Otomatik jesyon sètifika SSL ann ankripte lè l sèvi avèk defi DNS-01 ak AWS

Pòs la dekri etap pou otomatize jesyon sètifika SSL soti nan Ann ankripte CA lè l sèvi avèk DNS-01 defi и AWS.

acme-dns-route53 se yon zouti ki pral pèmèt nou aplike karakteristik sa a. Li ka travay ak sètifika SSL ki soti nan Let's Encrypt, sove yo nan Amazon Certificate Manager, itilize Route53 API pou aplike defi DNS-01 la, epi finalman, pouse notifikasyon nan SNS. NAN acme-dns-route53 Genyen tou fonksyonalite entegre pou itilize andedan AWS Lambda, e se sa nou bezwen.

Atik sa a divize an 4 seksyon:

  • kreye yon dosye postal;
  • kreye yon wòl IAM;
  • kreye yon fonksyon lambda ki kouri acme-dns-route53;
  • kreye yon revèy CloudWatch ki deklanche yon fonksyon 2 fwa pa jou;

Remak: Anvan ou kòmanse ou bezwen enstale GoLang 1.9+ и AWS CLI

Kreye yon fichye postal

acme-dns-route53 ekri nan GoLang epi li sipòte vèsyon ki pa pi ba pase 1.9.

Nou bezwen kreye yon fichye postal ak yon binè acme-dns-route53 anndan. Pou fè sa ou bezwen enstale acme-dns-route53 soti nan depo GitHub lè l sèvi avèk lòd la go install:

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

Binè a enstale nan $GOPATH/bin anyè. Tanpri sonje ke pandan enstalasyon nou te espesifye de anviwònman chanje: GOOS=linux и GOARCH=amd64. Yo fè li klè pou konpilateur Go a ke li bezwen kreye yon binè apwopriye pou Linux OS ak achitekti amd64 - sa a se sa ki kouri sou AWS.
AWS espere pwogram nou an dwe deplwaye nan yon fichye postal, kidonk ann kreye acme-dns-route53.zip achiv ki pral genyen binè ki fèk enstale:

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

Remak: Binè a ta dwe nan rasin achiv postal la. Pou sa nou itilize -j drapo.

Koulye a, ti non postal nou an pare pou deplwaman, tout sa ki rete se kreye yon wòl ak dwa ki nesesè yo.

Kreye yon wòl IAM

Nou bezwen mete yon wòl IAM ak dwa lambda nou an egzije pandan egzekisyon li.
Ann rele politik sa a lambda-acme-dns-route53-executor epi imedyatman ba li yon wòl debaz AWSLambdaBasicExecutionRole. Sa a pral pèmèt lambda nou an kouri ak ekri mòso bwa nan sèvis AWS CloudWatch la.
Premyèman, nou kreye yon dosye JSON ki dekri dwa nou yo. Sa a pral esansyèlman pèmèt sèvis lambda yo sèvi ak wòl la lambda-acme-dns-route53-executor:

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

Sa ki nan dosye nou an se jan sa a:

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

Koulye a, ann kouri lòd la aws iam create-role pou kreye yon wòl:

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

Remak: sonje politik ARN (Amazon Resource Name) - nou pral bezwen li nan pwochen etap yo.

Wòl lambda-acme-dns-route53-executor kreye, kounye a nou bezwen presize otorizasyon pou li. Fason ki pi fasil pou fè sa se sèvi ak kòmandman an aws iam attach-role-policy, pase politik ARN AWSLambdaBasicExecutionRole jan sa a:

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

Remak: ou ka jwenn yon lis ak lòt politik isit la.

Kreye yon fonksyon lambda ki kouri acme-dns-route53

Houra! Koulye a, ou ka deplwaye fonksyon nou an nan AWS lè l sèvi avèk lòd la aws lambda create-function. Lambda a dwe konfigirasyon lè l sèvi avèk varyab anviwònman sa yo:

  • AWS_LAMBDA - fè li klè acme-dns-route53 ekzekisyon sa a fèt andedan AWS Lambda.
  • DOMAINS — yon lis domèn separe pa vigil.
  • LETSENCRYPT_EMAIL - gen ladann Ann ankripte imel.
  • NOTIFICATION_TOPIC — non Sijè Notifikasyon SNS (si ou vle).
  • STAGING - nan valè a 1 yo itilize anviwònman an.
  • 1024 MB - limit memwa, ka chanje.
  • 900 segonn (15 min) - delè.
  • acme-dns-route53 - non binè nou an, ki nan achiv la.
  • fileb://~/acme-dns-route53.zip - chemen an nan achiv ke nou te kreye.

Koulye a, ann deplwaye:

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

Kreye yon revèy CloudWatch ki deklanche yon fonksyon 2 fwa pa jou

Dènye etap la se mete kanpe cron, ki rele fonksyon nou an de fwa pa jou:

  • kreye yon règ CloudWatch ak valè a schedule_expression.
  • kreye yon sib règ (sa ki ta dwe egzekite) lè w espesifye ARN nan fonksyon lambda a.
  • bay pèmisyon règ la pou rele fonksyon lambda a.

Anba a mwen tache konfigirasyon Terraform mwen an, men an reyalite sa a se fè trè tou senpleman lè l sèvi avèk konsole AWS oswa 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}"
}

Koulye a, ou se configuré otomatikman kreye ak mete ajou sètifika SSL

Sous: www.habr.com

Add nouvo kòmantè