Category: Server

DatabaseMac OSServerTeknologiUbuntuWindows

Panduan Lengkap: Cara Membuat Pengguna Baru dan Pemberian Izin di MySQL

MySQL adalah salah satu sistem manajemen basis data (database management system) yang paling populer dan banyak digunakan di dunia. MySQL dikembangkan oleh perusahaan Oracle Corporation dan tersedia secara gratis sebagai perangkat lunak open source. MySQL biasanya digunakan untuk aplikasi web dan digunakan sebagai database untuk banyak aplikasi web populer, seperti WordPress, Joomla, Drupal, dan lain sebagainya.

(more…)
Server

Cara Instalasi WordPress dengan Docker Compose

Sebenarnya instalasi WordPress cukup sederhana, dengan menyewa layanan hosting yang sudah umum, biasanya terdapat fitur untuk instalasi WordPress secara mudah. Namun, di saat pengunjung blog kita sudah mulai merangkak naik, banyak penyedia layanan hosting akan menghentikan semua website yang sudah terlalu banyak menyedot sumber-daya server mereka. Di saat inilah, kita harus mempertimbangkan untuk menempatkan blog kita di sebuah server Cloud atau VPS.

Supaya wordpress bisa berjalan, kita membutuhkan server web dan server database, bisa LAMP (Linux Apache MySQL PHP) atau LEMP (Linux NGINX MySQL PHP). Proses instalasi kedua server tersebut akan memakan waktu yang tidak sedikit, apalagi banyak juga yang belum paham tentang server. Di sisi lain, apabila terdapat masalah pada kode PHP, maka server sangat rentan untuk diretas melalui website yang kita jalankan. Nah, Docker merupakan sistem yang akan melokalisir semua aplikasi di dalam container-nya, sehingga memperkecil peluang akan mengganggu server utama maupun aplikasi lain di container yang berbeda.

Prasyarat

Instalasi Docker-Compose

Tools yang bermanfaat untuk menyederhanakan proses instalasi adalah docker-compose. Install dengan curl:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version

Buat folder untuk file docker-compose.yml berikut file nya dengan perintah berikut:

mkdir blog && cd blog
cat > docker-compose.yml << EOF
version: "3"
    
services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: sandiroot
      MYSQL_DATABASE: namadatabase
      MYSQL_USER: penggunawordpress
      MYSQL_PASSWORD: sandiwordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html
      - apache_etc:/etc/apache2
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: penggunawordpress
      WORDPRESS_DB_PASSWORD: sandiwordpress
      WORDPRESS_DB_NAME: namadatabase
volumes:
  db_data: {}
  wordpress_data: {}
  apache_etc: {}
EOF

Saya tidak meng-ekspos satu port pun pada file docker-compose.yml di atas, karena nantinya jika kita akan menghubungkannya dengan NGINX sebagai reserve proxy web servernya tinggal diakses alamat ip container-nya.

Untuk membuat container berdasarkan file docker-compose. Ketikkan perintah berikut di folder yang sama:

docker-compose up -d
  • up: membuat jika belum ada container dengan nama yang sama, dan menjalankan container yang berhasil dibuat.
  • -d: mode detach, yaitu menjalankan container di latar belakang.

Periksa file docker-compose.yml jika terjadi masalah, kemungkinan terdapat container yang sudah ada dengan nama sama. Jika tidak ada pesan kesalahan, periksa apakah container yang baru saja dibuat sudah aktif:

docker ps
  • ps: daftar container

Karena kita tidak menentukan nama container, biasanya akan dibuatkan oleh Docker dengan format: [folder]_[nama-services]_[integer]. Jadi kemungkinan nya adalah nama container wordpress kita adalah blog_wordpress_1. Jika tidak terlihat, coba tambahkan flag -a di belakang opsi ps. Jika tidak aktif saat baru dibuat, cek juga log nya dengan:

docker logs blog_wordpress_1
docker logs blog_db_1

Apabila semua proses tidak ada kendala apapun, kita bisa melanjutkannya dengan konfigurasi reserve proxy NGINX yang akan menghubungkan blog wordpress kita dengan internet sehingga bisa diakses dari luar server. Periksa alamat ip yang dihasilkan dari pembuatan container di atas:

docker inspect blog_wordpress_1
  • inspect: menampilkan informasi dari objek Docker

Perhatikan output json yang muncul, pada baris IPAddress. Contoh:

                    "Gateway": "172.31.0.1",
                    "IPAddress": "172.31.0.3",
                    "IPPrefixLen": 16,

Perhatikan alamat IP container wordpress kita adalah: 172.31.0.3. Maka konfigurasi NGINX nya adalah:

    location / {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $host;
        proxy_pass http://172.31.0.3;
    }

Pada baris proxy_pass kita gunakan http://172.31.0.3 tanpa port, karena secara default http akan mengakses port 80. Anda bisa menggantinya dengan https jika web server apache sudah dikonfigurasi untuk mendukung SSL.

Karena kita menggunakan NGINX sebagai reserve proxy, konfigurasi web server apache yang berada di dalam container untuk mengenali bahwa ip nginx dianggap sebagai ip proxy bukan ip pengunjung, sehingga apache2 akan bisa mengenali alamat ip pengunjung sebagai REMOTE_ADDR bukan X_FORWARDED_FOR. Periksa lokasi volume dengan perintah docker inspect seperti di atas, perhatikan baris yang ada kata Mounts:

        "Mounts": [
            {
                "Type": "volume",
                "Name": "blog_wordpress_data",
                "Source": "/var/lib/docker/volumes/blog_wordpress_data/_data",
                "Destination": "/var/www/html",
                "Driver": "local",
                "Mode": "rw",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "blog_apache_etc",
                "Source": "/var/lib/docker/volumes/blog_apache_etc/_data",
                "Destination": "/etc/apache2",
                "Driver": "local",
                "Mode": "rw",
                "RW": true,
                "Propagation": ""
            }
        ],

Sesuai dengan lokasi folder blog_apache_etc, edit file remoteip.conf:

sudo nano /var/lib/docker/volumes/blog_apache_etc/_data/conf-available/remoteip.conf

Biasanya file remoteip.conf sudah berisi:

RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 10.0.0.0/8
RemoteIPTrustedProxy 172.16.0.0/12
RemoteIPTrustedProxy 192.168.0.0/16
RemoteIPTrustedProxy 169.254.0.0/16

Apabila alamat ip apache server yang berada di container 172.31.0.3, maka tidak perlu melakukan perubahan terhadap file tersebut, karena 172.16.0.0/12 akan menjangkau sampai ip 172.31.254.254.

Pastikan modul remoteip sudah aktif, masuklah ke container dengan perintah:

docker exec -it blog_wordpress_1 /bin/bash
  • exec: menjalankan perintah pada container yang sedang aktif
  • -it: interaktif terminal
  • blog_wordpress_1: container yang akan diakses
  • /bin/bash: jenis shell terminal.

Aktifkan modul remoteip dengan perintah:

a2enmod remoteip

Jika sudah aktif, akan muncul pesan: Module remoteip already enabled. Namun jika belum, pesan nya akan seperti ini:

Enabling module remoteip.
To activate the new configuration, you need to run:
  service apache2 restart

Keluar dari container:

exit

Restart container:

docker restart blog_wordpress_1

Cek lagi dengan:

docker ps

Jika sudah terlihat aktif, maka seluruh proses bisa dianggap selesai, dan kita bisa mengakses nya dari nama domain yang kita konfigurasi di NGINX. Dengan terlokalisir-nya blog wordpress di sebuah container berarti kita sudah menurunkan resiko peretasan sistem apabila terdapat bugs pada aplikasi wordpress nya.

Photo by Michael Faes from FreeImages

ServerSistem OperasiUbuntu

Cara Membuat dan Menggunakan Pasangan Kunci SSH

SSH adalah protokol jaringan kriptografi yang memungkinkan pengguna dapat mengakses server secara aman pada jaringan yang tidak aman. Secara default, SSH dapat diakses dengan kata sandi sebagai otentikasi.

Serangan umum terhadap SSH adalah dengan melakukan peretasan kata sandi brute-force, yaitu menebak kata sandi dengan bantuan aplikasi. Untuk mengurangi resiko seperti ini sangat direkomendasikan untuk menggunakan otentikasi dengan pasangan kunci.

Pasangan kunci adalah dua set kunci yang salah satunya akan ditaruh di sisi server, dan kunci lainnya akan digunakan untuk mengakses server. Analoginya seperti anak kunci (kunci privat) dan lubang kunci pada pintu (kunci publik). Untuk memasuki rumah, kita harus menggunakan anak kunci supaya bisa membuka pintu, meski saat ini sudah banyak pintu yang dikunci menggunakan PIN. Memang PIN akan memudahkan pemilik rumah untuk keluar masuk rumah tanpa harus membawa-bawa kunci, namun juga mudah disusupi oleh orang-orang yang tidak diinginkan, seperti maling.

Membuat Pasangan Kunci

Sebenarnya ada 4 jenis kunci SSH, di antaranya: DSA, RSA, ECDSA dan Ed25519. Sangat direkomendasikan hanya menggunakan RSA dengan panjang 4096 bit, dan jenis Ed25519.

RSA merupakan jenis kunci SSH default pada banyak sistem saat ini, namun apabila dibandingkan dengan Ed25519, RSA lebih lamban dan lebih rentan. Ed25519 hanya tersedia di sistem-sisterm terbaru yang dikenalkan pada OpenSSH versi 6.5 adalah implementasi ECDSA menggunakan Twisted Edward Curve. Metode tersebut menawarkan keamanan yang lebih baik dengan performa lebih cepat dibandingkan dengan DSA ataupun ECDSA.

Kunci publik Ed25519 sangat kompak, hanya terdiri dari 68 karakter, dibandingkan dengan RSA 3072 yang terdiri dari 544 karakter. Membuat kunci Ed25519 sama cepatnya dengan saat menggunakannya untuk mengakses server. Buka terminal dengan ketikan perintah berikut untuk membuat kunci SSH:

ssh-keygen -o -a 100 -t ed25519 -f ~/.ssh/id_ed25519 -C "[email protected]"

Kita akan ditanyakan untuk memasukkan kata sandi untuk kunci ini, disarankan menggunakan kombinasi kata yang sulit ditebak, bahkan oleh kita sendiri.

  • -o: menggunakan format OpenSSH terbaru
  • -a: jumlah putaran KDF (Key Derivation Function). Makin tinggi angka menghasilkan verifikasi kata sandi lebih lamban, namun menambah ketahanan serangan brute-force apabila kunci privat tercuri.
  • -t: menentukan jenis kunci yang akan dibuat.
  • -f: menentukan lokasi file-file dari pembuatan kunci. Jika tidak digunakan, maka file akan tersimpan di folder .ssh
  • -C: Opsi menentukan komentar, yang akan ditambahkan pada akhir isi file kunci publik. Jika tidak digunakan, maka komentar akan diisi dengan <login>@<hostname>.

Untuk jenis RSA, gunakan perintah berikut:

ssh-keygen -t rsa -b 4096
  • -b: panjang bit.

Selanjutnya salin kunci publik ke server yang kita inginkan:

ssh-copy-id [email protected]_ip_server

Semua kunci publik yang berada di folder .ssh akan disalin ke server yang lokasi filenya ada di .ssh/authorized_keys. Selanjutnya kita bisa masuk ke server dengan kunci privat. Ubah layanan SSH untuk hanya menerima kunci bukan kata sandi.

Photo by Fons Reijsbergen from FreeImages

ServerSistem OperasiUbuntu

Cara Instalasi dan Menggunakan Docker di Ubuntu 20.04

Docker adalah sebuah sistem yang menyederhanakan pengaturan proses aplikasi yang terisolasi dalam sebuah server, sehingga proses yang dijalankan dengan Docker tidak akan mengganggu sistem utamanya. Dapat dianalogikan sebuah kapal peti kemas sebagai server, sehingga apapun yang terjadi di dalam salah satu peti kemas yang diangkutnya diharapkan tidak akan berdampak langsung terhadap kapal pembawa-nya maupun peti kemas lainnya.

Di sisi lain, ada jenis server yang disebut VPS (Virtual Private Server) yang merupakan hasil pembagian hardware dengan menggunakan teknologi virtualisasi. Pada sistem ini, hardware harus dibagi secara eksplisit, apabila server utama memiliki RAM sebesar 16GB, maka pembagian RAM pada VPS yang aktif tidak boleh melebihi kapasitas RAM pada server utama. Sebagai contoh, jika terdapat 3 VPS dengan RAM 4GB diberikan kepada setiap VPS, maka total yang digunakan oleh VPS aktif adalah 12GB, sedangkan sisanya hanya sekitar 4GB yang bisa dimanfaatkan oleh server utama.

Berbeda dengan VPS, di dalam sebuah server atau bahkan VPS, kita dapat membuat Container Docker sebanyak yang dibutuhkan. Sumber daya yang tersedia dapat diperebutkan oleh semua Container yang sedang aktif.

Instalasi Docker

Perbaharui daftar paket pada sistem Ubuntu:

sudo apt update

Instalasi beberapa paket berikut supaya apt menggunakan paket melalui HTTPS:

sudo apt install apt-transport-https ca-certificates curl software-properties-common -y

Tambahkan kunci GPG dari repository resmi Docker ke sistem Ubuntu:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Tambah repository Docker pada APT source:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"

Perintah di atas juga meng-update database paket dengan paket-paket dari Docker yang repo nya tadi ditambahkan. Pastikan untuk meng-install dari repo Docker dan bukan dari repo default dari Ubuntu:

apt-cache policy docker-ce

Outputnya akan seperti ini:

docker-ce:
  Installed: (none)
  Candidate: 5:20.10.11~3-0~ubuntu-focal
  Version table:
     5:20.10.11~3-0~ubuntu-focal 500
        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages

Informasi tersebut menandakan docker-ce belum terinstall, namun kandidat untuk instalasi berasal dari repository Docker untuk Ubuntu 20.04 (focal). Selanjutnya install Docker:

sudo apt install docker-ce

Setelah selesai, seharusnya Docker sudah terinstall, daemon aktif, dan proses diaktifkan saat boot. Cek dengan perintah berikut:

sudo systemctl status docker

Outputnya akan seperti ini:

● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2021-11-29 12:36:21 UTC; 29s ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 2887 (dockerd)
      Tasks: 7
     Memory: 37.0M
     CGroup: /system.slice/docker.service
             └─2887 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Informasi di atas menandakan Docker sudah aktif.

Secara default perintah-perintah Docker hanya bisa dijalankan oleh akun root atau akun yang berada pada grup docker. Untuk menjalankan perintah docker tanpa akun root atau tanpa sudo, kita harus menambahkan user biasa ke dalam grup docker:

sudo usermod -aG docker ${USER}

Untuk mengaktifkan keanggotaan grup docker, keluar dari sistem dan masuk kembali, atau ketikkan perintah berikut:

su - ${USER}

Masukkan kata sandi user untuk melanjutkan. Pastikan user sudah ditambahkan ke grup docker:

groups

Outputnya akan seperti ini kira-kira:

joko sudo docker

Sampai di sini, kita sudah bisa menjalankan semua perintah docker tanpa perlu root atau sudo. Tutorial membuat container di dalam docker dan pengaturan lainnya, insya Allah akan saya buatkan artikel terpisah.

Photo by Ken Munyard from FreeImages