はじめに
備忘録として、WSL2のUbuntu環境からDockerコンテナへのSSH接続をするハンズオンを書きました。是非とも参考にしてください。
※Dockerのインストール手順は省略します。
注意
SSHにはパスワード認証と公開鍵認証の2種類の認証方法がありますが、本記事では公開鍵認証のみを用いています。また、本ハンズオンではrootへのログインを有効にしている等、本番環境下としては適していない設定が一部あります。
ハンズオン
まずはワークスペースディレクトリを作成し、そこへ移動します。
$ mkdir ssh-test-workspace
$ cd ssh-test-workspace
次に、以下の内容のDockerfileをそのディレクトリ上に保存します。
FROM ubuntu:noble-20240429
# OpenSSHサーバをインストール
RUN apt-get update && \
apt-get install -y openssh-server
# SSHサーバの設定を変更
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config && \
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config && \
sed -i 's/#Port 22/Port 20022/' /etc/ssh/sshd_config
# クライアントの公開鍵をコンテナへコピー
COPY ssh-test-keys/ssh-test-ed25519.pub /root/.ssh/ssh-test-ed25519.pub
# クライアントの公開鍵をコンテナのauthorized_keysファイルへ追記
RUN cat /root/.ssh/ssh-test-ed25519.pub >> /root/.ssh/authorized_keys
# SSHデーモンの起動時に必要
RUN mkdir /var/run/sshd
EXPOSE 20022
# コンテナ作成時にSSHデーモンを起動
CMD ["/usr/sbin/sshd", "-D"]
(余談ですが、SSHサーバ設定はsshd_configファイルによって記述されています。そのため、sedコマンドを用いてsshd_configファイルの一部を書き換えることで、イメージのビルド時からSSHサーバ設定を変更することができるというわけなんですね。私もまだまだ駆け出しの身なので、「ああ、そうやってやるんだ...」という感じでした...。なんか力業っぽいですよね...。)
次に、今回使用する鍵を置くためのディレクトリを作成します。
$ mkdir ssh-test-keys
次に、今回使用する鍵を作成します。
$ ssh-keygen -f ssh-test-keys/ssh-test-ed25519 -N '' -t ed25519
-fは鍵の名前と保存先、-Nは鍵自体にかけるパスワードを設定するオプションです。
本来はコマンド実行時に入力を求められる項目ですが、このようにオプションとして加えておくことで、一発で鍵を作成することができます。
実行に成功すると、ディレクトリ構成は以下のようになります。
.
├── Dockerfile
└── ssh-test-keys
├── ssh-test-ed25519
└── ssh-test-ed25519.pub
次に、DockerfileからDockerイメージを作成します。
$ docker build -t ssh-test .
次に、先ほど作成したDockerイメージからDockerコンテナを作成し、起動させます。
$ docker container run -itd -p 20021:20022 --name "ssh-test-container" ssh-test
最後に、そのDockerコンテナへSSH接続します。
$ ssh -i ssh-test-keys/ssh-test-ed25519 root@localhost -p 20021
お疲れさまでした。今回のハンズオンで作成されたコンテナやイメージは以下のコマンドを順番に実行することで削除することができます。
$ docker container stop ssh-test-container
$ docker container rm ssh-test-container
$ docker image rm ssh-test
(余談)公開鍵をコンテナへ保存する方法あれこれ
当初はssh-copy-idコマンドを用いて楽に公開鍵をコンテナへ保存させようと考えていましたが、このコマンド自体がそもそもSSHプロトコルを用いるせいで、このコマンドを動作させるためにあらかじめ公開鍵をコンテナへ保存する必要が出るというよくわからない状況が発生します...。
ssh-copy-id uses the SSH protocol to connect to the target host and upload > > the SSH user key.
https://www.ssh.com/academy/ssh/copy-id
パスワード認証を用いたSSH接続からssh-copy-idコマンドを実行させ、公開鍵をコンテナへ渡すといった方法もあるにはありました。ただ、この方法では手間がかかると感じたため、今回はssh-copy-idコマンドを用いることなく、Dockerfile上から公開鍵をコンテナへ渡す形にしました。私はまだまだ経験が浅いため、このssh-copy-idコマンドって便利なのか不便なのかよくわかりません...。
参考記事