Otomasyona Werin em rêveberiya sertîfîkaya SSL-ê şîfre bikin bi karanîna dijwariya DNS-01 û AWS

Post gavên ji bo otomatîkkirina rêveberiya sertîfîkayên SSL-ê vedibêje Werin em CA şîfre bikin bikar anîn Pirsgirêka DNS-01 и AWS.

acme-dns-route53 amûrek e ku dê destûrê bide me ku em vê taybetmendiyê bicîh bînin. Ew dikare bi sertîfîkayên SSL-ê ji Let's Encrypt bixebite, wan di Gerînendeyê Sertîfîkaya Amazonê de hilîne, API-ya Route53 bikar bîne da ku dijwariya DNS-01 bicîh bîne, û, di dawiyê de, agahdariyên SNS-ê bişopîne. LI acme-dns-route53 Ji bo karanîna di hundurê AWS Lambda de fonksiyonek çêkirî jî heye, û ya ku em hewce ne ev e.

Ev gotar li ser 4 beşan dabeş dibe:

  • afirandina pelê zip;
  • afirandina rola IAM;
  • afirandina fonksiyonek lambda ku dimeşîne acme-dns-route53;
  • afirandina demjimêrek CloudWatch ku rojê 2 caran fonksiyonek vedike;

Not: Berî ku hûn dest pê bikin, hûn hewce ne ku saz bikin GoLang 1.9+ и AWS CLI

Afirandina pelê zip

acme-dns-route53 di GoLang de hatî nivîsandin û guhertoya ku ji 1.9-ê kêmtir nîne piştgirî dike.

Pêdivî ye ku em pelek zip bi binaryek çêbikin acme-dns-route53 nav. Ji bo vê yekê hûn hewce ne ku saz bikin acme-dns-route53 ji depoya GitHub bi karanîna fermanê go install:

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

Binarya tê sazkirin $GOPATH/bin directory. Ji kerema xwe not bikin ku di dema sazkirinê de me du hawîrdorên guherbar diyar kirin: GOOS=linux и GOARCH=amd64. Ew ji berhevkarê Go re eşkere dikin ku ew hewce ye ku ji bo Linux OS û mîmariya amd64 binaryek minasib biafirîne - ya ku li ser AWS-ê dimeşîne ev e.
AWS hêvî dike ku bernameya me di pelek zip de were bicîh kirin, ji ber vê yekê em biafirînin acme-dns-route53.zip arşîva ku dê binarya ku nû hatî saz kirin dihewîne:

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

Not: Divê binary di koka arşîva zip de be. Ji bo vê yekê em bikar tînin -j al.

Naha paşnavê meya zip ji bo bicîhkirinê amade ye, ya ku dimîne ev e ku em bi mafên pêwîst rolek biafirînin.

Afirandina rola IAM

Pêdivî ye ku em bi mafên ku lambda me di dema darvekirina wê de hewce dike, rolek IAM saz bikin.
Em ji vê siyasetê re bibêjin lambda-acme-dns-route53-executor û yekser roleke bingehîn bide wê AWSLambdaBasicExecutionRole. Ev ê bihêle ku lambda me bixebite û têketinên karûbarê AWS CloudWatch binivîsîne.
Pêşîn, em pelek JSON ku mafên me vedibêje diafirîne. Ev ê bi bingehîn rê bide karûbarên lambda ku rola xwe bikar bînin lambda-acme-dns-route53-executor:

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

Naveroka dosyaya me wiha ye:

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

Naha em fermanê bimeşînin aws iam create-role ji bo afirandina rolek:

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

Not: Siyaseta ARN (Navê Çavkaniyê ya Amazon) bi bîr bîne - em ê di gavên pêş de jê re hewce bikin.

Rola lambda-acme-dns-route53-executor afirandin, naha divê em ji bo wê destûrên diyar bikin. Rêya herî hêsan a kirina vê yekê karanîna fermanê ye aws iam attach-role-policybi derbaskirina siyaseta ARN AWSLambdaBasicExecutionRole wiha ye:

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

Not: lîsteyek bi polîtîkayên din dikare were dîtin vir.

Afirandina fonksiyonek lambda ku dimeşîne acme-dns-route53

Hooray! Naha hûn dikarin bi karanîna fermanê fonksiyona me li AWS bicîh bikin aws lambda create-function. Pêdivî ye ku lambda bi karanîna guhêrbarên hawîrdorê yên jêrîn were mîheng kirin:

  • AWS_LAMBDA - eşkere dike acme-dns-route53 ew darvekirin di hundurê AWS Lambda de pêk tê.
  • DOMAINS - navnîşek domên ku bi koman têne veqetandin.
  • LETSENCRYPT_EMAIL - dihewîne Werin em E-nameyê şîfre bikin.
  • NOTIFICATION_TOPIC - navê Mijara Agahdariya SNS (vebijarkî).
  • STAGING - li nirxê 1 hawirdora sehneyê tê bikaranîn.
  • 1024 MB - sînorê bîranînê, dikare were guhertin.
  • 900 çirke (15 hûrdem) - dem derbas dibe.
  • acme-dns-route53 - navê binarya me, ku di arşîvê de ye.
  • fileb://~/acme-dns-route53.zip - riya arşîva ku me çêkir.

Naha em bicîh bikin:

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

Afirandina demjimêrek CloudWatch ku rojê 2 caran fonksiyonek vedike

Pêngava paşîn sazkirina cron e, ku rojê du caran bangî fonksiyona me dike:

  • bi nirxê qaîdeyek CloudWatch biafirîne schedule_expression.
  • bi diyarkirina ARN ya fonksiyona lambda armancek qaîdeyek biafirîne (çi divê were darve kirin).
  • destûrê bide qaîdeyê ku bangî fonksiyona lambda bike.

Li jêr min konfigurasyona xwe ya Terraform vekiriye, lê di rastiyê de ev pir bi hêsanî bi karanîna konsolê AWS an AWS CLI tête kirin.

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

Naha hûn hatine mîheng kirin ku hûn bixweber sertîfîkayên SSL-ê biafirînin û nûve bikin

Source: www.habr.com

Add a comment