Docker APIを0.0.0.0で公開し、TLSを使用してセキュアにする方法

Docker API を外部ネットワークに公開する際に、すべてのインターフェース(外部ネットワークからのアクセスも含む)で接続を許可する設定を tcp://0.0.0.0:2376 に変更することができます。ただし、この方法にはセキュリティ上のリスクが伴うため、必ず TLS を使用して通信を暗号化し、認証を行う必要があります。ここでは、証明書の作成から設定、接続までの手順を解説します。


構成概要

  • 目的: Docker API を 0.0.0.0:2376 で公開し、外部ネットワークからも接続できるようにする。ただし、セキュアな通信を行うために TLS 証明書を使用する。
  • 前提: Docker がインストールされているサーバーで TLS 証明書の作成が可能。

手順

1. TLS 証明書の作成

まず、Docker API のセキュリティを確保するために、自己署名の TLS 証明書を生成します。以下の手順では、OpenSSL を使用して自己署名証明書を作成します。

1.1. CA(認証局)の作成

CA 証明書を作成します。この証明書は、クライアントとサーバーの双方で信頼される認証局として機能します。

# 認証局の秘密鍵を作成
openssl genrsa -out ca-key.pem 4096

# 認証局の証明書を作成
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

ここで、-days 365 は証明書の有効期限(1年)を指定しています。req コマンドを実行すると、証明書に含める情報(国、組織名など)の入力を求められます。

1.2. サーバー証明書の作成

次に、Docker デーモンが使用するサーバー証明書を作成します。サーバー証明書には、接続されるサーバーのホスト名または IP アドレスが含まれます。

# サーバーの秘密鍵を作成
openssl genrsa -out server-key.pem 4096

# サーバーの証明書要求を作成(Common Name はサーバーのホスト名かIPを指定)
openssl req -subj "/CN=your-server-ip" -new -key server-key.pem -out server.csr

# サーバー証明書を作成し、認証局で署名する
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem

ここで、/CN=your-server-ip には、Docker API に接続するサーバーの IP アドレスを指定します(例: /CN=192.168.1.100)。

1.3. クライアント証明書の作成

次に、Docker API にアクセスするクライアントが使用する証明書を作成します。

# クライアントの秘密鍵を作成
openssl genrsa -out client-key.pem 4096

# クライアントの証明書要求を作成(クライアント用のCommon Nameを指定)
openssl req -subj "/CN=client" -new -key client-key.pem -out client.csr

# クライアント証明書を作成し、認証局で署名する
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem

この証明書は、Docker API にアクセスするクライアントに必要なものです。


2. Docker デーモンの設定

証明書が作成できたら、Docker デーモンを設定して、TLS を使用した接続を受け入れるようにします。設定ファイル /etc/docker/daemon.json に以下の内容を追加します。

{
  "tls": true,
  "tlsverify": true,
  "tlscacert": "/path/to/ca.pem",
  "tlscert": "/path/to/server-cert.pem",
  "tlskey": "/path/to/server-key.pem",
  "hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"]
}
  • tls: TLS を有効にする。
  • tlsverify: クライアント証明書を検証する。
  • tlscacert: 認証局(CA)証明書のパス。
  • tlscert: サーバー証明書のパス。
  • tlskey: サーバーの秘密鍵のパス。
  • hosts: Docker デーモンがリッスンするホスト。tcp://0.0.0.0:2376 は、すべてのインターフェースからの TCP 接続を許可します。
設定ファイルのパスの例
{
  "tls": true,
  "tlsverify": true,
  "tlscacert": "/etc/docker/ca.pem",
  "tlscert": "/etc/docker/server-cert.pem",
  "tlskey": "/etc/docker/server-key.pem",
  "hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"]
}

設定後、Docker デーモンを再起動して設定を反映させます。

sudo systemctl restart docker

3. クライアントからの接続

クライアントは、証明書を使って Docker API に接続します。クライアント側で TLS 証明書を指定し、docker コマンドを使ってリモート Docker に接続します。

クライアントから接続するコマンド例
docker --tlsverify \
  --tlscacert=/path/to/ca.pem \
  --tlscert=/path/to/client-cert.pem \
  --tlskey=/path/to/client-key.pem \
  -H tcp://your-server-ip:2376 version

このコマンドで以下を指定します:

  • --tlsverify: TLS 認証を有効化。
  • --tlscacert: CA 証明書のパス。
  • --tlscert: クライアント証明書のパス。
  • --tlskey: クライアントキーのパス。
  • -H: リモートホストの指定。your-server-ip にはサーバーの IP アドレスを指定。

4. セキュリティの注意点

  • 外部公開に伴うリスク: Docker API を 0.0.0.0 で公開する場合、インターネット全体からアクセス可能になるため、セキュリティリスクが高まります。必ず TLS 証明書による認証と暗号化を行い、必要に応じて IP アドレスの制限やファイアウォールでアクセスを制限してください。
  • クライアント証明書の管理: クライアント証明書を利用することで、Docker API へのアクセスを制限できますが、証明書の保護は重要です。クライアント証明書が流出した場合、第三者が不正に API にアクセスするリスクがあります。
  • ファイアウォール設定: すべてのネットワークからのアクセスを許可する代わりに、特定の信頼できる IP アドレスからのみアクセスを許可するようにファイアウォールを設定することをお勧めします。

まとめ

Docker API を 0.0.0.0 で公開して外部からアクセス可能にするには、TLS 証明書を使って通信の暗号化とクライアント認証を行うことが重要です。手順に従い、自己署名証明書を生成し、Docker デーモンを適切に設定することで、セキュアな接続が可能になります。

外部公開は高いセキュリティリスクを伴うため、常に適切な認証・暗号化、そしてファイアウォールによるアクセス制限を行ってください。

コメントを残す