Category Archives

128 Articles
Membuat Sertifikat Let’s Encrypt Menggunakan certbot Di Debian Wheezy
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 Wheezy

Maaf, ya, saya suka khilaf lupa menulis tulisan lanjutan. Ha… ha… ha….

Berikut ini adalah cara memasang sertifikat SSL yang ditandatangani oleh Let’s Encrypt dengan menggunakan certbot pada Debian Wheezy. Silakan lihat cara pasang di Wheezy untuk keterangan lebih lanjut.

Aktifkan Repo Debian Wheezy Backports

Anda bisa langsung mengaktifkan repo Debian Wheezy Backports:

echo "deb http://kambing.ui.ac.id/debian-backports/ jessie-backports main" | sudo tee /etc/apt/sources.list.d/debian-backports.list
sudo apt update

Atau nanti tunggu ditanyakan pada saat menjalankan certbot.

Pasang certbot

Unduh dengan pengunduh favorit Anda.

sudo wget https://dl.eff.org/certbot-auto -O /usr/local/bin/certbot-auto
sudo chmod +x /usr/local/bin/certbot-auto

Sebelum Memasang Let’s Encrypt

Siapa tahu Anda malas tidak punya waktu untuk membaca artikel sebelumnya, perhatikanlah:

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

Penulisan DNS di luar cakupan tulisan ini. Berikut contoh direktori .well-known

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;
        }
 
}

Mari memasang certbot.

Sertifikasi

Seperti biasa:

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

Seandainya tadi Anda melewati bagian pemasangan repositori Debian Backports, maka Anda akan ditanyakan:

To use the Apache Certbot plugin, augeas needs to be installed from wheezy-backports.
Would you like to enable the wheezy-backports repository [Y/n]? y

Lalu beberapa pesan pemasangan paket Python virtualenv. Kemudian, ditanyakan alamat info:

Installing Python packages...
Installation succeeded.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):admin@example.com

Lalu, ditanyakan apakah menyetujui syarat dan ketentuan yang diberikan, jawab A untuk setuju.

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at

No Title

No Description

------------------------------------------------------------------------------- (A)gree/(C)ancel: A

Setelah itu, tunggu beberapa saat.

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for example.com
Using the webroot path /var/www/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0000_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.com/fullchain.pem. Your
   cert will expire on 2017-04-19. To obtain a new or tweaked version
   of this certificate in the future, simply run certbot-auto again.
   To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you lose your account credentials, you can recover through
   e-mails sent to admin@example.com.
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Kalau sudah sampai sini, Anda sudah selesai mendapatkan sertifikasi dari Let’s Encrypt.

Konfigurasi NGINX

Kalau mau penjelasan, lihat artikel terdahulu.

Berikut blok SSL:

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;

Nah, untuk Debian Wheezy, ada tambahan yang harus dilakukan.

Penambahan Penjadwalan CRON

Pada paket Debian Jessie, jadwal CRON untuk certbot sudah dipasang pada /etc/cron.d/certbot. Mari tambahkan secara manual untuk Debian Wheezy.

Pertama-tama, coba jalankan apakah sukses.

sudo certbot-auto renew --dry-run

Kalau sudah berhasil, maka pasang pada CRON.

sudo crontab -e

Masukkan entri:

0 */12 * * * /usr/local/bin/certbot-auto renew --quiet --no-self-upgrade

Let’s Encrypt memandatkan untuk pengecekan sehari dua kali.

Terakhir

Selesai.

 

Bacaan Lebih Lanjut

Pasang ZFS Terbaru pada Ubuntu Xenial 16.04

Pasang ZFS Terbaru pada Ubuntu Xenial 16.04

Ubuntu Xenial secara baku memasang ZFS. Sayangnya, saya sering pindah-pindah sistem operasi sehingga versi ZFS yang dimiliki oleh Ubuntu Xenial tidak memadai. Ada fitur yang tidak kompatibel dengan versi ZFS Ubuntu.

Untungnya, perkakas ZFS yang sudah ada di Xenial sudah mumpuni. Yang perlu diperbaiki hanya versi kernelnya. Jadi, itulah yang hendak kita lakukan: memasang kernel ZFS terbaru pada Ubuntu Xenial sehingga fitur-fitur terbaru didukung.

Saya belum tahu efeknya, tetapi mohon berhati-hati bila menggunakan perkakas berbeda dengan kernel. Kalau saya, saya punya cadangan. Lagipula, saya biasa melakukan ini dari CD Pemasangan KDE Neon, distro GNU/Linux berdasarkan Ubuntu Xenial.

Mohon berhati-hati.  Saya tidak bertanggung jawab atas risiko yang Anda lakukan.

Teknis Setelah Mukadimah

Untuk kernel dari Ubuntu, hapus kernel ZFS yang sudah ada:

rm -rf /lib/modules/4.4.0-24-generic/kernel/zfs/

Pasang ketergantungan:

apt -y install build-essential autoconf libtool gawk alien fakeroot linux-headers-$(uname -r)
apt -y install zlib1g-dev uuid-dev libattr1-dev libblkid-dev libselinux-dev libudev-dev
apt -y install parted lsscsi ksh
apt -y install autoconf git libdevmapper-dev

Unduh SPL:

git clone https://github.com/zfsonlinux/spl && cd spl

Buat:

./autogen
./configure --prefix=/usr --with-config=kernel
make -j$(nproc)
sudo make install

Unduh ZFS:

cd ..
git clone https://github.com/zfsonlinux/zfs && cd zfs

Buat:

./autogen.sh
./configure --prefix=/usr --with-config=kernel
make -j$(nproc)
sudo make install

Selesai.

Pasang ZFS GIT di Ubuntu 16.04 Xenial

Pasang ZFS GIT di Ubuntu 16.04 Xenial

Set:

export KERNEL_TARGET_VERSION=`uname -r`

Cuma memastikan versi yang lama tidak ada:

rm -rf /lib/modules/4.4.0-24-generic/kernel/zfs/

Pasang ketergantungan:

apt -y install build-essential autoconf libtool gawk alien fakeroot linux-headers-$KERNEL_TARGET_VERSION
apt -y install zlib1g-dev uuid-dev libattr1-dev libblkid-dev libselinux-dev libudev-dev
apt -y install parted lsscsi ksh
apt -y install autoconf git libdevmapper-dev

INI IMPLEMENTASI YANG RUSAK UNTUK XENIAL. SAYA TIDAK MENGHAPUS KARENA UNTUK KEPERLUAN RISET DI VERSI OS YANG LAIN. MOHON IKUTI CARA DI TULISAN INI.

 

Bacaan Lebih Lanjut

Resep: Jemalloc

Resep: Jemalloc

Pastikan bahwa:

sudo apt-get install build-essential autoconf

terpasang. Perkakas autoconf diperlukan untuk membuat makro-makro yang dibutuhkan. Hal ini karena versi VCS biasanya perlu menjalankan autogen.sh untuk membuat skrip configure.

Ambil dari GIT:

git clone https://github.com/jemalloc/jemalloc.git && cd jemalloc

Lakukan tiga langkah sulap seperti biasa:

./autogen.sh
./configure --prefix=/usr --enable-lazy-lock EXTRA_CFLAGS='-march=native -mtune=native'
make -j$(nproc)
sudo make install_bin install_include install_lib

Eh, empat, deh. Lupa. Kalau memasang dari repositori langsung, bukan versi terbit, harus dibuatkan makronya terlebih dahulu. Baris configure saya tambahkan parameter GCC untuk menggunakan kode-kode ke prosesor saya berhubung jemalloc untuk laptop. Baris make dijalankan sebanyak jumlah prosesor. Baris instalasi secara spesifik dijabarkan untuk hanya memasang pustaka dan binari jemalloc. Ada galat kompilasi dokumentasi di jemalloc yang menyebabkan pemasangan menyeluruh (sudo make install) menjadi gagal.

Memasang RVM

Memasang RVM

RVM adalah sebuah pengatur lingkungan Ruby. Dengan menggunakan RVM, kita bisa memiliki beberapa versi Ruby yang tidak saling bertabrakan. Cocok untuk pengembangan aplikasi Ruby yang versinya sering kali tidak bisa stabil mengikuti distro.

Impor kunci GPG:

curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -

Pasang RVM seperti biasa:

\curl -sSL https://get.rvm.io | bash -s stable --ruby

Selesai.

Catatan Pribadi: Pemasangan ZFS Pada Ubuntu 16.04 Xenial

Catatan Pribadi: Pemasangan ZFS Pada Ubuntu 16.04 Xenial

Versi kernel disesuaikan dengan kebutuhan, namun untuk kesederhanaan anggap saja versi yang sama dengan kernel yang sedang berjalan.

export KERNEL_TARGET_VERSION=`uname -r`

Pasang hal-hal yang dibutuhkan sesuai panduan pada ZFSOnLinux. Saya menambahkan GIT dan GNU Autoconf karena hendak memasang versi GIT.

sudo apt-get install build-essential gawk alien fakeroot linux-headers-$KERNEL_TARGET_VERSION
sudo apt-get install zlib1g-dev uuid-dev libattr1-dev libblkid-dev libselinux-dev libudev-dev
sudo apt-get install parted lsscsi ksh
sudo apt-get install git autoconf

Setelah ini, mari bangun komponen-komponen ZFS, yakni: SPL dan ZFS itu sendiri.

Memasang SPL

Unduh:

git clone https://github.com/zfsonlinux/spl && cd spl

Sebenarnya tidak perlu dengan –with-linux. Sebagai pengingat saja kalau misalnya mau memasang untuk kernel versi lainnya. Misalnya, ada versi kernel terbaru dan sebelum masuk dengan kernel tersebut, kita pasang terlebih dahulu modul kernel. Jalankan skrip konfigurasi untuk mendapatkan skrip configure yang lazim dipakai untuk mengompilasi. Biasanya kalau unduh dari SCM (CVS, SVN, Mercurial, GIT, dan sebagainya), skrip tersebut belum ada. Lalu, lakukan stanza yang seperti biasanya.

./autogen.sh
./configure --prefix=/usr --disable-static --with-gnu-ld --with-linux=/usr/src/linux-headers-$KERNEL_TARGET_VERSION --with-linux-obj=/usr/src/linux-headers-$KERNEL_TARGET_VERSION --libexecdir=/usr/lib/zfs-linux --bindir=/bin --sbindir=/sbin --localstatedir=/var --runstatedir=/run --sysconfdir=/etc
make -j$(nproc)
sudo make install

Tentu saja, biasakan untuk mengompilasi dengan pengguna biasa. Baru setelah mau dipasang, dieskalasi jadi administrator.

Memasang ZFS

Unduh:

cd .. && git clone https://github.com/zfsonlinux/zfs && cd zfs

Lakukan empat stanza standar.

./autogen.sh
./configure --prefix=/usr --disable-static --with-gnu-ld --with-linux=/usr/src/linux-headers-$KERNEL_TARGET_VERSION --with-linux-obj=/usr/src/linux-headers-$KERNEL_TARGET_VERSION --with-systemdunitdir=/lib/systemd/system --with-systemdpresetdir=/lib/systemd/system-preset --with-systemdmodulesloaddir=/etc/modules-load.d --libexecdir=/usr/lib/zfs-linux --bindir=/bin --sbindir=/sbin --localstatedir=/var --runstatedir=/run --sysconfdir=/etc
make -j$(nproc)
sudo make install

Selesai. Bagaimana menjalankan ZFS sudah ada di tulisan yang lain.

MariaDB + Galera Cluster + HAProxy untuk Basisdata Lebih Handal

MariaDB + Galera Cluster + HAProxy untuk Basisdata Lebih Handal

HA Proxy Galera

HA Proxy encapsulate a Galera cluster for High-Availability solution.

Ada banyak aplikasi PHP di luar sana yang secara naas belum bisa pindah dari MySQL ke PostgreSQL. Aplikasi seperti WordPress dan Magento. Untuk aplikasi-aplikasi kritikal tersebut, diperlukan adanya redundansi untuk menjamin data. Untungnya, sekarang sudah ada produk Galera Cluster yang bisa mencapai itu. Produk ini menjadikan serangkaian MySQL Server untuk memiliki replikasi data yang sama.

Eh, tapi kayaknya kalau nanti PHP7 sudah resmi, mereka bakal dipaksa menggunakan ADODB, deh. Abstraksi ADODB memungkinkan SQL yang portabel. Hmm… sepertinya alasan ini nantinya bakal tidak ada.

Atau, mungkin Anda tertarik mengetahui bagaimana layanan MySQL Object (DBaaS) pada AWS dibuat? Atau, bagaimana layanan DBaaS pada OpenStack dibuat?

Ah, sudahlah, apa pun alasan supaya artikel ini ditulis supaya menjaga semangat ngeblog. Sejujurnya, saya menulis tutorial ini karena mood lagi naik akibat mendapatkan banyak Pokémon unik tadi siang di Perpustakaan Pusat UI.

Konfigurasi Peladen

Supaya tidak pusing, saya jelaskan dalam contoh kali ini ada 4 peladen. Satu peladen untuk HAProxy (harusnya dua, tapi saya malas). Lalu, tiga peladen menjadi peladen MySQL. Saya memilih untuk menggunakan MariaDB karena gratis dan mudah konfigurasi Galera-nya.

Peladen HAPROXY (selanjutnya dalam artikel akan saya sebut HAProxy)

  • IP 1: 192.168.1.12
  • IP 2: 192.168.101.1

IP 1 adalah IP eksternal yang digunakan untuk berhubungan dengan aplikasi. IP 2 adalah IP internal dalam jaringan lokal basisdata. Perhatikan baik-baik! Implementasi pusat data yang baik seharusnya memisahkan antara jaringan aplikasi, jaringan basisdata, jaringan administrasi, dan jaringan lainnya. Walau pun keempat peladen ini dijalankan pada VirtualBox sekalipun, tetap saya pisahkan untuk menunjukkan arsitektur yang benar.

Ada tiga peladen yang akan digunakan sebagai peladen basisdata. Saya akan namakan MariaDB1 (192.168.101.10), MariaDB2 (192.168.101.11), dan MariaDB3 (192.168.101.12). Walau pun nantinya setiap peladen bisa ditulisi, saya akan menggunakan peladen MariaDB1 sebagai awalan.

Berhubung saya malas, saya akan kurang detail menjelaskan. Silakan tinggalkan komentar bila kurang jelas. Saya menggunakan Debian Jessie sebagai sistem operasi dasar. Lalu, saya memilih menggunakan MariaDB 10.1 karena dia sudah mendukung langsung Galera Cluster.

Memasang MariaDB

Lakukan ini pada setiap peladen MariaDB: MariaDB1, MariaDB2, dan MariaDB3. Pokoknya, identik!

Memasang Peladen MariaDB

Aktifkan repositori MariaDB. Sebagai contoh dengan menggunakan Perkakas Konfigurasi Repositori kali ini saya ambil cermin Biznet karena yang sebelumnya Kartolo. Buatlah berkas /etc/apt/sources.list.d/mariadb.list yang berisi:

# MariaDB 10.1 repository list - created 2016-07-22 08:52 UTC
# http://downloads.mariadb.org/mariadb/repositories/
deb [arch=amd64,i386] http://mariadb.biz.net.id/repo/10.1/debian jessie main
deb-src http://mariadb.biz.net.id/repo/10.1/debian jessie main

Atau cara lainnya:

sudo apt-get install software-properties-common
sudo add-apt-repository 'deb [arch=amd64,i386] http://mariadb.biz.net.id/repo/10.1/debian jessie main'

Setelah itu, impor kunci publik repositori MariaDB:

sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db

MariaDB versi 10.1 sudah memasang Galera secara baku. Jadi, perintah pemasangan menjadi lebih mudah, cukup:

sudo apt-get install mariadb-server

Setelah itu, matikan layanan MariaDB:

sudo systemctl stop mysql

Atau, kalau Anda nyentrik atau punya alasan idealisme lainnya sehingga tidak menggunakan SystemD:

sudo service mysql stop

Setelah ini, konfigurasi Galera.

Berkas yang Identik

Debian Jessie menggunakan konfigurasi /etc/mysql/debian.cnf untuk menyediakan pengguna internalnya. Pengguna internal ini yang digunakan oleh Debian dalam mengonfigurasi peladen MySQL. Salin berkas tersebut dari MariaDB1 ke MariaDB2 dan MariaDB3 sehingga ketiganya memiliki /etc/mysql/debian.cnf yang identik.

Hanya berkas ini yang tidak identik karena dibuat secara otomatis oleh Debian pada saat pemasangan. Tetapi, kita perlu ketiga peladen memiliki konfigurasi yang identik. Itu sebabnya, satu berkas yang berbeda ini yang perlu disamakan.

Buat Konfigurasi untuk Kluster Galera

Pada ketiga peladen (MariaDB1, MariaDB2, MariaDB3) buat konfigurasi /etc/mysql/conf.d/galera.cnf

[mysqld]
#mysql settings
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
innodb_doublewrite=1
query_cache_size=0
query_cache_type=0
bind-address=0.0.0.0

#galera settings
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_name="apakek_cluster"
wsrep_cluster_address=gcomm://192.168.101.10,192.168.101.11,192.168.101.12
wsrep_sst_method=rsync

Silakan ganti nama berkas galera.cnf dengan nama lain kalau Anda mau. Silakan ganti “apakek_cluster” sesuai selera Anda untuk mendapatkan nama kluster yang jauh lebih baik.

Aktifkan Salah Satu Peladen Terlebih Dahulu

Lakukan langkah ini di salah satu peladen yang akan dimulai pertama kali. Bisa jadi karena pemasangan baru seperti saat ini. Atau, bisa jadi ada mati lampu sehingga menyebabkan seluruh kluster mati. Atau, laptop Anda baru dinyalakan kembali. Intinya, lakukan langkah ini pada saat tidak ada satu pun peladen yang menyala dan kluster ini baru mau dinyalakan dulu.

Bila pada kasus mati lampu atau peladen mati mendadak (crash), periksa berkas /var/lib/mysql/grastate.dat pada masing-masing peladen untuk memilih mana peladen dengan data terbaru. Sehingga, peladen tersebutlah yang dimulai pertama kali.

Bila Anda menggunakan SystemD, gunakan skrip ini:

sudo /usr/bin/galera_new_cluster

Atau, demi alasan idealisme atau apa pun sehingga Anda membuang SystemD dan menggunakan sistem init lainnya:

sudo service mysql start --wsrep-new-cluster

Pada saat ini seharusnya sudah berjalan:

$ sudo mysql --defaults-file=/etc/mysql/debian.cnf -e 'SELECT VARIABLE_VALUE as "cluster size" FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME="wsrep_cluster_size"'
+--------------+
| cluster size |
+--------------+
| 1            |
+--------------+

Kalau 0, berarti Anda ada salah konfigurasi di suatu tempat.

Jalankan Peladen MariaDB Sisanya

Pada dua peladen sisanya, MariaDB dijalankan dengan cara normal:

sudo systemctl start mysql

Atau

sudo service mysql start

Seharusnya, apabila tidak ada kerusakan, pada akhirnya akan ada tiga peladen.

$ sudo mysql --defaults-file=/etc/mysql/debian.cnf -e 'SELECT VARIABLE_VALUE as "cluster size" FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME="wsrep_cluster_size"'
+--------------+
| cluster size |
+--------------+
| 3            |
+--------------+

Sampai saat ini, Galera sudah selesai dibuat. Anda lakukan operasi SQL pada salah satu peladen mana pun hasilnya akan sama.

BONUS TUGAS

Terakhir, untuk tugas. Silakan buat satu pengguna Admin Super yang bisa membuat basis data dan penggunanya. Pengguna ini harus bisa mengakses dari luar.

Konfigurasi HAProxy

Pada salah satu peladen MariaDB (MariaDB1/MariaDB2/MariaDB3), buat sebuah pengguna HAProxy di basisdata. Pengguna ini akan mengkueri basisdata untuk mengecek keberlangsungan masing-masing peladen.

sudo mysql --defaults-file=/etc/mysql/debian.cnf -e "CREATE USER 'haproxy'@'192.168.101.1'"

Ganti nama pengguna haproxy dengan sesuatu yang lebih kreatif. Demi keamanan, jangan cuma copas saja di sini!

Lalu, masuk pada peladen HAProxy dan pasang HAProxy di sana:

sudo apt-get install haproxy

Lalu, buat konfigurasi HAProxy. Caranya, tambahkan baris-baris ini pada berkas konfigurasi /etc/haproxy/haproxy.cfg

# Load Balancing for Galera Cluster
listen galera 192.168.1.12:3306
     balance source
     mode tcp
     option tcpka
     option mysql-check user haproxy
     server node1 192.168.101.10:3306 check weight 1
     server node2 192.168.101.11:3306 check weight 1
     server node2 192.168.101.12:3306 check weight 1

Ganti nama pengguna haproxy dengan sesuatu yang lebih kreatif. Demi keamanan, jangan cuma copas saja di sini!

Lalu, jalankan ulang HAProxy. (Pada titik ini saya sudah malas membuat dua versi)

sudo service haproxy restart

Selesai.

Optimasi

Bonus untuk landasan pemikiran. Berikut arsitektur-arsitektur alternatif yang bisa dibuat untuk memenuhi kebutuhan.

  1. Ganti HAProxy dengan perangkat keras router atau load-balancer.
  2. Pasang HAProxy pada setiap peladen aplikasi agar menghilangkan bottleneck jaringan. Jadi, hubungan antara aplikasi dan basisdata menjadi M:N. Kalau pakai ini, HAProxy lebih baik bind ke localhost jangan ke IP. Jadi, akses per aplikasi langsung ke localhost. Ini pondasi arsitektur layanan mikro (microservice architecture).
    HAProxy per apps

    HAProxy per apps

  3. Partisi peladen-peladen aplikasi untuk mengakses hanya salah peladen dalam kluster.
  4. Tambah jumlah peladen dalam kluster.

Jumlah kluster 3 itu adalah demi memenuhi konsep kuorum.

Optimasi Lebih Lanjut yang Belum Sempat Ditulis Karena Saya Ingin Mencari Pokémon Lagi Riset Lebih Lanjut

Ada riset lanjutan yang dapat membuat arsitektur aplikasi lebih terskalakan. Yakni, membuat sebuah peladen obyek penyimpan (storage object) semacam Amazon S3 dengan menggunakan OpenStack Swift dengan menggunakan CEPH. Atau, implementasi sederhana dengan GlusterFS atau NFS. Silakan kembangkan lebih lanjut agar aplikasi Anda lebih terskalakan.

Gunakan Puppet, Ansible, Chef, atau konfigurator apa pun yang lebih baik. Kalau arsitektur sudah skala besar seperti ini, mengubah peladen satu persatu itu sudah mustahil bila tanpa ada kesalahan. Buat tutorial ini menjadi cookbook/rule yang bisa secara dinamis di-deploy.

Semoga bermanfaat.

Bacaan Lebih Lanjut

WordPress JP: Installing MariaDB

WordPress JP: Installing MariaDB

THERE WAS A BUG IN THE SERVER THAT MADE ME LOST THIS POST. THIS IS THE RETRIEVED VERSION THAT I BACK UP.

It’s obvious that I speed write and take everything from guide. As I said before, writing this in Bahasa Indonesia kind of hard for me. So, I write this as I do in parallel.

Setup Filesystem

Disable ZFS file-level prefetch as in the guide:

cat >> /etc/modprobe.d/zfs.conf << .
options zfs zfs_prefetch_disable=1
.

That would be last on the next reboot, but for now disable:

echo 1 | sudo tee /sys/module/zfs/parameters/zfs_prefetch_disable

Create the dataset and the optimizations:

zfs create -o mountpoint=/var/lib/mysql rpool/MARIADB
zfs set primarycache=metadata rpool/MARIADB
zfs set recordsize=16k rpool/MARIADB

It is optimized to use cache for metadata only if we are going to use INNODB. Its chunk is 16k, so we set it also in ZFS. In the guide we are told that MariaDB log is a 128k chunk — default chunk in ZFS.

Remember that ZFSOnLinux Bug early on? Yeah, we should regenerate Ramdisk everytime we’ve done something to /etc/zfs/zpool.cache. To be honest, I don’t know if any of the operation we did earlier warrant such action. But, just do that for precaution.

update-initramfs -d -k `uname -r`
update-initramfs -c -k `uname -r`

And now, we go with installing MariaDB server.

Installing Database Server

According to MariaDB Repository configuration page, let’s set MariaDB:

cat >> /etc/apt/sources.list.d/mariadb.list << .
# MariaDB 10.1 repository list - created 2016-05-03 08:05 UTC
# http://mariadb.org/mariadb/repositories/
deb [arch=amd64,i386] http://kartolo.sby.datautama.net.id/mariadb/repo/10.1/debian jessie main
deb-src http://kartolo.sby.datautama.net.id/mariadb/repo/10.1/debian jessie main
.

Import its key and update our list:

sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
sudo apt-get update

Install MariaDB server:

sudo apt-get install mariadb-server

Disable MariaDB server double buffer by add a line (mine, vanilla at line 142) with:

skip-innodb_doublewrite

And restart MariaDB server:

sudo systemctl restart mysql

From this onward, we are ready to install WordPress, NGINX and such.

Bacaan Lebih Lanjut

WordPress JP: Installing LAMP Stack with ZFS

WordPress JP: Installing LAMP Stack with ZFS

A REVISION WAS LOST! PLEASE TAKE A LOOK AT THE BOTTOM PAGE FOR GRUB SETTING BEFORE REBOOT.

I’m in fast writing mode as this is probably won’t intended to be understood by most people. I’m writing in this blog as I moving forward installing. To keep writing  and translating from my tacit into Bahasa Indonesia is kind of laboring. Perhaps, if you want, I would reiterate what I do here with better Bahasa Indonesia. But, now, let’s live speed writing.

Preparations

I’ve got Ubuntu 14.04 Live USB on my arsenal. Boot it up and setup some trivial like IP, DNS and stuff. I modify APT sources.list to match my nearest server.

deb http://kambing.ui.ac.id/ubuntu/ trusty main restricted
deb http://kambing.ui.ac.id/ubuntu/ trusty-security main restricted
deb http://kambing.ui.ac.id/ubuntu/ trusty-updates main restricted

Do the update and install SSH and VIM.

sudo -i
apt-get update
apt-get install ssh vim
passwd ubuntu

I need SSH because I can’t stand on server room too long. I’m not going to go on religious war on ViM vs Emacs. Last, change ubuntu user password.

And now the show live from my comfy SSH terminal laptop.

Install Ubuntu ZFS for Ubuntu Live Session

Straight from the doc.

sudo -i
apt-add-repository --yes ppa:zfs-native/stable
apt-get update
apt-get install debootstrap spl-dkms zfs-dkms ubuntu-zfs
modprobe zfs

You may wondering why I’m not upgrading first. Upgrading a temporary system is wasting time, especially one with GUI installed. Okay, now we get to the formatting.

Create A ZFS Pool

I have 2 SATA and 1 SSD. The best for server should be two SSDs. But, hey, beggar can’t choose.

ZFS config: 2 Disks + 1 SSD.

ZFS config: 2 Disks + 1 SSD.

Using GParted, I turned SSD into GPT with 3 partitions:

  • The first 200MB for /boot partition. Some twisted soul refused to use separated partition for /boot, well, good for you! I go with the conservative.
  • 8GB used for ZIL (ZFS Intent Log) drive. ZFS usually use 8GB max for journaling.
  • The rest used for ZFS Cache (ZARC).

But, hey, where is the EFI partition?

I’ve just recently found out that when you give your whole disk to ZFS, it would format the disk into two partitions. One big partition (sX1) for the use of ZFS and one 8MB partition (sdX9) for EFI partition (FAT). Yeah, ZFS automatically turn the disk into GPT partitioning scheme. After adding the two disks into a ZFS pool, the partitions will be like this:

sda: sda1 sda9, sdb: sdb1 sdb9

I’m doing mirroring for sda and sdb. I wish I have one more SSD. I would mirror two partitions on separated SSDs for ZIL. If you are luckier than me, do it! It is for safety measure. But, don’t mirror the cache because it’s wasting space.

Here’s the reality:

zpool  create -f -o ashift=12 -o altroot=/mnt -m none rpool mirror sda sdb log sdc2 cache sdc3

If I may have a dream with two SSDs:

zpool create -f -o ashift=12 -o altroot=/mnt -m none rpool mirror sda sdb log mirror sdc2 sdd2 cache sdc3 sdd3

Disable access time, enable relative time and enable LZ4 compression on tanks.

zfs set atime=off rpool
zfs set relatime=on rpool
zfs set compression=lz4 rpool

If nothing is wrong, we would got:

# zpool status rpool
  pool: rpool
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    rpool       ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        sda     ONLINE       0     0     0
        sdb     ONLINE       0     0     0
    logs
      sdc2      ONLINE       0     0     0
    cache
      sdc3      ONLINE       0     0     0

errors: No known data errors

Next, the partitioning. After this, I’m doing things from Crossroad’s tutorial with some tweaks.

Create Partition

As Debian configuration:

zfs create -o mountpoint=none rpool/ROOT
zfs create -o mountpoint=/ rpool/ROOT/debian-1
zpool set bootfs=rpool/ROOT/debian-1 rpool

What? Yes, I’m installing Debian not Ubuntu.

Last, export the pool we’ve created for later import. We do this so that the ZFS config would read from disk by ID instead of common UDEV naming. Believe me, you don’t want to use UDEV naming (sda, sdb, etc.) on ZFS.

zpool export rpool

Now, we can start installing Debian system.

Install Debian

Reimport ZFS pool and create a ZFS configuration cache file.

zpool import -d /dev/disk/by-id -R /mnt rpool
mkdir -p /mnt/etc/zfs
zpool set cachefile=/mnt/etc/zfs/zpool.cache rpool

REMEMBER: (Straight from the ZFS FAQ)

Run update-initramfs -c -k all after any /sbin/zpool command changes the /etc/zfs/zpool.cache file.

This is the reason of random failures from mounting ZFS root partition.

Install the system and mount all the basic system partitions.

debootstrap --arch=amd64 jessie /mnt http://kambing.ui.ac.id/debian/

And now, configure.

Configure Debian

Hostname.

echo gantenghost > /mnt/etc/hostname
sed -i -Ee "s#(127.+)#\1 gantenghost#" /mnt/etc/hosts

Create configuration for network interfaces. In the spirit of new configuration scheme, I put two files in /etc/network/interfaces.d/

# cat > /mnt/etc/network/interfaces.d/eth0 << .
auto eth0
iface eth0 inet dhcp
.

and

# cat > /mnt/etc/network/interfaces.d/lo << .
auto lo
iface lo inet loopback
.

Mount all the system filesystems.

for f in dev dev/pts proc sys; do mount -v --bind {,/mnt}/$f; done

Chroot there

chroot /mnt /bin/bash

In Debian Configuration

Locales.

apt-get install locales
sed -i -Ee 's/# (en_US.UTF+)/\1/' /etc/locale.gen
locale-gen

Timezone.

dpkg-reconfigure tzdata
apt-get install ntp
/etc/init.d/ntp stop

Remember when I said I’m going to put /boot on different partition? Now is the time.

echo "/dev/sdc1 /boot ext4 rw,relatime,stripe=4,data=ordered 0 0" >> /etc/fstab
mount /boot

Remember also what I said about using the ninth partition of the first disk? Now is the time.

apt-get install dosfstools
mkdir /boot/efi
mkfs.vfat /dev/sda9
echo "/dev/sda9 /boot/efi vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro 0 0" >> /etc/fstab
ap

Install ZFS packages with Debian style. ZFS needs lsb-release package.

cd /tmp
wget http://archive.zfsonlinux.org/debian/pool/main/z/zfsonlinux/zfsonlinux_6_all.deb
apt-get install lsb-release
dpkg -i zfsonlinux_6_all.deb
apt-get update && apt-get install linux-image-amd64 debian-zfs
apt-get install grub2-common grub-efi zfs-initramfs

Last, add a login.

apt-get install sudo vim ssh
adduser user
adduser user sudo

Setup GRUB For ZFS Boot

There is a bug in Debian’s GRUB that makes the system unbootable. First, let’s reconfigure GRUB Default command line:

sudo dpkg-reconfigure grub-efi-amd64

Change Linux default command line (second screen after Linux command line) from

quiet

to

root=ZFS=rpool/ROOT/debian-1 rpool=rpool bootfs=rpool/ROOT/debian-1 quiet

After this, update grub and we are done.

sudo update-grub

Booting to New System

After all preparations, unmount all the filesystems

umount /boot/efi/ /boot
exit
for f in dev/pts dev proc sys; do umount /mnt/$f; done
zfs umount -a
zfs export rpool

Reboot.

Final Thought

Well, you might find some faults here and there. If not, everything after this is straightforward.

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?

HP Pavilion P230AX: Mengaktifkan RTL8723BE

Laptop ini memiliki kepingan kombo WLAN + Bluetooth dengan merk Realtek  8723BE. Setelah lama mencari-cari di jagat Internet, berikut apa yang saya lakukan sehingga WLAN dapat berjalan.

Memasang Penggerak rtlwifi-new

Pasang penggerak dari PPA:

sudo add-apt-repository ppa:hanipouspilot/rtlwifi
sudo apt-get update
sudo apt-get install rtlwifi-new-dkms linux-firmware

Set Region

Lalu, cek apakah WIFI telah ditandai region apa:

sudo iw reg get

Pada kasus saya, masih bernilai 00 (tak bernegara). Saya pun set jadi Indonesia:

sudo iw reg set ID

Sesuai dengan kode negara di ISO.

Sesudah itu, supaya berjalan benar, ubah berkas di /etc/default/crda dengan domain negara kita.

REGDOMAIN=ID

Set IOMMU pada GRUB

Konfigurasikan ulang GRUB: (ganti grub-efi-amd64 dengan grub-pc kalau masih BIOS belum UEFI)

sudo dpkg-reconfigure grub-efi-amd64

Tambahkan baris berikut pada Linux command line:

iommu=soft

umLalu OK semua.

Setelah ini, lalu nyalakan ulang laptop dan selesai.

Bagaimana Debian Membentuk Model FOSS

Bagaimana Debian Membentuk Model FOSS

FOSS bukanlah tentang perangkat lunak gratis saja. FOSS merupakan sebuah kultur untuk berbagi dan melakukan segala sesuatu secara gotong royong.

Bermula dari kekurangan distro SLS yang hanya dikerjakan satu orang, Ian Murdock (RIP) mengundang orang-orang untuk membuat sebuah sistem GNU/Linux baru dalam bentuk paket-paket.

Ide dasarnya adalah sebuah paket perangkat lunak mengerti bagaimana caranya mengintegrasi dirinya sendiri pada sistem; mengerti bagaimana menghapus dirinya sendiri; dan mampu memperbaharui dengan aman ke versi terbaru.

 

Bacaan Lebih Lanjut

MariaDB Mematikan Fitur PERFORMANCE_SCHEMA Secara Baku

Mulai MariaDB versi 10.0.12, MariaDB akan mematikan fasilitas PERFORMANCE_SCHEMA secara baku. Hal ini dilakukan untuk menambah performa peladen. Saya pribadi sudah lama tidak pernah memanfaatkan fungsi itu. Toh, fungsi statistika disediakan oleh yang lain.

 

 

Bacaan Lebih Lanjut

Mengubah Format PEM (Apache/NGINX) ke Keystore JAVA

Mengubah Format PEM (Apache/NGINX) ke Keystore JAVA

Untuk organisasi/individu yang memegang domain dengan banyak sub-domain, biasanya dibeli sertifikat wildcard. Dengan sertifikat wilcard, tak perlu membeli sertifikat per sub-domain. Hanya saja, biasanya format yang diberikan adalah PEM untuk peladen HTTP semacam Apache2 atau NGINX.

Bagaimana dengan peladen berbasis Web macam Tomcat?

Saya asumsikan sudah ada tiga berkas ini:

server.key
Kunci privat peladen.
server.crt
Sertifikat peladen yang sudah ditandatangani oleh CA.
ca.cert
Sertifikat CA yang menandatangani sertifikat peladen.

Selanjutnya, ubah bentuk X.509 ke format PKCS12 dengan OpenSSL:

openssl pkcs12 -export -in server.crt -inkey server.key -out keystore.p12 -name red5 -certfile ca.cert

Anda akan ditanyakan sandi baru. Jangan lewati karena proses berikutnya butuh sandi tersebut! Isi sandi dengan sandi yang aman.

Selanjutnya, impor kunci PKCS12 tersebut ke sebuah keystore Java:

keytool -importkeystore -deststorepass ahs8kahLuvu3nahb -destkeypass ahs8kahLuvu3nahb -destkeystore keystore.jks -srckeystore keystore.p12 -srcstoretype PKCS12 -srcstorepass ahs8kahLuvu3nahb -alias red5

Saya menggunakan PWGen untuk membuat sandi acak. Mohon ganti ahs8kahLuvu3nahb dengan sandi yang Anda telah masukkan sebelumnya pada proses openssl.

Selesai. Anda kini sudah memiliki keystore.jks yang siap dipakai oleh aplikasi Java untuk membuat koneksi SSL/TLS.

Selamat mencoba.

Tentang Pengembangan Laman Situs

Tentang Pengembangan Laman Situs

Laman Depan

Saat ini, ada konsep yang bernama landing page. Inti dari landing page adalah konsep Call To Action (CTA). Ada sebuah tombol atau borang yang mengajak langsung pengunjung untuk beraksi. Aksi yang dimaksud misalnya mengajak untuk mendaftar atau membeli.

Kebetulan situs ini tidak untuk kepentingan komersial. Bahkan, Anda bisa saja menolak semua cookies yang ada di situs ini karena itu dari pihak ketiga. Ya, saya menggunakan tombol CTA untuk ke halaman daftar tulisan blog.

Saya menggunakan LayerSliderWP yang telah dibeli oleh Humas UI untuk membuat tampilan. Tematik yang saya gunakan (Limitless) sudah mendukung langsung. Tinggal saya mempelajari tulisan yang ada.

Poster

Saya iseng-iseng membuat sebuah poster dengan cara yang benar karena sayang melihat poster web hanya sebuah satu gambar JPEG. Kerap kali kita senang membuat poster/infografis daring bermodalkan sebuah gambar besar. Sayangnya, mesin-mesin pencari tidak dapat menangkap isi data poster/infografis tersebut. Sehingga, informasi yang sebenarnya ingin disebarkan ke web menjadi terbatas saja. Selain itu, ukuran menjadi sangat besar.

Untuk itu, perlu dibuatkan sebuah poster/infografis ala web. Saya menggunakan RevSlider yang telah dibeli Humas UI sebagai perkakas.

Konsepnya sama seperti menggunakan penyunting grafis seperti GIMP/Photoshop. Gambar dijadikan beberapa lapisan (layer). Beberapa lapisan yang berisi info berupa tulisan biasa. Untuk ikon dan gambar orang, misalnya, baru digunakan lapisan grafis.

Basi, ‘dong?

Tentu tidak! Dengan adanya fonta daring (web font) yang dapat diakses dari Google Fonts, dapat dibuat tulisan dengan jenis huruf yang nyeleneh seperti yang dijumpai pada komputer pribadi.

Tentunya, pembuatan poster ICACSIS 2015 yang saya buat jauh dari sempurna. Ada beberapa perbaikan yang saya pikir perlu:

  1. Menggunakan flat design dengan menghindari latar belakang gambar. Selain lebih sederhana, ukuran total menjadi lebih kecil.
  2. Menghitung piksel yang benar sehingga konsisten pada semua tampilan.
  3. Belajar desain yang lebih menarik. 🙂

Demikianlah, saya masih dalam taraf belajar.

Gambar Latar

Dari studi kasus situs IBM, ada dua hal yang saya dapat pelajari, yakni gambar yang digunakan untuk latar blok CTA dan gambar yang digunakan untuk efek paralaks. Selain itu, permainan warna yang digunakan oleh IBM cenderung warna-warna kalem dan komposisi foto yang warnanya terbatas sehingga dapat dikompresi dengan ukuran yang kecil.

Gambar untuk CTA

Yang menjadi misteri adalah ketika menghitung berapa dimensi gambar latar, kalau pun seharusnya menggunakan gambar latar. Kalau saya lihat dari IBM.com pada laman MobileFirst-nya, mereka menggunakan dimensi 1600×400px dan 1600×520px. Di beberapa laman lainnya ada yang 1600×450px.

Gambar untuk Parallax

Untuk tipe gambar parallax, dimensi yang digunakan oleh IBM pada laman cloud computing adalah 1480×987px.

Terakhir

Saya masih penasaran untuk membuat landing page yang bagus. Saya lihat, situs-situs seperti IBM minim animasi. Mungkin untuk mengurangi distraksi dan membuat berat sistem.

Ah, saya jadi ingin mengoprek lebih lanjut.

Dunia Tak Seindah Dulu

Dunia Tak Seindah Dulu

Sebagai janitor yang berbakti, saya suka berkunjung ke situs-situs yang seharusnya dikelola oleh orang lain. Kebetulan lapak orang itu menempati lahan yang saya kelola. Ya, sebagai bakti sosial, saya juga suka membantu lapak-lapak itu.

Suatu hari, saya secara tak sengaja menemukan akses ke URL yang seharusnya tidak ada, yakni akses ke kfc.i.illuminationes.com/snitch, pada peramban saya. [Pada Firefox tekan F12 pada jaringan

Hmm… domain apakah ini?

Ternyata usut punya usut, ini adalah  salah satu domain yang digunakan oleh spyware!

Menurut ddmcleod, penyebab injeksi ini adalah komputer yang terinfeksi oleh malware khusus. Malware ini mendeteksi pengguna yang merupakan admin WordPress. Sehingga, ketika pengguna sedang login ke situsnya yang berbasis WordPress, malware ini akan menginjeksi situs tersebut dengan menambahkan skrip Javascript pada setiap header.php tematik yang ada di situs itu.

Niat sekali pembuat malware ini. Mereka berusaha menginjeksi komputer-komputer di seluruh dunia dengan harapan ada admin WordPress yang memakai komputer terinjeksi malware tersebut untuk mengakses situsnya.

The malicious code.

The malicious code. I screen-captured it so that Google won’t block my site.

Canggih sekali malware zaman sekarang.

Cara saya mendeteksi setiap tematik itu adalah dengan menjalankan berikut:

grep -ri 1Aqapkrv

dan saya pun menemukan skrip aneh. Lalu, saya satu persatu menghapus tematik yang tak diperlukan dan menghapus baris injeksi.

Selamat berburu.

Bacaan Lebih Lanjut

Cara Membuat Situs WordPress Hanya-Baca

Cara Membuat Situs WordPress Hanya-Baca

Untuk mengurangi akibat pembobolan situs, batasi akses situs WordPress dengan membatasi akses pengguna MySQL.

  1. Masuk ke dalam MySQL dan pilih basisdata:
    sudo mysql --defaults-file=/etc/mysql/debian.cnf
  2. Untuk melihat GRANT apa saja yang didapatkan:
    mysql>  SHOW GRANTS FOR 'pengguna'@'localhost';
    +-----------------------------------------------------------------------------------------------------------------+
    | Grants for pengguna@localhost                                                                                   |
    +-----------------------------------------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'pengguna'@'localhost' IDENTIFIED BY PASSWORD '*PASSWORDYANGDIHASHED'                     |
    | GRANT ALL PRIVILEGES ON `basis_data`.* TO 'pengguna'@'localhost'                                                |
    +-----------------------------------------------------------------------------------------------------------------+
    2 rows in set (0.00 sec
  3. Pada contoh, seperti umumnya pengguna MySQL yang diberikan berhak melakukan apa saja kepada basisdata tersebut. Cabut semua akses basisdata:
    REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'pengguna'@'localhost';
  4. Setelah semua izin dicabut, maka izinkan pengguna untuk membaca saja isi basisdata:
    GRANT SELECT ON basis_data.* TO 'pengguna'@'localhost';
  5. Selesai. Bila benar dilakukan, maka tabel perizinan akan berisi hal berikut:
    mysql>  SHOW GRANTS FOR 'pengguna'@'localhost';
    +-----------------------------------------------------------------------------------------------------------------+
    | Grants for pengguna@localhost                                                                                   |
    +-----------------------------------------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'pengguna'@'localhost' IDENTIFIED BY PASSWORD '*PASSWORDYANGDIHASHED'                     |
    | GRANT SELECT ON `basis_data`.* TO 'pengguna'@'localhost'                                                        |
    +-----------------------------------------------------------------------------------------------------------------+
    2 rows in set (0.00 sec