Categories
Tutorial, Manual, Tips dan Trik

Proxy, Solusi HTTPS Pada Server HTTP dan Port Forwarding (Apache2)

Proksi (forward proxy & reverse proxy) digunakan untuk perantara koneksi ke suatu server. Proxy dapat digunakan untuk solusi permasalahan (1) tidak dapat mengatur HTTPS karena mendapatkan user non-sudoers dan (2) tidak banyak memiliki alamat IP untuk banyak server sehingga menggunakan port forwarding agar server dapat diakses melalui internet dengan port 80 atau 443.

Daftar Isi

Proxy Untuk Server HTTP dan Port Forwarding Menggunakan Apache2

Tidak selamanya mimin memiliki keleluasaan dalam melakukan pengaturan pada server. Ada kalanya mimin hanya mendapatkan user non-sudoers sehingga tidak dapat memasang SSL (HTTPS). Ada kalanya mimin hanya diberi alamat yang terbatas sehingga terpaksa menggunakan port forwarding. Nah, mimin dapat mencoba menggunakan proxy (Apache2) nih sebagai alternatif solusi.

— Proxy, Solusi HTTPS Pada Server HTTP dan Port Forwarding (Apache2)
https://bptsi.unisayogya.ac.id/proxy-solusi-https-pada-server-http-dan-port-forwarding-apache2/ 2022-06-03 00:01:44

Sebagai catatan:

  1. Tutorial ini menggunakan server Ubuntu dan Apache2.
  2. Parameter, alamat dan angka dapat disesuaikan dengan kondisi masing-masing server.
  3. Penjelasan inline di dalam kode dalam bentuk komentar (#).

Misalnya suatu instansi memiliki 10 buah server dengan alamat IP sebanyak 8 buah (/29), dimana 1 buah alamat untuk network, 1 buah alamat untuk broadcast dan 1 alamat untuk gateway, sehingga tersisa 5 buah alamat.

Dari 5 buah alamat tadi, 1 buah alamat digunakan untuk server apache2, 3 buah alamat untuk server lainnya dan 1 buah alamat (pf.example.com) digunakan untuk port forwarding 6 buah server lainnya.

Skenario yang dikehendaki: (1) manfaatkan proxy agar 6 buah server dapat diakses menggunakan port 443 (HTTPS), (2) ada 1 buah server yang hanya diketahui user non-sudoers.

|- Persiapan

#mengaktifkan proxy
a2enmod proxy_html
a2enmod proxy_http
a2enmod proxy

#mengaktifkan header (solusi mixed content)
a2enmod headers

service apache2 restart

|-Buat Site Baru

#terminal
nano /etc/apache2/sites-available/pf-ssl.conf

|-Atur Virtual Host Apache2 Site Baru

#filename: /etc/apache2/sites-available/pf
#konfigurasi proxy
<IfModule mod_ssl.c>
  #skenario hanya diketahui user non-sudoers (https to http)
  #kebetulan juga port fowarding
  <VirtualHost _default_:443>
    ServerAdmin webmaster@localhost
    ServerName apps.example.com
    ErrorLog ${APACHE_LOG_DIR}/apps.example.com.log
    #jika server proxy https
    SSLEngine on
    SSLCertificateFile    /path/certificate.crt
    SSLCertificateKeyFile /path/certificate.key
    SSLCertificateChainFile /path/certificate.ca-bundle
    #rule proxy
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    #ubah host menjadi sama dengan alamat server proxy, bukan alamat server target
    ProxyPreserveHost On
    #proses proxy
    ProxyPass /  http://pf.example.com:1234/
    ProxyPassReverse /  http://pf.example.com:1234/
    #contoh jika tidak port forwarding
    #ProxyPass /  http://npf.example.com/
    #ProxyPassReverse /  http://npf.example.com/
    #solusi mixed content (http to https atau https to http)
    Header add Content-Security-Policy "upgrade-insecure-requests"
    RequestHeader set Content-Security-Policy "upgrade-insecure-requests"
  </VirtualHost>

  #skenario (1) https to https (2) port forwarding
  <VirtualHost _default_:443>
    ServerAdmin webmaster@localhost
    ServerName mail.example.com
    ErrorLog ${APACHE_LOG_DIR}/mail.example.com.log
    #jika server proxy https
    SSLEngine on
    SSLCertificateFile    /path/certificate.crt
    SSLCertificateKeyFile /path/certificate.key
    SSLCertificateChainFile /path/certificate.ca-bundle
    #rule proxy
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    #jika server target https
    SSLProxyEngine On
    #ubah host menjadi sama dengan alamat server proxy, bukan alamat server target
    ProxyPreserveHost On
    #proses proxy
    ProxyPass /  https://pf.example.com:7890/
    ProxyPassReverse /  https://pf.example.com:7890/
    #tidak diperlukan solusi mixed content karena https to https
  </VirtualHost>
</IfModule>

|-Aktifkan Site Baru

a2ensite pf-ssl
service apache2 restart
Proxy HTTPS ke HTTP berhasil
<!-- source code -->
<!-- tetap http di source code, tetapi tidak mixed content karena ada header Content-Security-Policy="upgrade-insecure-requests" -->
<!DOCTYPE html>
<html>
<head>
    <title>SISTER</title>
    <link rel="icon" type="image/png" href="http://apps.example.com/favicon.png"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="http://apps.example.com/css/bootstrap.min.css" rel="stylesheet">
    <link href="http://apps.example.com/font-awesome/css/font-awesome.min.css" rel="stylesheet">
    <!-- ... -->
</head>
<body class="gray-bg bg-cover" style="background: url(http://apps.example.com/bg_login_new.jpg) no-repeat fixed;;">
    <!-- ... -->
</body>
</html>

|- Bagaimana Jika Tidak …

|– Tidak Menggunakan ProxyPreserveHost On

Proxy tidak menggunakan ProxyPreserveHost On
<!-- source code -->
<!DOCTYPE html>
<html>
<head>
    <title>SISTER</title>
    <link rel="icon" type="image/png" href="http://pf.example.com:1234/favicon.png"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="http://pf.example.com:1234/css/bootstrap.min.css" rel="stylesheet">
    <link href="http://pf.example.com:1234/font-awesome/css/font-awesome.min.css" rel="stylesheet">
    <!-- ... -->
</head>
<body class="gray-bg bg-cover" style="background: url(http://pf.example.com:1234/bg_login_new.jpg) no-repeat fixed;;">
    <!-- ... -->
</body>
</html>

Apabila ProxyPreserveHost On tidak digunakan, maka host yang digunakan adalah host dari server target, sedangkan server target tidak menggunakan port 80/443.

Oleh karena itu, ProxyPreserveHost On membuat host yang digunakan adalah host dari server proxy.

|– Tidak Menggunakan Header upgrade-insecure-requests

Proxy tidak menggunakan Header upgrade-insecure-requests
<!-- source code -->
<!-- tetap http di source code dan mixed content -->
<!DOCTYPE html>
<html>
<head>
    <title>SISTER</title>
    <link rel="icon" type="image/png" href="http://apps.example.com/favicon.png"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="http://apps.example.com/css/bootstrap.min.css" rel="stylesheet">
    <link href="http://apps.example.com/font-awesome/css/font-awesome.min.css" rel="stylesheet">
    <!-- ... -->
</head>
<body class="gray-bg bg-cover" style="background: url(http://apps.example.com/bg_login_new.jpg) no-repeat fixed;;">
    <!-- ... -->
</body>
</html>

Pada kasus HTTPS ke HTTP, apabila tidak ditambahkan Content-Security-Policy yang bernilai upgrade-insecure-requests pada header, maka protokol yang digunakan sama dengan server target, yaitu HTTP, sedangkan protokol dari server proxy adalah HTTPS.

Hal tersebut mengakibatkan mixed content (campuran antara HTTPS dan HTTP). Mixed content secara bawaan ditolak oleh browser.

Oleh karena itu, mixed content dapat dihindari dengan cara menambahkan Content-Security-Policy yang bernilai upgrade-insecure-requests pada header.

Demikian, semoga bermanfaat. [bst]

Sumber:

By basit

Biro Pengembangan Teknologi Dan Sistem Informasi

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.