Outomatisering van Let's Encrypt SSL-sertifikaatbestuur met behulp van DNS-01-uitdaging en AWS

Die pos beskryf stappe om die bestuur van SSL-sertifikate te outomatiseer vanaf Kom ons enkripteer CA gebruik DNS-01 uitdaging и AWS.

acme-dns-roete53 is 'n instrument wat ons sal toelaat om hierdie kenmerk te implementeer. Dit kan met SSL-sertifikate van Let's Encrypt werk, dit in Amazon Certificate Manager stoor, die Route53 API gebruik om die DNS-01-uitdaging te implementeer, en laastens, kennisgewings na SNS stoot. IN acme-dns-roete53 Daar is ook ingeboude funksionaliteit vir gebruik binne AWS Lambda, en dit is wat ons nodig het.

Hierdie artikel is in 4 afdelings verdeel:

  • die skep van 'n zip-lêer;
  • die skep van 'n IAM-rol;
  • die skep van 'n lambda-funksie wat loop acme-dns-roete53;
  • die skep van 'n CloudWatch-timer wat 'n funksie 2 keer per dag aktiveer;

let wel: Voordat jy begin, moet jy installeer GoLang 1.9+ и AWS CLI

Skep 'n zip-lêer

acme-dns-route53 is in GoLang geskryf en ondersteun weergawe nie laer as 1.9 nie.

Ons moet 'n zip-lêer met 'n binêre skep acme-dns-route53 binne. Om dit te doen moet jy installeer acme-dns-route53 vanaf GitHub-bewaarplek met behulp van die opdrag go install:

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

Die binêre is geïnstalleer in $GOPATH/bin gids. Neem asseblief kennis dat ons tydens installasie twee veranderde omgewings gespesifiseer het: GOOS=linux и GOARCH=amd64. Hulle maak dit duidelik aan die Go-samesteller dat dit 'n binêre moet skep wat geskik is vir Linux OS en amd64-argitektuur - dit is wat op AWS loop.
AWS verwag dat ons program in 'n zip-lêer ontplooi sal word, so kom ons skep acme-dns-route53.zip argief wat die nuut geïnstalleerde binêre sal bevat:

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

let wel: Die binêre moet in die wortel van die zip-argief wees. Hiervoor gebruik ons -j vlag.

Nou is ons zip-bynaam gereed vir ontplooiing, al wat oorbly is om 'n rol te skep met die nodige regte.

Skep 'n IAM-rol

Ons moet 'n IAM-rol opstel met die regte wat ons lambda vereis tydens die uitvoering daarvan.
Kom ons noem dit beleid lambda-acme-dns-route53-executor en gee haar dadelik 'n basiese rol AWSLambdaBasicExecutionRole. Dit sal ons lambda toelaat om logs na die AWS CloudWatch-diens te laat loop en te skryf.
Eerstens skep ons 'n JSON-lêer wat ons regte beskryf. Dit sal in wese lambda-dienste toelaat om die rol te gebruik lambda-acme-dns-route53-executor:

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

Die inhoud van ons lêer is soos volg:

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

Laat ons nou die opdrag uitvoer aws iam create-role om 'n rol te skep:

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

let wel: onthou die beleid ARN (Amazon Resource Name) - ons sal dit in die volgende stappe nodig hê.

Rol lambda-acme-dns-route53-executor geskep, nou moet ons toestemmings daarvoor spesifiseer. Die maklikste manier om dit te doen is om die opdrag te gebruik aws iam attach-role-policy, verbygaande beleid ARN AWSLambdaBasicExecutionRole soos volg:

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

let wel: 'n lys met ander beleide kan gevind word hier.

Die skep van 'n lambda-funksie wat loop acme-dns-roete53

Hoera! Nou kan u ons funksie na AWS ontplooi deur die opdrag te gebruik aws lambda create-function. Die lambda moet gekonfigureer word deur die volgende omgewingsveranderlikes te gebruik:

  • AWS_LAMBDA - maak dit duidelik acme-dns-roete53 dat uitvoering binne AWS Lambda plaasvind.
  • DOMAINS - 'n lys van domeine geskei deur kommas.
  • LETSENCRYPT_EMAIL - bevat Kom ons enkripteer e-pos.
  • NOTIFICATION_TOPIC — naam van SNS Kennisgewing Onderwerp (opsioneel).
  • STAGING - teen die waarde 1 verhoog-omgewing gebruik word.
  • 1024 MB - geheue limiet, kan verander word.
  • 900 sekondes (15 min) — uitteltyd.
  • acme-dns-route53 - die naam van ons binêre, wat in die argief is.
  • fileb://~/acme-dns-route53.zip — die pad na die argief wat ons geskep het.

Kom ons ontplooi nou:

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

Skep 'n CloudWatch-tydteller wat 'n funksie 2 keer per dag aktiveer

Die laaste stap is om cron op te stel, wat ons funksie twee keer per dag oproep:

  • skep 'n CloudWatch-reël met die waarde schedule_expression.
  • skep 'n reëlteiken (wat uitgevoer moet word) deur die ARN van die lambda-funksie te spesifiseer.
  • gee toestemming aan die reël om die lambda-funksie te roep.

Hieronder het ek my Terraform-konfigurasie aangeheg, maar in werklikheid word dit baie eenvoudig gedoen deur die AWS-konsole of AWS CLI te gebruik.

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

Nou is jy ingestel om outomaties SSL-sertifikate te skep en op te dateer

Bron: will.com

Voeg 'n opmerking