SSH adalah salah satu perintah yang paling sering digunakan di kotak alat sysadmin tetapi tidak biasa terlihat di samping Docker. Inilah cara Anda memasukkan SSH ke dalam container yang sedang berjalan dan mengapa Anda harus berpikir dua kali sebelum melakukannya.
Haruskah Anda Menggunakan SSH Dengan Kontainer Docker?
SSH-ing ke dalam wadah Docker umumnya merupakan praktik buruk yang harus Anda hindari. Hampir selalu lebih baik menggunakan docker exec
perintah untuk memasukkan shell ke dalam container.
Pendatang baru Docker dapat tergoda untuk menggunakan SSH untuk memperbarui file di dalam wadah. Wadah dimaksudkan untuk sekali pakai sehingga harus diperlakukan sebagai tidak berubah setelah dibuat, kecuali untuk data persisten yang disimpan di dalam volume. Buat gambar baru dan mulai ulang penampung Anda saat Anda mengedit kode sumber.
Selain dari proses konfigurasi multi-langkah, menginstal SSH dalam gambar Docker menambahkan beberapa paket ketergantungan dan memperlihatkan vektor serangan potensial lainnya. Pada sistem dengan beberapa container aktif, Anda akan menjalankan beberapa proses SSH independen dan harus mengingat port yang benar untuk setiap container.
Alih-alih menambahkan SSH ke wadah individual, instal sekali di host fisik yang menjalankan Docker. Gunakan SSH untuk terhubung ke host Anda, lalu jalankan docker exec -it my-container bash
untuk mengakses wadah individual.
Sementara docker exec
adalah pendekatan yang disukai, masih ada skenario di mana SSH mungkin berguna. Anda dapat memperkenalkannya sebagai langkah sementara untuk berintegrasi dengan sistem penerapan lama. Ini juga dapat digunakan oleh beberapa IDE dan membangun alat untuk menyediakan kemampuan memuat ulang secara langsung selama pengembangan.
Menginstal Server SSH di Wadah Docker
Gambar dasar Docker yang paling populer disimpan dengan sengaja disederhanakan. Anda harus menambahkan server OpenSSH sendiri, bahkan pada image yang berasal dari distribusi sistem operasi populer.
Berikut ini contoh Dockerfile
untuk gambar berbasis Debian:
RUN apt-get update && apt-get install -y openssh-server RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config ENTRYPOINT service ssh start && bash
Konfigurasi SSH dimodifikasi sehingga Anda dapat login sebagai root
, pengguna default dalam wadah Docker. Untuk keamanan yang lebih baik, siapkan akun pengguna khusus sebagai gantinya:
RUN useradd -m -s /bin/bash sshuser
Ini membuat pengguna baru bernama sshuser
dengan direktori home (-m
). -s
switch menyetel shell login default pengguna ke Bash.
Penggunaan ENTRYPOINT
memastikan layanan SSH selalu dimulai saat container melakukannya. Eksekusi kemudian diserahkan ke Bash sebagai proses latar depan wadah. Anda dapat menggantinya dengan biner aplikasi Anda.
Mengonfigurasi Otentikasi
Selanjutnya Anda perlu mengatur sistem otentikasi. Anda dapat menetapkan kata sandi untuk sshuser
Anda akun dan login dengan itu:
RUN echo "sshuser:Changeme" | changepasswd
Cara yang lebih aman adalah dengan mengatur otentikasi kunci SSH. Anda harus membuat pasangan kunci di mesin klien Anda, lalu menyalin bagian publik ke dalam wadah. Dengan cara ini daemon SSH dapat memverifikasi identitas mesin Anda saat Anda terhubung.
Ubah Dockerfile
Anda untuk mengatur .ssh
folder konfigurasi untuk pengguna Anda. Salin kunci publik dari direktori kerja Anda, baik dengan docker cp
perintah atau COPY
instruksi di Dockerfile
. Dalam kasus terakhir, kunci akan dimasukkan ke dalam gambar, dapat dilihat oleh siapa saja yang memiliki akses.
COPY id_rsa.pub /home/sshuser/.ssh/authorized_keys RUN chown -R sshuser:sshuser /home/sshuser/.ssh RUN chmod 600 /home/sshuser/.ssh/authorized_keys
Urutan perintah ini membuat authorized_keys
SSH file dengan id_rsa.pub
kunci publik di direktori kerja Anda. Izin sistem file disesuaikan agar sesuai dengan persyaratan SSH.
Menghubungkan ke Penampung
Sekarang Anda siap untuk terhubung ke penampung Anda. Jalankan wadah dengan port 22 terikat ke host:
docker run -p 22:22 my-image:latest
Menjalankan ssh [email protected]
akan memberi Anda cangkang di dalam wadah Anda.
Anda dapat melewati pengikatan port jika Anda akan terhubung dari mesin yang menghosting wadah Docker. Gunakan docker inspect
untuk mendapatkan alamat IP penampung Anda, lalu berikan ke perintah koneksi SSH.
docker inspect <id-or-name> | grep 'IPAddress' | head -n 1
Gunakan klien SSH di mesin Anda untuk terhubung ke container:
ssh [email protected] # OR ssh [email protected]
Anda harus menggunakan port alternatif jika Anda menjalankan server SSH terpisah di host atau Anda memiliki beberapa container yang memerlukan port 22. Berikut cara memulai koneksi saat SSH terikat ke port 2220:
docker run -p 22:2220 my-image:latest ssh [email protected] -p 2220
Menyiapkan Pintasan Kontainer Dengan SSH Config
Anda dapat memanipulasi file konfigurasi SSH Anda untuk menyederhanakan koneksi ke wadah individual. Edit ~/.ssh/config
untuk mendefinisikan host singkatan dengan port yang telah dikonfigurasikan sebelumnya:
Host my-container HostName 172.17.0.1 Port 2220 User sshuser
Sekarang Anda dapat menjalankan ssh my-container
untuk menjatuhkan langsung ke wadah Anda. Ini membuatnya lebih mudah untuk mengatur beberapa koneksi tanpa mengingat IP dan port container.
Gunakan Dockssh untuk Menyederhanakan Pengelolaan Kontainer
Proyek Dockssh mengambil langkah lebih jauh dengan menyediakan daemon lain yang memungkinkan Anda menjalankan ssh [email protected]
, tanpa konfigurasi SSH manual. Anda tidak perlu menginstal server SSH di wadah Anda; Dockssh secara otomatis mem-proxy koneksi SSH dan menjalankan docker exec
yang benar perintah sebagai gantinya.
Anda harus menginstal Redis terlebih dahulu untuk menyimpan data konfigurasi Dockssh:
sudo apt install redis
Selanjutnya, tentukan wadah yang ingin Anda tampilkan dengan menambahkan catatan Redis dengan nama wadah dan kata sandi untuk koneksi SSH:
redis-cli set dockssh:my-container:pass "container-password-here"
Kemudian unduh Dockssh:
sudo curl https://github.com/alash3al/dockssh/releases/download/v1.1.0/dockssh_linux_amd64 -O /usr/local/bin/dockssh sudo chmod +x /usr/local/bin/dockssh sudo ufw allow 22022 # Start DockSSH server dockssh
Sekarang Anda dapat terhubung ke penampung Anda:
ssh [email protected] -p 22022
Dockssh mendengarkan pada port 22022 secara default. Firewall dibuka untuk mengizinkan koneksi masuk menggunakan port.
Anda akan dimintai kata sandi penampung saat Anda terhubung. Ini ditetapkan sebagai container-password-here
dalam catatan Redis kami di atas.
Menggunakan Dockssh memudahkan SSH ke sejumlah besar container Docker. Pendekatan ini sangat ideal ketika Anda secara teratur terhubung ke wadah Anda dari host jarak jauh karena menyederhanakan dua langkah “SSH lalu docker exec
” urutan menjadi satu perintah yang mudah diingat.
Daftarkan Dockssh sebagai layanan sistem untuk penggunaan jangka panjang:
sudo nano /etc/systemd/system/dockssh.service
[Unit] Description=Dockssh service After=network.target [Service] type=simple Restart=always RestartSec=1 User=root ExecStart=/usr/local/bin/dockssh [Install] WantedBy=multi-user.target
Aktifkan layanan menggunakan systemctl
:
sudo systemctl enable dockssh.service sudo systemctl start dockssh
Dockssh sekarang akan mulai secara otomatis ketika sistem Anda melakukan booting.
Ringkasan
Menggabungkan SSH dengan wadah Docker secara luas dianggap sebagai anti-pola namun masih digunakan dalam lingkungan pengembangan, pengujian, dan warisan. Jika tidak ada alternatif lain, Anda dapat menambahkan server SSH ke penampung Anda, menyalin kunci publik, dan terhubung melalui IP penampung atau pengikatan port host.
Admin sistem yang ingin mengelola sejumlah besar container Docker dari jarak jauh dapat mencoba Dockssh. Ini memungkinkan Anda menjalankan ssh
familiar yang familier perintah melalui pemetaan di belakang layar yang mulus ke docker exec
, memberi Anda yang terbaik dari kedua dunia menggunakan gambar yang tidak dimodifikasi.