認証付きのDocker Private registryを立てる
DockerHub(Public registry)を使えない場合は,Private Registryを立てる必要がある.DockerはPrivate registry用のDockerイメージを提供しているため,コンテナを立てるだけですぐに使い始めることができる.
$ docker run -p 5000:5000 registry
$ docker push docker-private.com:5000/test-image:latest
ただ,これだとURLを知っていれば誰でも好きにイメージをpushできてしまうので,認証を行う必要がある.認証には,Dockerクライアント(docker login
)が対応しているBasic認証を利用する.Docker registryには認証機構がないため,nginxやApacheをリバースプロキシとして配置して,Basic認証を行う.
このとき,(当たり前だが)以下の2つの制限がある.
- DockerクライアントのBasic認証はSSLが必須である
- Dockerクライアントは証明書の正当性をちゃんとチェックする(無視できない)
気軽さを求めて自己署名証明書を使うと,いくつか面倒な部分があるのでまとめておく.環境としては,サーバーをUbuntu,リバースプロキシをnginx,クライアントをOSX+boot2dockerとする.
サーバー側の設定
サーバー側では以下の3つの設定を行う.
- nginxの設定
- 認証するユーザのパスワードの設定
- 自己署名証明書の作成
nginxの設定
リバースプロキシにはnginxを用いる.Docker registryはBasic認証を行うためのnginxの設定例を提供している(docker-registry/contrib/nginx)ので,それをそのまま利用する.
$ git clone https://github.com/docker/docker-registry
$ cp docker-registry/contrib/nginx/nginx_1-3-9.conf /etc/nginx/conf.d/.
$ cp docker-registry/contrib/nginx/docker-registry.conf /etc/nginx/.
パスワードの設定
Docker Registryを利用するユーザの設定を行う(apache2-utils
パッケージを利用する).
$ htpasswd -bc /etc/nginx/docker-registry.htpasswd USERNAME PASSWORD
自己署名証明書の作成
自己署名(オレオレ)証明書を作る.まず,CAの秘密鍵と公開鍵を作成しておく.
$ echo 01 > ca.srl
$ openssl genrsa -des3 -out ca-key.pem 2048
$ openssl req -new -x509 -days 365 -key ca-key.pem -out ca.pem
次に,このCAを使ってサーバーの秘密鍵と証明書(CRT)を作成する.
$ openssl genrsa -des3 -out server-key.pem 2048
$ openssl req -subj '/CN=<Your Hostname Here>' -new -key server-key.pem -out server.csr
$ openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem -out server-cert.pem
パスフレーズは削除しておく.
$ openssl rsa -in server-key.pem -out server-key.pem
最後にこれらをしかるべき配置しておく.
$ cp server-cert.pem /etc/ssl/certs/docker-registry
$ cp server-key.pem /etc/ssl/private/docker-registry
クライアント側の設定
クライアント側では,サーバーの自己署名証明書を受け入れる設定をする.無視できるようにしようという流れはあるが,実現はしていない,というかなさそう(2014年10月現在)(#2687,#5817).
OSX上でboot2dockerを使っている場合は,OSXで設定するのではなくboot2docker-vmに設定する必要がある.上でサーバーの自己署名証明書の作成したCAの公開鍵(ca.pem
)を使う(#347)
$ boot2docker ssh
$ cat ca.pem >> /etc/ssl/certs/ca-certificates.crt
$ /etc/init.d/docker restart
以上.あとはログインすればDockerHubのように利用できる.
$ docker login https://docker-private.com
まとめ
自己署名証明は初めてであまり自信ないので,おかしい部分があれば教えてください.次にまた必要になれば自動化する.
参考
- Running Docker with https - Docker deamonとDocker client間もSSLで通信することができる.deamonがリモートで,clientがローカルという構成では必要になるかもしれない.
- Deploying your own Private Docker Registry | ActiveState
- オレオレ証明書をopensslで作る - ろば電子が詰まっている
- 社内用Docker Registryを立てる - $shibayu36->blog;