Yuki’s blog

自身の成果物や好きなことを発信していきたいと思います。情報系のジャンルが多いです。

ssh-agentを利用した認証方法(SSH接続先サーバーとDockerコンテナ)

はじめに

業務で複数台のサーバーを行き来する際に便利だったssh-agentについて解説します。これを使えば、それぞれのサーバーで認証鍵を作成し、管理する必要がなくなります。

ssh-agentがどんなものかというと

  • 公開鍵認証を便利にしてくれるツールみたいなもの
  • 自分のローカルの秘密鍵を一時的にssh-agentに登録でき、ssh-agentに登録された鍵を利用して認証処理を実施できる
  • エージェント転送(ForwardAgent)機能を使うと、どのサーバーにおいてもssh-agentに登録した鍵で認証処理を実施できる
ssh先のサーバーからPC(ローカル)のssh-agentを使う方法

1. ssh-agentの起動

$ ssh-agent

unixドメインソケットファイルが生成され、ファイル名が環境変数SSH_AUTH_SOCK)に格納されます。unixドメインソケットファイルとはLinuxプロセス間のデータ通信に使われるファイルです。

2. ssh-agentへの秘密鍵登録

$ ssh-add

秘密鍵ssh-agentに登録される。ssh-agentに鍵が登録されているかどうかを確認するには以下のコマンドを実施する

$ ssh-add -l

3. エージェント転送(Forward Agent)機能を使用してssh接続をする

$ ssh -A hogehoge.com

エージェント転送(Forward Agent)オプション(-A)を利用する。これで、接続先のサーバーでssh-agentを使った認証が可能になる。接続先のサーバーでssh-agentが有効かどうか確認したい場合は、$ssh-add -l コマンドを実施し、エージェントに鍵が登録されているかどうかを確認する。

Dockerコンテナ内からPC(ローカル)のssh-agentを使う方法

ssh-agentはunixドメインソケットファイルを提供しており、環境変数SSH_AUTH_SOCK)に設定されている。これをDockerコンテナ内に持っていく。
1. 一つ前の例を参考にssh-agentの起動と鍵登録をする

2. 1.で生成したソケットファイルをDockerコンテナにマウントし、環境変数SSH_AUTH_SOCK)にソケットファイルへのパスを指定する。

environment:
    - SSH_AUTH_SOCK = /tmp/ssh-agent.sock
volumes:
    - {SSH_AUTH_SOCK}:/tmp/ssh-agent.sock

上記の手順で、unixドメインソケットファイルを通してssh-agentとプロセス間通信が可能になりssh-agentを介した認証が可能になる。ローカルPCの認証鍵でDockerコンテナ内からGitの認証を通してpullできたりする。