Let's Encrypt SSL sertifikatų valdymo automatizavimas naudojant DNS-01 iššūkį ir AWS

Įraše aprašomi žingsniai, kaip automatizuoti SSL sertifikatų valdymą Užšifruokime CA naudojant DNS-01 iššūkis и AWS.

acme-dns-route53 yra įrankis, kuris leis mums įgyvendinti šią funkciją. Jis gali dirbti su SSL sertifikatais iš Let's Encrypt, išsaugoti juos Amazon Certificate Manager, naudoti Route53 API DNS-01 iššūkiui įgyvendinti ir galiausiai siųsti pranešimus SNS. IN acme-dns-route53 Taip pat yra įmontuota funkcija, skirta naudoti AWS Lambda viduje, ir tai yra tai, ko mums reikia.

Šis straipsnis suskirstytas į 4 skyrius:

  • sukurti zip failą;
  • sukurti IAM vaidmenį;
  • sukurti lambda funkciją, kuri veikia acme-dns-route53;
  • sukurti CloudWatch laikmatį, kuris suaktyvina funkciją 2 kartus per dieną;

Pastaba: Prieš pradėdami, turite įdiegti GoLang 1.9+ и AWS CLI

Kuriamas zip failas

acme-dns-route53 yra parašyta GoLang ir palaiko ne žemesnę nei 1.9 versiją.

Turime sukurti zip failą su dvejetainiu acme-dns-route53 viduje. Norėdami tai padaryti, turite įdiegti acme-dns-route53 iš GitHub saugyklos naudodami komandą go install:

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

Dvejetainė yra įdiegta $GOPATH/bin katalogas. Atkreipkite dėmesį, kad diegimo metu nurodėme dvi pakeistas aplinkas: GOOS=linux и GOARCH=amd64. Jie aiškiai parodo „Go“ kompiliatoriui, kad jis turi sukurti dvejetainį failą, tinkamą Linux OS ir amd64 architektūrai – būtent tai veikia AWS.
AWS tikisi, kad mūsų programa bus įdiegta ZIP faile, todėl sukurkime acme-dns-route53.zip archyvas, kuriame bus naujai įdiegtas dvejetainis failas:

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

Pastaba: Dvejetainis failas turėtų būti ZIP archyvo šaknyje. Tam mes naudojame -j vėliava.

Dabar mūsų pašto slapyvardis yra paruoštas naudoti, belieka sukurti vaidmenį su reikiamomis teisėmis.

IAM vaidmens sukūrimas

Turime nustatyti IAM vaidmenį su teisėmis, kurių reikalauja mūsų lambda jo vykdymo metu.
Pavadinkime šią politiką lambda-acme-dns-route53-executor ir iš karto skirkite jai pagrindinį vaidmenį AWSLambdaBasicExecutionRole. Tai leis mūsų lambda paleisti ir rašyti žurnalus į AWS CloudWatch paslaugą.
Pirmiausia sukuriame JSON failą, kuriame aprašomos mūsų teisės. Tai iš esmės leis lambda paslaugoms naudoti vaidmenį lambda-acme-dns-route53-executor:

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

Mūsų failo turinys yra toks:

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

Dabar vykdykime komandą aws iam create-role sukurti vaidmenį:

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

Pastaba: prisiminkite politiką ARN (Amazon Resource Name) – jos mums reikės atliekant kitus veiksmus.

Vaidmuo lambda-acme-dns-route53-executor sukurta, dabar turime nurodyti jo teises. Lengviausias būdas tai padaryti yra naudoti komandą aws iam attach-role-policy, perduodamas ARN politika AWSLambdaBasicExecutionRole taip:

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

Pastaba: galima rasti sąrašą su kitomis taisyklėmis čia.

Veikiančios lambda funkcijos sukūrimas acme-dns-route53

Sveika! Dabar galite įdiegti mūsų funkciją AWS naudodami komandą aws lambda create-function. Lambda turi būti sukonfigūruota naudojant šiuos aplinkos kintamuosius:

  • AWS_LAMBDA – aiškiai parodo acme-dns-route53 kad vykdymas įvyksta AWS Lambda viduje.
  • DOMAINS — kableliais atskirtų domenų sąrašas.
  • LETSENCRYPT_EMAIL - yra Užšifruokime el.
  • NOTIFICATION_TOPIC — SNS pranešimų temos pavadinimas (neprivaloma).
  • STAGING - pagal vertę 1 naudojama pastatymo aplinka.
  • 1024 MB – atminties limitas, galima keisti.
  • 900 sek. (15 min.) — skirtas laikas.
  • acme-dns-route53 - mūsų dvejetainio, esančio archyve, pavadinimas.
  • fileb://~/acme-dns-route53.zip - kelias į mūsų sukurtą archyvą.

Dabar diegkime:

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

„CloudWatch“ laikmačio, kuris suaktyvina funkciją 2 kartus per dieną, sukūrimas

Paskutinis veiksmas yra nustatyti cron, kuris du kartus per dieną iškviečia mūsų funkciją:

  • sukurti „CloudWatch“ taisyklę su verte schedule_expression.
  • sukurkite taisyklės tikslą (kas turėtų būti vykdoma), nurodydami lambda funkcijos ARN.
  • duoti leidimą taisyklei iškviesti lambda funkciją.

Žemiau pridėjau savo „Terraform“ konfigūraciją, tačiau iš tikrųjų tai daroma labai paprastai naudojant AWS konsolę arba 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}"
}

Dabar esate sukonfigūruotas automatiškai kurti ir atnaujinti SSL sertifikatus

Šaltinis: www.habr.com

Добавить комментарий