Automation ng Let's Encrypt SSL certificate management gamit ang DNS-01 challenge at AWS

Inilalarawan ng post ang mga hakbang upang i-automate ang pamamahala ng mga SSL certificate mula sa I-encrypt natin ang CA gamit DNS-01 hamon ΠΈ AWS.

acme-dns-route53 ay isang tool na magpapahintulot sa amin na ipatupad ang feature na ito. Maaari itong gumana sa mga SSL certificate mula sa Let's Encrypt, i-save ang mga ito sa Amazon Certificate Manager, gamitin ang Route53 API para ipatupad ang DNS-01 challenge, at, sa wakas, push notifications sa SNS. SA acme-dns-route53 Mayroon ding built-in na functionality para sa paggamit sa loob ng AWS Lambda, at ito ang kailangan namin.

Ang artikulong ito ay nahahati sa 4 na seksyon:

  • paglikha ng isang zip file;
  • paglikha ng tungkulin ng IAM;
  • paglikha ng isang lambda function na tumatakbo acme-dns-route53;
  • paggawa ng CloudWatch timer na nagti-trigger ng function 2 beses sa isang araw;

tandaan: Bago ka magsimula kailangan mong i-install GoLang 1.9+ ΠΈ AWS CLI

Paglikha ng isang zip file

Ang acme-dns-route53 ay nakasulat sa GoLang at sinusuportahan ang bersyon na hindi bababa sa 1.9.

Kailangan nating lumikha ng isang zip file na may binary acme-dns-route53 sa loob. Upang gawin ito kailangan mong i-install acme-dns-route53 mula sa GitHub repository gamit ang command go install:

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

Ang binary ay naka-install sa $GOPATH/bin direktoryo. Pakitandaan na sa panahon ng pag-install, tinukoy namin ang dalawang binagong kapaligiran: GOOS=linux ΠΈ GOARCH=amd64. Nilinaw nila sa Go compiler na kailangan nitong lumikha ng binary na angkop para sa Linux OS at amd64 architecture - ito ang tumatakbo sa AWS.
Inaasahan ng AWS na mai-deploy ang aming programa sa isang zip file, kaya gumawa tayo acme-dns-route53.zip archive na maglalaman ng bagong naka-install na binary:

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

tandaan: Ang binary ay dapat nasa ugat ng zip archive. Para dito ginagamit namin -j bandila.

Ngayon ang aming zip nickname ay handa na para sa deployment, ang natitira ay upang lumikha ng isang tungkulin na may mga kinakailangang karapatan.

Paglikha ng tungkulin ng IAM

Kailangan nating mag-set up ng tungkulin ng IAM na may mga karapatan na kinakailangan ng ating lambda sa panahon ng pagpapatupad nito.
Tawagan natin ang patakarang ito lambda-acme-dns-route53-executor at agad na bigyan siya ng pangunahing tungkulin AWSLambdaBasicExecutionRole. Papayagan nito ang aming lambda na tumakbo at magsulat ng mga log sa serbisyo ng AWS CloudWatch.
Una, gumawa kami ng JSON file na naglalarawan sa aming mga karapatan. Ito ay mahalagang magbibigay-daan sa mga serbisyo ng lambda na gamitin ang tungkulin lambda-acme-dns-route53-executor:

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

Ang mga nilalaman ng aming file ay ang mga sumusunod:

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

Ngayon patakbuhin natin ang utos aws iam create-role upang lumikha ng isang tungkulin:

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

tandaan: tandaan ang patakaran ARN (Amazon Resource Name) - kakailanganin natin ito sa mga susunod na hakbang.

Papel lambda-acme-dns-route53-executor nilikha, ngayon kailangan nating tukuyin ang mga pahintulot para dito. Ang pinakamadaling paraan upang gawin ito ay ang paggamit ng command aws iam attach-role-policy, pagpasa sa patakarang ARN AWSLambdaBasicExecutionRole tulad ng sumusunod:

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

tandaan: isang listahan na may iba pang mga patakaran ay matatagpuan dito.

Paglikha ng lambda function na tumatakbo acme-dns-route53

Hooray! Ngayon ay maaari mong i-deploy ang aming function sa AWS gamit ang command aws lambda create-function. Dapat na i-configure ang lambda gamit ang mga sumusunod na variable ng kapaligiran:

  • AWS_LAMBDA - ginagawa itong malinaw acme-dns-route53 ang pagpapatupad na iyon ay nangyayari sa loob ng AWS Lambda.
  • DOMAINS β€” isang listahan ng mga domain na pinaghihiwalay ng mga kuwit.
  • LETSENCRYPT_EMAIL - naglalaman ng I-encrypt Natin ang Email.
  • NOTIFICATION_TOPIC β€” pangalan ng SNS Notification Topic (opsyonal).
  • STAGING - sa halaga 1 ang kapaligiran ng pagtatanghal ay ginagamit.
  • 1024 MB - limitasyon ng memorya, maaaring mabago.
  • 900 seg (15 min) β€” timeout.
  • acme-dns-route53 β€” ang pangalan ng aming binary, na nasa archive.
  • fileb://~/acme-dns-route53.zip β€” ang landas patungo sa archive na aming ginawa.

Ngayon, i-deploy natin:

$ 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"
 }

Paggawa ng CloudWatch timer na nagti-trigger ng function 2 beses sa isang araw

Ang huling hakbang ay ang pag-set up ng cron, na tumatawag sa aming function dalawang beses sa isang araw:

  • lumikha ng panuntunan sa CloudWatch na may halaga schedule_expression.
  • lumikha ng target ng panuntunan (kung ano ang dapat isagawa) sa pamamagitan ng pagtukoy sa ARN ng lambda function.
  • bigyan ng pahintulot ang panuntunan na tawagan ang lambda function.

Sa ibaba ay inilakip ko ang aking Terraform config, ngunit sa katunayan ito ay ginagawa nang napakasimple gamit ang AWS console o 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}"
}

Ngayon ay na-configure ka na upang awtomatikong lumikha at mag-update ng mga SSL certificate

Pinagmulan: www.habr.com

Magdagdag ng komento