Sjálfvirkni Let's Encrypt SSL vottorðastjórnun með DNS-01 áskorun og AWS

Færslan lýsir skrefum til að gera sjálfvirkan stjórnun SSL vottorða frá Við skulum dulkóða CA að nota DNS-01 áskorun и AWS.

acme-dns-leið53 er tæki sem gerir okkur kleift að innleiða þennan eiginleika. Það getur unnið með SSL vottorð frá Let's Encrypt, vistað þau í Amazon Certificate Manager, notað Route53 API til að innleiða DNS-01 áskorunina og að lokum ýtt tilkynningum til SNS. IN acme-dns-leið53 Það er líka innbyggð virkni til notkunar inni í AWS Lambda, og þetta er það sem við þurfum.

Þessi grein skiptist í 4 hluta:

  • búa til zip skrá;
  • búa til IAM hlutverk;
  • búa til lambda aðgerð sem keyrir acme-dns-leið53;
  • búa til CloudWatch tímamæli sem kallar á aðgerð 2 sinnum á dag;

Athugaðu: Áður en þú byrjar þarftu að setja upp GoLang 1.9+ и AWS CLI

Að búa til zip skrá

acme-dns-route53 er skrifað í GoLang og styður ekki lægri útgáfu en 1.9.

Við þurfum að búa til zip skrá með tvöfaldri acme-dns-route53 inni. Til að gera þetta þarftu að setja upp acme-dns-route53 frá GitHub geymslunni með því að nota skipunina go install:

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

Tvöfaldurinn er settur upp í $GOPATH/bin Skrá. Vinsamlegast athugaðu að við uppsetninguna tilgreindum við tvö breytt umhverfi: GOOS=linux и GOARCH=amd64. Þeir gera Go þýðandanum ljóst að það þarf að búa til tvöfalda sem hentar fyrir Linux OS og amd64 arkitektúr - þetta er það sem keyrir á AWS.
AWS býst við að forritið okkar verði dreift í zip skrá, svo við skulum búa til acme-dns-route53.zip skjalasafn sem mun innihalda nýlega uppsetta tvöfaldann:

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

Athugaðu: Tvöfaldurinn ætti að vera í rót zip-skjalasafnsins. Fyrir þetta notum við -j fána.

Nú er zip gælunafnið okkar tilbúið til dreifingar, allt sem er eftir er að búa til hlutverk með nauðsynlegum réttindum.

Að búa til IAM hlutverk

Við þurfum að setja upp IAM hlutverk með þeim réttindum sem lambda okkar krefst meðan á framkvæmd hennar stendur.
Við skulum kalla þetta stefnu lambda-acme-dns-route53-executor og gefa henni strax grunnhlutverk AWSLambdaBasicExecutionRole. Þetta mun leyfa lambda okkar að keyra og skrifa annála í AWS CloudWatch þjónustuna.
Fyrst búum við til JSON skrá sem lýsir réttindum okkar. Þetta mun í raun gera lambdaþjónustum kleift að nota hlutverkið lambda-acme-dns-route53-executor:

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

Innihald skráar okkar er sem hér segir:

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

Nú skulum við keyra skipunina aws iam create-role til að búa til hlutverk:

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

Athugaðu: mundu eftir stefnunni ARN (Amazon Resource Name) - við munum þurfa hana í næstu skrefum.

Hlutverk lambda-acme-dns-route53-executor búin til, nú þurfum við að tilgreina heimildir fyrir það. Auðveldasta leiðin til að gera þetta er að nota skipunina aws iam attach-role-policy, brottför stefnu ARN AWSLambdaBasicExecutionRole sem hér segir:

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

Athugaðu: lista yfir aðrar reglur má finna hér.

Að búa til lambda aðgerð sem keyrir acme-dns-leið53

Húrra! Nú geturðu sent aðgerðina okkar til AWS með því að nota skipunina aws lambda create-function. Lambda verður að stilla með því að nota eftirfarandi umhverfisbreytur:

  • AWS_LAMBDA - gerir það ljóst acme-dns-leið53 að framkvæmd á sér stað inni í AWS Lambda.
  • DOMAINS — listi yfir lén aðskilin með kommum.
  • LETSENCRYPT_EMAIL - inniheldur Við skulum dulkóða tölvupóst.
  • NOTIFICATION_TOPIC — heiti SNS tilkynningaefnis (valfrjálst).
  • STAGING - á verðmæti 1 sviðsetningarumhverfi er notað.
  • 1024 MB - minnistakmörk, hægt að breyta.
  • 900 sekúndur (15 mín.) — tíminn er liðinn.
  • acme-dns-route53 — heiti tvöfaldsins okkar, sem er í skjalasafninu.
  • fileb://~/acme-dns-route53.zip — leiðin að skjalasafninu sem við bjuggum til.

Nú skulum við dreifa:

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

Búa til CloudWatch teljara sem kallar á aðgerð 2 sinnum á dag

Síðasta skrefið er að setja upp cron, sem kallar aðgerðina okkar tvisvar á dag:

  • búa til CloudWatch reglu með gildinu schedule_expression.
  • búa til reglumarkmið (hvað ætti að framkvæma) með því að tilgreina ARN lambda fallsins.
  • gefa leyfi fyrir reglunni til að kalla lambda fallið.

Hér að neðan hef ég fest Terraform stillinguna mína, en í raun er þetta gert mjög einfaldlega með því að nota AWS vélina eða 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ú ertu stilltur til að búa til og uppfæra SSL vottorð sjálfkrafa

Heimild: www.habr.com

Bæta við athugasemd