Tự động hóa quản lý chứng chỉ SSL Let's Encrypt bằng thử thách DNS-01 và AWS

Bài viết mô tả các bước để tự động hóa việc quản lý chứng chỉ SSL từ Hãy mã hóa CA sử dụng Thử thách DNS-01 и AWS.

acme-dns-route53 là một công cụ cho phép chúng tôi triển khai tính năng này. Nó có thể hoạt động với chứng chỉ SSL từ Let's Encrypt, lưu chúng trong Trình quản lý chứng chỉ Amazon, sử dụng API Route53 để triển khai thử thách DNS-01 và cuối cùng là đẩy thông báo tới SNS. TRONG acme-dns-route53 Ngoài ra còn có chức năng tích hợp sẵn để sử dụng bên trong AWS Lambda và đây là thứ chúng ta cần.

Bài viết này được chia thành 4 phần:

  • tạo một tệp zip;
  • tạo vai trò IAM;
  • tạo một hàm lambda chạy acme-dns-route53;
  • tạo bộ hẹn giờ CloudWatch kích hoạt chức năng 2 lần một ngày;

Lưu ý: Trước khi bắt đầu, bạn cần cài đặt GoLang 1.9+ и AWSCLI

Tạo một tập tin zip

acme-dns-route53 được viết bằng GoLang và hỗ trợ phiên bản không thấp hơn 1.9.

Chúng ta cần tạo một tệp zip có nhị phân acme-dns-route53 bên trong. Để làm được điều này bạn cần cài đặt acme-dns-route53 từ kho GitHub bằng lệnh go install:

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

Tệp nhị phân được cài đặt trong $GOPATH/bin danh mục. Xin lưu ý rằng trong quá trình cài đặt, chúng tôi đã chỉ định hai môi trường đã thay đổi: GOOS=linux и GOARCH=amd64. Họ nói rõ với trình biên dịch Go rằng nó cần tạo một tệp nhị phân phù hợp với hệ điều hành Linux và kiến ​​trúc amd64 - đây là thứ chạy trên AWS.
AWS mong đợi chương trình của chúng tôi sẽ được triển khai ở dạng tệp zip, vì vậy hãy tạo acme-dns-route53.zip kho lưu trữ sẽ chứa tệp nhị phân mới được cài đặt:

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

Lưu ý: Tệp nhị phân phải nằm trong thư mục gốc của kho lưu trữ zip. Đối với điều này chúng tôi sử dụng -j lá cờ.

Bây giờ biệt danh zip của chúng tôi đã sẵn sàng để triển khai, tất cả những gì còn lại là tạo một vai trò với các quyền cần thiết.

Tạo vai trò IAM

Chúng ta cần thiết lập vai trò IAM với các quyền mà lambda của chúng ta yêu cầu trong quá trình thực thi vai trò này.
Hãy gọi chính sách này lambda-acme-dns-route53-executor và ngay lập tức giao cho cô ấy một vai trò cơ bản AWSLambdaBasicExecutionRole. Điều này sẽ cho phép lambda của chúng tôi chạy và ghi nhật ký vào dịch vụ AWS CloudWatch.
Đầu tiên, chúng tôi tạo một tệp JSON mô tả các quyền của mình. Điều này về cơ bản sẽ cho phép các dịch vụ lambda sử dụng vai trò lambda-acme-dns-route53-executor:

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

Nội dung file của chúng ta như sau:

{
    "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/*"
            ]
        }
    ]
}

Bây giờ hãy chạy lệnh aws iam create-role để tạo một vai trò:

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

Lưu ý: hãy nhớ chính sách ARN (Tên tài nguyên của Amazon) - chúng tôi sẽ cần nó trong các bước tiếp theo.

Vai trò lambda-acme-dns-route53-executor đã tạo, bây giờ chúng ta cần chỉ định quyền cho nó. Cách dễ nhất để làm điều này là sử dụng lệnh aws iam attach-role-policy, chuyển chính sách ARN AWSLambdaBasicExecutionRole như sau:

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

Lưu ý: một danh sách với các chính sách khác có thể được tìm thấy đây.

Tạo hàm lambda chạy acme-dns-route53

Hoan hô! Bây giờ bạn có thể triển khai chức năng của chúng tôi lên AWS bằng lệnh aws lambda create-function. Lambda phải được cấu hình bằng các biến môi trường sau:

  • AWS_LAMBDA - nói rõ ràng acme-dns-route53 việc thực thi đó xảy ra bên trong AWS Lambda.
  • DOMAINS — danh sách các tên miền được phân tách bằng dấu phẩy.
  • LETSENCRYPT_EMAIL - chứa Hãy mã hóa email.
  • NOTIFICATION_TOPIC - tên của Chủ đề thông báo SNS (tùy chọn).
  • STAGING - ở giá trị 1 môi trường dàn dựng được sử dụng.
  • 1024 MB - giới hạn bộ nhớ, có thể thay đổi.
  • 900 giây (15 phút) - hết thời gian chờ.
  • acme-dns-route53 — tên nhị phân của chúng tôi, có trong kho lưu trữ.
  • fileb://~/acme-dns-route53.zip — đường dẫn đến kho lưu trữ mà chúng tôi đã tạo.

Bây giờ hãy triển khai:

$ 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",[email protected],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": "[email protected]", 
            "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"
 }

Tạo bộ hẹn giờ CloudWatch kích hoạt chức năng 2 lần một ngày

Bước cuối cùng là thiết lập cron, gọi hàm của chúng ta hai lần một ngày:

  • tạo quy tắc CloudWatch với giá trị schedule_expression.
  • tạo mục tiêu quy tắc (điều gì sẽ được thực thi) bằng cách chỉ định ARN của hàm lambda.
  • cho phép quy tắc gọi hàm lambda.

Bên dưới tôi đã đính kèm cấu hình Terraform của mình, nhưng trên thực tế, việc này được thực hiện rất đơn giản bằng cách sử dụng bảng điều khiển AWS hoặc 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}"
}

Bây giờ bạn đã được cấu hình để tự động tạo và cập nhật chứng chỉ SSL

Nguồn: www.habr.com

Thêm một lời nhận xét