Automation sa Let's Encrypt SSL certificate management gamit ang DNS-01 challenge ug AWS

Gihubit sa post ang mga lakang aron ma-automate ang pagdumala sa mga sertipiko sa SSL gikan sa Atong I-encrypt ang CA gamit DNS-01 nga hagit ΠΈ AWS.

acme-dns-ruta53 usa ka himan nga magtugot kanamo sa pagpatuman niini nga bahin. Mahimo kini nga magamit sa mga sertipiko sa SSL gikan sa Let's Encrypt, i-save kini sa Amazon Certificate Manager, gamita ang Route53 API aron ipatuman ang hagit sa DNS-01, ug, sa katapusan, iduso ang mga pahibalo sa SNS. SA acme-dns-ruta53 Adunay usab built-in nga pag-andar para magamit sa sulod sa AWS Lambda, ug kini ang kinahanglan namon.

Kini nga artikulo gibahin sa 4 nga mga seksyon:

  • paghimo og zip file;
  • paghimo og papel sa IAM;
  • paghimo og lambda function nga nagdagan acme-dns-ruta53;
  • paghimo usa ka CloudWatch timer nga mag-trigger sa usa ka function 2 beses sa usa ka adlaw;

Mubo nga sulat: Sa dili ka pa magsugod kinahanglan nimo nga i-install GoLang 1.9+ ΠΈ AWS CLI

Paghimo og zip file

Ang acme-dns-route53 gisulat sa GoLang ug nagsuporta sa bersyon nga dili ubos sa 1.9.

Kinahanglan namon nga maghimo usa ka zip file nga adunay binary acme-dns-route53 sulod. Aron mahimo kini kinahanglan nimo nga i-install acme-dns-route53 gikan sa GitHub repository gamit ang command go install:

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

Ang binary gi-install sa $GOPATH/bin direktoryo. Palihug timan-i nga sa panahon sa pag-instalar among gipiho ang duha ka nausab nga mga palibot: GOOS=linux ΠΈ GOARCH=amd64. Gipatin-aw nila sa Go compiler nga kinahanglan nga maghimo usa ka binary nga angay alang sa Linux OS ug amd64 nga arkitektura - kini ang nagdagan sa AWS.
Gilauman sa AWS nga ang among programa ma-deploy sa usa ka zip file, busa maghimo kita acme-dns-route53.zip archive nga maglangkob sa bag-ong na-install nga binary:

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

Mubo nga sulat: Ang binary kinahanglan nga anaa sa gamut sa zip archive. Alang niini among gigamit -j bandera.

Karon ang among zip nickname andam na alang sa pag-deploy, ang nahabilin mao ang paghimo usa ka papel nga adunay kinahanglan nga mga katungod.

Paghimo usa ka tahas sa IAM

Kinahanglan namon nga maghimo usa ka tahas sa IAM nga adunay mga katungod nga gikinahanglan sa among lambda sa panahon sa pagpatuman niini.
Tawgon nato kini nga palisiya lambda-acme-dns-route53-executor ug hatagan dayon siya ug batakang papel AWSLambdaBasicExecutionRole. Kini magtugot sa among lambda sa pagdagan ug pagsulat sa mga troso sa serbisyo sa AWS CloudWatch.
Una, naghimo kami og JSON file nga naghulagway sa among mga katungod. Kini sa tinuud magtugot sa mga serbisyo sa lambda nga magamit ang papel lambda-acme-dns-route53-executor:

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

Ang sulod sa among file mao ang mosunod:

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

Karon atong padaganon ang sugo aws iam create-role sa paghimo sa usa ka papel:

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

Mubo nga sulat: hinumdumi ang polisiya ARN (Amazon Resource Name) - kinahanglan nato kini sa sunod nga mga lakang.

Ang papel sa lambda-acme-dns-route53-executor gibuhat, karon kinahanglan naton ipiho ang mga pagtugot alang niini. Ang pinakasayon ​​nga paagi sa pagbuhat niini mao ang paggamit sa sugo aws iam attach-role-policy, pagpasa sa polisiya sa ARN AWSLambdaBasicExecutionRole ingon sa mosunod:

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

Mubo nga sulat: ang usa ka lista uban sa ubang mga polisiya makita dinhi.

Paghimo og lambda function nga nagdagan acme-dns-ruta53

Hooray! Karon mahimo nimong i-deploy ang among function sa AWS gamit ang command aws lambda create-function. Ang lambda kinahanglang i-configure gamit ang mosunod nga environment variables:

  • AWS_LAMBDA - nagpatin-aw niini acme-dns-ruta53 kana nga pagpatay mahitabo sa sulod sa AWS Lambda.
  • DOMAINS β€” usa ka lista sa mga dominyo nga gibulag sa mga koma.
  • LETSENCRYPT_EMAIL - naglangkob Atong I-encrypt ang Email.
  • NOTIFICATION_TOPIC β€” ngalan sa SNS Notification Topic (opsyonal).
  • STAGING - sa bili 1 ang palibot sa dula gigamit.
  • 1024 MB - limitasyon sa memorya, mahimong mausab.
  • 900 secs (15 min) β€” timeout.
  • acme-dns-route53 β€” ang ngalan sa among binary, nga naa sa archive.
  • fileb://~/acme-dns-route53.zip β€” ang agianan padulong sa archive nga among gibuhat.

Karon atong i-deploy:

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

Paghimo usa ka CloudWatch timer nga mag-trigger sa usa ka function 2 beses sa usa ka adlaw

Ang katapusang lakang mao ang pag-set up sa cron, nga nagtawag sa among function kaduha sa usa ka adlaw:

  • paghimo usa ka lagda sa CloudWatch nga adunay kantidad schedule_expression.
  • paghimo usa ka target sa lagda (unsay kinahanglan ipatuman) pinaagi sa pagtino sa ARN sa function sa lambda.
  • paghatag pagtugot sa lagda sa pagtawag sa lambda function.

Sa ubos akong gilakip ang akong Terraform config, apan sa pagkatinuod kini gihimo sa yano nga paggamit sa 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}"
}

Karon na-configure ka aron awtomatiko nga maghimo ug mag-update sa mga sertipiko sa SSL

Source: www.habr.com

Idugang sa usa ka comment