Automatisering av Let's Encrypt SSL-sertifikatadministrasjon ved hjelp av DNS-01 challenge og AWS

Innlegget beskriver trinn for å automatisere administrasjonen av SSL-sertifikater fra La oss kryptere CA ved hjelp av DNS-01 utfordring и AWS.

acme-dns-route53 er et verktøy som lar oss implementere denne funksjonen. Den kan fungere med SSL-sertifikater fra Let's Encrypt, lagre dem i Amazon Certificate Manager, bruke Route53 API for å implementere DNS-01-utfordringen, og til slutt, push-varsler til SNS. I acme-dns-route53 Det er også innebygd funksjonalitet for bruk inne i AWS Lambda, og det er dette vi trenger.

Denne artikkelen er delt inn i 4 seksjoner:

  • lage en zip-fil;
  • skape en IAM-rolle;
  • lage en lambda-funksjon som kjører acme-dns-route53;
  • lage en CloudWatch-timer som utløser en funksjon 2 ganger om dagen;

OBS: Før du starter må du installere GoLang 1.9+ и AWS CLI

Opprette en zip-fil

acme-dns-route53 er skrevet i GoLang og støtter versjon ikke lavere enn 1.9.

Vi må lage en zip-fil med en binær fil acme-dns-route53 innsiden. For å gjøre dette må du installere acme-dns-route53 fra GitHub-depotet ved å bruke kommandoen go install:

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

Binæren er installert i $GOPATH/bin katalog. Vær oppmerksom på at under installasjonen spesifiserte vi to endrede miljøer: GOOS=linux и GOARCH=amd64. De gjør det klart for Go-kompilatoren at den må lage en binær som passer for Linux OS og amd64-arkitektur - det er dette som kjører på AWS.
AWS forventer at programmet vårt blir distribuert i en zip-fil, så la oss lage acme-dns-route53.zip arkiv som vil inneholde den nylig installerte binære filen:

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

OBS: Binærfilen skal være i roten til zip-arkivet. Til dette bruker vi -j flagg.

Nå er zip-kallenavnet vårt klart for distribusjon, alt som gjenstår er å opprette en rolle med de nødvendige rettighetene.

Opprette en IAM-rolle

Vi må sette opp en IAM-rolle med rettighetene som kreves av lambdaen vår under utførelsen.
La oss kalle denne politikken lambda-acme-dns-route53-executor og umiddelbart gi henne en grunnleggende rolle AWSLambdaBasicExecutionRole. Dette vil tillate lambdaen vår å kjøre og skrive logger til AWS CloudWatch-tjenesten.
Først lager vi en JSON-fil som beskriver rettighetene våre. Dette vil i hovedsak tillate lambda-tjenester å bruke rollen lambda-acme-dns-route53-executor:

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

Innholdet i filen vår er som følger:

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

La oss nå kjøre kommandoen aws iam create-role for å opprette en rolle:

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

OBS: husk policyen ARN (Amazon Resource Name) - vi trenger den i de neste trinnene.

rolle lambda-acme-dns-route53-executor opprettet, nå må vi spesifisere tillatelser for det. Den enkleste måten å gjøre dette på er å bruke kommandoen aws iam attach-role-policy, bestått politikk ARN AWSLambdaBasicExecutionRole som følger:

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

OBS: en liste med andre retningslinjer kan bli funnet her.

Lage en lambda-funksjon som kjører acme-dns-route53

Hurra! Nå kan du distribuere funksjonen vår til AWS ved å bruke kommandoen aws lambda create-function. Lambdaen må konfigureres ved hjelp av følgende miljøvariabler:

  • AWS_LAMBDA - gjør det klart acme-dns-route53 at henrettelsen skjer inne i AWS Lambda.
  • DOMAINS — en liste over domener atskilt med komma.
  • LETSENCRYPT_EMAIL - inneholder La oss kryptere e-post.
  • NOTIFICATION_TOPIC — navn på SNS-varslingsemne (valgfritt).
  • STAGING - til verdien 1 iscenesettelsesmiljø brukes.
  • 1024 MB - minnegrense, kan endres.
  • 900 sekunder (15 min) — tidsavbrudd.
  • acme-dns-route53 — navnet på vår binære, som er i arkivet.
  • fileb://~/acme-dns-route53.zip — veien til arkivet vi opprettet.

La oss nå distribuere:

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

Opprette en CloudWatch-timer som utløser en funksjon 2 ganger om dagen

Det siste trinnet er å sette opp cron, som kaller funksjonen vår to ganger om dagen:

  • opprette en CloudWatch-regel med verdien schedule_expression.
  • opprette et regelmål (hva som skal utføres) ved å spesifisere ARN for lambda-funksjonen.
  • gi tillatelse til regelen for å kalle lambda-funksjonen.

Nedenfor har jeg lagt ved min Terraform-konfigurasjon, men faktisk gjøres dette veldig enkelt ved å bruke AWS-konsollen eller 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}"
}

Nå er du konfigurert til å opprette og oppdatere SSL-sertifikater automatisk

Kilde: www.habr.com

Legg til en kommentar