Oleh Adhit Priyambodo adhit.priyambodo@ametis.co.id Keamanan Web Server Oleh Adhit Priyambodo adhit.priyambodo@ametis.co.id
Outline Pengenalan Web Server Instalasi & Konfigurasi Web Server Pengenalan Secure Socket Layer Instalasi & Konfigurasi SSL pada Web Server Pengenalan Apache Authentication Instalasi & Konfigurasi Apache Authentication Pengenalan Mod Security Instalasi & Konfigurasi Mod Security Pengenalan Denial of Service Cara untuk mengurangi resiko DoS Pengenalan Reverse Proxy Instalasi & Konfigurasi Reverse Proxy
Apache Web Server Aplikasi Web Server Opensource Dikembangkan oleh Apache Group Dapat berjalan pada beberapa sistem operasi, seperti Linux, Windows, BSD-Unix, Mac OS, dan lain-lain
Fitur utama Apache Mendukung protokol HTTP/1.1 Mendukung Virtual Host Mendukung autentikasi HTTP Mendukung SSL untuk komunikasi terenkripsi Mendukung CGI Terintegrasi dengan bahasa pemrograman PHP, Perl dan bahasa pemrograman script lain Dan lain-lain
Instalasi Apache (1) Pada Distro Linux Debian, gunakan fasilitas apt-get. root@WebServer:# apt-get install apache2 Reading package lists … Done Building dependency tree…Done The following extra packages will be installed: apache2-mpm-worker apache2.2-common Suggested packages: www-browser apache2-doc The following NEW packages will be installed: apache2 apache2-mpm-worker apache2.2-common 0 upgraded, 3 newly installed, 0 to remove and 61 not upgraded. Need to get 1444kB of archives. After unpacking 4170kB of additional disk space will be used. Do you want to continue [Y/n]?y
Instalasi Apache (2) Pada Distro Linux Debian, gunakan fasilitas dpkg. root@WebServer:# dpkg –-install <nama file .deb>
Halaman default Apache
Virtual Host Salah satu keunggulan Apache adalah Apache dapat melayani beberapa website dalam satu mesin server sekaligus. Virtual Host dapat dikonfigurasi sebagai: Name-based, menggunakan domain yang telah dikonfigurasi pada DNS(Anda bisa menambahkan record CNAME untuk membuat alias pada DNS) IP-based, menggunakan IP alias.
Konfigurasi Virtual Host Contoh konfigurasi DNS untuk mendukung Virtual Host Buat direktori /home/depkominfo/secure/log Kemudian buat sebuah file index.html pada direktori /home/depkominfo/secure www.depkominfo.go.id. IN A 172.16.1.5 secure.depkominfo.go.id. CNAME www.depkominfo.go.id. web.depkominfo.go.id CNAME www.depkominfo.go.id. root@WebServer:# mkdir –p /home/depkominfo/secure/log root@WebServer:# echo “<h3>Welcome to Secure.Depkominfo.Go.ID</h3>” > /home/depkominfo/secure/index.html
Konfigurasi Virtual Host(cont) Buat sebuah file dengan name ‘secure’ di direktori /etc/apache/site-available yang berisi baris berikut: Aktifkan vhost menggunakan perintah a2ensite NameVirtualHost *:80 <VirtualHost *:80> ServerName secure.depkominfo.go.id ServerAdmin admin@depkominfo.go.id DocumentRoot /home/depkominfo/secure/ ErrorLog /home/depkominfo/secure/log/error.log CustomLog /home/depkominfo/secure/log/access.log combined ServerSignature On </VirtualHost> root@WebServer:# a2ensite secure root@WebServer:# /etc/init.d/apache2 reload
Halaman Web menggunakan Virtual Host
Eavesdropping
Tanpa SSL
Dengan SSL
Bagaimana Mengatasinya ?
Secure Socket Layer
SSL pada Apache SSL(Secure Socket Layer) kali pertama ditemukan oleh Netscape Communication untuk mendukung komunikasi terenkripsi antara Web browser client dengan Web server. Untuk dukungan SSL pada Apache, kita bisa menggunakan Apache-SSL atau mod_ssl.
Konfigurasi SSL pada Apache Buat direktori kerja dengan nama ‘ssl’, kemudian buat private key menggunakan perintah openssl Buat CSR(Certificate Signing Request) dan isi data sesuai dengan nama instansi Anda. root@WebServer:# mkdir ssl root@WebServer:# cd ssl root@WebServer:# openssl genrsa 1024 > depkominfo.key Generating RSA private key, 1024 bit long modulus ......................+++++++ ................+++++ e is 65537 (0x10001)
Konfigurasi SSL pada Apache(cont) Kemudian berikan signature root@WebServer:# openssl req –new –key depkominfo.key >depkominfo.csr ............................... Country Name (2 letter code) [GB]:ID State or Province Name (full name) [Some-State]: Jakarta Locality Name (eg, city) []:Jakarta Organization Name (eg, company) []:Depkominfo Organizational Unit Name (eg, section) [ ]:IT Divisi Common Name [ ]:secure.depkominfo.go.id Email Address [ ]:admin@depkominfo.go.id ......................................... root@WebServer:# openssl x509 -req -days 365 -in depkominfo.csr -signkey depkominfo.key -out depkominfo.cert Signature ok subject=/C=ID/L=Jakarta/O=Depkominfo/CN=secure.depkominfo.go.id/ emailAddress=admin@depkominfo.go.id Getting Private key
Konfigurasi SSL pada Apache(cont) Kopikan file key dan certificate ke direktori Apache dan berikan hak akses 400 Tambahkan baris berikut pada /etc/apache2/ports.conf root@WebServer:# mkdir –p /etc/apache2/depkominfo/ssl root@WebServer:# cp depkominfo.key depkominfo.cert /etc/apache2/depkominfo.go.id/ssl root@WebServer:# chmod 400 /etc/apache2/depkominfo.go.id/ssl/* Listen 443
Konfigurasi SSL pada Apache(cont) Tambahkan direktif berikut pada konfigurasi Virtual Host Aktifkan modul SSL menggunakan perintah a2enmod Akses website menggunakan HTTPS ..................................................................... SSLEngine On SSLCertificateFile /etc/apache2/depkominfo.go.id/ssl/depkominfo.cert SSLCertificateKeyFile /etc/apache2/depkominfo.go.id/ssl/depkominfo.key root@WebServer:# a2enmod ssl Module ssl installed; run /etc/init.d/apache2 force-reload to enable. root@WebServer:# /etc/init.d/apache2 force-reload
Halaman Web yang menggunakan SSL
Penggunaan Certificate Authority Terpisah
Pembuatan Certificate Authority Pembuatan Kunci CA openssl genrsa –out ca.key 1024 Pembuatan Certificate Authority openssl req –new –x509 –key ca.key –out ca.crt –days 3650 Informasi Certificate Authority openssl x509 –text –in ca.crt -noout
Pembuatan Certificate Pembuatan Key untuk CSR openssl genrsa –out server.key 1024 Pembuatan CSR openssl req –new –key server.key –out server.csr Informasi CSR openssl req –text –in server.csr -noout
Pengesahan Certificate Pengesahan CSR dengan CA openssl x509 -req -in server.csr -out server.crt -sha1 –CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 Informasi Signed Certificate openssl x509 –in server.crt –text –noout Export Certificate ke Format PKCS12 openssl pkcs12 -export –in server.crt –inkey server.key –out server.p12
Konfigurasi SSL pada Apache Kopikan file key dan certificate ke direktori Apache dan berikan hak akses 400 Tambahkan baris berikut pada /etc/apache2/ports.conf root@WebServer:# mkdir –p /etc/apache2/depkominfo.go.id/ssl root@WebServer:# cp server.key server.crt ca.crt /etc/apache2/depkominfo.go.id/ssl root@WebServer:# chmod 400 /etc/apache2/depkominfo.go.id/ssl/* Listen 443
Konfigurasi SSL pada Apache Tambahkan direktif berikut pada konfigurasi Virtual Host Aktifkan modul SSL menggunakan perintah a2enmod Akses website menggunakan HTTPS ..................................................................... SSLEngine On SSLCertificateFile /etc/apache2/depkominfo.go.id/ssl/server.crt SSLCertificateKeyFile /etc/apache2/depkominfo.go.id/ssl/server.key SSLCACertificateFile /etc/apache2/depkominfo.go.id/ssl/ca.crt root@WebServer:# a2enmod ssl Module ssl installed; run /etc/init.d/apache2 force-reload to enable. root@WebServer:# /etc/init.d/apache2 force-reload
SSL Mutual Authentication
Pembuatan Client Certificate Pembuatan Key untuk CSR openssl genrsa –out client.key 1024 Pembuatan CSR openssl req –new –key client.key –out client.csr Informasi CSR openssl req –text –in client.csr -noout
Pengesahan Certificate Pengesahan CSR dengan CA openssl x509 -req -in client.csr -out client.crt -sha1 –CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 Informasi Signed Certificate openssl x509 –in client.crt –text –noout Export Certificate ke Format PKCS12 openssl pkcs12 -export –in client.crt –inkey client.key –out client.p12
Konfigurasi SSL pada Apache Tambahkan direktif berikut pada konfigurasi Virtual Host ..................................................................... SSLEngine On SSLCertificateFile /etc/apache2/depkominfo.go.id/ssl/server.crt SSLCertificateKeyFile /etc/apache2/depkominfo.go.id/ssl/server.key SSLCACertificateFile /etc/apache2/depkominfo.go.id/ssl/ca.crt SSLVerifyClient require SSLVerifyDepth 1
Import Personal Certificate
Import Personal Certificate
Apache Authentication
Autentikasi menggunakan Modul Auth Basic Secara default telah disertakan bersama paket Apache. Sederhana dan mudah dikonfigurasi. Informasi username dan password disimpan dalam file plaintext.
Konfigurasi Modul Auth Basic Gunakan perintah htpasswd untuk membuat user. Tambahkan baris berikut pada file konfigurasi Virtual Host. root@WebServer:# mkdir /etc/apache2/depkominfo.go.id/user root@WebServer:# htpasswd –c /etc/apache2/depkominfo.go.id/user/users admin root@WebServer:# htpasswd /etc/apache2/depkominfo.go.id/user/users adhit ...................................................... <Directory /home/depkominfo/secure/member/> AuthType Basic AuthName “Staf Divisi IT Depkominfo” AuthUserFile /etc/apache2/depkominfo.go.id/user/users Require valid-user </Directory>
Konfigurasi Modul Auth Basic(cont) Reload service Apache root@WebServer:# /etc/init.d/apache2 reload
Autentikasi menggunakan Modul MySQL Auth Informasi user disimpan dalam database MySQL. Mendukung beberapa metode enkripsi, seperti MD5, SHA, dan lain-lain.
Installasi Modul MySQL Auth Gunakan fasilitas apt-get root@WebServer:# apt-get install libapache2-mod-auth-mysql Reading package lists... Done Building dependency tree Reading state information... Done The following NEW package will be installed: libapache2-mod-auth-mysql 0 upgraded, 1 newly installed, 0 to remove and 364 not upgraded. Need to get 22.4kB of archives.
Konfigurasi Modul MySQL Auth Buat user di database MySQL yang akan kita gunakan untuk koneksi ke database.
Konfigurasi Modul MySQL Auth(cont) Buat database untuk menyimpan tabel user.
Konfigurasi Modul MySQL Auth(cont) Tambahkan baris berikut pada file konfigurasi Apache Tambahkan baris berikut pada konfigurasi Virtual Host atau simpan dalam file .htaccess pada direktori yang akan kita proteksi. Auth_MySQL_Info localhost depkominfo d3pk0minf0 AuthBasicAuthoritative Off AuthName “Khusus Staff IT Divisi Depkominfo - MySQLAuth” AuthType Basic <LIMIT GET POST> Auth_MySQL_DB auth Auth_MySQL_Encrypted_Passwords On Auth_MySQL_Encryption_Types PHP_MD5 Crypt Require valid-user </LIMIT>
Konfigurasi Modul MySQL Auth(cont) Aktifkan modul MySQL Auth dan reload service Apache root@WebServer:# a2enmod auth_mysql Module auth_mysql installed: run /etc/init.d/apache2 force-reload to enable root@WebServer:# /etc/init.d/apache2 force-reload Reloading web server config: apache2.
Halaman website menggunakan autentikasi MySQL Auth
Autentikasi menggunakan Modul PgSQL Auth Informasi user disimpan di database PostgreSQL Mendukung beberapa metode enkripsi, seperti MD5, SHA, dan lain-lain
Installasi Modul PgSQL Auth Gunakan fasilitas apt-get root@WebServer:# apt-get install libapache2-mod-auth-pgsql Reading package lists... Done Building dependency tree Reading state information... Done The following NEW package will be installed: libapache2-mod-auth-mysql 0 upgraded, 1 newly installed, 0 to remove and 365 not upgraded. Need to get 19.8kB of archives.
Konfigurasi Modul PgSQL Auth Buat user untuk koneksi ke database PostgreSQL Login sebagai user depkominfo dan buat tabel untuk menyimpan data user(pada bagian ini, kita tidak mengenkripsi password, Anda dapat mencobanya dengan menambahkan beberapa direktif yang tersedia pada modul ini).
Konfigurasi Modul PgSQL Auth(cont)
Konfigurasi Modul PgSQL Auth(cont) Tambahkan baris berikut pada konfigurasi Virtual Host atau file .htaccess AuthBasicAuthoritative Off AuthName “Khusus Staff Divisi IT Depkominfo – PgSQL” AuthType Basic Auth_PG_host localhost Auth_PG_port 5432 Auth_PG_user depkominfo Auth_PG_pwd d3pk0minf0 Auth_PG_database depkominfo Auth_PG_pwd_table pgsql_auth Auth_PG_uid_field username Auth_PG_pwd_field passwd Auth_PG_encrypted Off <Limit GET POST> Require valid-user </Limit>
Konfigurasi Modul PgSQL Auth(cont) Aktifkan modul PgSQL Auth dan reload service Apache root@WebServer:# a2enmod auth_pgsql Module auth_pgsql installed: run /etc/init.d/apache2 force-reload to enable root@WebServer:# /etc/init.d/apache2 force-reload Reloading web server config: apache2.
Halaman website menggunakan autentikasi PgSQL Auth
Web Application Firewall Mod Security
Mod Security Web Application firewall opensource. Dikembangkan oleh Ivan Ristic . Dirilis menggunakan lisensi GPL dan Commercial. Tersedia rules untuk memaksimalkan kerja Mod Security.
Fitur utama Mod Security Request filtering. Setiap request yang datang akan dianalisa sebelum request tersebut diproses oleh Web Server atau modul lain. Audit logging Setiap request bisa di-log secara detail untuk proses analisa nantinya. Mendukung teknik anti-evasion secara otomatis. HTTPS filtering Dan lain-lain.
Installasi Mod Security Download paket binary dari http://etc.inittab.org/~agi/debian/libapache-mod-security2/etch Gunakan perintah dpkg untuk menginstall paket.
Konfigurasi Mod Security Salin konfigurasi minimal Mod Security yang terletak di /usr/share/doc/libapache2-mod-security2/examples/ ke file konfigurasi Apache2.
Konfigurasi Mod Security(cont) # Basic configuration options SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess Off SecUploadKeepFiles Off # Handling of file uploads SecDebugLog logs/modsec_debug.log # Debug log SecDebugLogLevel 0 SecAuditEngine RelevantOnly # Serial audit log SecAuditLogRelevantStatus ^5 SecAuditLogParts ABIFHZ SecAuditLogType Serial SecAuditLog logs/modsec_audit.log # Maximum request body size we will accept for buffering SecRequestBodyLimit 131072 SecRequestBodyInMemoryLimit 131072 # Store up to 128 KB in memory # Buffer response bodies of up to 512 KB in length SecResponseBodyLimit 524288
Konfigurasi Mod Security(cont) Aktifkan modul Mod Security dan reload service Apache
Chroot Apache menggunakan Mod Security Chroot akan “memenjarakan” Apache dalam suatu environment sehingga Apache tidak dapat “melihat” proses atau bagian dari filesistem di luar lingkungan tersebut. Untuk menghindari “kerusakan” pada sistem akibat ulah attacker.
Konfigurasi Chroot Apache Buat direktori chroot Tambahkan baris berikut pada file konfigurasi Apache. Reload service Apache root@WebServer:# mkdir –p /chroot/var/www root@WebServer:# mkdir –p /chroot/var/run/apache2 root@WebServer:# mkdir –p /chroot/etc root@WebServer:# cp /etc/mime.types /chroot/etc/ .......................................................... SecChrootDir /chroot DocumentRoot /chroot/var/www
Mengubah Server Signature menggunakan Mod Security Server Signature adalah informasi yang muncul pada bagian bawah halaman yang di-generate oleh Apache (misal pada halaman directory listing).
Mengubah Server Signature menggunakan Mod Security(cont) Tambahkan baris berikut pada file konfigurasi Apache dan reload service Apache. ................................................... SecServerSignature “Microsof-IIS/7.0”
Mengubah Server Signature menggunakan Mod Security(cont)
Reverse Proxy
Reverse Proxy Mesin gateway yang memungkinkan sebuah Web server menyediakan content dari Web server lain secara transparan.
Reverse Proxy Kelebihan: Menyembunyikan topologi network dari luar. Client memiliki satu mesin untuk mengakses ke Web server. Mampu menjalankan berbagai aplikasi yang berjalan pada sistem operasi yang berbeda dalam satu mesin. Dan lain-lain.
Contoh kasus Depkominfo memiliki sebuah domain secure.depkominfo.go.id dan sebuah IP public yang bisa diakses dari internet. Depkominfo menginginkan aplikasi server yang berada di Web server private.depkominfo.go.id dapat diakses dari luar (private.depkominfo.go.id adalah domain internal yang menggunakan IP private sehingga tidak dikenal di internet).
Konfigurasi Reverse Proxy Pada mesin secure.depkominfo.go.id Tambahkan baris berikut pada file konfigurasi Virtual Host. Direktif ProxyPass akan memetakan remote server (private.depkominfo.go.id) ke url local server (http://secure.depkominfo.go.id/private). Aktifkan modul proxy dan proxy_http menggunakan perintah a2enmod. ................................................... ProxyPass /private http://private.depkominfo.go.id ProxyPassReverse /private http://private.depkominfo.go.id
Halaman website menggunakan Reverse Proxy
Denial of Service
TCP SYN Flood Merupakan salah satu bentuk serangan DoS (Denial of Service) dan bertujuan agar server yang menjadi target tidak dapat menyelesaikan TCP handshake sehingga service yang disediakan oleh server menjadi unavailable. Ilustrasi Normal three-way TCP handshake
TCP SYN Flood(cont) Pada SYN flood, attacker akan mengirimkan paket SYN dalam jumlah besar kepada target .
Contoh TCP SYN Flooding
TCP SYN Flood(cont) Untuk melindungi server Anda dari serangan SYN flood, kita bisa membatasi jumlah paket SYN baru yang datang dari client. Untuk menyimpan konfigurasi secara permanen, tambahkan baris berikut pada file /etc/sysctl.conf root@WebServer:# echo 4096 >/proc/sys/net/ipv4/tcp_max_syn_backlog root@WebServer:# echo 1 > /proc/sys/net/ipv4/tcp_syncookies net.ipv4.tcp_max_syn_backlog = 4096 net.ipv4.tcp_syncookies = 1
Bogon IP Prefiks yang tidak boleh berada dalam tabel routing internet dan merupakan IP public, tetapi tidak didelegasikan atau dialokasikan oleh IANA(Internet Assigned Numbers Authority) atau RIR(Regional Internet Registry). Biasanya digunakan oleh attacker untuk melakukan serangan DDoS atau menyebarkan Spam
Memfilter Bogon IP Download database Bogon dari website http://www.completewhois.com Gunakan script berikut untuk memasukkan IP Bogon ke dalam tabel filter iptables. Router:# wget http://www.completewhois.com/bogons/data/bogons-cidr-all.txt #!/bin/bash #Filename: iptables.sh iptables –N BOGONS for x in `grep ^[0-9] bogons-cidr-all.txt` do echo iptables –A BOGONS –s $x –j REJECT iptables –A BOGONS –s $x –j REJECT done
Memfilter Bogon IP(cont) Jalankan script sebagai berikut Router:# ls bogons-cidr-all.txt iptables.sh Router:# sh iptables.sh iptables –A BOGONS –s 0.0.0.0/7 –j REJECT iptables –A BOGONS –s 2.0.0.0/8 –j REJECT iptables –A BOGONS –s 5.0.0.0/8 –j REJECT iptables –A BOGONS –s 7.0.0.0/8 –j REJECT . . . . . . . . . . . . . . . . . . . . .