Tag Archives

9 Articles
Membuat Sertifikat Let’s Encrypt Menggunakan certbot Di Debian Jessie
By The people from the Tango! project, derived RRZEicons (The Tango! Desktop Project) [Public domain], via Wikimedia Commons, color modified by JP

Membuat Sertifikat Let’s Encrypt Menggunakan certbot Di Debian Jessie

Untuk mendukung web yang aman dan dalam rangka HTTP/2 yang sudah menggunakan SSL sebagai dasar koneksi, diperlukan sertifikat digital yang ditandatangani oleh pihak yang terpercaya. Situs yang memiliki sertifikat digital yang ditandatangani sendiri bahkan sudah ditandai oleh beberapa peramban sebagai situs tak aman. Tak ayal lagi, diperlukan tanda tangan digital yang terpercaya.

Kali ini kita menggunakan sebuah sertifikat gratis yang bernama Let’s Encrypt. Penyedia sertifikat ini (CA) didukung oleh EFF (Electronic Frontier Foundation), sebuah organisasi nirlaba yang bergerak dalam aktivitas digital. Bahkan, organisasi nirlaba ini menyediakan perkakas untuk sertifikasi tanda tangan digital, certbot.

Mungkin Anda bertanya, bagaimana dengan Sivion? Sivion adalah salah satu usaha dari Indonesia untuk itu. CA (penyedia sertifikat) dari Indonesia ini saat ini menyediakan tanda tangan gratis bagi kita. Namun, sayangnya mereka belum menyediakan perkakas sertifikasi seperti Let’s Encrypt.

Artikel kali ini membahas bagaimana memasang sertifikat Let’s Encrypt dengan certbot. Artikel ditulis untuk Debian Jessie.

Aktifkan Repo Debian Jessie Backports

Tambahkan ke daftar repo dan perbaharui daftar paket.

echo "deb http://ftp.debian.org/debian jessie-backports main" | sudo tee /etc/apt/sources.list.d/debian-backports.list
sudo apt update

Saya tidak arahkan ke Kambing karena saya sedang malas membetulkan Kambing. Mungkin nanti setelah betul, saya arahkan ke Kambing. ;-P

Pasang certbot

Perkakas certbot ada di repo Jessie Backports.

sudo apt-get install certbot -t jessie-backports

Sebelum Memasang Let’s Encrypt

Ada dua hal yang menjadi kewajiban kita:

  1. Pastikan semua domain yang didaftarkan sudah terdaftar di DNS publik.
  2. Pastikan bahwa direktori yang memuat URL untuk sertifikasi dapat diakses.

Untuk pembuatan entri DNS di luar cakupan tulisan ini.

Halaman HTTP (tanpa SSL) untuk lokasi .well-known/ (http://example.com/.well-known/) harus dapat diakses. Bila Anda seperti saya yang mematikan non-SSL, harus ditambahkan dahulu pengecualian tersebut di peladen. Omong-omong saya menggunakan peladen NGINX. Contoh pengecualian:

server {
        listen   80;
        listen  [::]:80 ipv6only=on;
        server_name  example.com www.example.com;
        server_name_in_redirect on;
        port_in_redirect on;

        access_log  /var/log/nginx/access.log;
        error_log  /var/log/nginx/error.log;

        # For ACME Let's Encrypt challenge
        location /.well-known {
                alias /var/www/html/.well-known; # have this as the webroot
        }

        location / {
                return 301 https://$server_name$request_uri;
        }

}

Berikutnya, pasang.

Sertifikasi

Jalankan sertifikasi

sudo certbot certonly --webroot -w /var/www/html -d example.com -d www.example.com

Ikuti prosesnya, biasanya pertama-tama ditanyakan alamat surel yang bisa dihubungi bila ada apa-apa.

Enter our email address

Enter our email address

Setelah itu, biasanya ditanyakan kesediaan mengikuti syarat dan ketentuan yang ditetapkan oleh Let’s Encrypt. Pencet tombol [ENTER] saja.

Saya lupa menyuplikkan saat sudah berhasil. Ya, coba saja cek direktori /etc/letsencrypt/live yang seharusnya berisi satu direktori bernama domain pertama yang kita daftarkan.

Konfigurasi NGINX

Sebelum saya kasih konfigurasi penuh, saya coba berikan potongan.

SSL Baku

Untuk konfigurasi SSL baku gunakan sertifikat-sertifikat ini:

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

OCSP Stapling

Untuk memanfaatkan OCSP Stapling gunakan sertifikat ini:

ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

Contoh Penuh

Ini contoh penuh blok SSL saya.

ssl  on;

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
        
ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers         "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
ssl_prefer_server_ciphers on;
ssl_session_cache   shared:SSL:20m;
ssl_session_timeout 60m;

ssl_dhparam /etc/nginx/ssl/dhparam.pem;

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
resolver 8.8.8.8;

add_header Strict-Transport-Security "max-age=31536000" always;

Terakhir

Untungnya menggunakan paket Debian Jessie adalah pembaharuan SSL berlangsung otomatis. Setelah ini saya akan buat tulisan untuk Debian Wheezy. Sayangnya, pemasangan Debian Wheezy lebih rumit dari Debian Jessie.

Selamat mencoba dan tinggalkan komentar bila ingin bertanya.

Bacaan Lebih Lanjut

NGINX dan Situs Siap HTTP/2

NGINX dan Situs Siap HTTP/2

Semenjak versi 1.9.5, NGINX sudah menggantikan modul SPDY dengan HTTP/2. Protokol tersebut telah resmi dan banyak peramban modern memanfaatkannya pada versi anyar. Salah satu yang paling gencar adalah Chromium dan turunannya (Google Chrome).

Ajaibnya, mengaktifkan HTTP/2 dapat menyebabkan galat berikut pada Chromium:

ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY

Berikut penyebab mengapa demikian:

  • Menggunakan enkripsi lawas yang dilarang oleh HTTP/2, misalnya masih SHA-1, RC4, atau lebih rendah.
  • Menggunakan sertifikat SSL yang tidak ditandatangani oleh CA yang terpercaya/diakui oleh peramban.
  • Masih ada penggunaan protokol tak terenkripsi sehingga isi situs tercampur antara yang terenkripsi atau tidak.

Lalu apa yang harus kita lakukan untuk dapat sesuai dengan HTTP/2?

  • Untuk situs yang melayani HTTP dan HTTPS, sebaiknya penulisan URI tidak mencantumkan skema. Misalnya, daripada menulis “http://alamat.sesuatu/res/1.jpg” atau “https://alamat.sesuatu/res/1.jpg”, lebih baik ditulis dengan “/res/1.jpg”.
  • Solusi yang paling betul, tulis semua dengan menggunakan protokol HTTPS.
  • Solusi lain, tulis semua dengan menggunakan HTTP non-enkripsi dan lupakan HTTP/2.

Pada zaman dahulu, penggunaan protokol HTTPS berat dan cenderung dilewati. Namun, protokol HTTP/2 memiliki mekanisme saluran aman sehingga dapat mengirim sumber daya dengan lebih cepat dan efisien. Apalagi, prosesor zaman sekarang sudah dilengkapi oleh ekstensi AES-NI yang melakukan enkripsi secara perangkat keras. Dengan kedua alasan itu, menyalakan HTTP/2 justru mempercepat situs.

Sayangnya, dunia tak seindah itu. Harga tanda tangan sertifikat per domain itu mahal! Kalau Anda memiliki situs dengan banyak domain, Anda tentunya harus berstrategi. Salah satunya Anda bisa saja membeli sertifikat wildcard (*) sehingga bisa dipakai oleh sub domain.

Tetap saja, untuk UI yang memiliki lembaga tingkat 2 (misalnya lembaga di bawah fakultas), sertifikat wildcard tidak bisa dipakai. UI harus membeli sertifikat wildcard per fakultas juga. Atau, UI bisa saja membeli sertifikat untuk menjadi CA sekunder.

Keduanya adalah solusi yang mahal. Apalagi, setiap sertifikat hanya berlaku setahun atau dua tahun saja dan harus diperpanjang. Kalau sudah sampai seperti itu, kita harus berstrategi.

Dalam kasus UI, situs-situs yang membutuhkan keamanan tinggi harus menggunakan HTTP/2 dan sertifikat SHA2. Sedangkan untuk situs-situs kurang penting seperti Blog Staff ini, penggunaan sertifikat sekenanya saja. Misalnya, masih ditandatangani sendiri (self-signed) atau sertifikat SHA1 sisa-sisa dana tahun lalu.

Untuk peladen yang menggunakan WordPress Multisite dan Drupal multisite sayangnya harus secara manual menulis konfigurasi HTTP/2 pada NGINX. Bisa, sih, ditulis skripnya. Tetapi, saya terlalu malas untuk saat ini. Terlalu banyak kasus anomali (edge cases) yang harus dipertimbangkan.

Bagaimana dengan Anda, sudah siapkah situs Anda?

WordPress, NGINX, HHVM, dan Monit

WordPress, NGINX, HHVM, dan Monit

Bagi yang sudah pernah berurusan dengan situs yang berat, Anda pasti juga jengah dengan kelakuan PHP-FPM. Ada beberapa solusi yang saat ini tersedia:

Beberapa waktu yang lalu saya sudah membahas tentang uWSGI. Sekarang, saya mau mencoba teknologi HHVM. Doakan saja supaya saya tidak malas dan juga mau mencoba HippyVM dan PHP7-FPM sehingga saya bisa menuliskan untuk Anda.

Pasang HHVM

Cara pasang HHVM di berbagai sistem operasi ada di sini. Saya asumsikan hendak dipasang di sistem operasi Debian Jessie.

sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449
echo deb http://dl.hhvm.com/debian jessie main | sudo tee /etc/apt/sources.list.d/hhvm.list
sudo apt-get update
sudo apt-get install hhvm

Perintah-perintah ini pada intinya memasang kunci paket repo HHVM dan menambahkan repo tersebut ke daftar repositori sistem. Kemudian, perbaharui daftar paket yang tersedia dan pasang HHVM.

Selanjutnya, ubah konfigurasi HHVM di /etc/hhvm/server.ini menjadi

; php options

pid = /var/run/hhvm/pid

; hhvm specific 
hhvm.server.file_socket=/var/run/hhvm/hhvm.sock
hhvm.server.type = fastcgi
hhvm.server.default_document = index.php
hhvm.log.level = Warning
hhvm.log.always_log_unhandled_exceptions = true
hhvm.log.runtime_error_reporting_level = 8191
hhvm.log.use_log_file = true
hhvm.log.file = /var/log/hhvm/error.log
hhvm.repo.central.path = /var/run/hhvm/hhvm.hhbc
hhvm.mysql.typed_results = false

; Generate JIT codes sooner!
hhvm.eval.jit_warmup_requests = 1

; Disable Perf debugging
hhvm.keep_perf_pid_map = 0
hhvm.perf_pid_map = 0
hhvm.perf_data_map = 0

Ada beberapa perbedaan dengan konfigurasi biasa. Berikut yang penting:

  • Saya memilih untuk menggunakan socket dari pada port TCP karena lebih aman dalam menentukan hak akses.
  • Saya menyuruh HHVM untuk segera mengaktifkan optimasi dari sejak awal. Hal ini mengakibatkan peladen agak lama di awal.
  • Saya mematikan fungsi profiling. Fungsi ini berguna kalau Anda mau men-debug kode PHP Anda yang dieksekusi oleh HHVM. Kemungkinan besar, Anda terlalu malas seperti saya. Fungsi ini hanya akan memenuhi /tmp dengan berkas peta performa.

Pasang NGINX

Pertama-tama, pasang NGINX:

sudo apt-get install nginx

Set upstream NGINX ke HHVM di berkas /etc/nginx/conf.d/upstream.conf

# Upstream to abstract backend connection(s) for PHP.
upstream php-hhvm {
  server unix:/var/run/hhvm/hhvm.sock;
}

Lalu, buat sebuah blok konfigurasi /etc/nginx/php-hhvm

location ~ \.(hh|php)$ {
    try_files $uri =404;

    fastcgi_keep_conn on;
    fastcgi_pass   php-hhvm;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

Ini saya ambil dan modifikasi sedikit dari hhvm.conf yang biasanya terpasang saat kita memasang HHVM.

Nah, setiap Virtual Host yang mau menggunakan, tinggal mengikutkan berkas php-hhvm di dalam berkas konfigurasinya. Misalnya, kita buat sebuah berkas /etc/nginx/sites-available/default

server {
    # Anything not directed at specific host will hit "Welcome to nginx"
    listen 80 default_server;
    server_name _;
    
    root /var/www/html;
    index index.php index.html index.htm;

    location / {
            try_files $uri $uri/ /index.php?$args ;
    }

        include php-hhvm;

}

Jangan lupa, ini cuma contoh! Untuk mesin produksi, tolong ubah berkas direktori dan tambahkan beberapa aturan untuk menghindari injeksi.

Selanjutnya, pasang seperti biasa ala Debian:

sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default
sudo invoke-rc.d nginx reload

Beres.

Eits! Nanti dulu, Kisanak! Supaya situs tetap berjalan, mari pasang Monit untuk memonitor keberadaan HHVM. Menurut pengalaman saya, awal-awal HHVM rentan terhadap aplikasi yang harus dinyalakan ulang.

Pasang Monit

Pasang Monit.

sudo apt-get install monit

Buat konfigurasi Monit untuk HHVM di /etc/monit/conf.d/hhvm yang isinya:

check process hhvm with pidfile /var/run/hhvm/pid
  group hhvm
  start program = "/usr/sbin/service hhvm start" with timeout 60 seconds
  stop program = "/usr/sbin/service hhvm stop"
  if failed unixsocket /var/run/hhvm/hhvm.sock then restart
  if mem > 400.0 MB for 1 cycles then restart
  if 5 restarts with 5 cycles then timeout

Untuk dapat memonitor Monit, langkah opsional yang dapat diambil adalah dengan mengubah 3 baris berikut pada /etc/monit/monitrc

set httpd port 2812 and
   use address localhost  # only accept connection from localhost
   allow localhost        # allow localhost to connect to the server and

Kalau pada konfigurasi Jessie, baris-baris itu mulai dari baris ke-130.

Setelah selesai, muat ulang Monit:

invoke-rc.d restart monit

Kalau mau lihat Monit, silakan ketik:

sudo monit status

Tentunya, langkah opsional dikerjakan. Bila tidak, maka Monit tak dapat dilihat.

Selesai!

NGINX, uWSGI, PHP pada Debian Jessie

NGINX, uWSGI, PHP pada Debian Jessie

Solusi PHP-FPM sudah tak mencukupi lagi untuk saya. Sering kali saya mendapati sistem-sistem dengan pengunjung banyak tidak bereaksi. Padahal, semua layanan menyala.

Dari kasak-kusuk di Internet yang saya dapati bahwa ternyata PHP-FPM harus sering-sering dijalankan ulang. Bahkan, ada yang memasang CRON untuk menjalankan ulang PHP-FPM setiap 15 menit sekali. Saya pun terenyuh.

Untungnya, ada sebuah solusi, yakni uWSGI. Awalnya, ia hanya untuk menjalankan layanan web berbasis Python. Namun, sekarang ia berkembang untuk menjalankan hampir apa saja. Enaknya dia, setiap proses dijalankan sebagai pengguna biasa (non-root).

Cara Pasang

Cara pasang seperti biasa:

sudo apt-get install nginx uwsgi uwsgi-plugin-php

Seperti biasa.

Konfigurasi

NGINX

Cara konfigurasi sama seperti PHP-FPM, tetapi sedikit berbeda. Berikut sekilas contoh konfigurasi salah satu virtual host (/etc/nginx/sites-available/xxx)

server {
  ...

  location / {
    index   index.php;
    try_files $uri $uri/ /index.php?$args;
  }

  ...

  location ~ .php$ {
     include uwsgi_params;
     uwsgi_modifier1 14; 
     uwsgi_pass unix:/tmp/uwsgi_webphp.sock;
  }
}

Perhatikan bahwa tidak ada yang berubah dari baris lain. Hanya blok pengolah PHP yang diubah dari FastCGI untuk PHP-FPM menjadi UWSGI. Aplikasi nginx memiliki antarmuka alami dengan uWSGI.

Seperti biasa, aktifkan virtual host dengan:

sudo ln -s /etc/nginx/sites-{available,enabled}/xxx
sudo service nginx restart

Selanjutnya uWSGI.

uWSGI

Pada Debian Jessie, virtual host uWSGI terletak pada /etc/uwsgi/apps-available/xxx.ini

Perhatikan kalau uWSGI mengharapkan ekstensi .ini pada setiap berkas konfigurasi virtual host yang valid.

Mari buat berkas /etc/uwsgi/apps-available/webphp.ini (Iya, saya kurang kreatif, silakan ganti nama berkas dengan apa saja)

[uwsgi]
socket=/tmp/uwsgi_webphp.sock
pidfile2=/tmp/uwsgi_webphp.pid
daemonize=/var/log/uwsgi/webphp.log
plugins=php

chdir=/var/www
cheaper=4
close-on-exec=1
harakiri=360
max-requests=128
processes=8
master=1
uid=www-data
gid=www-data
chmod=666
log-5xx=1
vacuum=1
post-buffering=8192

Perhatikanlah yang berbeda ada pada baris 3! Gunakan pidfile2, jangan pidfile saja! Opsi pidfile2 yang membuat adalah pengguna tersebut, bukan root. Bila menggunakan pidfile, layanan uwsgi akan gagal dikendalikan oleh Debian.

Aktifkan konfigurasi ala Debian:

sudo ln -s /etc/uwsgi/apps-{available,enabled}/webphp.ini
sudo service uwsgi restart

Selesai.

Memperketat Keamanan Situs

Memperketat Keamanan Situs

Pendahuluan

Halo, jumpa lagi di hari Jumat!

Karena isu keamanan akhir-akhir ini semakin ketat, saya merasakan perlunya pembelajaran kepada masyarakat Indonesia mengenai penggunaan enkripsi yang tepat. Entahlah, mungkin ini juga karena saya meneliti Owncloud terlalu jauh. Atau mungkin ini sekedar tulisan menambah kuota tulisan saya di blog. Ilmu memang untuk dibagi.

Orang pasti sudah tahu tentang BEAST, CRIME, dan HEARTBLEED. BEAST adalah proof-of-concept serangan terhadap enkripsi TLSv1.0 yang menyebabkan sebuah domain dapat dibajak dari implementasi TLS v1.0 yang buruk di sistem operasi. Lalu, ada CRIME yang menyerang implementasi kompresi HTTP pada TLS dan SPDY. Yang menghebohkan berikutnya adalah HEARTBLEED yang menyerang implementasi cacat OpenSSL pada implementasi ekstensi TLS heartbeat.

Yang terakhir dan teranyar adalah POODLE, eksploit terhadap SSLv3 yang menyebabkan sekarang ini orang dipaksa untuk mematikan SSLv3. Ya, kecuali Anda menggunakan IE6/7 pada Windows XP yang belum diperbaharui, sebenarnya SSLv3 sudah lama tidak diperlukan. Bahkan, sebaiknya Anda memaksa peramban Anda langsung menggunakan TLS v1.2.

Ekstensi AES-NI

Tapi… tapi… bukankah menggunakan enkripsi membuat peladen kurang responsif?

Itu dulu! Sekarang, ‘kan, sudah ada ekstensi AES-NI pada prosesor x86. Jadi, enkripsi dilakukan secara langsung oleh CPU. Saya melakukan eksperimen kecil untuk memperlihatkan perbedaan operasi biasa dan menggunakan AES-NI.

Operasi biasa menggunakan instruksi CPU normal.

$ OPENSSL_ia32cap="~0x200000200000000" openssl speed -elapsed -evp aes-128-cbc
You have chosen to measure elapsed time instead of user CPU time.
Doing aes-128-cbc for 3s on 16 size blocks: 34349970 aes-128-cbc's in 3.00s
Doing aes-128-cbc for 3s on 64 size blocks: 8984170 aes-128-cbc's in 3.00s
Doing aes-128-cbc for 3s on 256 size blocks: 2337382 aes-128-cbc's in 3.00s
Doing aes-128-cbc for 3s on 1024 size blocks: 589989 aes-128-cbc's in 3.00s
Doing aes-128-cbc for 3s on 8192 size blocks: 74022 aes-128-cbc's in 3.00s
OpenSSL 1.0.1i 6 Aug 2014
built on: Fri Aug  8 06:23:32 WIB 2014
options:bn(64,64) rc4(8x,int) des(idx,cisc,16,int) aes(partial) idea(int) blowfish(idx) 
compiler: x86_64-pc-linux-gnu-gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -DTERMIO -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -O2 -pipe -march=native -mtune=native -fomit-frame-pointer -flto=8 -floop-interchange -ftree-loop-distribution -floop-strip-mine -floop-block -ftree-vectorize -fno-strict-aliasing -Wa,--noexecstack
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128-cbc     183199.84k   191662.29k   199456.60k   201382.91k   202129.41k

Sedangkan berikut operasi menggunakan instruksi AES-NI.

$ openssl speed -elapsed -evp aes-128-cbc
You have chosen to measure elapsed time instead of user CPU time.
Doing aes-128-cbc for 3s on 16 size blocks: 99416661 aes-128-cbc's in 3.00s
Doing aes-128-cbc for 3s on 64 size blocks: 27157194 aes-128-cbc's in 3.00s
Doing aes-128-cbc for 3s on 256 size blocks: 7746016 aes-128-cbc's in 3.00s
Doing aes-128-cbc for 3s on 1024 size blocks: 2005119 aes-128-cbc's in 3.00s
Doing aes-128-cbc for 3s on 8192 size blocks: 253147 aes-128-cbc's in 3.00s
OpenSSL 1.0.1i 6 Aug 2014
built on: Fri Aug  8 06:23:32 WIB 2014
options:bn(64,64) rc4(8x,int) des(idx,cisc,16,int) aes(partial) idea(int) blowfish(idx) 
compiler: x86_64-pc-linux-gnu-gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -DTERMIO -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -O2 -pipe -march=native -mtune=native -fomit-frame-pointer -flto=8 -floop-interchange -ftree-loop-distribution -floop-strip-mine -floop-block -ftree-vectorize -fno-strict-aliasing -Wa,--noexecstack
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128-cbc     530222.19k   579353.47k   660993.37k   684413.95k   691260.07k

Berikut tabel hasilnya:

Instruksi CPU Tipe 16-bit 64-bit 256-bit 1024-bit 8192-bit
AES-NI aes-128-cbc 530222,19 579353,47 660993,37 684413,95 691260,07
Normal 183199,84 191662,29 199456,6 201382,91 202129,41
Performa 2,8942284557 3,0227827811 3,313970909 3,3985701667 3,4198886248
Total Performa AES-NI 3,2098881874

Tampak bahwa dalam kasus ini, penggunakan AES-NI pada OpenSSL meningkatkan performa 3 kali lipat.

Dukungan AES-NI

Untuk mengetahui apakah prosesor peladen Anda mendukung AES-NI, silakan lihat dengan:

$ cat /proc/cpuinfo  | grep aes
flags           : ... aes ...

Kalau didukung, akan ada tulisan ‘aes’. Biasanya, sih, untuk prosesor AMD dan Intel yang baru [baca: keluaran tahun-tahun ini] sudah mendukung instruksi AES-NI. Kalau pun belum, bisa langsung saja mengompilasi OpenSSL dengan menggunakan instruksi SSE4 atau AVX. Ya, tapi itu di luar cakupan tulisan ini agar tidak terlalu rumit.

Untuk Debian Wheezy, OpenSSL 1.0.1e yang digunakan akan secara otomatis mendeteksi AES-NI. Tidak perlu mengompilasi sendiri untuk versi Debian tersebut. Untuk sistem operasi yang lain, silakan konsultasi kepada Mbah Gugel.

Bila Anda menggunakan KVM atau Proxmox, pastikan Anda menggunakan tipe CPU Host. Cara lain adalah pastikan instruksi AES-NI diperbolehkan untuk KVM.

Konfigurasi NGINX

Karena OpenSSL transparan, maka tidak ada yang perlu dipusingkan oleh NGINX untuk menggunakan AES-NI. NGINX hanya perlu memberitahukan protokol enkripsi yang dipakai untuk HTTPS.  Untuk itu, perhatikan contoh konfigurasi NGINX:

server {
        listen   80;
        listen  [::]:80 ipv6only=on;
        server_name  www.contoh.aja;
        server_name_in_redirect on;
        port_in_redirect on;

        access_log  /var/log/nginx/normal.access.log;
        error_log  /var/log/nginx/normal.error.log;

        ## redirect http to https ##
        rewrite        ^ https://$server_name$request_uri? permanent;
}

server {
        listen   443 ssl spdy;
        listen [::]:443 ipv6only=on ssl spdy;

        server_name  www.contoh.aja;
        server_name_in_redirect on;
        port_in_redirect on;

        ssl  on;
        ssl_certificate /etc/nginx/ssl.cert;
        ssl_certificate_key /etc/nginx/ssl.key;
        
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
        ssl_prefer_server_ciphers on;
        ssl_session_cache   shared:SSL:10m;
        ssl_session_timeout 10m;

        access_log  /var/log/nginx/ssl.access.log;
        error_log  /var/log/nginx/ssl.error.log;

        ## HERE PHP ENGINE AND OTHER REWRITE RULES ##
}

Saya akan mencoba menjelaskan beberapa bagian yang penting. Saya mengasumsikan Anda sudah tahu mengonfigurasi NGINX secara dasar sehingga saya tak perlu menjelaskan semuanya. Atau, setidaknya Anda bisa mencari langsung di Internet.

Saya sengaja tidak menyertakan aturan FastCGI PHP dan aturan-aturan rewrite untuk mengurangi kompleksitas kode. Ada banyak tutorial dasar untuk menyertakan aturan FastCGI. Lagipula, untuk aturan-aturan rewrite tergantung kepada aplikasi yang kita gunakan (Drupal, WordPress, dsb.).

Yak, langsung saja.

Mendengar di IPv4 dan IPv6

Berikut sintaksis agar NGINX mendengar semua antarmuka jaringan (IPv4 dan IPv6).

listen   80;
listen  [::]:80 ipv6only=on;

Ada alasan mengapa mengaktifkan dual stack. Universitas Indonesia (UI) sudah sejak lama memiliki satu blok (/16) IPv4 kelas B. Karena termasuk historical member dari IANA, UI juga beruntung mendapatkan satu blok /48 IPv6. Itu sebabnya, hampir semua peladen UI sudah memiliki IPv6 sendiri berikut IPv4 publik.

Mengarahkan Semua ke HTTPS

Berikut sintaksis untuk mengarahkan koneksi HTTP ke HTTPS.

rewrite        ^ https://$server_name$request_uri? permanent;

Ada tutorial lama yang menyampur koneksi HTTPS dan HTTP. Hal ini tidak sesuai dengan prinsip keamanan. Bila memang situs ingin aman sepenuhnya, maka harus semuanya harus menggunakan HTTPS. Konten campuran (berisi HTTP dan HTTPS) tidak disarankan dan beberapa peramban akan cerewet tentang itu.

Mengaktifkan SPDY

Berikut sintaksis agar NGINX menggunakan SSL (HTTPS) dengan SPDY.

listen   443 ssl spdy;
listen [::]:443 ipv6only=on ssl spdy;

Untuk akselerasi HTTPS, Google mengembangkan teknik SPDY. Hampir semua peramban modern mendukung protokol SPDY. Saya pernah membahas ini.

Mengaktifkan SSL

Baris-baris inilah yang mengaktifkan enkripsi HTTPS (SSL).

ssl  on;
ssl_certificate /etc/nginx/ssl.cert;
ssl_certificate_key /etc/nginx/ssl.key;

Baris ssl_certificate mengarahkan ke berkas sertifikat peladen. Ada tiga jenis skenario untuk berkas sertifikat peladen:

  1. Untuk menambah legitimasi, biasanya sertifikat ditandatangani oleh Certificate Authority (CA) yang sudah diakui. StartSSL menyediakan layanan ini dengan gratis. Kalau mau yang murah ada RapidSSL atau Komodo. Kalau mau lebih bonafide, gunakan VeriSign. Mereka ini biasanya sertifikat utamanya (root certificate) sudah dipasang di sistem operasi/peramban. Root certificate adalah sertifikat CA yang dipakai untuk melegitimasi sertifikat sebuah server.
  2. Ada juga organisasi yang membuat root certificate sendiri. Biasanya, mereka memasang sendiri root certificate ke sistem operasi/peramban pengguna. Ada banyak tutorial tentang itu, terutama Windows Server dan UNIX.
  3. Yang paling jamak digunakan di tutorial-tutorial biasanya menggunakan sertifikat yang ditandatangani sendiri (self-signed).

Silakan pilih skenario yang terbaik. Untuk situs bisnis biasanya menggunakan CA pihak ketiga (poin 1). Namun, untuk Intranet biasanya menggunakan poin 2.

Baris berikutnya ssl_certificate_key mengarahkan berkas kunci privat peladen. Pastikan berkas ini hanya bisa diakses baca-saja oleh root (0400).

Parameter Tambahan

Berikut parameter tambahan yang opsional. Parameter-parameter ini yang memperkuat enkripsi situs.

Hanya Gunakan TLS

Protokol SSLv3 sudah tamat semenjak POODLE beberapa hari yang lalu. Banyak yang menyarankan untuk mematikan protokol ini. Ya, berhubung protokol ini sudah sangat lama, wajar saja. Lagipula, hanya IE6/7 yang menggunakan Windows XP SP3 yang belum ditambal saja yang terpengaruh. Sisanya, dunia sudah mengenal TLS sejak lama.

Ya sudah, cukup aktifkan semua versi protokol TLS saja.

ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;

Protokol TLS pun sebenarnya tidak begitu aman. Kalau mau paranoid, hanya aktifkan TLSv1.2 saja. Tentu saja, ini mengurangi jumlah pengunjung dan peramban yang bisa mengakses situs kita.

Gunakan SHA256 AES-GCM dengan Forward Secrecy dan RC4 Sebagai Cadangan

Semenjak tahun 2011, SHA1 dianggap sudah tidak aman lagi. Lebih parah lagi, Google akan mempenalti situs-situs yang masih menggunakan SHA1 pada 1 Januari 2017. Artinya, semua situs yang masih memakai sertifikat dengan tanda tangan SHA1 akan dianggap tidak aman oleh produk-produk Google.

Bila Anda masih baru mau memasang sertifikat, gunakan sertifikat dengan tanda tangan SHA256. Atau kalau lebih bagus lagi, gunakan SHA387. Tetapi, untuk SHA387 masih jarang dan lagi mahal.

Ada banyak protokol pertukaran kunci dan saya tidak mau terlalu detail. Saat ini protokol yang aman dari gangguan adalah AES-GCM dan RC4. Protokol RC4 sudah lama dan relatif aman. Sedangkan GCM masih relatif baru, sehingga beberapa peramban lama tidak mendukung.

[Lama itu hitungannya 10 s.d. 20 tahun yang lalu, ya, kawan-kawan.]

Saat ini RC4 disarankan untuk ditinggalkan. Bukan berarti dia tidak aman. Sudah ada metodenya, tetapi untuk bisa membobol RC4 saat ini memerlukan sumber daya yang sangat besar. Jadi, RC4 relatif cukup aman.

Penggunaan AES-GCM disarankan oleh karena adanya instruksi AES-NI yang mempercepat percepat perhitungan.  Teknik ini peningkatan implementasi dari AES-CBC dengan menggunakan instruksi perangkat keras. Itu sebabnya, AES-CBC disarankan ditinggalkan.

Berikut instruksinya.

ssl_ciphers         "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";

Oh, iya, satu lagi. Dalam konfigurasi ini diaktifkan mode Forward Secrecy yang ada di TLSv1.2.

Mengaktifkan Urutan Enkripsi Di Sisi Server

Instruksinya:

ssl_prefer_server_ciphers on;

Instruksi ini mengakibat peladen akan menyuruh klien untuk menggunakan metode enkripsi yang diinginkan sesuai dengan urutan. Ini mengurangi kemungkinan klien yang sudah mendukung TLSv1.2 malah menggunakan versi terdahulu karena konfigurasi perambannya. Hal ini bisa memitigasi terhadap serangan BEAST.

Menyimpan Sesi SSL

Instruksinya:

ssl_session_cache   shared:SSL:10m;
ssl_session_timeout 10m;

Untuk keperluan optimasi, NGINX dapat menyimpan sesi SSL pada tembolok. Ada dua jenis yang didukung. Yang pertama, tembolok tersebut disimpan oleh NGINX sehingga bisa diakses oleh sesama proses-proses pekerja NGINX. Yang kedua, per pekerja menggunakan tembolok yang disediakan oleh OpenSSL. Disarankan untuk menggunakan tembolok NGINX saja.

Menurut NGINX, 1 MB mampu menampung 4000 sesi. Konfigurasi ini menggunakan 10MB sehingga kira-kira ada 40000 sesi yang didukung. Setiap sesi ini disimpan selama 10 menit saja. Silakan dikonfigurasikan sesuai kemampuan peladen Anda.

Terakhir

Setelah semua selesai, silakan menyalakan ulang NGINX. Mari saya rekap untuk Anda:

  1. Gunakan SPDY untuk mempercepat koneksi HTTPS.
  2. Gunakan kunci dengan algoritma SHA256 atau lebih yang sudah divalidasi oleh CA.
  3. Gunakan protokol TLS teranyar dengan AES-GCM dengan RC4 sebagai cadangan.
  4. Gunakan tembolok untuk mengoptimasi penggunaan TLS.

Anda pun sudah memiliki peladen yang cukup handal. Anda bisa mempelajari teknik-teknik tambahan lain mengenai SSL, misalnya menggunakan OCSP.

Terakhir, Anda perlu mengedukasi pengguna Anda agar tidak memberikan sandi kepada siapa pun dan mengganti sandi secara periodik, misalnya 6 bulan sekali. Percuma punya infrastruktur yang handal tanpa pengguna yang paham.

Nota Bene

Gunakan pihak ketiga untuk menguji SSL. Saya menggunakan perkakas dari Qualys SSL Lab. Contoh hasil pengujian konfigurasi SSL pada Blog Staff UI.

SSL Labs test on Blog Staff UI. Yeah, we need to upgrade into SHA256. The certificate is issued not long ago.

SSL Labs test on Blog Staff UI. Yeah, we need to upgrade into SHA256. The certificate is issued not long ago.

Bacaan Lebih Lanjut

Owncloud: Solusi Perangkat Lunak Bebas

Owncloud: Solusi Perangkat Lunak Bebas

Untuk memenuhi kuota menulis, saya akan menulis mengenai pemasangan Owncloud. Ini bukan karena Snowden yang memberitahukan untuk menghindari menggunakan Facebook, Google, dan Twitter. Tetapi, karena saya memang sedang iseng tentang perangkat lunak ini. Coba ada yang meminta untuk mencoba sesuatu yang lain, saya pasti menulis tentang itu.

Berbeda dengan konfigurasi biasa, saya menggunakan NGINX sebagai peladen HTTP dan PHP-FPM sebagai penyedia PHP. Hal ini karena ada WAF yang bisa dikonfigurasi nantinya apa bila Anda mau membuat ini serius. Ada banyak tambahan yang bisa dibuat dari Owncloud.

Yak, tanpa banyak basa-basi, mari kita memasang. Saya asumsikan Anda telah memasang NGINX dan MySQL pada peladen Anda. Saya juga mengasumsikan Anda menggunakan Debian atau turunannya (BlankOn atau Ubuntu).

Menyiapkan Basisdata

Pertama-tama, siapkan basisdata terlebih dahulu, masuk ke dalam terminal MySQL sebagai Administrator:

sudo mysql --defaults-file=/etc/mysql/debian.cnf

Buat basisdata dan berikan hak akses ke klien Owncloud:

CREATE DATABASE awansendiribd;
GRANT ALL PRIVILEGES ON awansendiribd.* TO 'megawan'@'localhost' IDENTIFIED BY 'week^u2heoQuuv]ah9sah]B~ahShie?t';
FLUSH PRIVILEGES;
QUIT;

Saya menggunakan pwgen untuk membuat sandi yang aman:

pwgen -y 32

Anda bisa buat sendiri sandi Anda, ganti nama basisdata, dan nama klien basisdata yang akan digunakan. Hal ini agar Owncloud Anda bisa aman. Belajarlah untuk aman.

Menyiapkan Rumah

Pada konfigurasi kali ini, saya menggunakan pengguna tersendiri untuk Owncloud. Bukan pengguna baku www-data, tetapi yang berbeda — Anda pun bisa berbeda dari tutorial ini. Caranya:

sudo adduser --home /srv/awani --disabled-password awani

Saya membedakan instalasi Owncloud dengan datanya. Mari buat kedua direktori tersebut.

sudo -u awani mkdir /srv/awani/{app,data}

Selanjutnya, unduh dan pasang Owncloud. Pada penulisan ini, yang terbaru adalah Owncloud 7.0.2. Silakan cek versi terbaru yang mungkin sudah ada saat Anda mencoba ini lagi di masa mendatang.

wget https://download.owncloud.org/community/owncloud-7.0.2.tar.bz2 -O- | \
sudo -u awani tar xvfj - -C /srv/awani/app --strip 1

Sesuaikan dengan direktori Anda sendiri.

Menyiapkan konfigurasi Peladen

Ada dua yang perlu disiapkan:

  1. Peladen PHP-FPM untuk konfigurasi PHP5.
  2. Peladen NGINX untuk HTTPS.

Sekarang konfigurasi PHP-FPM.

Konfigurasi PHP-FPM

Buat berkas konfigurasi /etc/php5/fpm/pool.d/owncloud yang berisi:

[owncloud]
;; I'm using Socket-based connection because it's safer.
;; Set only Owncloud user
user = awani
group = awani
listen = /tmp/php5-awan-awan.sock
listen.owner = awani
listen.group = awani
listen.mode = 0660

;; Set default server pools
pm = dynamic
pm.max_children = 20 
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 5 

;; Set PHP5 logging
chdir = /
php_admin_value[error_log] = /var/log/fpm-php.awan-awan.log
php_admin_flag[log_errors] = on

;; Longer execution time and bigger upload size.
php_admin_value[max_execution_time] = 300 
php_admin_value[upload_tmp_dir] = /tmp
php_admin_value[upload_max_filesize] = 16G
php_admin_value[post_max_size] = 16G

Jumlah peladen itu tidak saya rubah. Silakan Anda sesuaikan dengan kebutuhan dan kemampuan mesin Anda. Berkas yang bisa diunggah pun sampai 16GB. Secara teori, sih, berkat Menkominfo yang mau turun, tidak mungkin ada berkas sebesar itu yang diunggah.

Setelah selesai, aktifkan Owncloud dan muat ulang PHP-FPM Anda.

sudo invoke-rc.d php5-fpm restart

Sekarang saatnya mengonfigurasi NGINX.

Konfigurasi NGINX

Asal Anda tahu, CA yang beredar di pasaran masih menggunakan enkripsi 1024-bit dan 2048-bit. Kalau pun ada yang 4096-bit, mereka menjual sertifikat dengan harga mahal. Itu sebabnya, saya menggunakan sertifikat yang ditandatangani sendiri.

Sedikit tambahan, Debian dan distro GNU/Linux terbaru lainnya menolak menyertakan CA yang masih 1024-bit. Makanya tempo hari kita gagal memasang Origin. Hal ini karena Origin masih menggunakan CA yang 1024-bit. Ya, itulah nasib keamanan sebatas ilusi.

Membuat Sertifikat Ditandatangani Sendiri (Self-signed Certificate)

Mari membuat sertifikat yang bisa ditandatangani sendiri:

sudo openssl req -newkey rsa:4096 -sha512 -x509 -days 3650 -nodes -out /etc/nginx/awan-awan.pem -keyout /etc/nginx/awan-awan.key

Selanjutnya membuat konfigurasi NGINX.

Membuat Konfigurasi NGINX

Buat berkas konfigurasi /etc/nginx/sites-available/owncloud dengan isi sebagai berikut:

## REDIRECT ALL HTTP TO HTTPS
server {
        listen 80;
        server_name awan.contoh.aja; # CHANGE THE HOSTNAME!
        return 301 https://$server_name$request_uri;  # enforce https
}

## HTTPS
server {
        listen 443 ssl;
        server_name awan.contoh.aja; # CHANGE THE HOSTNAME!

        keepalive_timeout   70;

        ## DISABLE SSLv3 only TLS!
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
        ssl_certificate     awan-awan.pem;
        ssl_certificate_key awan-awan.key;
        ssl_session_cache   shared:SSL:10m;
        ssl_session_timeout 10m;

        # Path to the root of your installation
        root /srv/awani/app;

        client_max_body_size 16G; # set max upload size
        fastcgi_buffers 64 4K;

        rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
        rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
        rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

        ## REWRITE FOR BETTER CLEAN URL
        rewrite ^/f/(.*)$       /public.php?service=files&t=$1;

        index index.php;
        error_page 403 /core/templates/403.php;
        error_page 404 /core/templates/404.php;

        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }

        location ~ ^/(data|config|\.ht|db_structure\.xml|README) {
                deny all;
        }

        location / {
                # The following 2 rules are only needed with webfinger
                rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
                rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

                rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
                rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;

                rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;

                try_files $uri $uri/ index.php;
        }

        #Path to default data directory
        location ~ ^/srv/awani/data/ {
            internal;
            root /;
        }

        location ~ ^(.+?\.php)(/.*)?$ {
                try_files $1 = 404;

                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$1;
                fastcgi_param PATH_INFO $2;
                fastcgi_param HTTPS on;
                fastcgi_pass unix:/tmp/php5-awan-awan.sock;
        }

        # Optional: set long EXPIRES header on static assets
        location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
                expires 30d;
                # Optional: Don't log access to assets
                access_log off;
        }
}

Perhatikan kalau saya menghapus SSLv3 dari muka bumi. Setahu saya, hanya IE6 yang masih menggunakan SSLv3. Peramban modern sudah mendukung TLS. Bahkan, kalau mau lebih aman, silakan hapus selain TLSv1.2 agar aman dari gangguan SHARK.

Jalankan ulang NGINX.

 sudo ngxensite owncloud 
sudo invoke-rc.d nginx restart

Sekarang saatnya memulai pemasangan.

Menyiapkan Konfigurasi Owncloud

Setelah semua berjalan sebagai mana mestinya, saatnya membuka peramban dan mengarahkan ke alamat yang telah dibuat. Nanti ada wisaya yang berisi satu halaman konfigurasi pengguna awal (Administrator), letak data, dan konfigurasi basisdata. Saya malas membuat cuplikannya, lebih baik saya arahkan saja.

Bagian pertama adalah membuat Administrator Owncloud.

Create an admin account

  • superman
  • r4NdomP4$sW()Rd

Bagian berikutnya adalah direktori menaruh data.

Data folder

  • /srv/awani/data

Lalu konfigurasi MySQL.

Configure the database

  • megawan
  • week^u2heoQuuv]ah9sah]B~ahShie?t
  • awansendiribd
  • localhost

Setelah itu semua selesai, lalu tekan tombol Finish Setup.

Tunggu sebentar dan hasilnya Anda siap untuk masuk.

Owncloud Login page

Owncloud Login page

Selamat mencoba dan bereksplorasi! Mohon bagi-bagi ilmu kalau ada yang baru.

Bacaan Lebih Lanjut

NGINX + SPDY + Naxsi + NGINX Cache Purge pada Debian

NGINX + SPDY + Naxsi + NGINX Cache Purge pada Debian

Untuk kesederhanaan tulisan ini, saya tidak membahas konfigurasi Naxsi dan NGINX Cache Purge. Nanti bila saya tidak malas, saya akan tulis. Ya, silakan ingatkan saya saja kalau saya lupa. 🙂

Pendahuluan

Teman saya lebih suka melihat dokumentasi di blog saya dari pada Repositori Pengetahuan internal. Ya, sudah, makanya ini saya tulis di blog. Lumayanlah, untuk pengetahuan khalayak ramai juga.

Saat ini Google sedang menggadang-gadang SPDY. Chrome, Firefox, dan banyak peramban modern lainnya sudah mengerti tentang SPDY. Protokol ini diharapkan bisa menghasilkan koneksi yang aman namun lebih cepat dari pada koneksi TLS/SSL (HTTPS) biasa.

Menurut Wikipedia, SPDY menggunakan ekstensi NPN TLS/SSL dari OpenSSL versi 1.x. SPDY yang terbaru sekarang adalah versi 3.1 (SPDY/3.1). Versi 4 sedang masuk tahap alfa dan sejalan dengan HTTP 2.0.

Celakanya, NGINX yang dipaketkan oleh Debian saat ini masih menggunakan SPDY/2.0. Padahal, tak berapa lama lagi versi ini tak didukung oleh peramban. SPDY/3.1 didukung oleh NGINX 1.5.10+.

Hmm…. Saatnya membuka terminal!

Berkas-berkas yang dibutuhkan

Ada tiga paket yang dibutuhkan, NGINX (saat penulisan versi 1.5.12), Naxsi (versi GIT), dan NGINX Cache Purge (saat penulisan versi 2.1). Sebenarnya Naxsi dan NGINX Cache Purge tidak diperlukan. Namun, pada situs yang saya kelola, saya menggunakan kedua komponen tersebut. Untuk Anda mungkin kedua komponen tersebut tidak perlu.

NGINX

$ wget http://nginx.org/download/nginx-1.5.12.tar.gz
$ tar xvfz nginx-1.5.12.tar.gz

NGINX Cache Purge

$ wget http://labs.frickle.com/files/ngx_cache_purge-2.1.tar.gz
$ tar xvfz ngx_cache_purge-2.1.tar.gz

Naxsi

Kalau belum punya GIT, pasang dulu:

$ sudo apt-get install git

Baru lakukan ini:

$ git clone https://github.com/nbs-system/naxsi.git/

Pemasangan

Unduh dan pasang  paket-paket yang dibutuhkan sebelum mengompilasi dan memasang NGINX.

Memasang Paket-paket yang Dibutuhkan

Kalau paling gampang, untuk paket-paket yang dibutuhkan, cukup pasang:

$ sudo apt-get install build-dep nginx

Namun, ini memasang banyak sekali paket yang tak perlu. Cukup lakukan ini saja:

$ sudo apt-get install build-essential libssl-dev libpcre3-dev libgeoip-dev

Memasang NGINX dan Teman-teman

Masuk ke direktori sumber NGINX:

$ cd nginx-1.5.12/

Lakukan tiga langkah buat:

$ CFLAGS="-O2 -pipe -march=native -mtune=native -fomit-frame-pointer" ./configure --prefix=/opt/nginx \
   --with-file-aio --with-ipv6 --with-pcre --conf-path=/etc/nginx/nginx.conf \
   --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log \
   --http-client-body-temp-path=/var/lib/nginx/body --http-proxy-temp-path=/var/lib/nginx/proxy \
   --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx \
   --with-http_secure_link_module --with-http_random_index_module --with-http_ssl_module --with-http_realip_module \
   --with-http_addition_module --with-http_sub_module --with-http_gzip_static_module --with-http_degradation_module \
   --with-http_stub_status_module --with-http_geoip_module --with-http_spdy_module \
   --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --http-scgi-temp-path=/var/lib/nginx/scgi \
   --add-module=../ngx_cache_purge-2.1 --add-module=../naxsi/naxsi_src/
$ CFLAGS="-O2 -pipe -march=native -mtune=native -fomit-frame-pointer" make -j3
$ sudo CFLAGS="-O2 -pipe -march=native -mtune=native -fomit-frame-pointer" make install

Ya, sebagai seorang sysadmin, saya suka mengubah konfigurasi:

  • Karena ini kompilasi, sekalian saja buat supaya binari yang dibuat disesuaikan dengan mesin yang dipakai (alami/native).
  • Konfigurasi tempat berkas konfigurasi, log, dan soket disesuaikan dengan versi Debian.
  • Kompilasi secara paralel dengan menggunakan 3 trit.

Konfigurasi

Setelah terpasang, konfigurasi “/etc/nginx/nginx.conf”. Atau kalau pada Debian, pada “/etc/nginx/sites-enabled/XXXX”, ganti XXXX dengan berkas virtual host Anda misalkan “default”. Tambahkan baris berikut pada blok server:

server {
        ...
        listen 443 ssl spdy;
        ...
}

Lalu aktifkan TLS/SSL seperti biasa, contohnya:

        ssl on;
        ssl_certificate /etc/nginx/ssl/certificate/server.crt;
        ssl_certificate_key /etc/nginx/ssl/certificate/server.key;
        ssl_session_timeout 5m;
        ssl_protocols SSLv3 TLSv1;
        ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
        ssl_prefer_server_ciphers on;

Menyalakan Ulang NGINX

Setelah selesai, matikan NGINX bila sudah ada NGINX di peladen.

$ sudo invoke-rc.d nginx stop

Ubah skrip NGINX di Debian untuk mengarah kepada binari NGINX yang kita kompilasi:

$ sudo sed -i.bak 's/^DAEMON=.*/DAEMON=\/opt\/nginx\/sbin\/nginx/g' /etc/init.d/nginx

Mari nyalakan kembali:

$ sudo invoke-rc.d nginx start

Selesai.

Terakhir

Untuk mengecek apakah sudah benar, bisa dicek di http://spdycheck.org/

Contohnya:

Blog Mahasiswa UI supports SPDY

Blog Mahasiswa UI supports SPDY

Semoga berhasil!

Mencoba SLiMS Cendana 7

Mencoba SLiMS Cendana 7

SLiMS Open Source Library Management System (SLiMS) adalah sebuah manajemen koleksi perpustakaan daring. Selain keanggotaan, kode batang, dan pengaturan koleksi, SLiMS mendukung OPAC dengan pustaka Javascript terbaru. Sayangnya, dia hanya mendukung basisdata MySQL (MariaDB, Percona, dan sejenisnya), tetapi tidak PostgreSQL. Padahal, PostgreSQL lebih bagus dibandingkan dengan MySQL.

Kali ini menjelang pulang kantor saya akan memasang SLiMS dengan menggunakan sistem berbasis NGINX, PHP-FPM, dan MySQL. Ingat, kawan-kawan, ini adalah sebuah keisengan. Jangan lupa untuk riset lebih lanjut. Saya membangun sistem ini dari BlankOn 9 hasil debootstrap.

Memasang Hal-hal Dasar

Mari kita hal-hal dasar sebelum memasang Senayan

Memasang Sistem Dasar

Mari memasang aplikasi-aplikasi yang diperlukan.

$ sudo apt-get install nginx php5-fpm mysql-server php5-mysqlnd php5-gd

NGINX, PHP5-FPM, dan MySQL dipasang. Saya menggunakan MySQL Native Driver (MySQL ND) bukan libmysqlclient. Hal ini karena MySQL ND lebih efisien.(Andrea Usu, 2010) Tak lupa saya juga memasang PHP GD karena SLiMS menggunakannya untuk memroses gambar dan kode batang.

Membuat Basisdata

Lalu mari buat sebuah basisdata Senayan:

$ sudo mysql --defaults-file=/etc/mysql/debian.cnf

Debian menggunakan berkas konfigurasi untuk masuk sebagai administrator MySQL. Berkas konfigurasi ini tidak dapat diakses kecuali oleh root.

mysql> create database senayandb;
mysql> grant all privileges on senayandb.* to senayan@localhost identified by 'senayan123';
mysql> flush privileges;

Setelah itu, keluar dari klien PostgreSQL.

mysql> \q

Anda tentunya tidak akan menggunakan senayan, senayandb, dan “senayan123”, ‘kan? Anda tidak sebodoh itu, ‘kan? Gunakan nama yang lain yang lebih aman!

Memasang Senayan

Saatnya mengunduh Senayan:

$ wget http://slims.web.id/download/slims7-cendana-stable.tar.gz

Lalu memekarkan berkas tersebut:

$ tar xvfz slims7-cendana-stable.tar.gz

Entah mengapa seluruh berkas yang saya ekstraksi memiliki izin 755. Artinya, setiap berkas tersebut rawan untuk bisa dieksekusi. Sebelum diolah lebih lanjut, mari kita betulkan:

$ find slims7_cendana-slims7-cendana/ -type f -exec chmod 644 {} \;

Pindahkan ke /var/www dan buat menjadi milik www-data

$ sudo mv slims7_cendana-slims7-cendana /var/www
$ sudo chown -R 33:33 /var/www

Saatnya mengaktifkan NGINX. Buat konfigurasi situs. Saat ini saya membuat konfigurasi situs berdasarkan /etc/nginx/sites-available/default. Anda dapat mengutak-atik lebih lanjut.

$ cat >> slims < EOF
server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /var/www;
    index index.html index.htm index.php;

    # Make site accessible from http://localhost/
    server_name localhost;

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
        # Uncomment to enable naxsi on this location
        # include /etc/nginx/naxsi.rules
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

        # With php5-cgi alone:
        #fastcgi_pass 127.0.0.1:9000;
        # With php5-fpm:
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    location ~ /\.ht {
        deny all;
    }
}
EOF
$ sudo cp slims /etc/nginx/sites-available/slims
$ rm slims

Cara menyunting konfigurasi ini sebenarnya dapat dilakukan dengan mudah menggunakan penyunting favorit Anda (ViM, EMACS, pico, dll.)

$ sudo $EDITOR /etc/nginx/sites-available/slims

Isi dengan konfigurasi yang diwarnai merah. Perhatikan, ganti localhost dengan domain Anda yang benar.

Sekarang, saatnya mengaktifkan SLiMS dan menonaktifkan konfigurasi baku.

$ sudo rm -f /etc/nginx/sites-enabled/default
$ sudo ln -sf /etc/nginx/sites-available/slims /etc/nginx/sites-enabled/slims

Setelah itu, saatnya menyalakan ulang NGINX.

$ sudo invoke-rc.d nginx restart

Selesai. Selanjutnya tinggal mengarahkan peramban kepada situs kita.

Mengonfigurasi Situs

Kalau Anda telah selesai mengonfigurasi dengan benar, maka tampilan pertama dari SLiMS di peramban adalah laman pemasangan.

A Welcome screen for SLiMS setup.

01. A welcoming start for SLiMS setup.

Pilih "Let's Start The Installation" untuk lanjut. Maka pada laman berikutnya akan ditampilkan isian untuk mengonfigurasi.

Setup configuration for SLiMS

02. Setup configuration for SLiMS

Halaman kedua intinya untuk mengonfigurasi basisdata dan admin SLiMS. Contoh yang saya isi untuk isian tersebut:

Database Host localhost
Database Name senayandb
Database Username senayan
Database Password **********
Generate Sample Data Yes
Username pustakawan
Password *************
Retype Password *************

Saya memilih untuk memasang data contoh agar mendapatkan gambaran mengenai apa itu SLiMS. Nanti kalau sudah digunakan secara penuh, tentunya data contoh ini tak perlu dipasang. Bahkan, dapat dihapus begitu saja. Setelah mengisi itu semua, pilih "Continue" untuk lanjut ke halaman terakhir.

Setup completed

03. Setup completed

Halaman terakhir memberikan rekomendasi untuk menghapus direktori "install/". Namun sebelumnya, mari memulai SLiMS dengan memilih "OK, start the SLiMS". Maka, Anda akan dibawa ke laman depan SLiMS.

SLiMS frontpage

SLiMS frontpage

Seperti rekomendasi pemasang SLiMS, mari hapus direktori pemasangan dan juga membetulkan perizinan berkas yang ada.

$ sudo rm -rf /var/www/install
$ sudo chmod 644 /var/www/sysconfig.local.inc.php

Sampai sini proses konfigurasi awal berhasil. Anda sudah dapat berpuas diri dan berpesta ria. Selanjutnya adalah proses yang saya hendak lakukan di dalam SLiMS agar lebih bagus. Tapi, itu, 'kan, tergantung selera masing-masing.

Bacaan Lebih Lanjut

Daftar Pustaka

Andrea Usu (2010, August 3). Benchmark: libmysql vs mysqlnd. Retrieved Jan 16, 2014 from https://usu.li/benchmark-libmysql-vs-mysqlnd/.^