GNU/Linux >> Znalost Linux >  >> Linux

Jak SSH do kontejneru Docker

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:

  1. 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.
  2. 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á.
  3. 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.


Linux
  1. Jak SSH do konkrétního adresáře?

  2. Jak spustit MySQL v kontejneru Docker

  3. Jak SSH do kontejneru Docker

  1. Jak připojit hostitelský adresář do kontejneru Docker

  2. Jak nainstalovat Vim do kontejneru Docker

  3. Jak vypsat Docker kontejnery

  1. Jak se přihlásit do kontejneru Lxc?

  2. Jak přiřadit statickou IP ke kontejneru Docker

  3. Jak opustit kontejner Docker