GitlabのContainer registryを自己署名認証局で使用する

Posted on 2022/10/22(Sat) 16:15 in technical

GitlabのContainer registryを自己署名認証局で使用する

ローカルに閉じた環境で Gitlab registry を使用するため、自己署名認証局を使用してContainer registryを設定します。

参考資料

この2つの合わせ技です。

環境

認証局の作成

$ mkdir certs
$ cd certs
$ openssl rand -writerand ~/.rnd
$ openssl genrsa -out ca.key 4096
Generating RSA private key, 4096 bit long modulus (2 primes)
......................................................++++
..............................................................++++
e is 65537 (0x010001)
$ openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=JP/ST=Mayoiga/L=Kotonomiya/O=ainoniwa/CN=ainoniwa.net" \
 -key ca.key \
 -out ca.crt

日本にマヨイガ県琴乃宮市なんてあるのかなぁ...

証明書の作成

$ openssl genrsa -out registry.ainoniwa.net.key 4096
$ openssl req -sha512 -new \
    -subj "/C=JP/ST=Mayoiga/L=Kotonomiya/O=ainoniwa/CN=registry.ainoniwa.net" \
    -key registry.ainoniwa.net.key \
    -out registry.ainoniwa.net.csr
$ cat <<_EOL_ > v3.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=registry.ainoniwa.net
DNS.2=registry.ainoniwa
DNS.3=registry
DNS.4=shiki
_EOL_
$ openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in registry.ainoniwa.net.csr \
    -out registry.ainoniwa.net.crt

Gitlabの設定

認証局と証明書を配置して gitlab-ctl reconfigure を叩くと有効になります。

$ sudo cp ca.crt /etc/gitlab/trusted-certs/
$ sudo mkdir /etc/gitlab/ssl
$ sudo cp registry.ainoniwa.net.crt /etc/gitlab/ssl/
$ sudo cp registry.ainoniwa.net.key /etc/gitlab/ssl/
$ sudo sed -i -e "s|# registry_external_url 'https://registry.example.com'|registry_external_url 'https://registry.ainoniwa.net'|" /etc/gitlab/gitlab.rb
$ sudo gitlab-ctl reconfigure
$ ls -l /opt/gitlab/embedded/ssl/certs
total 224
lrwxrwxrwx 1 root root     32 Oct 22 14:57 2e3b57b2.0 -> /etc/gitlab/trusted-certs/ca.crt
lrwxrwxrwx 1 root root     32 Oct 22 14:50 2f7cbad2.0 -> /etc/gitlab/trusted-certs/ca.crt
-rw-r--r-- 1 root root 224369 Oct  4 23:44 cacert.pem
-rw-r--r-- 1 root root    147 Mar  5  2017 README

Hint

Gitlabは /etc/gitlab/trusted-certs に認証局を置くと reconfigure 時に /opt/gitlab/embedded/ssl/certs にシンボリックリンクが置かれるらしい。
https://stackoverflow.com/questions/60021680/is-it-possible-to-configure-gitlab-builtin-container-registry-with-self-signed-c

Registryが使えるようになるとGitlabの各プロジェクトの画面でRegistryが見えるようになリます。

gitlab_registry_self_signed_001

Note

なお、DNS解決は別途環境に応じて設定されるものとします。私の環境はunboundなので適当に設定しましたが、無い人は /etc/hosts でも編集してください。

利用者(Docker)の設定

docker loginして、Registryを使用できるようにします。これは利用者各位で設定する必要があります。

何もしないと x509: certificate signed by unknown authority というエラーが返ってきます。

$ docker login registry.ainoniwa.net
Username: ruy
Password: 
Error response from daemon: Get "https://registry.ainoniwa.net/v2/": x509: certificate signed by unknown authority

Debian/Ubuntuの場合を例に、今回はシステムグローバルな対応をしてみます。
/usr/local/share/ca-certificates にCAを追加して update-ca-certificatessystemctl restart docker を実行します。

$ sudo cp ca.crt /usr/local/share/ca-certificates/registryCA.crt
$ sudo update-ca-certificates
$ sudo systemctl restart docker
$ docker login registry.ainoniwa.net
Username: ruy
Password: 
WARNING! Your password will be stored unencrypted in /home/yuki/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

Hint

Let's encryptが使えるならこのような作業は要らないので、出来るだけデフォルトで入っている認証局の範囲で構築したいものです。

その後は、Gitlabのプロジェクトに合わせたタグ名を付与してpushすることが出来るようになります。
Gitlabのコマンド例に従って、以下のように実行できるはずです。(下記例では、作成済みのコンテナに別のタグを設定してpushしています)

$ docker tag pve_portal/api registry.ainoniwa.net/ruy/pve-portal-spa/api
$ docker push registry.ainoniwa.net/ruy/pve-portal-spa/api

pushに成功したら以下のように登録されます。

gitlab_registry_self_signed_002

終わり

自己署名認証局を使用してGitlabにContainer registryを作りました。
これでインターネットに非公開の環境でGitlab runnerと組み合わせて、ダンゴ虫のように生きていくことが出来そうです。

色んな意味で「2022年にもなってそんなことするのかよ」って思った人は、そのまま頭の中にしまっておいてくれると嬉しいな。