Automatizimi i menaxhimit të certifikatës Let's Encrypt SSL duke përdorur sfidën DNS-01 dhe AWS

Postimi përshkruan hapat për të automatizuar menaxhimin e certifikatave SSL nga Le të Enkriptojmë CA duke përdorur Sfida DNS-01 и AWS.

acme-dns-route53 është një mjet që do të na lejojë të zbatojmë këtë veçori. Mund të funksionojë me certifikatat SSL nga Let's Encrypt, t'i ruajë ato në Amazon Certificate Manager, të përdorë Route53 API për të zbatuar sfidën DNS-01 dhe, së fundi, të shtyjë njoftimet në SNS. NË acme-dns-route53 Ekziston edhe funksionaliteti i integruar për përdorim brenda AWS Lambda, dhe kjo është ajo që na nevojitet.

Ky artikull është i ndarë në 4 seksione:

  • krijimi i një skedari zip;
  • krijimi i një roli IAM;
  • duke krijuar një funksion lambda që funksionon acme-dns-route53;
  • krijimi i një kohëmatësi CloudWatch që aktivizon një funksion 2 herë në ditë;

Shënim: Para se të filloni, duhet të instaloni GoLang 1.9+ и AWS CLI

Krijimi i një skedari zip

acme-dns-route53 është shkruar në GoLang dhe mbështet versionin jo më të ulët se 1.9.

Ne duhet të krijojmë një skedar zip me një binar acme-dns-route53 brenda. Për ta bërë këtë ju duhet të instaloni acme-dns-route53 nga depoja e GitHub duke përdorur komandën go install:

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

Binar është i instaluar në $GOPATH/bin drejtoria. Ju lutemi vini re se gjatë instalimit ne specifikuam dy mjedise të ndryshuara: GOOS=linux и GOARCH=amd64. Ata i bëjnë të qartë përpiluesit Go se duhet të krijojë një binar të përshtatshëm për Linux OS dhe arkitekturën amd64 - kjo është ajo që funksionon në AWS.
AWS pret që programi ynë të vendoset në një skedar zip, kështu që le të krijojmë acme-dns-route53.zip arkiv i cili do të përmbajë binarin e sapo instaluar:

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

Shënim: Binar duhet të jetë në rrënjën e arkivit zip. Për këtë përdorim -j flamuri.

Tani pseudonimi ynë zip është gati për vendosje, gjithçka që mbetet është të krijojmë një rol me të drejtat e nevojshme.

Krijimi i një roli IAM

Ne duhet të krijojmë një rol IAM me të drejtat e kërkuara nga lambda jonë gjatë ekzekutimit të saj.
Le ta quajmë këtë politikë lambda-acme-dns-route53-executor dhe menjëherë i jep asaj një rol bazë AWSLambdaBasicExecutionRole. Kjo do të lejojë që lambda jonë të ekzekutojë dhe të shkruajë regjistra në shërbimin AWS CloudWatch.
Së pari, ne krijojmë një skedar JSON që përshkruan të drejtat tona. Kjo në thelb do të lejojë shërbimet lambda të përdorin rolin lambda-acme-dns-route53-executor:

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

Përmbajtja e skedarit tonë është si më poshtë:

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

Tani le të ekzekutojmë komandën aws iam create-role për të krijuar një rol:

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

Shënim: mbani mend politikën ARN (Emri i burimit të Amazon) - do të na duhet në hapat e ardhshëm.

rol lambda-acme-dns-route53-executor krijuar, tani duhet të specifikojmë lejet për të. Mënyra më e lehtë për ta bërë këtë është të përdorni komandën aws iam attach-role-policy, kalimi i politikës ARN AWSLambdaBasicExecutionRole si më poshtë:

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

Shënim: mund të gjendet një listë me politika të tjera këtu.

Krijimi i një funksioni lambda që funksionon acme-dns-route53

Hora! Tani mund ta vendosni funksionin tonë në AWS duke përdorur komandën aws lambda create-function. Lambda duhet të konfigurohet duke përdorur variablat e mjedisit të mëposhtëm:

  • AWS_LAMBDA - e bën të qartë acme-dns-route53 ai ekzekutim ndodh brenda AWS Lambda.
  • DOMAINS — një listë domenesh të ndara me presje.
  • LETSENCRYPT_EMAIL - përmban Le të Enkriptojmë Email-in.
  • NOTIFICATION_TOPIC — emri i temës së njoftimit të SNS (opsionale).
  • STAGING - në vlerë 1 përdoret mjedisi i skenës.
  • 1024 MB - kufiri i memories, mund të ndryshohet.
  • 900 sekonda (15 min) - skadimi.
  • acme-dns-route53 - emri i binarit tonë, i cili është në arkiv.
  • fileb://~/acme-dns-route53.zip — rruga për në arkivin që krijuam.

Tani le të vendosim:

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

Krijimi i një kohëmatësi CloudWatch që aktivizon një funksion 2 herë në ditë

Hapi i fundit është të konfiguroni cron, i cili thërret funksionin tonë dy herë në ditë:

  • krijoni një rregull CloudWatch me vlerën schedule_expression.
  • krijoni një objektiv rregulli (çfarë duhet të ekzekutohet) duke specifikuar ARN-në e funksionit lambda.
  • jepni leje rregullit për të thirrur funksionin lambda.

Më poshtë kam bashkangjitur konfigurimin tim Terraform, por në fakt kjo bëhet shumë thjesht duke përdorur konsolën AWS ose 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}"
}

Tani jeni konfiguruar që të krijoni dhe përditësoni automatikisht certifikatat SSL

Burimi: www.habr.com

Shto një koment