SSHは、システム管理者のツールボックスで最もよく使用されるコマンドの1つですが、Dockerと一緒に一般的に見られることはありません。実行中のコンテナにSSHで接続する方法と、実行する前によく考える必要がある理由は次のとおりです。
DockerコンテナでSSHを使用する必要がありますか?
DockerコンテナへのSSH接続は、一般的に避けるべき悪い習慣です。ほとんどの場合、docker exec
を使用することをお勧めします コンテナ内にシェルを取得するコマンド。
Dockerの初心者は、SSHを使用してコンテナー内のファイルを更新したくなる可能性があります。ただし、コンテナは使い捨てであることが意図されているため、ボリューム内に保存されている永続データを除いて、作成後は不変として扱う必要があります。ソースコードを編集するときに、新しいイメージを作成してコンテナを再起動します。
マルチステップの構成プロセスとは別に、DockerイメージにSSHをインストールすると、いくつかの依存関係パッケージが追加され、別の潜在的な攻撃ベクトルが明らかになります。複数のアクティブなコンテナがあるシステムでは、複数の独立したSSHプロセスを実行し、各コンテナの正しいポートを覚えておく必要があります。
SSHを個々のコンテナに追加する代わりに、Dockerを実行している物理ホストに一度インストールします。 SSHを使用してホストに接続し、docker exec -it my-container bash
を実行します 個々のコンテナにアクセスします。
docker exec
推奨されるアプローチですが、SSHが役立つ可能性のあるシナリオがまだあります。従来の展開システムと統合するための一時的な手段として導入できます。また、一部のIDEやビルドツールで使用され、開発中にライブリロード機能を提供する場合もあります。
DockerコンテナへのSSHサーバーのインストール
最も人気のあるDockerベースイメージは意図的に合理化されています。一般的なオペレーティングシステムの配布から派生したイメージであっても、OpenSSHサーバーを自分で追加する必要があります。
これがDockerfile
の例です 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
SSH構成が変更され、root
としてログインできるようになりました 、Dockerコンテナのデフォルトユーザー。セキュリティを強化するには、代わりに専用のユーザーアカウントを設定してください:
RUN useradd -m -s /bin/bash sshuser
これにより、sshuser
という新しいユーザーが作成されます ホームディレクトリ(-m
)。 -s
スイッチは、ユーザーのデフォルトのログインシェルをBashに設定します。
ENTRYPOINT
の使用 コンテナが起動するときにSSHサービスが常に起動することを保証します。その後、実行はコンテナのフォアグラウンドプロセスとしてBashに渡されます。これをアプリケーションのバイナリに置き換えることができます。
次に、認証システムを設定する必要があります。 sshuser
にパスワードを割り当てることができます アカウントとログイン:
RUN echo "sshuser:Changeme" | changepasswd
より安全な方法は、SSHキー認証を設定することです。クライアントマシンでキーペアを作成してから、パブリック部分をコンテナにコピーする必要があります。このようにして、SSHデーモンは接続時にマシンのIDを確認できます。
Dockerfile
を変更する .ssh
を設定するには ユーザーの構成フォルダー。 docker cp
を使用して、作業ディレクトリから公開鍵をコピーします。 コマンドまたはCOPY
Dockerfile
の命令 。後者の場合、キーは画像に焼き付けられ、アクセス権を持つすべての人に表示されます。
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
この一連のコマンドにより、SSHのauthorized_keys
が作成されます id_rsa.pub
を含むファイル 作業ディレクトリの公開鍵。ファイルシステムの権限は、SSHの要件に一致するように調整されます。
これで、コンテナに接続する準備が整いました。ポート22をホストにバインドしてコンテナを実行します:
docker run -p 22:22 my-image:latest
ssh [email protected]
を実行しています コンテナ内にシェルが表示されます。
Dockerコンテナをホストしているマシンから接続する場合は、ポートのバインドをスキップできます。 docker inspect
を使用する コンテナのIPアドレスを取得し、SSH接続コマンドに渡します。
docker inspect <id-or-name> | grep 'IPAddress' | head -n 1
マシンのSSHクライアントを使用してコンテナに接続します:
ssh [email protected] # OR ssh [email protected]
ホストで別のSSHサーバーを実行している場合、またはポート22を必要とする複数のコンテナーがある場合は、代替ポートを使用する必要があります。SSHがポート2220にバインドされているときに接続を開始する方法は次のとおりです。
>docker run -p 22:2220 my-image:latest ssh [email protected] -p 2220
SSH構成を使用したコンテナショートカットの設定
SSH構成ファイルを操作して、個々のコンテナーへの接続を簡素化できます。 ~/.ssh/config
を編集します 事前設定されたポートを使用して短縮ホストを定義するには:
Host my-container HostName 172.17.0.1 Port 2220 User sshuser
これで、ssh my-container
を実行できます。 コンテナに直接ドロップします。これにより、コンテナのIPとポートを覚えていなくても、複数の接続を簡単に調整できます。
代わりに、Docksshを使用してコンテナ管理を簡素化する
Docksshプロジェクトは、ssh [email protected]
を実行できる別のデーモンを提供することで、これをさらに一歩進めています。 、手動のSSH構成なし。コンテナにSSHサーバーをインストールする必要はありません。 DocksshはSSH接続を自動的にプロキシし、正しいdocker exec
を実行します 代わりにコマンド。
Docksshの構成データを保存するには、最初にRedisをインストールする必要があります:
sudo apt install redis
次に、コンテナの名前とSSH接続のパスワードを含むRedisレコードを追加して、公開するコンテナを定義します。
redis-cli set dockssh:my-container:pass "container-password-here"
次に、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
これで、コンテナに接続できます:
ssh [email protected] -p 22022
Docksshはデフォルトでポート22022でリッスンします。ポートを使用した着信接続を許可するためにファイアウォールが開かれています。
接続すると、コンテナのパスワードの入力を求められます。これはcontainer-password-here
として設定されました 上記のRedisレコードにあります。
Docksshを使用すると、多数のDockerコンテナにSSHで簡単に接続できます。このアプローチは、2段階の「SSHとdocker exec
」を合理化するため、リモートホストからコンテナに定期的に接続する場合に理想的です。 」シーケンスを1つの記憶に残るコマンドに変換します。
Docksshを長期使用のシステムサービスとして登録します:
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
systemctl
を使用してサービスを有効にします :
sudo systemctl enable dockssh.service sudo systemctl start dockssh
システムの起動時にDocksshが自動的に起動するようになりました。
SSHとDockerコンテナーの組み合わせは、アンチパターンと広く見なされていますが、開発、テスト、およびレガシー環境での使用は依然としてあります。代替手段がない場合は、SSHサーバーをコンテナに追加し、公開鍵をコピーして、コンテナのIPまたはホストポートバインディングを介して接続できます。
多数のDockerコンテナをリモートで管理したいシステム管理者は、Dockshを試すことができます。おなじみのssh
を実行できます docker exec
へのシームレスな舞台裏マッピングを介したコマンド 、変更されていない画像を使用して、両方の長所を提供します。