概要
- docker registryイメージをローカルにデプロイして、カスタムイメージレジストリを構築してみよう
[root@container1 ~]# podman run -d -p 5000:5000 --name=registry -v /data/registry/:/var/lib/registry:Z docker.io/library/registry
- タグのレジストリを192.168.241.136:5000に変更する
[root@container1 ~]# podman tag docker.io/library/nginx 192.168.241.136:5000/nginx
- ローカルレジストリにプッシュしたが、TLS認証書なしのHTTPレスポンスを返されてエラーになった
[root@container1 ~]# podman push 192.168.241.136:5000/nginx
Getting image source signatures
Error: trying to reuse blob sha256:e6133723babd21baef99916f9a05b26c2ccacf68501daacec5c08b08d6725af5 at destination: pinging container registry 192.168.241.136:5000: Get "https://192.168.241.136:5000/v2/": http: server gave HTTP response to HTTPS client
- 「--tls-verify=false」ロングオプションをつけると、問題なくプッシュされたが、毎度オプションをつけるようにすることは無理がある
root@container1 ~]# podman push --tls-verify=false 192.168.241.136:5000/nginx
Getting image source signatures
Copying blob e05580707e24 done |
Copying blob b6518a63d3f5 done |
Copying blob e6133723babd done |
Copying blob 9870c3588040 done |
Copying blob 495f44945d44 done |
Copying blob 3e0268bbbafd done |
Copying blob 52f372f2a633 done |
Copying config 9e4696c649 done |
Writing manifest to image destination
Clientの設定変更による解決策
- コンテナクライアントの設定を変更してみよう
[root@container1 certs]# vi /etc/containers/registries.conf
- レジストリーの認証を無視する設定を加える
[[registry]]
location = "192.168.241.136:5000"
insecure = true
- すべてのクライアント側に設定が必要なため、実用的ではない
レジストリーにTLSの設定
- opensslのコンフィグレーションファイルを作成する
[root@container1 sha256]# vi /data/certs/openssl.cnf
- 下記のような設定ファイルをもとにキーペアを作成しよう
[req]
distinguished_name=req_distinguished_name # 証明書の持ち主の情報を[req_distinguished_name]セクションに指定する
x509_extensions = v3_req # 証明書がバージョン3の標準拡張機能を使用することを記す
prompt = no # 証明書を作成するときにプロンプトの確認を省略し、自動化する
[req_distinguished_name]
CN = registry.example.com # Common Nameの略語で、ドメインネームを記す
[v3_req]
subjectAltName = @alt_names # Common Name以外にも名前があるため、[alt_names]セクションを参照するようにする
[alt_names]
DNS.1 = registry.example.com # このドメインネームで接続するとき有効であることを示す
IP.1 = 192.168.241.136 # ただのIPアドレスで接続したときにも安全なコネクションとして認めるようにする
- 「-newkey」は証明書の作成と同時に秘密鍵も作成するオプションである
- 「-keyout」は秘密鍵の名前を指定するオプションである
- 「-x509」はオレオレ署名を表す
- 「-out」は証明書ファイルの名前を指定するオプションである
- 設定ファイルをもとに証明書と秘密鍵を作成する
[root@container1 certs]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout registry.example.com.key -x509 -days 365 -out registry.example.com.crt -config openssl.cnf
- 「registry.example.com.crt」証明書と「registry.example.com.key」秘密鍵が作成されたことがわかる
[root@container1 certs]# ls -l
total 12
-rw-r--r-- 1 root root 240 Apr 27 13:38 openssl.cnf
-rw-r--r-- 1 root root 1822 Apr 27 13:43 registry.example.com.crt
-rw------- 1 root root 3272 Apr 27 13:43 registry.example.com.key
- レジストリーコンテナの「/certs」当てにマウントさせて
- 証明書をREGISTRY_HTTP_TLS_CERTIFICATEに、秘密鍵をREGISTRY_HTTP_TLS_KEYに指定する
[root@container1 certs]# podman run -d -p 5000:5000 --name registry -v /data/registry:/var/lib/registry:Z -v /data/certs:/certs:Z -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.example.com.crt -e REGISTRY_HTTP_TLS_KEY=/certs/registry.example.com.key docker.io/library/registry
afdfb621ca0496f31ac5eb30397d45188de3b61763ac2588d5ecb7af02d8f668
- レジストリークライアント側の「/etc/containers/certs.d/」の下に該当レジストリー名のディレクトリを作成し
[root@container1 certs]# mkdir -p /etc/containers/certs.d/registry.example.com:5000
- 証明書を「ca.crt」の名前でコピーする
[root@container1 certs]# cp /data/certs/registry.example.com.crt /etc/containers/certs.d/registry.example.com:5000/ca.crt
- 問題なくプッシュできた
[root@container1 certs]# podman push registry.example.com:5000/nginx
Getting image source signatures
Copying blob 495f44945d44 done |
Copying blob b6518a63d3f5 done |
Copying blob 3e0268bbbafd done |
Copying blob 9870c3588040 done |
Copying blob e05580707e24 done |
Copying blob ce47c92e9d8e skipped: already exists
Copying blob 49b3e94dfdaa skipped: already exists
Copying config 9e4696c649 done |
Writing manifest to image destination
結論
- レジストリーは暗号通信のための機能が備わっている
- カスタムレジストリーを構築する際にTLSを適用してみよう