API Docker sepenuhnya tidak terlindungi secara default kecuali untuk izin sistem file pada soket Unix-nya. Anda harus menyiapkan TLS saat mengekspos Docker API melalui TCP sehingga Docker Engine dan klien Anda dapat memverifikasi identitas satu sama lain. Jika tidak, siapa pun yang memiliki akses ke port TCP dapat menelusuri wadah Docker Anda, memulai yang baru, dan menjalankan tindakan sebagai root
di sistem Anda.
TLS yang dikonfigurasi akan meminta klien untuk menunjukkan sertifikat valid yang ditandatangani oleh otoritas sertifikat server. Untuk membuatnya berfungsi, Anda perlu membuat sertifikat SSL, lalu menyiapkan Docker Engine untuk memerlukan koneksi TLS. Klien CLI Docker juga harus disesuaikan untuk mengharapkan server TLS.
Membuka TCP Socket
Anda dapat mengekspos soket TCP Docker dengan menggunakan -H
tandai untuk menentukan titik akhir tambahan saat memulai dockerd
proses. Bendera ini dapat diulang beberapa kali; dalam contoh ini, soket Unix dan soket TCP akan tersedia:
/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
Port 2375 secara konvensional digunakan untuk koneksi Docker yang tidak terenkripsi. Port 2376 harus digunakan sebagai gantinya setelah TLS disiapkan.
Anda dapat mengonfigurasi Docker untuk menggunakan flag ini secara otomatis dengan memodifikasi definisi layanan Docker Anda. Tambahkan override di /etc/systemd/system/docker.service.d/override.conf
yang mengubah ExecStart
baris:
[Service] ExecStart=/usr/bin/dockerd -H ...
Muat ulang systemd untuk menerapkan perubahan:
sudo systemctl daemon-reload
Membuat Otoritas Sertifikat Anda
Mulailah dengan membuat Certificate Authority (CA) untuk konfigurasi TLS Anda. Anda akan menggunakan CA ini untuk menandatangani sertifikat Anda; server akan menolak untuk berkomunikasi dengan klien yang menunjukkan sertifikat dari CA yang berbeda.
Gunakan OpenSSL untuk menghasilkan kunci CA pribadi dan publik di mesin yang menghosting server Docker Anda:
# Generate the private key openssl genrsa -aes256 -out ca-private.pem 4096 # Generate a public key from the private key openssl req -new -x509 -days 365 -key ca-private.pem -sha256 -out ca-public.pem
Anda akan diminta untuk memberikan frasa sandi, alamat email, kode negara, nama negara bagian dan kota, dan nama organisasi untuk disertakan dengan kunci publik Anda. Masukkan informasi di terminal Anda, tekan enter setelah setiap baris untuk maju ke depan dan membuat kunci.
Membuat Kunci Server dan Permintaan Penandatanganan Sertifikat
Selanjutnya buat kunci server dan permintaan penandatanganan sertifikat:
# Generate the server key openssl genrsa -out server-key.pem 4096 # Generate a certificate signing request openssl req -subj "/CN=example.com" -sha256 -new -key server-key.pm -out request.csr
Permintaan penandatanganan sertifikat (CSR) berisi semua informasi yang diperlukan untuk menghasilkan sertifikat yang ditandatangani. Penting untuk memeriksa nama umum di CSR sudah benar untuk server Anda. Ini ditentukan dalam CN
bidang sebagai example.com
di atas; Anda harus menyetelnya ke Fully Qualified Domain Name (FQDN) untuk server Anda.
Menyiapkan Ekstensi Sertifikat
Menggunakan CSR ini akan mengizinkan koneksi ke server melalui FQDN-nya. Anda perlu menentukan ekstensi sertifikat jika ingin menambahkan domain lain atau menggunakan alamat IP. Buat file ekstensi dengan subjectAltName
dan extendedKeyUsage
kolom untuk menyiapkan ini:
echo subjectAltName = DNS:sub.example.com;IP=192.168.0.1 >> extfile.cnf echo extendedKeyUsage = serverAuth >> extFile.cnf
Contoh ini juga akan mengizinkan koneksi melalui sub.example.com
dan 192.168.0.1
.
Membuat Sertifikat yang Ditandatangani
Sekarang Anda siap untuk menggabungkan semua komponen dan membuat sertifikat yang ditandatangani:
openssl x509 -req -days 365 -sha256 -in request.csr -CA ca-public.pem -CAkey ca-private.pem -CAcreateserial -extfile extfile.cnf -out certificate.pem
Ini mengambil permintaan penandatanganan sertifikat, menambahkan file ekstensi Anda, dan menggunakan kunci CA Anda untuk menghasilkan sertifikat OpenSSL yang ditandatangani. Anda harus memberikan frasa sandi CA untuk menyelesaikan proses.
Sertifikat ini akan kedaluwarsa setelah satu tahun. Anda dapat menyesuaikan -days
tandai untuk mendapatkan masa pakai yang berguna untuk kebutuhan Anda. Anda harus mengatur untuk membuat sertifikat pengganti sebelum sertifikat ini kedaluwarsa.
Membuat Sertifikat Klien
Selanjutnya Anda harus membuat sertifikat lain untuk digunakan klien Docker Anda. Ini harus ditandatangani oleh CA yang sama dengan sertifikat server. Gunakan file ekstensi dengan extendedKeyUsage = clientAuth
untuk mempersiapkan sertifikat ini untuk digunakan dalam skenario klien.
# Generate a client key openssl genrsa -out client-key.pem 4096 # Create a certificate signing request openssl req -subj '/CN=client' -new -key client-key.pem -out client-request.csr # Complete the signing echo extendedKeyUsage = clientAuth >> extfile-client.cnf openssl x509 -req -days 365 -sha256 -in client-request.csr -CA ca-public.pem -CAkey ca-private.pem -CAcreateserial -extfile extfile-client.cnf -out client-certificate.pem
Mempersiapkan Konfigurasi Docker
Salin ca-public.pem
your Anda , certificate.pem
, dan server-key.pem
file ke direktori baru yang siap dirujuk di konfigurasi Docker Anda. Setelah itu, salin ca-public.pem
, client-certificate.pem
, dan client-key.pem
file ke mesin yang akan Anda sambungkan.
Anda dapat menghapus permintaan penandatanganan sertifikat dan file ekstensi di direktori kerja Anda. Berhati-hatilah agar tidak kehilangan kunci pribadi Anda karena tidak dapat dipulihkan. Tanpa mereka, Anda tidak akan dapat memvalidasi sertifikat atau membuat pembaruan.
Mengonfigurasi Daemon Docker
Sekarang Anda dapat memulai daemon Docker dengan flag TLS yang merujuk pada sertifikat dan kunci yang Anda buat. --tlscacert
, --tlscert
, dan --tlskey
parameter menentukan jalur ke masing-masing sumber daya OpenSSL yang dihasilkan di atas.
/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --tlsverify --tlscacert=ca-public.pem --tlscert=certificate.pem --tlskey=server-key.pem
Menambahkan --tlsverify
flag memungkinkan penegakan koneksi TLS. Klien tanpa sertifikat yang cocok akan diblokir dari mengakses soket TCP Docker.
Mengonfigurasi Klien Docker
Aktifkan TLS di klien dengan menyediakan flag TLS saat Anda menggunakan docker
memerintah. Anda juga harus menambahkan -H
flag untuk menentukan alamat soket Docker jarak jauh yang akan disambungkan. Dari sudut pandang klien, --tlsverify
berarti perintah hanya akan terhubung ke server dengan sertifikat TLS yang ditandatangani oleh otoritas sertifikat yang sama dengan miliknya.
docker -H tcp://0.0.0.0:2376 --tlsverify --tlscacert=ca-public.pem --tlscert=client-certificate.pem --tlskey=client-key.pem ps
Memasok flag ini setiap kali Anda menggunakan CLI akan berulang dengan sangat cepat. Jika Anda sebagian besar akan bekerja dengan host yang dilindungi TLS yang sama, setel DOCKER_HOST
dan DOCKER_TLS_VERIFY
variabel lingkungan di profil Shell Anda. Salin file sertifikat Anda ke ca
, cert
, dan key
di dalam ~/.docker
. Anda direktori. Ini sesuai dengan --tls
Do Docker menandai dan menentukan sertifikat default untuk klien.
export DOCKER_HOST=tcp://0.0.0.0:2376 export DOCKER_TLS_VERIFY=1
Anda dapat menyederhanakan bekerja dengan banyak host menggunakan campuran koneksi lokal, jarak jauh, tidak aman, dan TLS dengan menyiapkan konteks Docker. Fitur ini memungkinkan Anda beralih di antara target menggunakan perintah Docker CLI.
Klien Docker juga mendukung mode verifikasi alternatif. Menggunakan campuran tls
, tlscacert
, tlscert
, tlskey
, dan tlsverify
tanda mengaktifkan berbagai tingkat penegakan TLS.
Hanya dengan tls
set, Docker akan mengautentikasi server menggunakan kumpulan CA default. Menambahkan tlscacert
dan tlsverify
flag tanpa kunci klien akan memaksa server menggunakan CA yang diberikan tanpa pemeriksaan lain. Menghilangkan tlscacert
dan tlsverify
tetapi menyertakan tiga kunci lainnya akan memverifikasi sertifikat klien tanpa mengautentikasi CA server.
Kesimpulan
Melindungi soket TCP Docker dengan sertifikat TLS memungkinkan Anda mengekspos API lebih aman dengan mencegah koneksi dari klien yang tidak sah. Aktor yang melakukan port scan jaringan Anda akan dilarang terhubung ke Docker, memberi Anda lapisan perlindungan yang mencegah mesin Anda disusupi dengan hak istimewa tingkat root.
Setelah membuat sertifikat, Anda dapat menggunakannya untuk mengautentikasi dengan Docker CLI atau klien HTTP Anda sendiri. Curl akan menerimanya sebagai --cert
, --key
, dan --cacert
bendera, misalnya.
TLS hanyalah satu komponen dari instance Docker API yang diamankan. Ini memberikan enkripsi dan jaminan bahwa klien dipercaya tetapi bukan mekanisme kontrol akses granular.
Jika Anda ingin membatasi apa yang boleh dilakukan oleh masing-masing klien, Anda harus menyiapkan plugin otorisasi Docker Engine. Plugin dapat menghubungi layanan eksternal untuk menentukan apakah permintaan API tertentu diizinkan untuk dilanjutkan. Sebagai alternatif, Anda dapat menggunakan proxy terbalik di depan soket TCP Anda untuk menerapkan kontrol akses sebelum permintaan mencapai Docker.