Menghapus HTTP Basic Auth di Nginx Reverse Proxy

Sabtu, 23 Januari 2021

Menghapus HTTP Basic Auth di Nginx Reverse Proxy. Oke ini sebenarnya adalah catatan pribadi saya sendiri. Dan saja juga sebenarnya agak bingung ngasih judulnya gimana. Intinya saya dapet case dimana sebuah service berjalan menggunakan HTTP auth, dan saya harus memasking service tersebut dengan reverse proxy Nginx.

Dan di Nginx nanti outputnya tidak lagi menggunakan HTTP auth jadi visitor tidak perlu memasukkan username password lagi.

Oke, daripada bingung mungkin langsung saya kasih contoh saja.

kano@linuxsec:~$ curl -I http://localhost:2525
HTTP/2 401 
server: god-server
date: Fri, 22 Jan 2021 18:08:31 GMT
content-type: text/plain; charset=utf-8
content-length: 17
www-authenticate: Basic realm="Restricted"
x-content-type-options: nosniff

kano@linuxsec:~$ curl -X GET -u user -I http://localhost:2525
Enter host password for user 'user':
HTTP/2 302 
server: god-server
date: Fri, 22 Jan 2021 18:10:37 GMT
content-type: text/html; charset=utf-8
content-length: 29
location: /welcome
Sekarang bagaimana saya memasking service tersebut di Nginx, sekaligus menghilangkan HTTP Auth nya?
Solusinya adalah dengan menambahkan header yang berisi username dan password nya kedalam reverse proxy.

Oke, anggap username dan password dari service tadi adalah user:password. Kita ubah ke bentuk base64. Dengan terminal kita bisa jalankan command:
echo -n "user:password" | base64
Didapatkan bentuk dXNlcjpwYXNzd29yZA==.

Tinggal tambahkan header
proxy_set_header Authorization "Basic dXNlcjpwYXNzd29yZA==";
Contoh di virtualhostnya:
location / {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://localhost:2525;
    proxy_set_header Authorization "Basic dXNlcjpwYXNzd29yZA==";
 }
Maka sekarang kita bisa mengakses halaman tersebut tanpa password.
kano@linuxsec:~$ curl -v http://localhost
*   Trying ::1:80...
* Connected to localhost (::1) port 80 (#0)
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.72.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 302 Found
< Server: nginx/1.18.0
< Date: Fri, 22 Jan 2021 18:36:16 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 29
< Connection: keep-alive
< Location: /welcome
Mudah bukan? Kalian juga bisa mengubah auth dari backend dengan kredensial yang kalian tentukan lagi dengan menambahkan HTTP Auth di Nginxnya. 

Oke mungkin sekian tutorial kali ini, semoga bermanfaat. Jika ada yang ingin ditanyakan silahkan tinggalkan komentar.

Artikel Terkait Nginx