Automation of Let's Encrypt SSL management certificate using DNS-01 challenge and AWS

Ny lahatsoratra dia mamaritra ny dingana hanamarihana ny fitantanana ny mari-pankasitrahana SSL avy amin'ny Andao Encrypt CA mampiasa DNS-01 fanamby и AWS.

acme-dns-route53 dia fitaovana ahafahantsika mampihatra io endri-javatra io. Afaka miara-miasa amin'ny mari-pankasitrahana SSL avy amin'ny Let's Encrypt izy, tehirizo ao amin'ny Amazon Certificate Manager, mampiasa ny Route53 API hampiharana ny fanamby DNS-01, ary farany, manosika fampandrenesana amin'ny SNS. IN acme-dns-route53 Misy ihany koa fampiasa naorina azo ampiasaina ao anatin'ny AWS Lambda, ary izany no ilaintsika.

Mizara 4 ity lahatsoratra ity:

  • mamorona rakitra zip;
  • famoronana anjara IAM;
  • mamorona asa lambda izay mandeha acme-dns-route53;
  • mamorona fameram-potoana CloudWatch izay miteraka asa in-2 isan'andro;

Fanamarihana: Alohan'ny hanombohanao dia mila mametraka ianao GoLang 1.9+ и AWS CLI

Mamorona rakitra zip

acme-dns-route53 dia voasoratra ao amin'ny GoLang ary manohana ny dikan-teny tsy latsaky ny 1.9.

Mila mamorona rakitra zip miaraka amin'ny binary isika acme-dns-route53 ao anatiny. Mba hanaovana izany dia mila mametraka acme-dns-route53 avy amin'ny tahiry GitHub mampiasa ny baiko go install:

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

Ny binary dia napetraka ao $GOPATH/bin lahatahiry. Mariho fa nandritra ny fametrahana dia nanondro tontolo niova roa izahay: GOOS=linux и GOARCH=amd64. Nazavain'izy ireo tamin'ny Go compiler fa mila mamorona binary mety amin'ny Linux OS sy ny maritrano amd64 - izany no mandeha amin'ny AWS.
Manantena ny AWS fa hapetraka ao anaty rakitra zip ny programantsika, ka andao hamorona acme-dns-route53.zip archive izay ahitana ny binary vao napetraka:

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

Fanamarihana: Ny binary dia tokony ho eo amin'ny fototry ny arsiva zip. Ho an'ity dia ampiasainay -j saina.

Ankehitriny ny anaram-bositra zip dia vonona amin'ny fametrahana, ny hany sisa tavela dia ny mamorona andraikitra miaraka amin'ny zo ilaina.

Famoronana anjara IAM

Mila manangana andraikitry ny IAM miaraka amin'ny zo takian'ny lambdantsika isika mandritra ny fanatanterahana azy.
Andeha hantsoina ity politika ity lambda-acme-dns-route53-executor ary avy hatrany dia omeo anjara fototra izy AWSLambdaBasicExecutionRole. Izany dia ahafahan'ny lambdantsika mihazakazaka sy manoratra logs amin'ny serivisy AWS CloudWatch.
Voalohany, mamorona rakitra JSON izay mamaritra ny zonay izahay. Izany dia mamela ny serivisy lambda hampiasa ny anjara andraikitra lambda-acme-dns-route53-executor:

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

Ny votoatin'ny rakitray dia toy izao manaraka izao:

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

Andeha hojerentsika izao ny baiko aws iam create-role hamorona anjara:

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

Fanamarihana: tadidio ny politika ARN (Amazon Resource Name) - mila izany isika amin'ny dingana manaraka.

anjara asa lambda-acme-dns-route53-executor noforonina, mila mamaritra ny fahazoan-dàlana amin'izany isika. Ny fomba tsotra indrindra hanaovana izany dia ny fampiasana ny baiko aws iam attach-role-policy, mandalo politika ARN AWSLambdaBasicExecutionRole toy izao manaraka izao:

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

Fanamarihana: misy lisitra misy politika hafa azo jerena eto.

Mamorona fiasa lambda izay mandeha acme-dns-route53

Hooray! Azonao atao izao ny mametraka ny fiasantsika amin'ny AWS amin'ny alàlan'ny baiko aws lambda create-function. Ny lambda dia tsy maintsy amboarina amin'ny fampiasana ireto fari-piainana manaraka ireto:

  • AWS_LAMBDA - manazava izany acme-dns-route53 izany famonoana izany dia mitranga ao anatin'ny AWS Lambda.
  • DOMAINS — lisitry ny sehatra sarahana faingo.
  • LETSENCRYPT_EMAIL - misy Andao hanoratra mailaka.
  • NOTIFICATION_TOPIC — anaran'ny Lohahevitra Fampandrenesana SNS (tsy voatery).
  • STAGING - amin'ny vidiny 1 manodidina ny fampisehoana no ampiasaina.
  • 1024 MB - fetra fitadidiana, azo ovaina.
  • 900 secs (15 min) — fiatoana.
  • acme-dns-route53 - ny anaran'ny binary antsika, izay ao amin'ny tahiry.
  • fileb://~/acme-dns-route53.zip — ny lalana mankany amin'ny arisiva noforoninay.

Andeha isika hametraka:

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

Mamorona fameram-potoana CloudWatch izay miteraka fiasa in-2 isan'andro

Ny dingana farany dia ny fametrahana cron, izay miantso ny asantsika indroa isan'andro:

  • mamorona fitsipika CloudWatch miaraka amin'ny sandany schedule_expression.
  • mamorona lasibatra fitsipika (izay tokony hotanterahina) amin'ny famaritana ny ARN ny lambda function.
  • omeo alalana ny fitsipika hiantso ny fiasa lambda.

Eto ambany aho dia nampifandray ny config Terraform-ko, fa raha ny marina dia vita amin'ny fampiasana tsotra fotsiny ny console AWS na 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}"
}

Ankehitriny ianao dia namboarina hamorona sy hanavao ho azy ireo mari-pankasitrahana SSL

Source: www.habr.com