Automatizarea gestionării certificatelor SSL Let's Encrypt folosind provocarea DNS-01 și AWS

Această postare descrie pașii pentru automatizarea gestionării certificatelor SSL de la Let’s Encrypt CA folosind provocarea DNS-01 și AWS.

acme-dns-route53 — este un instrument care ne va permite să implementăm această funcție. Acesta poate lucra cu certificatul SSL de la Let’s Encrypt, le poate salva în Amazon Certificate Manager, folosește API-ul Route53 pentru a implementa provocarea DNS-01 și, la final, trimite notificări în SNS. În acme-dns-route53 de asemenea, este prezent un funcțional built-in pentru utilizarea în interiorul AWS Lambda, iar aceasta este ceea ce avem nevoie.

Acest articol este împărțit în 4 secțiuni:

  • crearea fișierului zip;
  • crearea rolului IAM;
  • crearea funcției lambda care pornește acme-dns-route53;
  • crearea unui cronometru CloudWatch care declanșează funcția de 2 ori pe zi;

Notă: înainte de a începe, este necesar să instalați GoLang 1.9+ și AWS CLI

Crearea fișierului zip

acme-dns-route53 este scris în GoLang și suportă versiuni de 1.9 sau mai mari.

Trebuie să creăm un fișier zip cu bibliotecile binare acme-dns-route53 în interior. În acest sens, este necesar să instalați acme-dns-route53 din depozitul GitHub folosind comanda go install:

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

Binarul este instalat în $GOPATH/bin director. Rețineți că, la instalare, am specificat două variabile de mediu: GOOS=linux și GOARCH=amd64. Acestea îi comunică compilatorului Go necesitatea de a crea un fișier binar potrivit pentru OS Linux și arhitectura amd64 — aceasta este ceea ce rulează în AWS.
AWS presupune desfășurarea programului nostru într-un fișier zip, așa că să creăm acme-dns-route53.zip un arhivă care va conține binarul tocmai instalat:

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

Notă: binarul trebuie să fie în rădăcina arhivei zip. Pentru aceasta, folosim -j flag.

Acum zip-ul nostru este gata pentru desfășurare, rămâne să creăm un rol cu permisiunile necesare.

Crearea rolului IAM

Trebuie să configurăm rolul IAM cu permisiunile necesare funcționării lambda-ului nostru.
Să numim această politică lambda-acme-dns-route53-executor și imediat să-i dăm rolul de bază AWSLambdaBasicExecutionRole. Aceasta va permite lambda-ului nostru să pornească și să scrie jurnale în serviciul AWS CloudWatch.
Pentru început, creăm un fișier JSON în care descriem permisiunile noastre. Acesta, practic, va permite serviciilor lambda să utilizeze rolul lambda-acme-dns-route53-executor:

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

Conținutul fișierului nostru este următorul:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup"
            ],
            "Resource": "arn:aws:logs:::*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents",
                "logs:CreateLogStream"
            ],
            "Resource": "arn:aws:logs:::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}::",
                "arn:aws:route53:::hostedzone/*",
                "arn:aws:route53:::change/*",
                "arn:aws:acm:::certificate/*"
            ]
        }
    ]
}

Acum să executăm comanda aws iam create-role pentru a crea un rol:

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

Notă: rețineți ARN-ul politicii (Amazon Resource Name) — îl vom folosi în etapele următoare.

Rolul lambda-acme-dns-route53-executor a fost creat, acum trebuie să specificăm permisiunile pentru acesta. Cea mai simplă modalitate de a face acest lucru este să folosim comanda aws iam attach-role-policy, transmitând ARN-ul politicii AWSLambdaBasicExecutionRole în următorul mod:

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

Notă: lista cu celelalte politici o puteți găsi aici.

Crearea funcției lambda care va rula acme-dns-route53

Ura! Acum putem să ne implementăm funcția pe AWS folosind comanda aws lambda create-function. Funcția lambda trebuie configurată folosind următoarele variabile de mediu:

  • AWS_LAMBDA — indică faptul că execuția se desfășoară în interiorul AWS Lambda. acme-dns-route53 DOMAINS
  • — o listă de domenii, separate prin virgule. LETSENCRYPT_EMAIL
  • — conține Email-ul Let’s Encrypt NOTIFICATION_TOPIC.
  • — numele SNS Notification Topic (opțional). STAGING
  • — cu valoarea este utilizat mediul de staging. 1 MB — limita de memorie, poate fi modificată.
  • 1024 secs (15 min) — timeout.
  • 900 — numele bursierului nostru, care se află în arhivă.
  • acme-dns-route53 — calea către arhivă, pe care am creat-o.
  • fileb://~/acme-dns-route53.zip Acum implementăm:

Acum desfășurăm:

$ aws lambda create-function 
 --function-name acme-dns-route53 
 --runtime go1.x 
 --role arn:aws:iam:::role/lambda-acme-dns-route53-executor 
 --environment Variables="{AWS_LAMBDA=1,DOMAINS="example1.com,example2.com",LETSENCRYPT_EMAIL=begmaroman@gmail.com,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": "your@email.com", 
            "NOTIFICATION_TOPIC": "acme-dns-route53-obtained", 
            "AWS_LAMBDA": "1"
         }
     }, 
     "Version": "$LATEST", 
     "Role": "arn:aws:iam:::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::function:acme-dns-route53", 
     "Handler": "acme-dns-route53"
 }

Crearea unui trigger CloudWatch care declanșează funcția de două ori pe zi

Ultimul pas este să configurăm un cron care să cheme funcția noastră de două ori pe zi:

  • creați o regulă CloudWatch cu valoarea schedule_expression.
  • creați un obiectiv al regulii (ce trebuie să se execute), specificând ARN-ul funcției lambda.
  • dați permisiunea regulii de a apela funcția lambda.

Mai jos am atașat configurația mea Terraform, dar de fapt se face foarte ușor cu ajutorul consolei AWS sau 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}"
}

Acum și voi aveți configurarea automată a creării și actualizării certificatelor SSL

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster