GNU/Linux >> Belajar Linux >  >> Panels >> Docker

Cara Mengamankan Soket TCP Docker Dengan TLS

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.


Docker
  1. Cara mengamankan layanan email Linux Anda dengan SSL/TLS

  2. Cara Mengamankan nama host Plesk pada port 8443 dengan sertifikat SSL

  3. Cara mengamankan koneksi dengan sertifikat SSL/TLS

  1. Cara Menyebarkan Layanan Mikro dengan Docker

  2. Cara Menyebarkan Aplikasi dengan Rancher

  3. Cara Menyebarkan Wadah nginx dengan Docker di Linode

  1. Cara Berbagi Gambar Docker Dengan Orang Lain

  2. Cara Mengamankan vsFTPd Dengan SSL/TLS

  3. Bagaimana Mengkonfigurasi VSFTPD dengan koneksi terenkripsi SSL/TLS?