Docker APIをローカルコンテナからセキュアにアクセスする方法とTLSの設定
Dockerは、アプリケーションをコンテナとして実行し、管理するための強力なツールですが、APIを利用してコンテナの操作や管理を行うこともできます。この記事では、Docker APIにローカルコンテナからアクセスする方法と、そのアクセスをTLSでセキュアにする手順について詳しく解説します。
1. Docker APIの設定
1.1 Dockerデーモンの設定
Docker APIをローカルからアクセスできるようにするには、Dockerデーモンの設定を変更する必要があります。デフォルトでは、DockerデーモンはUNIXソケット(/var/run/docker.sock
)でリッスンしており、ローカルコンテナからのアクセスは可能ですが、TCP経由でのアクセスを有効にすることで、より柔軟なアクセスが可能になります。
1.1.1 設定ファイルの編集
- Dockerデーモンの設定ファイル(通常は
/etc/docker/daemon.json
)を編集します。もし設定ファイルが存在しない場合は、新しく作成してください。
sudo nano /etc/docker/daemon.json
- 設定ファイルに以下の内容を追加します。ここでは、DockerデーモンがTCPポート2375でリッスンするように設定しています(ポート番号は必要に応じて変更できます)。
{
"hosts": ["tcp://127.0.0.1:2375", "unix:///var/run/docker.sock"]
}
"tcp://0.0.0.0:2375"
は、全てのIPアドレスでTCPポート2375でリッスンする設定です。ローカルホストのみでアクセスを制限する場合は、"tcp://127.0.0.1:2375"
を使用します。"unix:///var/run/docker.sock"
は、UNIXソケットでのリッスン設定です。これにより、ローカルからの標準的なソケットアクセスも可能になります。
- 設定を保存してファイルを閉じます。
- Dockerデーモンを再起動して設定を反映させます。
sudo systemctl restart docker
1.2 ローカルホストでの設定
ローカルコンテナからのアクセスをセキュアにするためには、TLS(Transport Layer Security)を使用して接続を暗号化することが推奨されます。
2. TLSでのセキュアな設定
2.1 SSL/TLS証明書の生成
TLS接続を確立するためには、証明書とキーが必要です。これらを生成するには、OpenSSLを使用します。
2.1.1 CA証明書とサーバー証明書の生成
- CA(Certificate Authority)証明書と秘密鍵を生成します。
openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -out ca.pem
- サーバー証明書と秘密鍵を生成します。
openssl genrsa -out server-key.pem 4096
openssl req -new -key server-key.pem -out server.csr
openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
ca-key.pem
はCAの秘密鍵ca.pem
はCA証明書server-key.pem
はサーバーの秘密鍵server-cert.pem
はサーバー証明書
2.1.2 クライアント証明書の生成(必要に応じて)
- クライアント証明書と秘密鍵を生成します。
openssl genrsa -out client-key.pem 4096
openssl req -new -key client-key.pem -out client.csr
openssl x509 -req -days 365 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem
2.2 DockerデーモンのTLS設定
- Dockerデーモンの設定ファイルを再度編集します。
sudo nano /etc/docker/daemon.json
- 以下のようにTLS設定を追加します。
{
"hosts": ["tcp://127.0.0.1:2376", "unix:///var/run/docker.sock"],
"tls": true,
"tlsverify": true,
"tlscacert": "/path/to/ca.pem",
"tlscert": "/path/to/server-cert.pem",
"tlskey": "/path/to/server-key.pem"
}
"tls": true
はTLSを有効にする設定です。"tlsverify": true
はTLS証明書による検証を有効にする設定です。"tlscacert"
,"tlscert"
,"tlskey"
はそれぞれCA証明書、サーバー証明書、サーバー秘密鍵のパスを指定します。
- 設定を保存してファイルを閉じます。
- Dockerデーモンを再起動して設定を反映させます。
sudo systemctl restart docker
2.3 クライアント側の設定
クライアントからTLS経由でDocker APIにアクセスするには、適切な証明書を指定して接続します。
docker --tlsverify \
--tlscacert=/path/to/ca.pem \
--tlscert=/path/to/client-cert.pem \
--tlskey=/path/to/client-key.pem \
-H=tcp://127.0.0.1:2376 \
info
--tlsverify
はTLS証明書の検証を有効にします。--tlscacert
,--tlscert
,--tlskey
はそれぞれCA証明書、クライアント証明書、クライアント秘密鍵のパスを指定します。-H
はDockerデーモンのホストとポートを指定します。
3. まとめ
Docker APIへのアクセスをセキュアにするために、ローカルホストでのTCPポート設定とTLSによる暗号化が有効です。これにより、APIのセキュリティが強化され、ローカルコンテナからのアクセスも安全に行うことができます。TLS設定によって、通信が暗号化されることで、データの盗聴や改ざんのリスクを低減できます。
Dockerのセキュリティを強化し、より安全にコンテナを管理するために、これらの設定をぜひ実施してみてください。
この解説記事がDocker APIのセキュアな設定に役立つことを願っています。質問やさらなるサポートが必要であれば、お気軽にX(Twitter)からお知らせください。