SSH je jedním z nejpoužívanějších příkazů v sadě nástrojů správce systému, ale není běžně k vidění vedle Dockeru. Zde je návod, jak můžete SSH do běžícího kontejneru a proč byste si to měli dvakrát rozmyslet.
Měli byste používat SSH s kontejnery Docker?
SSH-ing do kontejneru Docker je obecně špatný postup, kterému byste se měli vyhnout. Téměř vždy je lepší použít docker exec
příkaz k získání shellu uvnitř kontejneru.
Nováčci Dockeru mohou být v pokušení používat SSH k aktualizaci souborů v kontejneru. Kontejnery jsou však určeny k jednorázovému použití, takže by se s nimi mělo po vytvoření zacházet jako s neměnnými, s výjimkou trvalých dat uložených uvnitř svazků. Při úpravě zdrojového kódu vytvořte nový obrázek a restartujte kontejner.
Kromě vícefázového konfiguračního procesu přidává instalace SSH do obrazu Dockeru několik závislých balíčků a odhaluje další potenciální vektor útoku. V systému s několika aktivními kontejnery budete spouštět několik nezávislých procesů SSH a budete si muset zapamatovat správný port pro každý kontejner.
Místo přidávání SSH do jednotlivých kontejnerů jej nainstalujte jednou na fyzického hostitele, na kterém běží Docker. Pomocí SSH se připojte k hostiteli a poté spusťte docker exec -it my-container bash
pro přístup k jednotlivým kontejnerům.
Zatímco docker exec
je preferovaný přístup, stále existují scénáře, kdy by SSH mohlo být užitečné. Mohli byste to zavést jako dočasné opatření pro integraci se staršími systémy nasazení. Může být také používán některými IDE a nástroji pro sestavení, které poskytují možnosti živého načítání během vývoje.
Instalace serveru SSH do kontejneru Docker
Nejoblíbenější základní obrázky Dockeru jsou záměrně uspořádané. OpenSSH server si budete muset přidat sami, a to i na obrázky odvozené z populárních distribucí operačního systému.
Zde je příklad Dockerfile
pro obraz založený na Debianu:
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
Konfigurace SSH je upravena, takže se můžete přihlásit jako root
, výchozí uživatel v kontejneru Docker. Pro větší zabezpečení si místo toho nastavte vyhrazený uživatelský účet:
RUN useradd -m -s /bin/bash sshuser
Tím se vytvoří nový uživatel s názvem sshuser
s domovským adresářem (-m
). -s
přepínač nastaví výchozí přihlašovací shell uživatele na Bash.
Použití ENTRYPOINT
zajišťuje, že služba SSH se vždy spustí, když se kontejner spustí. Provedení je pak předáno Bashovi jako proces na popředí kontejneru. Můžete to nahradit binárním souborem vaší aplikace.
Konfigurace ověřování
Dále musíte nastavit autentizační systém. Svému sshuser
můžete přiřadit heslo a přihlaste se pomocí tohoto účtu:
RUN echo "sshuser:Changeme" | changepasswd
Bezpečnějším způsobem je nastavení ověřování pomocí klíče SSH. Na klientském počítači budete muset vytvořit pár klíčů a poté zkopírovat veřejnou část do kontejneru. Tímto způsobem může démon SSH ověřit identitu vašeho počítače, když se připojíte.
Změňte svůj Dockerfile
pro nastavení .ssh
konfigurační složku pro vašeho uživatele. Zkopírujte veřejný klíč ze svého pracovního adresáře, buď pomocí docker cp
příkaz nebo COPY
instrukce v Dockerfile
. V druhém případě by byl klíč zapečen do obrázku, viditelný pro každého, kdo má přístup.
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
Tato sekvence příkazů vytváří authorized_keys
SSH soubor s id_rsa.pub
veřejný klíč ve vašem pracovním adresáři. Oprávnění souborového systému jsou upravena tak, aby odpovídala požadavkům SSH.
Připojování ke kontejneru
Nyní jste připraveni se připojit ke svému kontejneru. Spusťte kontejner s portem 22 navázaným na hostitele:
docker run -p 22:22 my-image:latest
Spuštění ssh [email protected]
vám dá shell uvnitř vašeho kontejneru.
Vazbu portu můžete přeskočit, pokud se budete připojovat ze stroje, který je hostitelem kontejneru Docker. Použijte docker inspect
abyste získali IP adresu svého kontejneru, pak ji předejte příkazu připojení SSH.
docker inspect <id-or-name> | grep 'IPAddress' | head -n 1
Pro připojení ke kontejneru použijte klienta SSH na vašem počítači:
ssh [email protected] # OR ssh [email protected]
Pokud na hostiteli provozujete samostatný server SSH nebo máte více kontejnerů, které potřebují port 22, budete muset použít alternativní port. Zde je návod, jak zahájit připojení, když je SSH vázáno na port 2220:
docker run -p 22:2220 my-image:latest ssh [email protected] -p 2220
Nastavení zástupců kontejneru pomocí SSH Config
S konfiguračním souborem SSH můžete manipulovat a zjednodušit tak připojení k jednotlivým kontejnerům. Upravte ~/.ssh/config
k definování zkrácených hostitelů s předkonfigurovanými porty:
Host my-container HostName 172.17.0.1 Port 2220 User sshuser
Nyní můžete spustit ssh my-container
spadnout přímo do vašeho kontejneru. To usnadňuje žonglování s více připojeními, aniž byste si pamatovali IP a porty kontejneru.
Použijte Dockssh ke zjednodušení správy kontejnerů
Projekt Dockssh to posouvá o krok dále tím, že poskytuje dalšího démona, který vám umožní spouštět ssh [email protected]
, bez jakékoli ruční konfigurace SSH. Do svých kontejnerů nemusíte instalovat server SSH; Dockssh automaticky zprostředkovává připojení SSH a spouští správný docker exec
místo toho příkaz.
Chcete-li uložit konfigurační data Dockssh, musíte nejprve nainstalovat Redis:
sudo apt install redis
Dále definujte kontejnery, které chcete vystavit, přidáním záznamu Redis s názvem kontejneru a heslem pro připojení SSH:
redis-cli set dockssh:my-container:pass "container-password-here"
Poté si stáhněte 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
Nyní se můžete připojit ke svému kontejneru:
ssh [email protected] -p 22022
Dockssh ve výchozím nastavení naslouchá na portu 22022. Brána firewall se otevře, aby umožnila příchozí připojení pomocí portu.
Při připojení budete vyzváni k zadání hesla kontejneru. Toto bylo nastaveno jako container-password-here
v našem záznamu Redis výše.
Použití Dockssh usnadňuje SSH do velkého počtu kontejnerů Docker. Tento přístup je ideální, když se pravidelně připojujete ke svým kontejnerům ze vzdáleného hostitele, protože zjednodušuje dvoukrokové „SSH pak docker exec
” sekvence do jediného zapamatovatelného příkazu.
Zaregistrujte Dockssh jako systémovou službu pro dlouhodobé používání:
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
Povolte službu pomocí systemctl
:
sudo systemctl enable dockssh.service sudo systemctl start dockssh
Dockssh se nyní spustí automaticky při startu vašeho systému.
Přehled
Kombinace SSH s kontejnery Docker je obecně považována za anti-vzor, ale stále má své využití ve vývojových, testovacích a starších prostředích. Pokud neexistuje žádná alternativa, můžete přidat server SSH do svého kontejneru, zkopírovat veřejný klíč a připojit se přes IP kontejneru nebo vazbu hostitelského portu.
Správci systému, kteří chtějí vzdáleně spravovat velké množství kontejnerů Docker, mohou vyzkoušet Dockssh. Umožňuje vám spouštět známé ssh
příkazy prostřednictvím bezproblémového mapování ze zákulisí na docker exec
, která vám poskytne to nejlepší z obou světů pomocí neupravených obrázků.