DockerデーモンのTLS接続設定

DockerデーモンのAPIエンドポイントをTLSで保護し、安全な通信経路を確立する方法について解説します。これにより、不正なアクセスからDocker環境を保護し、セキュリティを強化します。

TLS証明書の生成

まず、Dockerデーモンとクライアント間の安全な通信に必要なTLS証明書を生成します。

CA (認証局) 証明書の生成

# CA秘密鍵の生成 (パスワードは任意で設定、例: dockerpass)
openssl genrsa -aes256 -out ca-key.pem 4096
# CA証明書の生成 (有効期間1年、必要情報を入力)
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

Dockerデーモン用証明書の生成

# デーモン用秘密鍵の生成
openssl genrsa -out server-key.pem 4096
# デーモン用証明書署名要求 (CSR) の生成 (CNはDockerホストのIPアドレスまたはホスト名に置き換えてください)
openssl req -subj "/CN=192.168.1.100" -sha256 -new -key server-key.pem -out server.csr
# 拡張設定ファイルを作成 (IPアドレスやDNS名を追加)
echo "subjectAltName = DNS:docker.example.com,IP:192.168.1.100,IP:127.0.0.1" >> extfile.cnf
# 拡張キー使用法をサーバー認証に限定
echo "extendedKeyUsage = serverAuth" >> extfile.cnf
# CAで署名したデーモン用証明書を生成
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
  -CAcreateserial -out server-cert.pem -extfile extfile.cnf

クライアント用証明書の生成

# クライアント用秘密鍵の生成
openssl genrsa -out client-key.pem 4096
# クライアント用証明書署名要求 (CSR) の生成
openssl req -subj '/CN=client' -new -key client-key.pem -out client.csr
# クライアント認証用の拡張設定ファイルを作成
echo "extendedKeyUsage = clientAuth" > extfile-client.cnf
# CAで署名したクライアント用証明書を生成
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -extfile extfile.cnf

証明書ファイルの整理

# 不要になったCSRファイルと拡張設定ファイルを削除
rm -f client.csr server.csr extfile.cnf extfile-client.cnf
# 秘密鍵のパーミッションを変更 (読み取り専用)
chmod 0400 ca-key.pem client-key.pem server-key.pem
# 証明書ファイルのパーミッションを変更 (読み取り専用)
chmod 0444 ca.pem server-cert.pem client-cert.pem

DockerデーモンのTLS設定

生成した証明書ファイルをDockerデーモンがアクセスできる場所に配置し、設定ファイルを編集します。

必要な証明書ファイル:

  • ca.pem
  • server-cert.pem
  • server-key.pem

証明書ファイルをDockerの設定ディレクトリにコピーします。

cp ca.pem server-cert.pem server-key.pem /etc/docker/

Dockerデーモンのサービス定義ファイルを編集して、TLSオプションを指定します。

# systemdを使用している場合
sudo systemctl edit docker.service

編集画面が表示されたら、以下の内容でExecStart行を追記または修正します。これにより、Dockerデーモンは指定されたポート(例: 2376)でTCP接続を受け入れ、TLS検証を有効にします。

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H unix:///var/run/docker.sock

設定変更をシステムに反映し、Dockerサービスを再起動します。

sudo systemctl daemon-reload
sudo systemctl restart docker.service
sudo systemctl status docker.service

Dockerクライアントからの接続

Dockerクライアント (CLIやIDEなど) からTLSで保護されたDockerデーモンに接続するには、クライアント証明書が必要です。

クライアント用の証明書ファイル:

  • ca.pem
  • client-cert.pem
  • client-key.pem

これらのクライアント証明書を、接続元のマシンに安全に配置します。例えば、~/client_tls/ ディレクトリを作成してコピーします。

mkdir ~/client_tls
cp ca.pem client-cert.pem client-key.pem ~/client_tls/

Dockerクライアントの接続先URLは、tcp:// から https:// に変更し、ポート番号もデーモン設定に合わせたもの (例: 2376) を指定します。

curlでの接続例

curl https://192.168.1.100:2376/images/json \
  --cert ~/client_tls/client-cert.pem \
  --key ~/client_tls/client-key.pem \
  --cacert ~/client_tls/ca.pem

タグ: Docker tls SSL Security Certificate

10月21日 05:31 投稿