Di catatan ini, kita akan melakukan proses instalasi dan konfigurasi Consul sebagai komponen pendukung cluster Nomad. Fokus utama kita adalah mengamankan komunikasi antar node menggunakan TLS dan menyiapkan ACL dasar.
Consul menggunakan TLS untuk mengamankan komunikasi antar server. Semua server harus menggunakan sertifikat yang ditandatangani oleh CA yang sama.
Pembuatan CA dan Sertifikat TLS
CA (Certificate Authority) adalah pasangan sertifikat dan private key yang digunakan untuk menandatangani sertifikat TLS pada setiap server Consul.
Semua server dalam cluster harus menggunakan sertifikat yang ditandatangani oleh CA yang sama. Oleh karena itu, CA hanya dibuat sekali dan kemudian didistribusikan ke seluruh node.
Consul menyediakan helper bawaan untuk pembuatan CA dan sertifikat TLS, sehingga tidak perlu menggunakan OpenSSL secara manual.
Membuat CA
Jalankan perintah berikut pada salah satu node (misalnya node-1) atau di workstation kita:
consul tls ca create
Perintah ini akan menghasilkan:
- Sertifikat CA
- Private key CA
File CA ini harus disalin ke seluruh node Consul karena digunakan
untuk memverifikasi koneksi antar server. Untuk menyalin file CA dari workstation
atau server ke server lainnya kita bisa mengguankan scp atau rsync, atau
kalo mau yang lebih bespoke bisa pakai croc.
Menyiapkan tempat Sertifikat
Direktori sertifikat dapat ditempatkan di mana saja. Pada setup ini, aku
menyimpannya di /consul/config/certs.
sudo mkdir -p /consul/config/certs
sudo mv consul-agent-ca.pem /consul/config/certs/
sudo mv consul-agent-ca-key.pem /consul/config/certs/
Pastikan kepemilikan file diubah agar dapat diakses oleh Consul:
sudo chown -R consul:consul /consul/config/certs
Jika user ataupun group consul belum ada, kita bisa start consul dengan
systemctl terlebih dahulu. Langkah ini mungkin akan menghasilkan error karena
konfigurasi yang belum lengkap, tapi user dan group consul akan dibuat secara otomatis.
sudo systemctl start consul
Membuat Sertifikat Server
Setelah CA tersedia di setiap node, buat sertifikat server pada masing-masing node:
cd /consul/config/certs
consul tls cert create -server
Perintah ini akan menghasilkan sertifikat server yang spesifik untuk node tersebut.
Jika nama file CA dan Key berbeda dari default, kita bisa menyesuaikannya
dengan menambahkan flag -ca=<path-to-file> dan -key=<path-to-file> pada perintah di atas.
⚠️ Catatan
Sertifikat server tidak boleh dibagikan antar node.
Yang dibagikan hanyalah file CA.
Untuk melihat perintah TLS lainnya:
consul tls -h
Konfigurasi Consul
Setelah sertifikat tersedia, kita perlu mengonfigurasi Consul agar menggunakan TLS untuk seluruh komunikasi internal. Untuk referensi lengkap lihat di configuration-file.
Edit file konfigurasi Consul di /etc/consul.d/consul.hcl. Konfigurasi default
sudah berisi beberapa pengaturan dasar beserta comment yang menjelaskan
fungsi dari setiap opsi.
datacenter = "dc1"
ui_config {
enabled = true
}
server = true
advertise_addr = "203.0.113.10" # Ganti dengan public IP masing-masing node
bootstrap_expect = 3
# Isi dengan IP address dari seluruh node dalam cluster
retry_join = [
"203.0.113.10",
"203.0.113.11",
"203.0.113.12"
]
tls {
defaults {
verify_incoming = true
verify_outgoing = true
ca_file = "/consul/config/certs/consul-agent-ca.pem"
cert_file = "/consul/config/certs/dc1-server-consul-0.pem"
key_file = "/consul/config/certs/dc1-server-consul-0-key.pem"
verify_server_hostname = true
}
https {
verify_incoming = false
}
}
ports {
https = 8501
}
addresses {
https = "0.0.0.0"
}
Ringkasan:
advertise_addr
Ganti dengan public IP address dari masing-masing node Consul. Alamat ini digunakan oleh node lain untuk berkomunikasi dengan node ini. Karena dalam VM bisa terdapat beberapa interface jaringan, maka kita perlu menentukan alamat yang benar agar node tidak memberi address pada interface yang tidak dapat diakses oleh node lain.bootstrap_expect
Karena kita menjalankan Consul dalam mode server, maka kita perlu menentukan jumlah server yang diharapkan dalam cluster. Dalam contoh ini, kita memiliki 3 node server, sehinggabootstrap_expectdiset ke3. Opsi ini membantu memastikan bahwa cluster tidak akan terbentuk sampai semua server yang diperlukan sudah bergabung.retry_joinDaftar IP address dari seluruh node dalam cluster. Consul akan mencoba bergabung ke cluster dengan menghubungi alamat-alamat ini.tls.defaults
Konfigurasi ini akan diterapkan ke seluruh interface Consul seperti grpc, https, internal_rpc, dan lainnya. Selengkapnyatls.defaults.verify_incoming = true
Mengharuskan setiap koneksi masuk menyertakan sertifikat TLS yang ditandatangani oleh CA yang sama dengan CA yang digunakan oleh cluster.https.verify_incoming = false
Karenaverify_incoming = truediset pada stanzadefaults, maka secara default semua request HTTPS juga wajib menyertakan sertifikat.Opsi ini dimatikan agar Consul UI tetap bisa diakses melalui browser tanpa perlu client certificate.
ports.https = 8501
Mengaktifkan port HTTPS Consul pada port8501, karena secara default port HTTPS dalam keadaan nonaktif.addresses.https = "0.0.0.0"Agar Consul mendengarkan pada semua interface jaringan. Jika tidak diset, maka secara default hanya akan listen pada localhost.
Setelah konfigurasi diset pada tiap node, jalankan Consul dan buat agar berjalan otomatis saat boot:
sudo systemctl enable --now consul
# Pastikan consul berjalan
sudo systemctl status consul
Mengakses Consul
Setelah consul berjalan, kita bisa mengakses Consul UI melalui browser dan juga
CLI yang ada di workstation kita. Untuk mengakses Consul UI buka dengan
salah satu alamat IP dari node di browser https://<node-ip>:8501.
Mengakses Consul dari workstation, untuk referensi lengkap lihat di Consul CLI.
# Set address ke salah satu node
export CONSUL_HTTP_ADDR=https://<node-ip>:8501
# Karena menggunakan self-signed certificate, tambahkan opsi untuk mengabaikan verifikasi TLS
export CONSUL_HTTP_SSL_VERIFY=false
# Lihat daftar member di cluster
consul members
Saat ini komunikasi antar node sudah terenkripsi menggunakan TLS, termasuk akses ke Consul UI dan juga melalu cli. Namun bukan berarti ini aman, karena kalo kita bisa mengakses berarti orang lain juga bisa mengakses.
Bare minimum, kita perlu mengaktifkan ACL untuk membatasi akses ke API Consul, yang mana setiap request harus menyertakan token ACL yang valid.
Konfigurasi ACL Consul
Untuk mengaktifkan ACL di Consul, kita perlu melakukan langkah berikut:
- Mengaktifkan ACL pada agent
- Membuat bootstrap token
Mengaktifkan ACL pada Agent
Tambahkan konfigurasi berikut pada file /etc/consul.d/consul.hcl. Pastikan
untuk menggunakan parameter yang sama untuk seluruh node.
acl = {
enabled = true # Mengaktifkan ACL
default_policy = "deny" # Menolak semua request secara default
enable_token_persistence = true # Menyimpan token di disk agar tetap tersimpan setelah restart
}
Setelah diset, maka kita dapat me-restart Consul di salah satu server terlebih dahulu.
sudo systemctl restart consul
Membuat Bootstrap Token
Setelah ACL diaktifkan, kita perlu membuat bootstrap token yang akan kita gunakan untuk mengakses API Consul dan juga komunikasi antar agent.
Seharusnya token tiap agent berbeda, namun untuk kemudahan pada tahap ini kita akan menggunakan token yang sama pada seluruh node. Selengkapnya bisa baca disini.
Jalankan perintah berikut pada salah satu server, perintah ini akan membuat bootstrap token dan menampilkannya di terminal.
consul acl bootstrap
Jika terjadi error saat membuat bootstrap token, coba untuk mengubah
default_policymenjadiallow, kemudian restart consul dan coba lagi.
Setelah token terbuat, kita perlu menambahkannya pada konfigurasi Consul di
seluruh node. Edit file /etc/consul.d/consul.hcl dan tambahkan konfigurasi
berikut di dalam stanza acl lalu restart Consul di seluruh node.
tokens = {
agent = "<bootstrap-token>"
}
Langkah selanjutnya kita akan mengonfigurasi Nomad dan mengintegrasikannya dengan Consul yang sudah kita siapkan ini.