前回までで、イメージの脆弱性や構成上の問題をチェックし対応することが可能になりました。
コンテナ用のイメージは普段DockerHubからpullしてくると思いますが、セキュリティ的な観点からプライベートなコンテナレジストリを用意したいと思うこともあると思います。
そこで、自分用のコンテナレジストリとしてharborの作成(今回)と使い方(次回)について記載したいと思います。
harborを何で作るかですが、いろんな作り方があるんですけど今回はdocker composeという複数のコンテナを管理するツールを使いたいと思います。
元になるOSは毎度おなじみCentos 7でやります。
それではやっていきましょう。
コンテナとして展開するのでdockerを使います。
まずはdockerの構築が必要ですが、ここではdockerの構築は省略させていただきdocker-composeの構築からやっていきたいと思います。
利用するdocker-composeとharborのバージョンは以下
[バージョン]
- docker-compose v2.5.1
- harbor v2.5.1
まず、docker composeの導入です。
手順はこちら。
https://docs.docker.jp/compose/install.html#linux
・利用するv2.5.1を指定してコマンドを実行します。
# curl -L https://github.com/docker/compose/releases/download/v2.5.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
・バージョンの確認をします。
# docker-compose version
# Docker Compose version v2.5.1
docker composeはこれで準備完了です。
驚きの簡単さですね。
続いてharborになります。
こっちは、証明書の作成やそれに合わせたファイルの書き換えなどがあるので手順も多くしんどいです。
それゆえに、うまくいかないことも多いですので心を強く持って挑んでください。
まずはharborのバイナリをダウンロードしてきて、構築用のOSに転送します。
開発速度が速いので、今回記載しているバージョンより新しいものが出ているかと思いますが、その場合でもおそらく構築手順自体は同じだと思います。
今回は/root直下でやっています。
- harborのバイナリダウンロード先
- https://github.com/goharbor/harbor/releases
使いたいバージョンの「Assets」からダウンロードできます。
・CentOS上で解凍します。今回は/root 直下
# tar zxvf harbor-offline-installer-v2.5.1.tgz
証明書関連の作成に着手します。
これは正しく作成配置ができていないと、イメージを置いたりダウンロードしたりするときに認証が通らなくて失敗します。
個人的にはこれに一番苦労しました。
・作業用のディレクトリを作成し移動ます。
# mkdir CA
# cd CA
・CA証明書の秘密鍵を生成します。
# openssl genrsa -out ca.key 4096
・CA証明書を生成 ※CNにharborホスト名をFQDNで入れます
# openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=xxxx.xxxx" \
-key ca.key \
-out ca.crt
・秘密鍵を生成します。
# openssl genrsa -out myharbor.key 4096
・証明書署名要求(CSR)を生成します。
# openssl req -sha512 -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=xxxx.xxxx" \
-key myharbor.key \
-out myharbor.csr
・x509v3拡張ファイルを生成します。
# cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
IP.1=OSのIPアドレスを入力
DNS.1=harborホストのFQDNを入力
DNS.2=harborホストのショートネームを入力
EOF
・このファイルを使用してv3.ext、harborホストの証明書を生成します。
# openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in myharbor.csr \
-out myharbor.crt
・ホストにサーバー証明書と秘密鍵を置きます。
# mkdir -p /data/cert/
# cp myharbor.crt /data/cert/
# cp myharbor.key /data/cert/
・サーバー証明書、秘密鍵、CAファイルをharborホストのDocker証明書フォルダーにコピーします。
# mkdir -p /etc/docker/certs.d/harborホストのFQDN/
# cp myharbor.key /etc/docker/certs.d/harborホストのFQDN/
# cp ca.crt /etc/docker/certs.d/harborホストのFQDN/
・harborの設定ファイルharbor.ymlに必要な情報を記入します。
テンプレート(harbor.yml.tmpl)があるのでコピーして.ymlにします。
# cd ../harbor
# cp harbor.yml.tmpl harbor.yml
# vi harbor.yml
編集個所は以下
# Configuration file of Harbor
# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname: reg.mydomain.com ※harborホストのFQDNに変更
# http related config
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 80
# https related config
https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /your/certificate/path ※/data/cert/myharbor.crt に変更
private_key: /your/private/key/path ※/data/cert/myharbor.key に変更
・インストールのスクリプトを実行します
# ./prepare
# ./install.sh
・ブラウザから以下へ接続を確認します。
http://harborホストのIPアドレス
これで構築は完了です。
作業が多く何を作ってるのか見失いがちになりますが、ゆっくり一つ一つやっていきましょう。
初めて作るときはチェックシートなんかを用意してみてもいいかもしれませんね。
次回は、出来上がったharborへログインしてイメージのpushやpullを実行してみましょう。