Docker Trusted RegistryでLDAP認証する

Jul 27, 2015   #docker  #docker trusted registry  #active directory  #ldap 

Docker Trusted Registry(以下、DTR)は、DockerHubのようなリポジトリを自前の環境に構築できるソリューションです。 似たようなものでDocker Registryがありますが、DTRは認証機能が追加されていたりと色々な違いがあります。 今回は、Docker Registryとの違いを見ながらDTRを構築し、ADと連携するまで構築してみます。

何のためにDTR(or Docker Registry)を使うか

単純にリポジトリでイメージ管理をしたければ、公式提供のDockerHubを使えばOKです。 ですが、下記のようなケースではDTRやDocker Registryが必要になってきます。

  • プライベートリポジトリを使いたい(これはDockerHubでも可能)
  • インターネットに接続できない環境でリポジトリを使いたい
  • プライベートリポジトリと言えども、外部(インターネット上)で重要なイメージを管理したくない
  • docker pull/pushで消費するインターネット接続帯域を抑えたい
  • LANの広帯域を使って高速にdocker pull/pushしたい

ポイントはインターネット接続の有無と、セキュリティポリシー的に共用サービスが使えるかどうかでしょうか。

DTRとDocker Registryの比較

Docker RegistryとDTRを比較してみましょう。

Docker Registry DTR
費用 無料 有料(試用30日間)
UI CLI Web
認証 なし(色々いじれば可) ローカルDB、LDAP連携
ログ 出力なし あり(認証ログ等)

費用はかかるものの、実用における必要な機能が追加されたイメージですかね。

個人的には、認証機能が標準で搭載されたところが大きいです。 Docker Registryの場合はnginxも追加したりとか、色々やらないといけなかったので。

Docker Registryの方に興味がある方は、Docker Registryでプライベートなリポジトリを立てるをご確認ください。

今回の検証環境

AWSで環境を作ります。インスタンスは3つ使用します。

  1. CentOS7.1 DTR用
  2. CentOS7.1 push/pullテスト用
  3. Windows2012 AD用

AWSであれば、DTRのAMIがあるので上記1の構築はとても楽です。 簡単に済ませてしまっても良いのですが、せっかくなので自力で作ってみます。

2015年7月26日現在、DTRのAMIはUSリージョン限定です。

LDAP連携用のADを立てる

LDAP連携用にADを立てます。 私のようにADわからんっては、下記の手順が丁寧で分かりやすいです。

DTRのライセンスを入手する

Docker Subscriptionから、Docker Subscription for ServerのTrialを選びます。

DockerHubのアカウントを入れてログインします。

名前や会社名を入れてSubmitします。

そのままCreate Licenseします。

ダウンロードページに移ります。 DTR Trial Planのダウンロードアイコンから、ライセンスファイル(docker_subscription.lic)をダウンロードします。

また、今回はDTRのAMIを使わずにインストール用のスクリプトを使いますので、右上からスクリプト(docker-cs-engine-rpm.sh)を落とします。

DTR用のインスタンスを立ち上げる

DTRを乗せるCentOS7.1を立ち上げて、先ほどダウンロードしたスクリプトをscp等で転送します。 DTRはTCP80と443と5000を使うので、AWSの場合は穴を開けとく必要があります。

  • TCP80…DTRのWebUI(HTTPSにリダイレクトされる)
  • TCP443…DTRのWebUI
  • TCP5000…イメージのpush/pullをするポート

あとは公式のインストール手順に沿って進めます。

sudo yum update && sudo yum upgrade
chmod 755 docker-cs-engine-rpm.sh
sudo ./docker-cs-engine-rpm.sh
sudo yum install docker-engine-cs
sudo systemctl enable docker.service
sudo systemctl start docker.service
sudo bash -c "$(sudo docker run docker/trusted-registry install)"

最後のdocker runで少し時間がかかりますが、処理が終わるとプロンプトが帰ってきます。 docker psすると色々なコンテナが立ち上がっています。 nginxとpostgres使ってるみたいですね。

docker ps
CONTAINER ID        IMAGE                                          COMMAND                CREATED              STATUS              PORTS                                      NAMES
71fd542c2c52        docker/trusted-registry-nginx:1.2.0            "nginxWatcher"         18 seconds ago       Up 17 seconds       0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   docker_trusted_registry_load_balancer
58bd0dfcead1        docker/trusted-registry-admin-server:1.2.0     "server"               19 seconds ago       Up 18 seconds       80/tcp                                     docker_trusted_registry_admin_server
13166b5a50c6        docker/trusted-registry-log-aggregator:1.2.0   "log-aggregator"       19 seconds ago       Up 18 seconds                                                  docker_trusted_registry_log_aggregator
c777f33b42ed        docker/trusted-registry-garant:1.2.0           "garant /config/gara   19 seconds ago       Up 18 seconds                                                  docker_trusted_registry_auth_server
e0b242666c10        postgres:9.4.1                                 "/docker-entrypoint.   About a minute ago   Up About a minute   5432/tcp                                   docker_trusted_registry_postgres

インスタンスのIPにブラウザからアクセスしてみましょう。 証明書の警告を抜けると下記の画面が表示されるはずです。

ドメイン名が設定されてないことと、ライセンスが無いことで怒られていますね。 Settingsページからドメインを設定しましょう。ここではEC2のドメインを設定しました。

ライセンスは、SettingsページのLicenseタブから設定できます。 Upload Licenseから、先ほどダウンロードしたdocker_subscription.licをアップロードしましょう。

LDAP連携の設定

次に、LDAPの設定をします。 Settingsページから、Authenticationタブを開いて下記の設定をします。

LDAP Configuration Optionsで基本的な設定を行い、Confirm Login With Above Configurationで認証テストをする感じです。 また、User Search Filtersでセキュリティグループを使うと、権限付与を制御できます。 デフォルトだと全てのユーザが管理者権限になるので注意です。

ここでの設定は、push/pullだけではなくWebUIへのログインにも適用されます。 つまり、不適切な設定(認証テストに失敗している状態)で確定するとログインできなくなりますので要注意です。

認証がかかった状態でpush/pullする

別のインスタンスでDockerを入れてpush/pullを試してみましょう。 テスト用のイメージがほしいので、DockerHubからCentOSを落とします。

docker pull centos

で、このイメージをDTRにアップしたいのですがdocker loginで下記のエラーが出ます。

docker login 172.31.9.158
Username: dtr-user
Password:
Email:
FATA[0008] Error response from daemon: v1 ping attempt failed with error: Get https://172.31.9.158/v1/_ping: x509: cannot validate certificate for 172.31.9.158 because it doesn't contain any IP SANs. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry 172.31.9.158` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/172.31.9.158/ca.crt

正式な証明書を使うか、Docker daemonで--insecure-registry 172.31.9.158を指定しろとのこと。 なので/etc/sysconfig/dockerのOPTIONSに追記し、Dockerを再起動します。

# Modify these options if you want to change the way the docker daemon runs
OPTIONS='--selinux-enabled --insecure-registry 172.31.9.158'

systemctl restart docker

再起動すると、DTRに対しHTTPで通信するようになります。 もう一度docker loginしてみます。

docker login 172.31.9.158
Username: dtr-user
Password:
Email:
WARNING: login credentials saved in /root/.dockercfg.
Login Succeeded

DTRにログインできましたね。 タグを付け替えてから、DTRにpushします。タグを付け替えるのは、デフォルトでDockerHubにpushしようとするためです。

docker tag docker.io/centos 172.31.9.158/centos

docker push 172.31.9.158/centos
The push refers to a repository [172.31.9.158/centos] (len: 1)
7322fbe74aa5: Image already exists
c852f6d61e65: Image successfully pushed
f1b10cd84249: Image successfully pushed
Digest: sha256:c643bbf2b13660c54d8f3a0ff1ec9bb3f5043fd07f2fe7f665a68420a46c244d

一旦イメージを消してからpullしてみます。

docker rmi 172.31.9.158/centos
Untagged: 172.31.9.158/centos:latest

docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/centos    latest              7322fbe74aa5        5 weeks ago         172.2 MB

docker pull 172.31.9.158/centos
latest: Pulling from 172.31.9.158/centos
f1b10cd84249: Already exists
c852f6d61e65: Already exists
7322fbe74aa5: Already exists
Digest: sha256:c643bbf2b13660c54d8f3a0ff1ec9bb3f5043fd07f2fe7f665a68420a46c244d
Status: Downloaded newer image for 172.31.9.158/centos:latest

docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/centos      latest              7322fbe74aa5        5 weeks ago         172.2 MB
172.31.9.158/centos   latest              7322fbe74aa5        5 weeks ago         172.2 MB

pullも大丈夫そうですね。

ちなみに、pushされたイメージはDTRサーバの/var/local/dtr/image-storage/local/docker/registry/v2/repositoriesに格納されます。 ちょっと長いですが、中身を載せておきます。

pwd
/var/local/dtr/image-storage/local/docker/registry/v2/repositories
[root@ip-172-31-9-158 repositories]#
[root@ip-172-31-9-158 repositories]# ls -lR
.:
total 0
drwxr-xr-x. 5 root root 52 Jul 26 15:26 centos

./centos:
total 0
drwxr-xr-x. 3 root root 19 Jul 26 15:26 _layers
drwxr-xr-x. 4 root root 33 Jul 26 15:26 _manifests
drwxr-xr-x. 2 root root  6 Jul 26 15:26 _uploads

./centos/_layers:
total 4
drwxr-xr-x. 4 root root 4096 Jul 26 15:26 sha256

./centos/_layers/sha256:
total 0
drwxr-xr-x. 2 root root 17 Jul 26 15:26 672e8f8f8be08067e6a9a76dcca899642f82e33b1713e04288779b5215ca9d7e
drwxr-xr-x. 2 root root 17 Jul 26 15:26 a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4

./centos/_layers/sha256/672e8f8f8be08067e6a9a76dcca899642f82e33b1713e04288779b5215ca9d7e:
total 4
-rw-r--r--. 1 root root 71 Jul 26 15:26 link

./centos/_layers/sha256/a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4:
total 4
-rw-r--r--. 1 root root 71 Jul 26 15:26 link

./centos/_manifests:
total 0
drwxr-xr-x. 3 root root 19 Jul 26 15:26 revisions
drwxr-xr-x. 3 root root 19 Jul 26 15:26 tags

./centos/_manifests/revisions:
total 0
drwxr-xr-x. 3 root root 77 Jul 26 15:26 sha256

./centos/_manifests/revisions/sha256:
total 0
drwxr-xr-x. 3 root root 34 Jul 26 15:26 c643bbf2b13660c54d8f3a0ff1ec9bb3f5043fd07f2fe7f665a68420a46c244d

./centos/_manifests/revisions/sha256/c643bbf2b13660c54d8f3a0ff1ec9bb3f5043fd07f2fe7f665a68420a46c244d:
total 4
-rw-r--r--. 1 root root 71 Jul 26 15:26 link
drwxr-xr-x. 3 root root 19 Jul 26 15:26 signatures

./centos/_manifests/revisions/sha256/c643bbf2b13660c54d8f3a0ff1ec9bb3f5043fd07f2fe7f665a68420a46c244d/signatures:
total 0
drwxr-xr-x. 3 root root 77 Jul 26 15:26 sha256

./centos/_manifests/revisions/sha256/c643bbf2b13660c54d8f3a0ff1ec9bb3f5043fd07f2fe7f665a68420a46c244d/signatures/sha256:
total 0
drwxr-xr-x. 2 root root 17 Jul 26 15:26 950f8118967ead11ba1e3ea975fe94566dc409003af9b360c786503d8b356308

./centos/_manifests/revisions/sha256/c643bbf2b13660c54d8f3a0ff1ec9bb3f5043fd07f2fe7f665a68420a46c244d/signatures/sha256/950f8118967ead11ba1e3ea975fe94566dc409003af9b360c786503d8b356308:
total 4
-rw-r--r--. 1 root root 71 Jul 26 15:26 link

./centos/_manifests/tags:
total 0
drwxr-xr-x. 4 root root 32 Jul 26 15:26 latest

./centos/_manifests/tags/latest:
total 0
drwxr-xr-x. 2 root root 17 Jul 26 15:26 current
drwxr-xr-x. 3 root root 19 Jul 26 15:26 index

./centos/_manifests/tags/latest/current:
total 4
-rw-r--r--. 1 root root 71 Jul 26 15:26 link

./centos/_manifests/tags/latest/index:
total 0
drwxr-xr-x. 3 root root 77 Jul 26 15:26 sha256

./centos/_manifests/tags/latest/index/sha256:
total 0
drwxr-xr-x. 2 root root 17 Jul 26 15:26 c643bbf2b13660c54d8f3a0ff1ec9bb3f5043fd07f2fe7f665a68420a46c244d

./centos/_manifests/tags/latest/index/sha256/c643bbf2b13660c54d8f3a0ff1ec9bb3f5043fd07f2fe7f665a68420a46c244d:
total 4
-rw-r--r--. 1 root root 71 Jul 26 15:26 link

./centos/_uploads:
total 0

操作して思ったこと

Docker Registry一番の弱点だと思っていた認証機能が付いたのは嬉しいです。 やっと実用レベルになってきた感があります。

しかし、WebUIが思ったより充実してないですね。 どんなイメージがアップされているかをWebから確認する手段が無いので、そのあたりが実装されると良い感じです。