こんにちは、

この記事では、AWS Route53サービスを使ってLet's Encrypt SSLを発行する方法を紹介する。学び始めよう。

Let's Encryptとは?

Let's EncryptはInternet Security Research Group(ISRG)が運営する非営利の証明機関で、Transport Layer Security暗号化のためのX.509証明書を無料で提供している。つまり、プロジェクトやアプリ用に無料のSSL証明書を取得でき、そのSSL証明書は90日間有効だ。自動更新のために何らかの自動化を行う必要がある。

AWS Route53とは?

Amazon Route 53はスケーラブルで高可用なドメインネームシステムサービスだ。2010年12月5日にリリースされ、Amazon.comのクラウドコンピューティングプラットフォームであるAmazon Web Servicesの一部である。新しいドメインを登録したり、既存のドメインを移管したり、単にドメインのDNS管理システムを使用したりできる。

この記事では、Google Domainsで登録した自分のドメインの一つを使用し、DNS管理システムだけを使うことにした。念のため、ドメインタイプはRoute53のパブリックホストゾーンである必要がある。私のドメインは"ermis.email"だ。私のドメインのNSレコードを自由にチェックしてほしい : )

なぜLet's Encrypt SSLの発行にRoute 53を使うのか?

Let's Encryptから新しいSSL証明書をリクエストすると、certbotがLet's Encryptサーバーにリクエストを送信するが、暗号化証明書を取得するためにAWSの外にHTTP(安全でない)リクエストを送受信したくない : ) それは少し奇妙で、セキュリティ上の問題を引き起こす可能性があると思う。

あるいは、単にSSL証明書が必要で、nginxやapache、その他の種類のウェブサーバーサービスにSSL証明書を直接バインドしたくない場合もある。そして、この方法の方がより便利で速く、何らかの自動化も可能だ...

IAMポリシー

AWS内で直接SSLを発行するためにAWS EC2を使用することにした。まず、Route53にアクセスするためのIAMポリシーを作成する必要がある。EC2にはElastic IPがあり、IAMポリシーをより安全にし、Route53リソースへのアクセスを制限する。このポリシーはIAMロールとして使用できず、特定のプロファイル名"certbot-route53"でaws-cli操作用に設定する。以下がIAMポリシーの例だ:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "CertbotRoute53",
            "Effect": "Allow",
            "Action": [
                "route53:GetChange",
                "route53:ListHostedZones"
            ],
            "Resource": "*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "3.92.136.59/32"
                }
            }
        },
        {
            "Sid": "CertbotRoute531",
            "Effect": "Allow",
            "Action": "route53:ChangeResourceRecordSets",
            "Resource": "arn:aws:route53:::hostedzone/Z01859902ZBFBUXJ0AV3J",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "3.92.136.59/32"
                }
            }
        }
    ]
}

メールサーバーのDNS名は"hermes.ermis.email"で、AレコードはSimple Routingで3.65.142.23を指している。"hermes.ermis.email"用のLet's Encrypt SSLをリクエストする。ドメインのTLDがcom/net/orgではないので少し違って見えるかもしれないが問題ない。ただのドメインとDNSだ : )

EC2の要件

公式のAmazon Linux 2 AMIで新しく起動したインスタンスで実行している場合、いくつかの前提条件をインストールする必要がある。まず、certbotcertbot-dns-route53プラグインをインストールするためにepelリポジトリをインストールする必要がある。1行のコマンドでやってしまおう!

[root@ip-172-31-89-11 ~]# amazon-linux-extras install -y epel && yum install -y certbot python2-certbot-dns-route53

発行しよう!

発行コマンドは以下の通り。

[root@ip-172-31-89-11 ~]# export AWS_PROFILE=certbot-route53; \
> certbot certonly --dns-route53 \
> --agree-tos \
> -m hello@ermis.email \
> --non-interactive \
> -d hermes.ermis.email

最後に一つ

SSLの更新が必要かどうかをチェックするcronを設定するのを忘れずに。cronに以下のコマンドを使用することもできる。

00 00 * * * export AWS_PROFILE=certbot-route53; certbot renew -q

私の記事を読んでくれてありがとう。楽しんでいただけたなら幸いだ!