Automatizimi i menaxhimit tĂ« certifikatave SSL Let’s Encrypt duke pĂ«rdorur sfidĂ«n DNS-01 dhe AWS

Ky postim pĂ«rshkruan hapat pĂ«r automatizimin e menaxhimit tĂ« certifikatave SSL nga Let’s Encrypt CA duke pĂ«rdorur sfidĂ«n DNS-01 dhe AWS.

acme-dns-route53 — Ă«shtĂ« njĂ« mjet qĂ« na lejon tĂ« realizojmĂ« kĂ«tĂ« funksionalitet. Ai mund tĂ« punojĂ« me certifikatate SSL nga Let’s Encrypt, t'i ruajĂ« ato nĂ« Amazon Certificate Manager, tĂ« pĂ«rdorĂ« API-nĂ« e Route53 pĂ«r realizimin e sfidĂ«s DNS-01 dhe, nĂ« fund, tĂ« dĂ«rgojĂ« njoftime nĂ« SNS. NĂ« acme-dns-route53 nĂ« tĂ« njĂ«jtĂ«n kohĂ«, ka funksionalitet tĂ« integruar pĂ«r t'u pĂ«rdorur brenda AWS Lambda, dhe kjo Ă«shtĂ« ajo qĂ« na nevojitet.

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

  • krijimi i skedhĂ«s zip;
  • krijimi i rolit IAM;
  • krijimi i funksionit lambda qĂ« ekzekuton acme-dns-route53;
  • krijimi i njĂ« timer-i nĂ« CloudWatch qĂ« aktivizon funksionin 2 herĂ« nĂ« ditĂ«;

Shënim: para fillimit, nevojitet instalimi i GoLang 1.9+ dhe AWS CLI

Krijimi i skedhës zip

acme-dns-route53 është shkruar në GoLang dhe mbështet versionin 1.9 ose më të lartë.

Na nevojitet të krijojmë një skedhë zip me binarin acme-dns-route53 brenda. Për këtë është e nevojshme të instalohet acme-dns-route53 nga repository GitHub duke përdorur komandën go install:

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

Binar Ă«shtĂ« instaluar nĂ« $GOPATH/bin direktorinĂ«. Vini re se gjatĂ« instalimit ne caktuam dy variabla tĂ« mjedisit: GOOS=linux dhe GOARCH=amd64. KĂ«ta i tregojnĂ« kompajlerit Go pĂ«r tĂ« krijuar njĂ« binar tĂ« pĂ«rshtatshĂ«m pĂ«r sistemin operativ Linux dhe arkitekturĂ«n amd64 — ky Ă«shtĂ« ai qĂ« ekzekutohet nĂ« AWS.
AWS parashikon vendosjen e programit tonë në një skedar zip, kështu që le të krijojmë acme-dns-route53.zip arkivin që do të përmbajë binarin e sapo instaluar:

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

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

Tani zip-i ynë është gati për vendosje, duhet vetëm të krijojmë një rol me të drejtat e nevojshme.

Krijimi i rolit IAM

Na nevojitet të vendosim rolin IAM me të drejtat e nevojshme për lambdën tonë gjatë ekzekutimit të saj.
Le të quajmë këtë politikë lambda-acme-dns-route53-executor dhe menjëherë t'i japim asaj rolin e bazës AWSLambdaBasicExecutionRole. Kjo do t'i lejojë lambdës tonë të startojë dhe të shkruajë logje në shërbimin AWS CloudWatch.
Për fillim, krijojmë një skedar JSON në të cilin përshkruhen të drejtat tona. Kjo, për esencë, 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 vijon:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup"
            ],
            "Resource": "arn:aws:logs:::*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents",
                "logs:CreateLogStream"
            ],
            "Resource": "arn:aws:logs:::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}::",
                "arn:aws:route53:::hostedzone/*",
                "arn:aws:route53:::change/*",
                "arn:aws:acm:::certificate/*"
            ]
        }
    ]
}

Tani do ta shkojmë te komanda aws iam create-role për krijimin e rolit:

$ 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 policy ARN (Emri i Burimit Amazon) — do na nevojitet nĂ« hapat e ardhshĂ«m.

Roli lambda-acme-dns-route53-executor është krijuar, tani na nevojitet të përcaktojmë lejet për të. Mënyra më e thjeshtë për ta bërë këtë është të përdorim komandën aws iam attach-role-policy, duke kaluar policy ARN AWSLambdaBasicExecutionRole si nga:

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

Shënim: listën e politikave të tjera mund ta gjeni këtu.

Krijimi i funksionit lambda që ekzekuton acme-dns-route53

Ura! Tani mund ta publikojmë funksionin tonë në AWS me komandën aws lambda create-function. Lambda duhet të konfigurohet duke përdorur këto variabla ambienti:

  • AWS_LAMBDA — bĂ«n tĂ« ditur acme-dns-route53 se ekzekutimi ndodh brenda AWS Lambda.
  • DOMENET — lista e domain-eve, tĂ« ndara me vĂ­rgula.
  • LETSENCRYPT_EMAIL — pĂ«rmban Email pĂ«r Let’s Encrypt.
  • NOTIFICATION_TOPIC — emri i SNS Notification Topic (opsional).
  • STAGING — kur ka vlerĂ« 1 pĂ«rdoret ambienti i staging.
  • 1024 MB — limiti i memories, mund tĂ« ndryshohet.
  • 900 secs (15 min) — koha e skadencĂ«s.
  • acme-dns-route53 — emri i binarit tonĂ«, qĂ« ndodhet nĂ« arkiv.
  • fileb://~/acme-dns-route53.zip — rruga drejt arkivĂ«s qĂ« krijuam.

Tani po bëjmë publikimin:

$ aws lambda create-function 
 --function-name acme-dns-route53 
 --runtime go1.x 
 --role arn:aws:iam:::role/lambda-acme-dns-route53-executor 
 --environment Variables="{AWS_LAMBDA=1,DOMAINS="example1.com,example2.com",LETSENCRYPT_EMAIL=begmaroman@gmail.com,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": "your@email.com", 
 "NOTIFICATION_TOPIC": "acme-dns-route53-obtained", 
 "AWS_LAMBDA": "1"
 }
 }, 
 "Version": "$LATEST", 
 "Role": "arn:aws:iam:::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::function:acme-dns-route53", 
 "Handler": "acme-dns-route53"
 }

Krijimi i një timer-i CloudWatch që aktivizon funksionin 2 herë në ditë

Hapi i fundit është të konfigurojmë një cron që thërret funksionin tonë dy herë në ditë:

  • krijoni njĂ« rregull CloudWatch me vlerĂ«n schedule_expression.
  • krijoni njĂ« target tĂ« rregullit (çfarĂ« duhet tĂ« ekzekutohet), duke treguar ARN e funksionit lambda.
  • jepni leje rregullit tĂ« thĂ«rrasĂ« funksionin lambda.

Më poshtë kam bashkangjitur konfigurimin tim Terraform, por në të vërtetë kjo bëhet shumë lehtë përmes konsolës 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 edhe ju keni konfiguruar krijimin dhe përditësimin automatik të certifikatave SSL.

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster