it-swarm-eu.dev

Vstoupit klíče hostitele SSH do stroje Docker s Docker Compose

Používám Docker na Mac OS X s Docker Machine (s výchozím strojem boot2docker) a používám docker-compose pro nastavení vývojového prostředí.

Řekněme, že jeden z kontejnerů se nazývá "stack". Teď, co chci udělat, je volání:

docker-composer run stack ssh [email protected]

Můj veřejný klíč (který byl přidán do stackoverflow.com a který bude použit k ověření) se nachází na hostitelském počítači. Chci, aby tento klíč byl k dispozici pro kontejner Docker Machine, abych se mohl autentizovat proti stackoverflow pomocí tohoto klíče z kontejneru. Přednostně bez fyzického kopírování klíče do Dockerova stroje.

Existuje nějaký způsob, jak to udělat? Také, pokud je můj klíč chráněn heslem, existuje nějaký způsob, jak jej odemknout jednou, takže po každé injekci nebudu muset ručně zadávat heslo?

15
Ruslan

Můžete to přidat do docker-compose.yml (za předpokladu, že je uživatel uvnitř kontejneru root):

volumes:
    - ~/.ssh:/root/.ssh

Také můžete zkontrolovat pokročilejší řešení s agentem ssh (Já jsem to nevyzkoušel sám)

32
Anton Serdyuk

Docker má funkci zvanou tajemství, která zde může být užitečná. Chcete-li jej použít, můžete do kódu docker-compose.yml přidat následující kód:

---
version: '3.1' # Note the minimum file version for this feature to work
services:
  stack:
    ...
    secrets:
      - Host_ssh_key

secrets:
  Host_ssh_key:
    file: ~/.ssh/id_rsa

Nový tajný soubor je pak přístupný v souboru Dockerfile takto:

RUN mkdir ~/.ssh && ln -s /run/secrets/Host_ssh_key ~/.ssh/id_rsa

Tajné soubory nebudou zkopírovány do kontejneru:

Když udělíte nově vytvořený nebo spuštěný přístup k tajným službám, dešifrované tajemství se připojí do kontejneru v souborovém systému v paměti

Další podrobnosti naleznete na adrese:

10
Anton Styagun

Můžete předat agenta SSH:

something:
    container_name: something
    volumes:
        - $SSH_AUTH_SOCK:/ssh-agent # Forward local machine SSH key to docker
    environment:
        SSH_AUTH_SOCK: /ssh-agent
5
Aistis

Pokud používáte OS X a šifrované klíče to bude PITA. Zde jsou kroky Prošel jsem to takhle.

Přímý přístup

Člověk by si mohl myslet, že není problém. Stačí připojit složku ssh:

...
volumes:
  - ~/.ssh:/root/.ssh:ro
...

To by mělo fungovat, že?

Uživatelský problém

Další věc, kterou si všimneme, je, že používáme nesprávné ID uživatele. Dobře, napíšeme skript pro kopírování a změnu vlastníka ssh klíčů. V konfigurátoru nastavíme také uživatele ssh, aby ssh server věděl, kdo se připojuje.

...
volumes:
  - ~/.ssh:/root/.ssh-keys:ro
command: sh -c ‘./.ssh-keys.sh && ...’
environment:
  SSH_USER: $USER
...

# ssh-keys.sh
mkdir -p ~/.ssh
cp -r /root/.ssh-keys/* ~/.ssh/
chown -R $(id -u):$(id -g) ~/.ssh

cat <<EOF >> ~/.ssh/config
  User $SSH_USER
EOF

Problém s přístupovou frází klíče SSH

V naší společnosti chráníme SSH klíče pomocí přístupové fráze. To by nefungovalo v ukotvitelném panelu, protože je nepraktické zadávat přístupové fráze pokaždé, když spustíme kontejner.

openssl rsa -in id_rsa -out id_rsa2
# enter passphrase
# replace passphrase-encrypted key with plaintext key:
mv id_rsa2 id_rsa

Roztok činidla SSH

Možná jste si všimli, že pokaždé, když potřebujete ssh přístup, nemusíte zadat heslo. Proč je to? To je to, na co je agent SSH určen. Agent SSH je v podstatě server, který naslouchá speciálnímu souboru unix socket, nazvanému „ssh auth sock“. Jeho polohu můžete zobrazit ve vašem systému:

echo $SSH_AUTH_SOCK
# /run/user/1000/keyring-AvTfL3/ssh

Klient SSH komunikuje s agentem SSH prostřednictvím tohoto souboru, takže zadáváte heslo pouze jednou. Jakmile je SSH agent nezašifrovaný, uloží jej do paměti a pošle na požádání klientovi SSH. Můžeme to použít v Dockeru? Jistě, připojte tento speciální soubor a zadejte odpovídající proměnnou prostředí:

environment:
  SSH_AUTH_SOCK: $SSH_AUTH_SOCK
  ...
volumes:
  - $SSH_AUTH_SOCK:$SSH_AUTH_SOCK

V tomto případě ani nemusíme kopírovat klíče. Pro potvrzení, že jsou k dispozici klíče, můžeme použít nástroj ssh-add:

if [ -z "$SSH_AUTH_SOCK" ]; then
  echo "No ssh agent detected"
else
  echo $SSH_AUTH_SOCK
  ssh-add -l
fi

Problém podpory unix socket mount v Docker pro Mac

Bohužel pro uživatele OS X, Docker for Mac má řadu nedostatků, z nichž jednou je neschopnost sdílet sokety Unix mezi Mac a Linuxem. Existuje otevřený problém v D4M Github . Od února 2019 je stále otevřený.

Je to slepá ulička? Ne, je tu hacky.

Řešení pro předávání agentů SSH

Naštěstí není tento problém nový. Dlouho předtím, než Docker byl způsob, jak použít místní ssh klíče v rámci vzdálené ssh session. Toto se nazývá ssh agent forwarding. Myšlenka je jednoduchá: připojujete se ke vzdálenému serveru přes ssh a můžete zde používat všechny stejné vzdálené servery, a tak sdílet klíče.

S Docker for Mac můžeme použít chytrý trik: sdílet ssh agenta s dock virtuálním strojem pomocí TCP ssh spojení a připojit tento soubor z virtuálního počítače do jiného kontejneru, kde potřebujeme toto SSH spojení. Zde je obrázek, který ukazuje řešení:

SSH forwarding

Nejprve vytvoříme ssh relaci na ssh server uvnitř kontejneru uvnitř linuxu VM přes port TCP. Zde používáme skutečný ssh auth sock.

Dále, ssh server předá naše ssh klíče ssh agentovi na tom kontejneru. Agent SSH má soket Unix, který používá umístění připojené k Linuxu VM. Tj. Unixová zásuvka funguje v Linuxu. Nepracovní soubor soketu Unix v systému Mac nemá žádný vliv.

Poté vytvoříme užitečný kontejner s klientem SSH. Sdílíme soubor soketu Unix, který používá naše lokální relace SSH.

Existuje spousta skriptů, které tento proces zjednodušují: Https://github.com/avsm/docker-ssh-agent-forward

Závěr

Dostat SSH do práce v Dockeru mohlo být jednodušší. Ale lze to udělat. A v budoucnu to bude pravděpodobně lepší. Přinejmenším Docker vývojáři jsou si vědomi tohoto problému. A dokonce { vyřešeno pro Dockerfiles s časy budování času . A tam je návrh jak podporovat sokety domény Unix.

1
Vanuan