Jak používáte SSH ke vstupu do kontejneru Docker? Tradiční přístup se skládá ze dvou kroků:
Krok 1 :SSH na váš vzdálený linuxový server (pokud používáte kontejner ve vzdáleném systému).
ssh [email protected]_ip_address
Krok 2 :A pak vstoupíte do shellu svého spuštěného kontejneru Docker v interaktivním režimu takto:
docker exec -it container_ID_or_name /bin/bash
S tím můžete spustit příkaz Linux nebo provést nějakou údržbu služby běžící uvnitř kontejneru.
Na výše uvedené metodě není nic špatného. Toto je tradiční a doporučovaný způsob snadného vstupu do kontejnerů.
S určitým úsilím však můžete skutečně SSH do běžícího kontejneru přímo, bez předchozího přihlášení do hostitelského systému.
SSH do kontejneru Docker:Ale proč?
To je trochu divné, že? Přihlášení do kontejneru přes SSH. I když to zní netradičně, mohlo být pro vás stále užitečné, podle vašich případů použití.
Zde je několik věcí, kterých můžete dosáhnout pomocí schopnosti SSH do kontejneru:
- Můžete nastavit falešné hostitel pro každého potenciálního útočníka. Použitím nestandardního portu pro démona SSH vašeho hostitele a poskytováním připojení SSH na portu 22 pro útočníky.
- Zcela samostatná úroveň autorizace, tj. přihlášení pomocí hesla nebo různé klíče ssh, vše je na vás a oddělené od toho, co váš hostitel aktuálně používá.
- Spuštění jakéhokoli automatického vzdáleného procesu bez použití stejných klíčů ssh, které používají k přihlášení jednotlivci vašeho týmu.
Než vám ukážu, jak dělat všechny výše uvedené věci, provedu vás myšlenkou, jak to vlastně funguje.
Použití přihlášení ssh pro existující kontejner' se nedoporučuje. To zabíjí celý bod izolace hostitele.
Nastavení přístupu SSH pro kontejnery Docker [Intermediate to Expert]
Pokud vás nezajímá, jak to funguje, můžete tuto sekci klidně ignorovat. Ukážu vám falešný kontejner. Můžete postupovat podle kroků k procvičování.
Spustit kontejner
Nejprve musíte spustit kontejner Docker. Použiji extrémně malý alpine:latest
obrázek zatím. Spusťte kontejner pomocí tohoto příkazu:
docker run --rm --name ssh-test -it -p 7655:22 alpine:latest ash
Některé pozoruhodné body týkající se možností příkazového řádku jsou následující
- Pomocí
--rm
možnost, nemusíte poté kontejner explicitně odstraňovat. -it
možnosti jsou zde proto, abyste mohli mít funkční, interaktivní shell kontejneru.- Nakonec navážete port 22 kontejneru na číslo portu hostitele 7655 (nebo jakékoli jiné číslo portu, které ještě nepoužívá démon SSH na vašem hostitelském systému). Mějte na paměti, který port používáte.
Nastavení démona SSH v kontejneru
Nyní musíte nainstalovat ssh server do kontejneru. V Alpine Linux můžete použít tyto příkazy:
apk update; apk add openssh-server
Dále musíte rychle změnit konfigurační parametr, abyste umožnili přihlášení root. Můžete to udělat ruční úpravou souboru /etc/ssh/sshd_config nebo použitím tohoto příkazu:
sed -E 's/^#(PermitRootLogin )no/\1yes/' /etc/ssh/sshd_config -i
Vygenerujte hostitelské klíče pomocí:
ssh-keygen -A
Nakonec spusťte ssh server, spusťte /usr/sbin/sshd &
. Zkontrolujte, zda je spuštěn pomocí ps aux
.
Nastavte heslo pro kořenový účet kontejneru
Ve výchozím nastavení nemá kořenový účet kontejneru heslo. Pokud k němu otevíráte SSH přístup, musíte nastavit heslo pro účet root.
Příkaz passwd můžete použít bez možnosti a postupujte podle pokynů na obrazovce:
passwd
Přihlaste se do kontejneru přes SSH
Z jiného hostitele se nyní zkuste přihlásit do kontejneru.
ssh [email protected]_address_of_host_server -p port_number
Nepotřebujete -p
Pokud jste se dříve navázali na port 22. Pro IP použijte IP adresu hostitelského serveru (ne kontejneru).
Když spustíte příkaz, měli byste vidět výstup podobný tomuto:
Heslo[email protected]:/mnt/data/documents/Linux Handbook/container-ssh$ ssh [email protected]
[email protected]'s password:
Welcome to Alpine!
The Alpine Wiki contains a large amount of how-to guides and general
information about administrating Alpine systems.
See <http://wiki.alpinelinux.org/>.
You can setup the system with the command: setup-alpine
You may change this message by editing /etc/motd.
c4585d951883:~#
Jak to funguje?
Tomu lze lépe porozumět vizuálně. Podívejte se na následující diagram:
Představte si kontejnery jako virtuální stroj, jehož port 22 je spojen s portem hostitele 7655 (nebo tím, který jste vybrali). To vám umožňuje mít dva různé procesy ssh spuštěné na stejném počítači připojené k různým portům.
Řekněme, že používáte nějaký jiný port pro SSH na hostitelském systému a slepíte port 22 s portem kontejneru. Nyní, pokud se někdo pokusí připojit k hostitelskému serveru pomocí SSH výchozího portu 22, bude v kořenovém systému souborů kontejneru.
Nastavení SSH pro kontejnery pomocí Docker Compose [experti]
Nebylo by fér, kdybych vás nechal na tomto místě bez poskytnutí nějaké spolehlivé možnosti pro kontejner serveru SSH.
Pokud jste chtěli využít výhody jiného, izolovaného ssh serveru se samostatným kořenovým souborovým systémem běžícím na vašem vzdáleném systému, lze to udělat, ale ne podle předchozího návodu, tj. instalace a konfigurace sshd na běžící bázi kontejner.
Jednoduše proto, že to není snadno reprodukovatelné, každá změna, kterou provedete na běžícím kontejneru, není trvalá, restartuje se kontejner a vše je pryč.
Zde vám tedy nabízím mnohem jednodušší, snadno reprodukovatelný a konfigurovatelný způsob nasazení kontejneru serveru SSH na vašem vzdáleném hostiteli.
Předpoklady
Samozřejmě musíte mít nainstalovaný docker compose. Základní znalost docker compose je zde nutností.
Protože k serveru budete přistupovat pomocí klíčů SSH, musíte pro jistotu přidat veřejný klíč SSH vašeho místního systému do adresáře hostitelského serveru Linux, kde se nachází soubor docker-compose, a ponechat název „id_rsa.pub“.
Připravte soubor pro psaní
Doporučuji použít linuxserver/openssh-server
obraz. Toto je velmi lehký obrázek s dostatečně dobrými možnostmi konfigurace prostřednictvím proměnných prostředí.
Zde se vloží celý nový soubor. Zkopírujte to do nějakého umístění na vašem serveru a pojmenujte soubor docker-compose.yaml
.
version: "3.7"
services:
ssh:
image: "linuxserver/openssh-server"
ports:
- "22:2222"
volumes:
- "./id_rsa.pub:/pubkey:ro"
environment:
PUID: ${ID}
PGID: ${ID}
TZ: ${TZ}
PUBLIC_KEY_FILE: "/pubkey"
SUDO_ACCESS: "false"
PASSWORD_ACCESS: "false"
USER_NAME: ${USER_NAME}
restart: "always"
Docela malý soubor pro psaní, že? Dovolte mi vysvětlit různé části tohoto nového souboru.
Svazky: Máte pouze jedno připojení vazby, které připojí veřejný klíč v kontejneru jako pubkey
. Je také pouze pro čtení.
Porty: Proces sshd uvnitř kontejneru běží na portu 2222. Proto jsem tento port svázal s portem 22 mého hostitele. Změňte 22 podle svých potřeb, ale pamatujte na to, že jej budete později potřebovat k přihlášení do kontejneru přes SSH.
Proměnné prostředí:
- USER_NAME:Uživatel v kontejneru, budete se přihlašovat jako z místního počítače.
- PUID &PGID:UID a GID uživatele USER_NAME. Toto je nepovinné, kontejner automaticky přiřadí pár nerootových ID, pokud nejsou nastaveny proměnné prostředí.
- TZ:Vaše aktuální časové pásmo. Můžete to získat pomocí
cat /etc/timezone
. - PUBLIC_KEY_FILE:Umístění souboru veřejného klíče
- SUDO_ACCESS &PASSWORD_ACCESS:Samovysvětlující.
Zásady restartování: Nastavil jsem zásadu restartování „vždy“, která restartuje kontejner, i když je démon znovu načten.
Nasazení služby
Abychom vám to usnadnili, vytvořil jsem skript Bash, který vám položí několik otázek a na základě odpovědí službu nasadí.
#! /usr/bin/env bash
vars=("ID" "USER_NAME")
defaults=("991" "dummy")
questions=("What'd be your preferred UID & GID for the username of your choice? [default] " "Your preferred username for the container? [dummy] ")
put()
{
echo "$1" >> .env
}
for i in {1..0}; do
read -p "${questions[$i]}" ans
case $ans in
""|"default")
put "${vars[$i]}=${defaults[$i]}" ;;
*)
put "${vars[$i]}=$ans" ;;
esac
done
put "TZ=$(cat /etc/timezone)"
docker-compose up -d
Uložil jsem bash skript jako deploy.sh ve stejném adresáři, kde byl umístěn soubor docker-compose.
Nyní, když spustíte tento skript, zeptá se vás na několik otázek a poté spustí kontejner dockeru:
bash deploy.sh
Až to bude hotové, zkuste se přihlásit na server:
ssh [email protected] -p port
Tím končí tento článek o ssh s kontejnery dockeru. Pokud se vám to líbilo nebo máte cokoli jiného zmínit, neváhejte to komentovat níže nebo mi tweetovat @imdebdut.
Pokud byste chtěli, abych napsal nějaký další článek, dejte mi vědět.