Let's Encrypt SSL ziurtagirien kudeaketa automatizatzea DNS-01 erronka eta AWS erabiliz

Argitalpenak SSL ziurtagirien kudeaketa automatizatzeko urratsak deskribatzen ditu Enkriptatu dezagun CA erabiliz DNS-01 erronka ΠΈ AWS.

acme-dns-route53 ezaugarri hau ezartzeko aukera emango digun tresna da. Let's Encrypt-eko SSL ziurtagiriekin lan egin dezake, Amazon Certificate Manager-en gorde, Route53 APIa erabil dezake DNS-01 erronka ezartzeko eta, azkenik, SNSra bidalitako jakinarazpenak. IN acme-dns-route53 AWS Lambda barruan erabiltzeko funtzionaltasun integratua ere badago, eta hau da behar duguna.

Artikulu hau 4 ataletan banatuta dago:

  • zip fitxategi bat sortzea;
  • IAM rola sortzea;
  • exekutatzen den lambda funtzio bat sortuz acme-dns-route53;
  • Egunean 2 aldiz funtzio bat abiarazten duen CloudWatch tenporizadore bat sortzea;

Ohar: Hasi aurretik instalatu behar duzu GoLang 1.9+ ΠΈ AWS CLI

zip fitxategi bat sortzea

acme-dns-route53 GoLang-en idatzita dago eta 1.9 baino txikiagoa ez den bertsioa onartzen du.

Zip fitxategi bat sortu behar dugu bitar batekin acme-dns-route53 barruan. Horretarako instalatu behar duzu acme-dns-route53 GitHub biltegitik komandoa erabiliz go install:

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

Binarioa instalatuta dago $GOPATH/bin direktorioa. Kontuan izan instalazioan zehar aldatutako bi ingurune zehaztu ditugula: GOOS=linux ΠΈ GOARCH=amd64. Argi uzten diote Go konpilatzaileari Linux OS eta amd64 arkitekturarako egokia den bitar bat sortu behar duela - hau da AWS-en exekutatzen dena.
AWS-k gure programa zip fitxategi batean zabaltzea espero du, beraz, sor dezagun acme-dns-route53.zip Instalatutako bitar berria edukiko duen artxiboa:

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

Ohar: Bitarra zip artxiboaren erroan egon behar da. Horretarako erabiltzen dugu -j bandera.

Orain gure zip ezizena zabaltzeko prest dago, behar diren eskubideekin rol bat sortzea besterik ez da geratzen.

IAM rola sortzea

IAM rol bat ezarri behar dugu gure lambdak exekutatzean eskatzen dituen eskubideekin.
Dei diezaiogun politika honi lambda-acme-dns-route53-executor eta berehala eman zion oinarrizko rola AWSLambdaBasicExecutionRole. Honek gure lambda AWS CloudWatch zerbitzuan erregistroak exekutatu eta idazteko aukera emango du.
Lehenik eta behin, gure eskubideak deskribatzen dituen JSON fitxategi bat sortzen dugu. Honek funtsean lambda zerbitzuei rola erabiltzeko aukera emango die lambda-acme-dns-route53-executor:

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

Gure fitxategiaren edukia honako hau da:

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

Orain exekutatu dezagun komandoa aws iam create-role rol bat sortzeko:

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

Ohar: gogoratu ARN politika (Amazon Resource Name) - hurrengo urratsetan beharko dugu.

Rola lambda-acme-dns-route53-executor sortu, orain horretarako baimenak zehaztu behar ditugu. Horretarako modurik errazena komandoa erabiltzea da aws iam attach-role-policy, ARN politika pasatzea AWSLambdaBasicExecutionRole honela:

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

Ohar: beste politika batzuekin zerrenda bat aurki daiteke Hemen.

Exekutatzen den lambda funtzio bat sortzea acme-dns-route53

Aupa! Orain gure funtzioa AWSra inplementa dezakezu komandoa erabiliz aws lambda create-function. Lambda ingurune-aldagai hauek erabiliz konfiguratu behar da:

  • AWS_LAMBDA - argi uzten du acme-dns-route53 exekuzio hori AWS Lambda barruan gertatzen da.
  • DOMAINS β€” komaz bereizitako domeinuen zerrenda.
  • LETSENCRYPT_EMAIL - dauka Enkriptatu dezagun posta elektronikoa.
  • NOTIFICATION_TOPIC β€” SNS jakinarazpen gaiaren izena (aukerakoa).
  • STAGING - balioan 1 eszenaratzeko ingurunea erabiltzen da.
  • 1024 MB - memoria muga, alda daiteke.
  • 900 segundo (15 min) - denbora-muga.
  • acme-dns-route53 β€” artxiboan dagoen gure binarioaren izena.
  • fileb://~/acme-dns-route53.zip β€” sortu genuen artxiborako bidea.

Orain zabaldu dezagun:

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

Funtzio bat egunean 2 aldiz abiarazten duen CloudWatch tenporizadore bat sortzea

Azken urratsa cron konfiguratzea da, gure funtzioa egunean bitan deitzen duena:

  • sortu CloudWatch arau bat balioarekin schedule_expression.
  • sortu arau helburu bat (exekutatu behar dena) lambda funtzioaren ARN zehaztuz.
  • lambda funtzioari deitzeko arauari baimena eman.

Jarraian, nire Terraform konfigurazioa erantsi dut, baina, egia esan, hori oso erraz egiten da AWS kontsola edo AWS CLI erabiliz.

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

Orain SSL ziurtagiriak automatikoki sortzeko eta eguneratzeko konfiguratuta zaude

Iturria: www.habr.com

Gehitu iruzkin berria