2.4.2. レジストリーを手動でセキュリティー保護する
レジストリーを手動でセキュリティー保護して TLS 経由でトラフィックを処理するには、以下を実行します。
- レジストリーをデプロイします。
レジストリーのサービス IP とポートを取得します。
oc get svc/docker-registry
$ oc get svc/docker-registry NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE docker-registry ClusterIP 172.30.82.152 <none> 5000/TCP 1d
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 既存のサーバー証明書を使用するか、またはキーと、指定された CA で署名された指定 IP およびホスト名に有効なサーバー証明書を作成します。レジストリーのサービス IP と docker-registry.default.svc.cluster.local ホスト名のサーバー証明書を作成するには、Ansible ホストインベントリーファイル (デフォルトでは /etc/ansible/hosts) に一覧表示されている最初のマスターから以下のコマンドを実行します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ルーターを 外部に公開する 場合、公開ルートのホスト名を
--hostnames
フラグに追加します。--hostnames='mydocker-registry.example.com,docker-registry.default.svc.cluster.local,172.30.124.220 \
--hostnames='mydocker-registry.example.com,docker-registry.default.svc.cluster.local,172.30.124.220 \
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ルートを外部にアクセス可能にするためにデフォルトの証明書を更新する際のその他詳細については、レジストリーとルーター証明書の再デプロイ を参照してください。
注記oc adm ca create-server-cert
コマンドは、2 年間有効な証明書を生成します。この期間は--expire-days
オプションを使って変更することができますが、セキュリティー上の理由から、値をこれより大きくすることは推奨されません。レジストリー証明書のシークレットを作成します。
oc create secret generic registry-certificates \ --from-file=/etc/secrets/registry.crt \ --from-file=/etc/secrets/registry.key
$ oc create secret generic registry-certificates \ --from-file=/etc/secrets/registry.crt \ --from-file=/etc/secrets/registry.key
Copy to Clipboard Copied! Toggle word wrap Toggle overflow シークレットをレジストリー Pod のサービスアカウント (デフォルトのサービスアカウントなど) に追加します。
oc secrets link registry registry-certificates oc secrets link default registry-certificates
$ oc secrets link registry registry-certificates $ oc secrets link default registry-certificates
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記シークレットを参照しているサービスアカウントにのみにシークレットを制限することはデフォルトで無効にされています。つまり、マスターの設定ファイルで
serviceAccountConfig.limitSecretReferences
がマスター設定のfalse
(デフォルトの設定) に設定されている場合は、サービスにシークレットをリンクする必要はありません。docker-registry
サービスを一時停止します。oc rollout pause dc/docker-registry
$ oc rollout pause dc/docker-registry
Copy to Clipboard Copied! Toggle word wrap Toggle overflow シークレットボリュームをレジストリーのデプロイメント設定に追加します。
oc set volume dc/docker-registry --add --type=secret \ --secret-name=registry-certificates -m /etc/secrets
$ oc set volume dc/docker-registry --add --type=secret \ --secret-name=registry-certificates -m /etc/secrets
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下の環境変数をレジストリーのデプロイメント設定に追加して TLS を有効にします。
oc set env dc/docker-registry \ REGISTRY_HTTP_TLS_CERTIFICATE=/etc/secrets/registry.crt \ REGISTRY_HTTP_TLS_KEY=/etc/secrets/registry.key
$ oc set env dc/docker-registry \ REGISTRY_HTTP_TLS_CERTIFICATE=/etc/secrets/registry.crt \ REGISTRY_HTTP_TLS_KEY=/etc/secrets/registry.key
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 詳細は、Docker ドキュメントのレジストリーの設定 のセクションを参照してください。
レジストリーの liveness probe に使用されているスキームを HTTP から HTTPS に更新します。
oc patch dc/docker-registry -p '{"spec": {"template": {"spec": {"containers":[{
$ oc patch dc/docker-registry -p '{"spec": {"template": {"spec": {"containers":[{ "name":"registry", "livenessProbe": {"httpGet": {"scheme":"HTTPS"}} }]}}}}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow レジストリーを OpenShift Container Platform 3.2 以降に初めてデプロイした場合は、レジストリーの readiness probe として使用されているスキームを HTTP から HTTPS に更新します。
oc patch dc/docker-registry -p '{"spec": {"template": {"spec": {"containers":[{
$ oc patch dc/docker-registry -p '{"spec": {"template": {"spec": {"containers":[{ "name":"registry", "readinessProbe": {"httpGet": {"scheme":"HTTPS"}} }]}}}}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow docker-registry
サービスを再開します。oc rollout resume dc/docker-registry
$ oc rollout resume dc/docker-registry
Copy to Clipboard Copied! Toggle word wrap Toggle overflow レジストリーが TLS モードで実行されていることを検証します。最後の docker-registry のデプロイメントが完了するまで待機し、Docker ログでレジストリーコンテナーを確認します。
listening on :5000, tls
のエントリーが見つかるはずです。oc logs dc/docker-registry | grep tls
$ oc logs dc/docker-registry | grep tls time="2015-05-27T05:05:53Z" level=info msg="listening on :5000, tls" instance.id=deeba528-c478-41f5-b751-dc48e4935fc2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow CA 証明書を Docker 証明書ディレクトリーにコピーします。これはクラスター内のすべてのノードで実行する必要があります。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- ca.crt ファイルは、マスター上の /etc/origin/master/ca.crt のコピーです。
認証を使用している場合、
docker
のバージョンによっては、OS レベルで証明書を信頼するようにクラスターを設定することも必要になります。証明書をコピーします。
cp /etc/origin/master/ca.crt /etc/pki/ca-trust/source/anchors/myregistrydomain.com.crt
$ cp /etc/origin/master/ca.crt /etc/pki/ca-trust/source/anchors/myregistrydomain.com.crt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下を実行します。
update-ca-trust enable
$ update-ca-trust enable
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
/etc/sysconfig/docker ファイルのこの特定のレジストリーに対してのみ、
--insecure-registry
オプションを削除します。次にデーモンを再度読み込み、 docker サービスを再起動して設定の変更を反映させます。sudo systemctl daemon-reload sudo systemctl restart docker
$ sudo systemctl daemon-reload $ sudo systemctl restart docker
Copy to Clipboard Copied! Toggle word wrap Toggle overflow docker
クライアント接続を検証します。レジストリーに対するdocker push
、またはレジストリーからのdocker pull
が正常に実行されるはずです。必ず このレジストリーにログインしていること を確認してください。docker tag|push <registry/image> <internal_registry/project/image>
$ docker tag|push <registry/image> <internal_registry/project/image>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下に例を示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow