Lewati ke konten utama
  1. Posts/

Cara Proteksi Docker Daemon agar Aman untuk Remote Docker dengan TLS

·674 kata·4 menit
Noor Khafidzin
Penulis
Noor Khafidzin
Daftar isi

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 2376 terbuka 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 ⇄ Node2

Keduanya 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.pem

Kenapa 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.cnf

Copy 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.pem

Kenapa 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 docker

Isi:

[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.pem

Reload Docker:

sudo systemctl daemon-reexec
sudo systemctl restart docker

Kenapa --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.cnf

Copy 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 ps

Jika 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.pem

Integrasi 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.pem

Generate 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.cnf

Replace & 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 docker

Kesimpulan
#

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.

Terkait


Load Comments