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

Postarea descrie pașii pentru automatizarea gestionării certificatelor SSL din Să criptăm CA folosind Provocare DNS-01 и AWS.

acme-dns-route53 este un instrument care ne va permite să implementăm această caracteristică. Poate funcționa cu certificate SSL de la Let's Encrypt, le poate salva în Amazon Certificate Manager, poate folosi API-ul Route53 pentru a implementa provocarea DNS-01 și, în cele din urmă, poate trimite notificări push către SNS. ÎN acme-dns-route53 Există, de asemenea, funcționalități încorporate pentru utilizare în interiorul AWS Lambda și de asta avem nevoie.

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

  • crearea unui fișier zip;
  • crearea unui rol IAM;
  • creând o funcție lambda care rulează acme-dns-route53;
  • crearea unui cronometru CloudWatch care declanșează o funcție de 2 ori pe zi;

Notă: Înainte de a începe, trebuie să instalați GoLang 1.9+ и AWS CLI

Crearea unui fișier zip

acme-dns-route53 este scris în GoLang și acceptă versiunea nu mai mică de 1.9.

Trebuie să creăm un fișier zip cu un binar acme-dns-route53 interior. Pentru a face acest lucru, trebuie 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. Vă rugăm să rețineți că în timpul instalării am specificat două medii modificate: GOOS=linux и GOARCH=amd64. Ei îi explică compilatorului Go că trebuie să creeze un binar potrivit pentru sistemul de operare Linux și arhitectura amd64 - acesta este ceea ce rulează pe AWS.
AWS se așteaptă ca programul nostru să fie implementat într-un fișier zip, așa că haideți să creăm acme-dns-route53.zip arhivă care va conține noul binar instalat:

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

Notă: Binarul ar trebui să fie în rădăcina arhivei zip. Pentru aceasta folosim -j steag.

Acum porecla noastră zip este gata pentru implementare, tot ce rămâne este să creăm un rol cu ​​drepturile necesare.

Crearea unui rol IAM

Trebuie să setăm un rol IAM cu drepturile cerute de lambda în timpul executării acestuia.
Să numim această politică lambda-acme-dns-route53-executor și să-i acorde imediat un rol de bază AWSLambdaBasicExecutionRole. Acest lucru va permite lambda noastră să ruleze și să scrie jurnalele în serviciul AWS CloudWatch.
Mai întâi, creăm un fișier JSON care descrie drepturile noastre. Acest lucru va permite în esență 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:<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/*"
            ]
        }
    ]
}

Acum să rulă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ă: amintiți-vă politica ARN (Amazon Resource Name) - vom avea nevoie de ea în următorii pași.

Rolul lui lambda-acme-dns-route53-executor creat, acum trebuie să specificăm permisiunile pentru acesta. Cel mai simplu mod de a face acest lucru este să utilizați comanda aws iam attach-role-policy, care trece politica ARN AWSLambdaBasicExecutionRole după cum urmează:

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

Notă: poate fi găsită o listă cu alte politici aici.

Crearea unei funcții lambda care rulează acme-dns-route53

Ura! Acum puteți implementa funcția noastră în AWS folosind comanda aws lambda create-function. Lambda trebuie configurat folosind următoarele variabile de mediu:

  • AWS_LAMBDA - este clar acme-dns-route53 acea execuție are loc în AWS Lambda.
  • DOMAINS — o listă de domenii separate prin virgule.
  • LETSENCRYPT_EMAIL - contine Să criptăm e-mailul.
  • NOTIFICATION_TOPIC — numele subiectului de notificare SNS (opțional).
  • STAGING - la valoare 1 este utilizat mediul de punere în scenă.
  • 1024 MB - limita de memorie, poate fi modificată.
  • 900 secunde (15 min) - timeout.
  • acme-dns-route53 — numele binarului nostru, care se află în arhivă.
  • fileb://~/acme-dns-route53.zip — calea către arhiva pe care am creat-o.

Acum să implementăm:

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

Crearea unui cronometru CloudWatch care declanșează o funcție de 2 ori pe zi

Ultimul pas este să configurați cron, care ne apelează funcția de două ori pe zi:

  • creați o regulă CloudWatch cu valoarea schedule_expression.
  • creați o țintă de regulă (ce ar trebui să fie executat) prin specificarea ARN-ului 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 acest lucru se face foarte simplu folosind consola 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 sunteți configurat pentru a crea și actualiza automat certificate SSL

Sursa: www.habr.com

Adauga un comentariu