Otomatisasi manajemen sertifikat SSL Let's Encrypt menggunakan tantangan DNS-01 dan AWS

Postingan tersebut menjelaskan langkah-langkah untuk mengotomatiskan pengelolaan sertifikat SSL Mari Enkripsi CA menggunakan Tantangan DNS-01 ΠΈ AWS.

acme-dns-route53 adalah alat yang memungkinkan kita mengimplementasikan fitur ini. Ini dapat bekerja dengan sertifikat SSL dari Let's Encrypt, menyimpannya di Amazon Certificate Manager, menggunakan API Route53 untuk mengimplementasikan tantangan DNS-01, dan, terakhir, mengirimkan pemberitahuan ke SNS. DI DALAM acme-dns-route53 Ada juga fungsionalitas bawaan untuk digunakan di dalam AWS Lambda, dan inilah yang kami butuhkan.

Artikel ini dibagi menjadi 4 bagian:

  • membuat file zip;
  • membuat peran IAM;
  • membuat fungsi lambda yang berjalan acme-dns-route53;
  • membuat pengatur waktu CloudWatch yang memicu fungsi 2 kali sehari;

Catatan: Sebelum memulai, Anda perlu menginstal GoLang 1.9+ ΠΈ AWS CLI

Membuat file zip

acme-dns-route53 ditulis dalam GoLang dan mendukung versi tidak lebih rendah dari 1.9.

Kita perlu membuat file zip dengan biner acme-dns-route53 di dalam. Untuk melakukan ini, Anda perlu menginstal acme-dns-route53 dari repositori GitHub menggunakan perintah go install:

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

Biner dipasang di $GOPATH/bin direktori. Harap dicatat bahwa selama instalasi kami menentukan dua lingkungan yang diubah: GOOS=linux ΠΈ GOARCH=amd64. Mereka menjelaskan kepada kompiler Go bahwa ia perlu membuat biner yang cocok untuk OS Linux dan arsitektur amd64 - inilah yang berjalan di AWS.
AWS mengharapkan program kita diterapkan dalam file zip, jadi mari kita buat acme-dns-route53.zip arsip yang akan berisi biner yang baru diinstal:

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

Catatan: Binernya harus berada di root arsip zip. Untuk ini kami menggunakan -j bendera.

Sekarang nama panggilan zip kami siap untuk diterapkan, yang tersisa hanyalah membuat peran dengan hak yang diperlukan.

Membuat peran IAM

Kita perlu menyiapkan peran IAM dengan hak yang dibutuhkan oleh lambda kita selama eksekusinya.
Sebut saja kebijakan ini lambda-acme-dns-route53-executor dan segera memberinya peran dasar AWSLambdaBasicExecutionRole. Ini akan memungkinkan lambda kami menjalankan dan menulis log ke layanan AWS CloudWatch.
Pertama, kami membuat file JSON yang menjelaskan hak kami. Ini pada dasarnya akan memungkinkan layanan lambda untuk menggunakan peran tersebut lambda-acme-dns-route53-executor:

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

Isi file kami adalah sebagai 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 perintahnya aws iam create-role untuk membuat peran:

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

Catatan: ingat kebijakan ARN (Amazon Resource Name) - kita akan membutuhkannya di langkah selanjutnya.

Peran lambda-acme-dns-route53-executor dibuat, sekarang kita perlu menentukan izin untuk itu. Cara termudah untuk melakukannya adalah dengan menggunakan perintah aws iam attach-role-policy, melewati kebijakan ARN AWSLambdaBasicExecutionRole sebagai berikut:

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

Catatan: daftar dengan kebijakan lain dapat ditemukan di sini.

Membuat fungsi lambda yang berjalan acme-dns-route53

Hore! Sekarang Anda dapat men-deploy fungsi kami ke AWS menggunakan perintah aws lambda create-function. Lambda harus dikonfigurasi menggunakan variabel lingkungan berikut:

  • AWS_LAMBDA - memperjelasnya acme-dns-route53 eksekusi itu terjadi di dalam AWS Lambda.
  • DOMAINS β€” daftar domain yang dipisahkan dengan koma.
  • LETSENCRYPT_EMAIL - mengandung Mari Enkripsi Email.
  • NOTIFICATION_TOPIC β€” nama Topik Pemberitahuan SNS (opsional).
  • STAGING - pada nilainya 1 lingkungan pementasan digunakan.
  • 1024 MB - batas memori, dapat diubah.
  • 900 detik (15 menit) β€” batas waktu.
  • acme-dns-route53 β€” nama biner kami, yang ada di arsip.
  • fileb://~/acme-dns-route53.zip β€” jalur menuju arsip yang kita buat.

Sekarang mari kita terapkan:

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

Membuat pengatur waktu CloudWatch yang memicu fungsi 2 kali sehari

Langkah terakhir adalah menyiapkan cron, yang memanggil fungsi kita dua kali sehari:

  • buat aturan CloudWatch dengan nilainya schedule_expression.
  • buat target aturan (apa yang harus dieksekusi) dengan menentukan ARN fungsi lambda.
  • memberikan izin pada aturan untuk memanggil fungsi lambda.

Di bawah ini saya telah melampirkan konfigurasi Terraform saya, tetapi sebenarnya ini dilakukan dengan sangat sederhana 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}"
}

Sekarang Anda dikonfigurasi untuk membuat dan memperbarui sertifikat SSL secara otomatis

Sumber: www.habr.com

Tambah komentar