Let's Encrypt SSL sertifikātu pārvaldības automatizācija, izmantojot DNS-01 izaicinājumu un AWS

Ziņojumā ir aprakstītas darbības, lai automatizētu SSL sertifikātu pārvaldību no Šifrēsim CA izmantojot DNS-01 izaicinājums и AWS.

acme-dns-route53 ir rīks, kas ļaus mums ieviest šo funkciju. Tas var darboties ar Let's Encrypt SSL sertifikātiem, saglabāt tos Amazon Certificate Manager, izmantot Route53 API, lai īstenotu DNS-01 izaicinājumu, un, visbeidzot, push paziņojumus SNS. IN acme-dns-route53 Ir arī iebūvēta funkcionalitāte lietošanai AWS Lambda iekšpusē, un tas ir tas, kas mums ir nepieciešams.

Šis raksts ir sadalīts 4 sadaļās:

  • zip faila izveide;
  • IAM lomas izveide;
  • izveidojot lambda funkciju, kas darbojas acme-dns-route53;
  • izveidojot CloudWatch taimeri, kas iedarbina funkciju 2 reizes dienā;

Piezīme: Pirms sākat, jums ir jāinstalē GoLang 1.9+ и AWS CLI

Zip faila izveide

acme-dns-route53 ir rakstīts GoLang un atbalsta versiju, kas nav zemāka par 1.9.

Mums ir jāizveido zip fails ar bināro failu acme-dns-route53 iekšā. Lai to izdarītu, jums ir jāinstalē acme-dns-route53 no GitHub repozitorija, izmantojot komandu go install:

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

Binārais fails ir instalēts $GOPATH/bin direktoriju. Lūdzu, ņemiet vērā, ka instalēšanas laikā mēs norādījām divas mainītas vides: GOOS=linux и GOARCH=amd64. Viņi Go kompilatoram skaidri norāda, ka tam ir jāizveido binārs, kas piemērots Linux OS un amd64 arhitektūrai — tas ir tas, kas darbojas AWS.
AWS sagaida, ka mūsu programma tiks izvietota zip failā, tāpēc izveidosim acme-dns-route53.zip arhīvs, kurā būs tikko instalētais binārais fails:

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

Piezīme: Binārajam failam ir jāatrodas zip arhīva saknē. Šim nolūkam mēs izmantojam -j karogs.

Tagad mūsu zip segvārds ir gatavs izvietošanai, atliek tikai izveidot lomu ar nepieciešamajām tiesībām.

IAM lomas izveide

Mums ir jāiestata IAM loma ar tiesībām, ko pieprasa mūsu lambda tās izpildes laikā.
Sauksim šo politiku lambda-acme-dns-route53-executor un nekavējoties piešķir viņai pamata lomu AWSLambdaBasicExecutionRole. Tas ļaus mūsu lambda darboties un rakstīt žurnālus AWS CloudWatch pakalpojumā.
Pirmkārt, mēs izveidojam JSON failu, kurā aprakstītas mūsu tiesības. Tas būtībā ļaus lambda pakalpojumiem izmantot lomu lambda-acme-dns-route53-executor:

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

Mūsu faila saturs ir šāds:

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

Tagad izpildīsim komandu aws iam create-role lai izveidotu lomu:

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

Piezīme: atcerieties politiku ARN (Amazon Resource Name) — tā mums būs nepieciešama nākamajās darbībās.

Loma lambda-acme-dns-route53-executor izveidots, tagad mums ir jānorāda tam atļaujas. Vienkāršākais veids, kā to izdarīt, ir izmantot komandu aws iam attach-role-policy, nokārtojot ARN politiku AWSLambdaBasicExecutionRole šādi:

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

Piezīme: sarakstu ar citām politikām var atrast šeit.

Tiek izveidota lambda funkcija, kas darbojas acme-dns-route53

Urrā! Tagad jūs varat izvietot mūsu funkciju AWS, izmantojot komandu aws lambda create-function. Lambda ir jākonfigurē, izmantojot šādus vides mainīgos:

  • AWS_LAMBDA - padara to skaidru acme-dns-route53 ka izpilde notiek AWS Lambda iekšpusē.
  • DOMAINS — ar komatiem atdalītu domēnu saraksts.
  • LETSENCRYPT_EMAIL - satur Šifrēsim e-pastu.
  • NOTIFICATION_TOPIC — SNS paziņojumu tēmas nosaukums (pēc izvēles).
  • STAGING - pēc vērtības 1 tiek izmantota iestudējuma vide.
  • 1024 MB - atmiņas limits, var mainīt.
  • 900 sekundes (15 min) — taimauts.
  • acme-dns-route53 — mūsu bināra nosaukums, kas atrodas arhīvā.
  • fileb://~/acme-dns-route53.zip — ceļš uz mūsu izveidoto arhīvu.

Tagad izvietosim:

$ 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 taimera izveide, kas aktivizē funkciju 2 reizes dienā

Pēdējais solis ir iestatīt cron, kas divreiz dienā izsauc mūsu funkciju:

  • izveidojiet CloudWatch kārtulu ar vērtību schedule_expression.
  • izveidojiet kārtulas mērķi (kas jāizpilda), norādot lambda funkcijas ARN.
  • dot atļauju kārtulai izsaukt lambda funkciju.

Zemāk esmu pievienojis savu Terraform konfigurāciju, taču patiesībā tas tiek darīts ļoti vienkārši, izmantojot AWS konsoli vai 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}"
}

Tagad esat konfigurēts, lai automātiski izveidotu un atjauninātu SSL sertifikātus

Avots: www.habr.com

Pievieno komentāru