Automasi pengurusan sijil SSL Let's Encrypt menggunakan cabaran DNS-01 dan AWS

Siaran itu menerangkan langkah-langkah untuk mengautomasikan pengurusan sijil SSL daripada Mari Sulitkan CA menggunakan Cabaran DNS-01 ΠΈ AWS.

acme-dns-route53 ialah alat yang membolehkan kami melaksanakan ciri ini. Ia boleh berfungsi dengan sijil SSL daripada Let's Encrypt, menyimpannya dalam Pengurus Sijil Amazon, menggunakan API Route53 untuk melaksanakan cabaran DNS-01 dan, akhirnya, pemberitahuan tolak kepada SNS. DALAM acme-dns-route53 Terdapat juga fungsi terbina dalam untuk digunakan di dalam AWS Lambda, dan inilah yang kami perlukan.

Artikel ini dibahagikan kepada 4 bahagian:

  • mencipta fail zip;
  • mewujudkan peranan IAM;
  • mencipta fungsi lambda yang berjalan acme-dns-route53;
  • mencipta pemasa CloudWatch yang mencetuskan fungsi 2 kali sehari;

Catatan: Sebelum anda mula anda perlu memasang GoLang 1.9+ ΠΈ AWS CLI

Mencipta fail zip

acme-dns-route53 ditulis dalam GoLang dan menyokong versi tidak lebih rendah daripada 1.9.

Kita perlu mencipta fail zip dengan binari acme-dns-route53 dalam. Untuk melakukan ini, anda perlu memasang acme-dns-route53 dari repositori GitHub menggunakan arahan go install:

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

Binari dipasang di $GOPATH/bin direktori. Sila ambil perhatian bahawa semasa pemasangan kami menetapkan dua persekitaran yang diubah: GOOS=linux ΠΈ GOARCH=amd64. Mereka menjelaskan kepada pengkompil Go bahawa ia perlu mencipta binari yang sesuai untuk OS Linux dan seni bina amd64 - inilah yang berjalan pada AWS.
AWS menjangkakan program kami akan digunakan dalam fail zip, jadi mari buat acme-dns-route53.zip arkib yang akan mengandungi binari yang baru dipasang:

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

Catatan: Binari harus berada dalam akar arkib zip. Untuk ini kami gunakan -j bendera.

Sekarang nama panggilan zip kami sedia untuk digunakan, yang tinggal hanyalah mencipta peranan dengan hak yang diperlukan.

Mencipta peranan IAM

Kami perlu menyediakan peranan IAM dengan hak yang diperlukan oleh lambda kami semasa pelaksanaannya.
Mari kita panggil dasar ini lambda-acme-dns-route53-executor dan segera berikan dia peranan asas AWSLambdaBasicExecutionRole. Ini akan membolehkan lambda kami menjalankan dan menulis log ke perkhidmatan AWS CloudWatch.
Pertama, kami mencipta fail JSON yang menerangkan hak kami. Ini pada asasnya akan membolehkan perkhidmatan lambda menggunakan peranan tersebut lambda-acme-dns-route53-executor:

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

Kandungan fail kami adalah seperti berikut:

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

Sekarang mari kita jalankan arahan aws iam create-role untuk mencipta peranan:

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

Catatan: ingat dasar ARN (Nama Sumber Amazon) - kami akan memerlukannya dalam langkah seterusnya.

Peranan lambda-acme-dns-route53-executor dicipta, kini kita perlu menentukan kebenaran untuknya. Cara paling mudah untuk melakukan ini adalah dengan menggunakan arahan aws iam attach-role-policy, lulus dasar ARN AWSLambdaBasicExecutionRole seperti berikut:

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

Catatan: senarai dengan dasar lain boleh didapati di sini.

Mencipta fungsi lambda yang berjalan acme-dns-route53

Hooray! Kini anda boleh menggunakan fungsi kami ke AWS menggunakan arahan aws lambda create-function. Lambda mesti dikonfigurasikan menggunakan pembolehubah persekitaran berikut:

  • AWS_LAMBDA - menjadikannya jelas acme-dns-route53 pelaksanaan itu berlaku di dalam AWS Lambda.
  • DOMAINS β€” senarai domain yang dipisahkan dengan koma.
  • LETSENCRYPT_EMAIL - mengandungi Mari Sulitkan E-mel.
  • NOTIFICATION_TOPIC β€” nama Topik Pemberitahuan SNS (pilihan).
  • STAGING - pada nilai 1 persekitaran pementasan digunakan.
  • 1024 MB - had memori, boleh ditukar.
  • 900 saat (15 min) β€” tamat masa.
  • acme-dns-route53 β€” nama binari kami, yang terdapat dalam arkib.
  • fileb://~/acme-dns-route53.zip β€” laluan ke arkib yang kami buat.

Sekarang mari kita gunakan:

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

Mencipta pemasa CloudWatch yang mencetuskan fungsi 2 kali sehari

Langkah terakhir ialah menyediakan cron, yang memanggil fungsi kami dua kali sehari:

  • buat peraturan CloudWatch dengan nilai schedule_expression.
  • buat sasaran peraturan (apa yang harus dilaksanakan) dengan menentukan ARN fungsi lambda.
  • memberi kebenaran kepada peraturan untuk memanggil fungsi lambda.

Di bawah saya telah melampirkan konfigurasi Terraform saya, tetapi sebenarnya ini dilakukan dengan mudah menggunakan konsol AWS atau 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}"
}

Kini anda dikonfigurasikan untuk mencipta dan mengemas kini sijil SSL secara automatik

Sumber: www.habr.com

Tambah komen