Secara otomatis memperoleh sertifikat SSL oleh Let's Encrypt menggunakan tantangan DNS-01 dan AWS

Posting ini menjelaskan langkah-langkah yang diperlukan untuk menyiapkan pembuatan dan pembaruan sertifikat SSL otomatis, menggunakan Let's Encrypt sebagai Otoritas Sertifikat otomatis, yang menyediakan API yang terpelihara dengan baik.
acme-dns-route53 adalah alat untuk mendapatkan sertifikat SSL dari Let's Encrypt menggunakan tantangan DNS-01 dengan Route53 dan Amazon Certificate Manager oleh AWS. acme-dns-route53 juga memiliki fungsi acme-dns-route53 untuk menggunakan alat ini di dalam AWS Lambda, dan inilah yang akan kita lakukan.


Posting ini dipecah menjadi 4 bagian:


  • membangun file zip mandiri yang dapat digunakan
  • membuat peran IAM untuk fungsi lambda yang memberikan izin yang diperlukan untuk mengeksekusi
  • membuat fungsi lambda yang mengeksekusi acme-dns-route53
  • membuat pengatur waktu CloudWatch yang memicu fungsi lambda dua kali sehari

Catatan: sebelum memulai, pastikan GoLang 1.9+ dan AWS CLI sudah diinstal.


Membangun file zip mandiri dan dapat digunakan


acme-dns-route53 ditulis dalam GoLang dan versi pendukungnya tidak kurang dari 1.9. Kita perlu membuat file zip mandiri yang bisa digunakan yang berisi executable dari alat acme-dns-route53 di dalamnya.


Langkah pertama adalah membangun sebuah executable dari repo GitHub dari alat acme-dns-route53 menggunakan perintah go install :


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

Eksekusi akan diinstal di $GOPATH/bin . Penting: sebagai bagian dari perintah ini kami menggunakan env untuk sementara menetapkan dua variabel lingkungan untuk durasi untuk perintah ( GOOS=linux dan GOARCH=amd64 ). Ini menginstruksikan kompiler Go untuk membuat executable yang cocok untuk digunakan dengan OS Linux dan arsitektur amd64 - yang akan dijalankan saat kami menyebarkannya ke AWS.
AWS mengharuskan kami untuk mengunggah fungsi lambda kami dalam file zip, jadi mari kita buat file zip acme-dns-route53.zip berisi file executable yang baru saja kita buat:


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

Perhatikan bahwa file yang dapat dieksekusi harus di root dari file zip - bukan di folder di dalam file zip. Untuk memastikan ini, saya telah menggunakan flag -j di snippet di atas untuk nama direktori junk.


Sekarang file zip dapat digunakan, tetapi masih membutuhkan izin untuk dijalankan.


Membuat peran IAM untuk fungsi lambda yang memberikan izin yang diperlukan untuk mengeksekusi


Kita perlu mengatur peran IAM yang mendefinisikan izin yang akan dimiliki fungsi lambda saat dijalankan.
Untuk saat ini, mari kita membuat peran lambda-acme-dns-route53-executor dan melampirkan kebijakan terkelola AWSLambdaBasicExecutionRole ke sana. Ini akan memberi fungsi lambda kami izin dasar yang diperlukan untuk menjalankan dan masuk ke layanan AWS CloudWatch.
Pertama, kita harus membuat file JSON kebijakan kepercayaan. Ini pada dasarnya akan menginstruksikan AWS untuk memungkinkan layanan lambda untuk mengambil peran lambda-acme-dns-route53-executor :


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

Konten file JSON yang dibuat harus 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:<AWS_REGION>:<AWS_ACCOUNT_ID>:<TOPIC_NAME>", "arn:aws:route53:::hostedzone/*", "arn:aws:route53:::change/*", "arn:aws:acm:<AWS_REGION>:<AWS_ACCOUNT_ID>:certificate/*" ] } ] } 

Kemudian gunakan perintah aws iam create-role untuk membuat peran dengan kebijakan trust ini:


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

Catat ARN (Nama Sumber Daya Amazon) yang dikembalikan - Anda akan memerlukan ini di langkah berikutnya.


Sekarang peran lambda-acme-dns-route53-executor telah dibuat, kita perlu menentukan izin yang dimiliki oleh peran tersebut. Cara termudah untuk melakukan ini adalah dengan menggunakan perintah aws iam attach-role-policy , dengan memasukkan ARN AWSLambdaBasicExecutionRole kebijakan izin seperti:


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

Catatan: Anda dapat menemukan daftar kebijakan izin lainnya yang mungkin berguna di sini .


Membuat fungsi lambda yang mengeksekusi acme-dns-route53


Sekarang kita siap untuk benar-benar menggunakan fungsi lambda ke AWS, yang bisa kita lakukan menggunakan perintah aws lambda create-function . Fungsi lambda perlu dikonfigurasi dengan opsi berikut:


  • AWS_LAMBDA variabel lingkungan dengan nilai 1 yang menyesuaikan alat untuk menggunakan fungsi Lambda di dalam.
  • DOMAINS adalah variabel lingkungan yang berisi daftar domain yang dipisahkan koma yang akan dikeluarkan sertifikatnya.
  • LETSENCRYPT_EMAIL adalah variabel lingkungan yang berisi email kadaluarsa Let's Encrypt.
  • NOTIFICATION_TOPIC adalah variabel lingkungan yang berisi SNS Notification Topic ARN.
  • STAGING adalah variabel lingkungan yang harus berisi 1 nilai untuk menggunakan lingkungan staging Let's Encrypt atau 0 untuk lingkungan produksi.
  • RENEW_BEFORE adalah jumlah hari yang menentukan periode sebelum berakhirnya saat sertifikat harus diperbarui.
  • 1024 MB adalah batas memori (dapat diubah jika diperlukan).
  • 900 detik (15 mnt) adalah batas waktu maksimum.
  • acme-dns-route53 adalah nama handler dari fungsi lambda.
  • fileb://~/acme-dns-route53.zip adalah file .zip yang dibuat di atas.

Teruskan dan coba 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\",LETSENCRYPT_EMAIL=begmaroman@gmail.com,STAGING=0,NOTIFICATION_TOPIC=acme-dns-route53-obtained,RENEW_BEFORE=7}" \ --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", "RENEW_BEFORE": "7", "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 lambda sekali sehari


Langkah terakhir adalah membuat pemicu harian untuk fungsi tersebut. Untuk melakukan ini kita dapat:


  • buat aturan CloudWatch dengan schedule_expression diinginkan (kapan harus dijalankan).
  • membuat target aturan (apa yang harus dijalankan) dengan menentukan ARN fungsi lambda.
  • memberikan izin aturan CloudWatch untuk menjalankan fungsi lambda.

Saya telah menempelkan konfigurasi Terraform saya untuk itu di bawah ini, tetapi juga sangat mudah untuk melakukannya dari konsol AWS atau 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 juga dapat memiliki 100% pembaruan sertifikat TLS otomatis!

Source: https://habr.com/ru/post/id451200/


All Articles