仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

Ubuntu 24.04のCockpitでLet's EncryptのSSL証明書を使う

2024年4月25日、Ubuntu 24.04 LTSがリリースされました

筆者はUbuntu 24.04 LTS + Cockpitを自宅の次期仮想マシンプラットフォームにする予定で、先日ベータ版を利用して紹介記事を書いたのですが、この記事では自己署名証明書をそのまま利用していました。そこでこの記事の補完ネタとして、Let's Encryptで正規のSSL証明書を取得し、Cockpitから利用する方法をここで紹介します。

CockpitはLAN内で運用する上、SSL証明書の取得のためだけにポートを開きたくはないため、DNS-01チャレンジを使用します。またDNSサーバーとしてはAWSのRoute 53を使う想定です。

IAMユーザーの作成とアクセスキーの発行

まずAWS上で、Certbotが利用するIAMユーザーを作成し、アクセスキーを発行しておきます。必要な権限は以下の通りです。ユーザーのインラインポリシーとして作成するのが手っとり早いでしょう。なお ChangeResourceRecordSets は、該当のゾーンに対してのみ許可されていればいいため、リソースを限定する方が望ましいのですが、筆者は複数のゾーンをホストしていることもあり、特に制限は入れていません。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "route53:GetChange",
                "route53:ListHostedZones",
                "route53:ChangeResourceRecordSets"
            ],
            "Resource": "*"
        }
    ]
}

UbuntuにAWSCLIをインストールし(snapを使うと便利です)、rootユーザーにアクセスキーを設定しておいてください。

$ sudo snap install aws-cli  --classic
$ sudo aws configure

Certbotのインストールと証明書の取得

certbotパッケージと、Route 53用のプラグインをインストールします。

$ sudo apt install -y certbot python3-certbot-dns-route53

AWSの設定が正しければ、以下のコマンドで証明書を発行できます。

$ sudo certbot certonly --dns-route53 \
  -n \
  -d '証明書のコモンネーム' \
  --email メールアドレス \
  --agree-tos

SSL証明書の設定

Cockpitは /etc/cockpit/ws-certs.d/ 以下から証明書を読み込みます。ここに CockpitのFQDN.crt(証明書) CockpitのFQDN.key(秘密鍵) という名前でファイルを配置してください。とはいえCerrtbotで取得した証明書は90日ごとに更新されますし、いちいちコピーするのも筋が悪いですから、シンボリックリンクを張るといいでしょう。証明書は /etc/letsencrypt/live/証明書のコモンネーム ディレクトリ内にありますので、以下のようにします。

$ cd /etc/cockpit/ws-certs.d/
$ sudo ln -s /etc/letsencrypt/live/証明書のコモンネーム/fullchain.pem 証明書のコモンネーム.crt
$ sudo ln -s /etc/letsencrypt/live/証明書のコモンネーム/privkey.pem 証明書のコモンネーム.key

あとはCockpitを再起動すれば、正規のSSL証明書が読み込まれます。

Cockpitの待ち受けポートを変更する

CockpitはデフォルトでTCPの9090番ポートで接続を待ち受けます。前段にリバースプロキシを置くのであれば、このままでもよいのですが、他のアプリを動かさないのであれば、Cockpitに直接443番ポートを待ち受けさせてしまってもいいでしょう。ポートを待ち受けているのはsystemd.socketですので、以下のコマンドでオーバーライドを作成します。

$ sudo systemctl edit cockpit.socket

テキストエディタが起動したら、以下の内容を記述してください。最初に空の ListenStream= を書くことで、デフォルトの9090番ポートの待ち受けをキャンセルする所がポイントです。

[Socket]
ListenStream=
ListenStream=443

変更を保存したら、 cockpit.socket を再起動してください。