株式会社ネットワールドのエンジニアがお届けする技術情報ブログです。
各製品のエキスパートたちが旬なトピックをご紹介します。

Azureに立てたGitLabサーバーにDNS名を割り当ててついでにLet's EncryptでSSL証明書を発行してみる

ネットワールドの鈴木です。
前回「AzureにGitLabサーバーを立ち上げてみよう! 」 でAzureの仮想マシンでGitLabサーバーを作りました。
今回は、WebUIにアクセスするときにIPを使ってアクセスしていたのでDNS名を割り当ててFQDNでアクセスできるようにしてみたいと思います。 ついでにSSL証明書もサーバー構成時に作られているであろう自己署名証明書が適用されているので、Let's Encryptを利用させていただき、パブリックな証明書を割り当ててみます。

本記事の対象の方

今回のブログのゴール

このブログのゴールはこちらです!

このブログのゴール
  • Azureの仮想マシンの仮想マシンにDNS名を割り当てる。
  • Let's Encryptを利用し、GitLabサーバーにパブリックな証明書を割り当てる。

このブログをお読みいただくにあたっての事前ご連絡事項

  • 本記事はGitLabがどういった製品なのかの説明はしておりません。製品説明につきましては弊社の製品ページ (こちら) をご参照ください。
  • GitLabの詳細な使用法についてはGitLabの公式オンラインドキュメント (こちら) をご参照ください。
  • 外部公開するサーバーですがセキュリティの細かい部分は記載していません。あくまでも検証用サーバーとしてなので大事なデータやシークレットなどは保存しないでください。
  • 一部手順はAzure DNSで管理している独自ドメインが必要になります。Azure DNS以外でドメインを管理している場合は今回の設定内容を参考に実施してみてください。

DNS名を割り当てる

GitLabの仮想マシンをデプロイした状態ではパブリックIPでアクセスすることはできてもDNS名は割り当てられていませんのでFQDNでアクセスすることができません。 まずは2つの方法でDNS名を割り当ててみます。

  1. 仮想マシンで利用可能な .(location).cloudapp.azure.com のドメインを使う方法
  2. 自身で管理している独自ドメインを使う方法

1.はAzureの仮想マシンであれば利用可能なAzureの機能です。
2.は自身でドメインを管理している必要があります。今回は Azure DNSで管理しているドメイン lab.xxxxxxxxx.xxx がありますので Azure 仮想マシンから連携するように設定します。

ドメインを管理しているが、Azure DNSではない(AWS Route 53)などの場合はAレコードにGitLabサーバーのDNS名とパブリックIPを登録してください。
その場合、Azureの仮想マシンのパブリックIPがデフォルトでは予約されていませんので、事前に予約されたパブリックIP に変更してください。

1. 仮想マシンで利用可能な .(location).cloudapp.azure.com のドメインを使う方法

仮想マシンの設定からDNS名の設定を開くことができます。

1-1. Azure PortalからGitLab仮想マシンを開きます。
DNS名未構成のリンクをクリックします。
f:id:networld-blog-post:20220128160704p:plain

1-2. パブリックIPの設定に移動します。
DNS 名ラベル (オプション) にDNS名を入力します。今回は blog-gitlab を入力します。
入力後、保存します。
f:id:networld-blog-post:20220128160719p:plain

1-3. 設定が保存されたことを確認します。
f:id:networld-blog-post:20220128160733p:plain

今回設定された FQDNをメモしておきます。
- blog-gitlab.japaneast.cloudapp.azure.com

1-4. GitLabサーバーの設定を変更します。GitLabサーバーにSSHなどで接続します。

1-5. 接続後、 sudo vi /etc/gitlab/gitlab.rb を実行し設定ファイルを開きます。
32行目にある external_url の値が https://(GitLabサーバーのパブリックIPアドレス) になっていますので、先ほどメモしたFQDNに変更し、保存します。
f:id:networld-blog-post:20220217121431p:plain

1-6. sudo gitlab-ctl reconfigure を実行し、設定を反映させます。
gitlab Reconfigured! と表示され完了することを確認します。 f:id:networld-blog-post:20220128160804p:plain

1-7. Webブラウザで設定したFQDNにアクセスしてみます。 証明書はLet's Encryptの証明書が適用されていないのでアラートがでたままです。
f:id:networld-blog-post:20220128160823p:plain

このようにAzure 仮想マシンの設定でDNS名を割り当てることで簡単にFQDNでのアクセスが可能になります。

2. 自身で管理している独自ドメインを使う方法

次に自身で管理している独自ドメインのDNS名を割り当てて、独自ドメインでのアクセスを設定してみます。
今回使うドメインは Azure DNSで管理しているドメインです。このドメインに先ほどと同じように blog-gitlab のDNS名を作成し、アクセスしてみます。

  • 今回使うAzure DNSのDNSゾーン
    f:id:networld-blog-post:20220128160838p:plain

2-1. Azure PortalからGitLab仮想マシンを開きます。
DNS名blog-gitlab.japaneast.cloudapp.azure.comのリンクをクリックします。 f:id:networld-blog-post:20220128160853p:plain

2-2. パブリックIPの設定に移動します。 エイリアスのレコード セット+エイリアス レコードの作成をクリックします。
f:id:networld-blog-post:20220128160906p:plain

2-3. エイリアスレコードの作成画面に遷移します。
対象のドメインが設定されているDNSゾーンを選択します。 名前 にDNS名を入力します。ここでは先ほどと同じように blog-gitlab と入力し、保存します。
f:id:networld-blog-post:20220128160922p:plain

2-4. 作成が完了し、エイリアスのレコードセット に設定が反映されることを確認します。
f:id:networld-blog-post:20220128160940p:plain

2-5. 1-4,5,6を参考にExternal_url の値を独自ドメインのFQDNに変更し、reconfigureを実行します。

2-6. Webブラウザで設定したFQDNにアクセスしてみます。 今回も証明書はLet's Encryptの証明書が適用されていないのでアラートがでたままです。 f:id:networld-blog-post:20220128160958p:plain

Azure DNSで管理しているドメインをつかってDNS名を割り当ててみました。
Azureの仮想マシンとAzure DNSでないとダメでは?と思うかもしれませんが、Azure DNS上の設定の実態としてはAレコードで仮想マシンのパブリックIPリソースを割り当てているだけですので、その他の管理サービスを利用されている場合でもAレコードでDNS名とパブリックIPを設定すれば問題ありません。
f:id:networld-blog-post:20220128161017p:plain

Azure DNS以外を利用される場合、仮想マシンに付与しているパブリックIPリソースの割り当て方法が 動的 となっているため、仮想マシンを停止し再度起動した場合別のパブリックIPが割り当たってしまいます。
この設定を事前に 静的 に変更してからDNSレコードの登録をしてください。

Let's Encryptを利用してSSL証明書を割り当てる

GitLabではパブリックな証明書を割り当てる際に、Let's Encryptを利用して自動的に発行・更新を行う機能があります。
今回はその機能を利用して証明書を発行してみます。

DNS名の設定は 1. 仮想マシンで利用可能な .(location).cloudapp.azure.com のドメインを使う方法 の方法で設定されている値を利用します。

  1. GitLabサーバーの設定を変更します。GitLabサーバーにSSHなどで接続します。

  2. 接続後、 sudo vi /etc/gitlab/gitlab.rb を実行し設定ファイルを開きます。 いくつか設定を変更します。

    • GitLab Nginxの設定変更
      1342行目あたりから始まる GitLab NGINX の以下の3つの設定をコメントアウトします。
# nginx['redirect_http_to_https'] = true
# nginx['ssl_certificate'] = "/etc/gitlab/ssl/server.crt"
# nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/server.key"

f:id:networld-blog-post:20220128161041p:plain

  • Let's Encrypt Integrationの設定変更
    2341行目あたりから始まる Let's Encrypt Integrationの設定を以下のように変更します。
################################################################################
# Let's Encrypt integration
################################################################################
letsencrypt['enable'] = true
letsencrypt['contact_emails'] = ['suzukik@networld.co.jp'] # This should be an array of email addresses to add as contacts
# letsencrypt['group'] = 'root'
# letsencrypt['key_size'] = 2048
# letsencrypt['owner'] = 'root'
# letsencrypt['wwwroot'] = '/var/opt/gitlab/nginx/www'
# See http://docs.gitlab.com/omnibus/settings/ssl.html#automatic-renewal for more on these sesttings
letsencrypt['auto_renew'] = true
letsencrypt['auto_renew_hour'] = 0
letsencrypt['auto_renew_minute'] = 30 # Should be a number or cron expression, if specified.
letsencrypt['auto_renew_day_of_month'] = "*/4"
letsencrypt['auto_renew_log_directory'] = '/var/log/gitlab/lets-encrypt'

Let’s Encryptとの連携設定を有効にし、4日ごとに自動更新を行うように設定されています。
スケジュールの細かい設定などはここでは行いませんので必要に応じて設定してください。
参考URL: http://docs.gitlab.com/omnibus/settings/ssl.html#automatic-renewal

f:id:networld-blog-post:20220128161058p:plain

  1. sudo gitlab-ctl reconfigure を実行し、設定を反映させます。
    gitlab Reconfigured! と表示され完了することを確認します。

  2. Webブラウザで設定したFQDNにアクセスしてみます。 証明書のアラートが表示されなく、URL欄の鍵アイコンをクリックすると証明書が 有効 と表示されます。 f:id:networld-blog-post:20220128161115p:plain

    証明書の中身をみてみると、 発行者が R3, Let's Encrypt, US となっていることが確認できます。
    f:id:networld-blog-post:20220128161134p:plain

再起動後にDNS名がパブリックIPにリセットされないようにする

Azure上のGitLabのイメージを利用して構成した場合、仮想マシンを再起動すると external_url に指定したDNS名がパブリックIPに初期化されてしまいます。
これを回避するためにssh で仮想マシンに接続し、下記のコマンドを実行します。

sudo /opt/bitnami/configure_app_domain --domain (DNS名)

実行時のログは下記のようになります。

bitnami@gitlab:~$ sudo /opt/bitnami/configure_app_domain --domain gitlab.xxxxxx.xxx
Configuring domain to gitlab.xxxxxx.xxx
2022-02-07T00:53:04.253Z - info: Saving configuration info to disk
gitlab 00:53:04.37 INFO  ==> Updating external URL in GitLab configuration
gitlab 00:53:04.38 INFO  ==> Reconfiguring GitLab
gitlab 00:53:49.91 INFO  ==> Starting GitLab services
Disabling automatic domain update for IP address changes

今回は以上です!
Azureで構成することで、独自ドメインを使うこともできますしAzure側で用意されているドメインを使うこともできます。 証明書はLet's Encryptとの連携で自動発行、自動更新を行うことができますので長期間の検証でも問題なく利用できるかと思います。
今回は独自ドメインを使ってLet's Encryptとの連携は記載していませんが手順は同じですので是非試してみてください。ちゃんと動きます!