Secara default, Docker daemon hanya bisa diakses dari socket lokal /var/run/docker.sock.
Masalah muncul saat kita memakai traefik, Portainer, atau tool monitoring lintas host yang perlu akses Docker API dari server lain.
Sebagai homelaber pemula, awalnya saya juga membuka port Docker tanpa enkripsi. Ini sangat berbahaya karena sama saja memberi akses root ke jaringan.
Di tutorial ini, kita akan membahas cara proteksi Docker daemon dengan TLS dua arah (mutual TLS) agar 2 host Docker bisa saling komunikasi dengan aman.
Persiapan / Prasyarat #
- Dua server Linux (Node1 & Node2)
- Docker sudah terinstall di kedua node
- Akses root / sudo
- OpenSSL
- Port TCP
2376terbuka di setiap Node - Pemahaman dasar command line Linux
Langkah Demi Langkah Cara Proteksi Docker Daemon dengan TLS (2 Arah) #
Skema Sistem #
| Node | Fungsi |
|---|---|
| CA Server | Penandatangan sertifikat |
| Node1 | Docker Client (Portainer / monitoring) |
| Node2 | Docker Server target |
Komunikasi:
Node1 ⇄ Node2Keduanya saling memverifikasi sertifikat TLS.
1️⃣ Membuat Certificate Authority (CA) #
mkdir -p ~/docker-ca && cd ~/docker-ca
openssl genrsa -out ca-key.pem 4096
openssl req -x509 -new -nodes -key ca-key.pem -sha256 -days 3650 -out ca.pemKenapa perlu CA?
CA berfungsi sebagai root trust agar Node1 dan Node2 hanya menerima koneksi dari sertifikat yang kita tanda tangani sendiri.
2️⃣ Generate Sertifikat Server untuk Node2 #
HOST=node2
openssl genrsa -out node2-key.pem 4096
openssl req -subj "/CN=$HOST" -new -key node2-key.pem -out node2.csr
echo subjectAltName = DNS:$HOST,IP:10.1.1.11,IP:127.0.0.1 > ext-node2.cnf
echo extendedKeyUsage = serverAuth,clientAuth >> ext-node2.cnf
openssl x509 -req -days 825 -sha256 \
-in node2.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial \
-out node2-cert.pem -extfile ext-node2.cnfCopy ke Node2:
scp node2-cert.pem node2-key.pem ca.pem node2:/etc/docker/ssl/Set permission:
sudo chmod 400 /etc/docker/ssl/node2-key.pem
sudo chmod 444 /etc/docker/ssl/node2-cert.pemKenapa SAN & permission penting?
SAN memastikan TLS valid untuk IP / hostname. Permission mencegah kebocoran private key.
3️⃣ Aktifkan TLS di Docker Daemon Node2 #
sudo systemctl edit dockerIsi:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd \
--host=unix:///var/run/docker.sock \
--host=tcp://0.0.0.0:2376 \
--tlsverify \
--tlscacert=/etc/docker/ssl/ca.pem \
--tlscert=/etc/docker/ssl/node2-cert.pem \
--tlskey=/etc/docker/ssl/node2-key.pemReload Docker:
sudo systemctl daemon-reexec
sudo systemctl restart dockerKenapa --tlsverify wajib?
Agar Docker daemon menolak semua koneksi tanpa sertifikat valid.
4️⃣ Generate Sertifikat Client untuk Node1 #
HOST=node1
openssl genrsa -out node1-key.pem 4096
openssl req -subj "/CN=$HOST" -new -key node1-key.pem -out node1.csr
echo extendedKeyUsage = clientAuth > ext-node1.cnf
openssl x509 -req -days 825 -sha256 \
-in node1.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial \
-out node1-cert.pem -extfile ext-node1.cnfCopy ke Node1:
scp node1-cert.pem node1-key.pem ca.pem node1:~/.docker/node2/5️⃣ Test Koneksi Docker Remote #
export DOCKER_HOST=tcp://10.1.1.11:2376
export DOCKER_TLS_VERIFY=1
export DOCKER_CERT_PATH=~/.docker/node2
docker psJika daftar container Node2 muncul → sukses.
6️⃣ Test via Curl #
curl https://10.1.1.11:2376/version \
--cert ~/.docker/node2/node1-cert.pem \
--key ~/.docker/node2/node1-key.pem \
--cacert ~/.docker/node2/ca.pemIntegrasi dengan Portainer / Tool Monitoring Container #
| Field | Value |
|---|---|
| Host | tcp://10.1.1.11:2376 |
| TLS | Enabled |
| Upload files | ca.pem, node1-cert.pem, node1-key.pem |
Dengan ini, traefik bisa membaca Docker API secara aman lintas host.
Penjelasan Teknis Tambahan: Mengapa Docker Perlu TLS? #
Docker API memberikan akses penuh ke host. Tanpa TLS, siapa pun di jaringan bisa:
- Menjalankan container berbahaya
- Menghapus image & volume
- Mengambil alih server
Karena itu, cara proteksi Docker daemon terbaik adalah dengan mutual TLS, bukan firewall saja.
Cara Cepat Renew TLS Jika Cert Expired #
Cek masa berlaku:
openssl x509 -enddate -noout -in /etc/docker/ssl/node2-cert.pemGenerate ulang cert:
openssl genrsa -out node2-key.pem 4096
openssl req -subj "/CN=node2" -new -sha256 -key node2-key.pem -out node2.csr
echo subjectAltName = DNS:node2,IP:10.1.1.11,IP:127.0.0.1 > ext-node2.cnf
echo extendedKeyUsage = serverAuth,clientAuth >> ext-node2.cnf
openssl x509 -req -days 825 -sha256 \
-in node2.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial \
-out node2-cert.pem -extfile ext-node2.cnfReplace & restart Docker.
Troubleshoot Umum #
❌ Cannot connect to the Docker daemon
#
Tambahkan unix socket di ExecStart:
--host=unix:///var/run/docker.sock❌ Docker service gagal start #
Hapus socket lama:
sudo rm -rf /run/docker.sock
sudo rm -rf /var/run/docker.sock
sudo systemctl daemon-reexec
sudo systemctl restart docker❌ permission denied while trying to connect to docker.sock
#
sudo usermod -aG docker $USER
newgrp dockerKesimpulan #
Kini kamu sudah memahami:
- Cara membuat CA & sertifikat Docker
- Cara proteksi Docker daemon dengan TLS
- Cara menghubungkan tool monitoring & docker lintas host secara aman
Dengan konfigurasi ini, Docker API tidak lagi menjadi celah keamanan.