使用 DNS-01 质询和 AWS 自动化 Let's Encrypt SSL 证书管理

这篇文章描述了自动管理 SSL 证书的步骤 让我们加密 CA 使用 DNS-01 挑战 и AWS.

acme-dns-route53 是一个允许我们实现此功能的工具。 它可以使用 Let's Encrypt 的 SSL 证书,将其保存在 Amazon Certificate Manager 中,使用 Route53 API 实施 DNS-01 质询,最后将通知推送到 SNS。 在 acme-dns-route53 AWS Lambda 中还提供了内置功能,这正是我们所需要的。

本文分为 4 部分:

  • 创建一个 zip 文件;
  • 创建 IAM 角色;
  • 创建一个运行的 lambda 函数 acme-dns-route53;
  • 创建一个每天触发函数 2 次的 CloudWatch 计时器;

注意: 在开始之前您需要安装 Go 语言 1.9+ и 命令行界面

创建 zip 文件

acme-dns-route53是用GoLang编写的,支持不低于1.9的版本。

我们需要创建一个带有二进制文件的 zip 文件 acme-dns-route53 里面。 为此,您需要安装 acme-dns-route53 使用命令从 GitHub 存储库中获取 go install:

$ env GOOS=linux GOARCH=amd64 go install github.com/begmaroman/acme-dns-route53

二进制文件安装在 $GOPATH/bin 目录。 请注意,在安装过程中我们指定了两个更改的环境: GOOS=linux и GOARCH=amd64它们告诉 Go 编译器创建一个适合的二进制文件。 Linux AWS 运行的是 OS 和 amd64 架构。
AWS 希望我们的程序部署在 zip 文件中,所以让我们创建 acme-dns-route53.zip 存档将包含新安装的二进制文件:

$ zip -j ~/acme-dns-route53.zip $GOPATH/bin/acme-dns-route53

注意: 二进制文件应位于 zip 存档的根目录中。 为此我们使用 -j 旗帜。

现在我们的 zip 昵称已准备好部署,剩下的就是创建一个具有必要权限的角色。

创建 IAM 角色

我们需要设置一个 IAM 角色,并具有 lambda 在执行过程中所需的权限。
我们称这个政策为 lambda-acme-dns-route53-executor 并立即给她一个基本角色 AWSLambdaBasicExecutionRole。 这将允许我们的 lambda 运行并将日志写入 AWS CloudWatch 服务。
首先,我们创建一个描述我们权利的 JSON 文件。 这本质上将允许 lambda 服务使用该角色 lambda-acme-dns-route53-executor:

$ touch ~/lambda-acme-dns-route53-executor-policy.json

我们的文件内容如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup"
            ],
            "Resource": "arn:aws:logs:<AWS_REGION>:<AWS_ACCOUNT_ID>:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents",
                "logs:CreateLogStream"
            ],
            "Resource": "arn:aws:logs:<AWS_REGION>:<AWS_ACCOUNT_ID>:log-group:/aws/lambda/acme-dns-route53:*"
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "route53:ListHostedZones",
                "cloudwatch:PutMetricData",
                "acm:ImportCertificate",
                "acm:ListCertificates"
            ],
            "Resource": "*"
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "sns:Publish",
                "route53:GetChange",
                "route53:ChangeResourceRecordSets",
                "acm:ImportCertificate",
                "acm:DescribeCertificate"
            ],
            "Resource": [
                "arn:aws:sns:${var.region}:<AWS_ACCOUNT_ID>:<TOPIC_NAME>",
                "arn:aws:route53:::hostedzone/*",
                "arn:aws:route53:::change/*",
                "arn:aws:acm:<AWS_REGION>:<AWS_ACCOUNT_ID>:certificate/*"
            ]
        }
    ]
}

现在让我们运行命令 aws iam create-role 创建角色:

$ aws iam create-role --role-name lambda-acme-dns-route53-executor 
 --assume-role-policy-document ~/lambda-acme-dns-route53-executor-policy.json

注意: 请记住策略 ARN(Amazon 资源名称) - 我们将在后续步骤中需要它。

角色 lambda-acme-dns-route53-executor 创建完毕,现在我们需要为其指定权限。 最简单的方法是使用命令 aws iam attach-role-policy,传递策略 ARN AWSLambdaBasicExecutionRole 如下所示:

$ aws iam attach-role-policy --role-name lambda-acme-dns-route53-executor 
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

注意: 可以找到包含其他政策的列表 这里.

创建一个运行的 lambda 函数 acme-dns-route53

万岁! 现在您可以使用命令将我们的函数部署到AWS aws lambda create-function。 必须使用以下环境变量配置 lambda:

  • AWS_LAMBDA - 说清楚了 acme-dns-route53 该执行发生在 AWS Lambda 内部。
  • DOMAINS — 以逗号分隔的域列表。
  • LETSENCRYPT_EMAIL - 包含 让我们加密电子邮件.
  • NOTIFICATION_TOPIC — SNS 通知主题的名称(可选)。
  • STAGING - 按价值 1 使用暂存环境。
  • 1024 MB——内存限制,可以更改。
  • 900 秒(15 分钟)— 超时。
  • acme-dns-route53 — 我们的二进制文件的名称,位于存档中。
  • fileb://~/acme-dns-route53.zip — 我们创建的存档的路径。

现在我们来部署:

$ aws lambda create-function 
 --function-name acme-dns-route53 
 --runtime go1.x 
 --role arn:aws:iam::<AWS_ACCOUNT_ID>:role/lambda-acme-dns-route53-executor 
 --environment Variables="{AWS_LAMBDA=1,DOMAINS="example1.com,example2.com",LETSENCRYPT_EMAIL=begmaroman@gmail.com,STAGING=0,NOTIFICATION_TOPIC=acme-dns-route53-obtained}" 
 --memory-size 1024 
 --timeout 900 
 --handler acme-dns-route53 
 --zip-file fileb://~/acme-dns-route53.zip

 {
     "FunctionName": "acme-dns-route53", 
     "LastModified": "2019-05-03T19:07:09.325+0000", 
     "RevisionId": "e3fadec9-2180-4bff-bb9a-999b1b71a558", 
     "MemorySize": 1024, 
     "Environment": {
         "Variables": {
            "DOMAINS": "example1.com,example2.com", 
            "STAGING": "1", 
            "LETSENCRYPT_EMAIL": "your@email.com", 
            "NOTIFICATION_TOPIC": "acme-dns-route53-obtained", 
            "AWS_LAMBDA": "1"
         }
     }, 
     "Version": "$LATEST", 
     "Role": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/lambda-acme-dns-route53-executor", 
     "Timeout": 900, 
     "Runtime": "go1.x", 
     "TracingConfig": {
         "Mode": "PassThrough"
     }, 
     "CodeSha256": "+2KgE5mh5LGaOsni36pdmPP9O35wgZ6TbddspyaIXXw=", 
     "Description": "", 
     "CodeSize": 8456317,
"FunctionArn": "arn:aws:lambda:us-east-1:<AWS_ACCOUNT_ID>:function:acme-dns-route53", 
     "Handler": "acme-dns-route53"
 }

创建每天触发函数 2 次的 CloudWatch 计时器

最后一步是设置 cron,它每天调用我们的函数两次:

  • 使用该值创建 CloudWatch 规则 schedule_expression.
  • 通过指定 lambda 函数的 ARN 创建规则目标(应执行的内容)。
  • 授予规则调用 lambda 函数的权限。

下面我附上了我的 Terraform 配置,但实际上这是使用 AWS 控制台或 AWS CLI 非常简单地完成的。

# Cloudwatch event rule that runs acme-dns-route53 lambda every 12 hours
resource "aws_cloudwatch_event_rule" "acme_dns_route53_sheduler" {
  name                = "acme-dns-route53-issuer-scheduler"
  schedule_expression = "cron(0 */12 * * ? *)"
}

# Specify the lambda function to run
resource "aws_cloudwatch_event_target" "acme_dns_route53_sheduler_target" {
  rule = "${aws_cloudwatch_event_rule.acme_dns_route53_sheduler.name}"
  arn  = "${aws_lambda_function.acme_dns_route53.arn}"
}

# Give CloudWatch permission to invoke the function
resource "aws_lambda_permission" "permission" {
  action        = "lambda:InvokeFunction"
  function_name = "${aws_lambda_function.acme_dns_route53.function_name}"
  principal     = "events.amazonaws.com"
  source_arn    = "${aws_cloudwatch_event_rule.acme_dns_route53_sheduler.arn}"
}

现在您已配置为自动创建和更新 SSL 证书

来源: habr.com

为具有 DDoS 保护、VPS VDS 服务器的站点购买可靠的主机 🔥 购买具备 DDoS 防护的可靠网站托管服务,包括 VPS 和 VDS 服务器 | ProHoster