Konfigurasi Consul

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, sehingga bootstrap_expect diset ke 3. Opsi ini membantu memastikan bahwa cluster tidak akan terbentuk sampai semua server yang diperlukan sudah bergabung.

  • retry_join Daftar 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. Selengkapnya

  • tls.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
    Karena verify_incoming = true diset pada stanza defaults, 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 port 8501, 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.

  • Referensi port Consul

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_policy menjadi allow, 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.