Automation of Hayu urang Encrypt SSL manajemén sertipikat maké DNS-01 tantangan jeung AWS

Tulisan ngajelaskeun léngkah-léngkah pikeun ngajadikeun otomatis manajemén sertipikat SSL tina Hayu urang Encrypt CA ngagunakeun DNS-01 tangtangan и AWS.

acme-dns-rute53 mangrupakeun alat anu bakal ngidinan urang pikeun nerapkeun fitur ieu. Éta tiasa dianggo sareng sertipikat SSL ti Let's Encrypt, simpen dina Amazon Certificate Manager, anggo API Route53 pikeun ngalaksanakeun tantangan DNS-01, sareng, tungtungna, nyorong béwara ka SNS. DI acme-dns-rute53 Aya ogé fungsionalitas anu diwangun pikeun dianggo di jero AWS Lambda, sareng ieu anu urang peryogikeun.

Artikel ieu dibagi jadi 4 bagian:

  • nyieun file pos;
  • nyieun peran IAM;
  • nyieun fungsi lambda nu ngajalankeun acme-dns-rute53;
  • nyieun timer CloudWatch nu micu fungsi 2 kali sapoé;

Catetan: Sateuacan anjeun ngamimitian anjeun kedah pasang GoLang 1.9+ и AWS CLI

Nyiptakeun file zip

acme-dns-route53 ditulis dina GoLang sareng ngadukung versi henteu langkung handap tina 1.9.

Urang kudu nyieun file pos kalawan binér a acme-dns-route53 jero. Jang ngalampahkeun ieu anjeun kudu install acme-dns-route53 ti gudang GitHub ngagunakeun paréntah go install:

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

Binér dipasang dina $GOPATH/bin diréktori. Punten dicatet yén nalika pamasangan kami netepkeun dua lingkungan anu dirobih: GOOS=linux и GOARCH=amd64. Aranjeunna ngajelaskeun kompiler Go yén éta kedah nyiptakeun binér anu cocog pikeun Linux OS sareng arsitektur amd64 - ieu anu dijalankeun dina AWS.
AWS ngarepkeun program urang bakal disebarkeun dina file pos, janten hayu urang jieun acme-dns-route53.zip arsip anu bakal ngandung binér anu nembé dipasang:

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

Catetan: Binér kedah aya dina akar arsip pos. Pikeun ieu kami nganggo -j bandéra.

Ayeuna nickname pos kami geus siap pikeun deployment, sadaya anu tetep nyaéta nyieun peran jeung hak perlu.

Nyiptakeun peran IAM

Urang kedah nyetél peran IAM kalayan hak anu dibutuhkeun ku lambda urang salami palaksanaanna.
Hayu urang nelepon kawijakan ieu lambda-acme-dns-route53-executor sareng langsung masihan anjeunna peran dasar AWSLambdaBasicExecutionRole. Ieu bakal ngamungkinkeun lambda urang ngajalankeun sareng nyerat log kana jasa AWS CloudWatch.
Kahiji, urang nyieun file JSON nu ngajelaskeun hak urang. Ieu dasarna bakal ngamungkinkeun jasa lambda ngagunakeun peran éta lambda-acme-dns-route53-executor:

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

Eusi file kami nyaéta kieu:

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

Ayeuna hayu urang ngajalankeun paréntah aws iam create-role nyieun peran:

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

Catetan: émut kabijakan ARN (Amazon Resource Name) - urang peryogina dina léngkah-léngkah salajengna.

peran lambda-acme-dns-route53-executor dijieun, ayeuna urang kudu nangtukeun idin pikeun eta. Cara panggampangna pikeun ngalakukeun ieu nyaéta nganggo paréntah aws iam attach-role-policy, ngaliwatan kawijakan ARN AWSLambdaBasicExecutionRole saperti kieu:

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

Catetan: daptar kalawan kawijakan séjén bisa kapanggih di dieu.

Nyiptakeun fungsi lambda anu dijalankeun acme-dns-rute53

Horeeee! Ayeuna anjeun tiasa nyebarkeun fungsi kami ka AWS nganggo paréntah aws lambda create-function. Lambda kedah dikonpigurasi nganggo variabel lingkungan ieu:

  • AWS_LAMBDA - ngajadikeun eta jelas acme-dns-rute53 yén palaksanaan lumangsung di jero AWS Lambda.
  • DOMAINS — daptar domain anu dipisahkeun ku koma.
  • LETSENCRYPT_EMAIL - ngandung Hayu urang Énkripsi Surélék.
  • NOTIFICATION_TOPIC - nami Topik Bewara SNS (opsional).
  • STAGING - dina nilai 1 lingkungan pementasan dipaké.
  • 1024 MB - wates memori, bisa dirobah.
  • 900 secs (15 mnt) - timeout.
  • acme-dns-route53 - ngaran binér urang, nu aya dina arsip.
  • fileb://~/acme-dns-route53.zip - jalur ka arsip nu urang dijieun.

Ayeuna hayu urang nyebarkeun:

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

Nyiptakeun timer CloudWatch anu memicu fungsi 2 kali sapoé

Léngkah terakhir nyaéta nyetél cron, anu nyauran fungsi kami dua kali sadinten:

  • nyieun aturan CloudWatch kalawan nilai schedule_expression.
  • nyieun udagan aturan (naon kudu dieksekusi) ku nangtukeun ARN sahiji fungsi lambda.
  • masihan idin ka aturan pikeun nelepon fungsi lambda.

Handap Kuring geus napel config Terraform kuring, tapi dina kanyataanana ieu dipigawé pisan saukur ngagunakeun konsol AWS atanapi 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}"
}

Ayeuna anjeun dikonpigurasi pikeun otomatis nyiptakeun sareng ngapdet sertipikat SSL

sumber: www.habr.com

Tambahkeun komentar