الحصول على شهادات طبقة المقابس الآمنة تلقائيًا من خلال Let's Encrypt باستخدام تحدي DNS-01 و AWS

يصف هذا المنشور الخطوات اللازمة لإعداد إنشاء شهادات طبقة المقابس الآمنة وتجديدها تلقائيًا ، وذلك باستخدام Let's Encrypt باعتبارها المرجع المصدق الآلي ، والذي يوفر واجهة برمجة تطبيقات مصانة جيدًا.
acme-dns-route53 هي الأداة للحصول على شهادات SSL من Let's Encrypt باستخدام DNS-01 للتحدي مع Route53 و Amazon Certificate Manager من AWS. acme-dns-route53 أيضًا وظيفة مدمجة لاستخدام هذه الأداة داخل AWS Lambda ، وهذا ما سنفعله.


هذا المنشور مقسم إلى 4 أقسام:


  • قم بإنشاء ملف مضغوط قابل للتوزيع وقائم بذاته
  • إنشاء دور IAM لوظيفة lambda يمنحه الأذونات اللازمة للتنفيذ
  • إنشاء وظيفة lambda التي تنفذ acme-dns-route53
  • إنشاء جهاز ضبط وقت CloudWatch يقوم بتشغيل وظيفة lambda مرتين في اليوم

ملاحظة: قبل البدء ، تأكد من تثبيت GoLang 1.9+ و AWS CLI بالفعل.


بنيت ملف مضغوط قابلة للتوزيع الذاتي


acme-dns-route53 في GoLang والنسخة الداعمة لا تقل عن 1.9. نحتاج إلى إنشاء ملف مضغوط acme-dns-route53 للنشر يحتوي على الملف القابل للتنفيذ لأداة acme-dns-route53 بداخله.


الخطوة الأولى هي بناء ملف قابل للتنفيذ من GitHub repo من أداة acme-dns-route53 طريق استخدام الأمر go install :


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

سيتم تثبيت الملف القابل للتنفيذ في $GOPATH/bin . هام: كجزء من هذا الأمر ، نستخدم env لتعيين متغيرين للبيئة مؤقتًا لمدة الأمر ( GOOS=linux و GOARCH=amd64 ). هذه تعليمات برنامج التحويل البرمجي Go لإنشاء ملف قابل للتنفيذ مناسب للاستخدام مع نظام التشغيل Linux OS و amd64 - وهو ما سيتم تشغيله عند نشره على AWS.
AWS يتطلب منا تحميل وظائف lambda الخاصة بنا في ملف مضغوط ، لذلك فلنقم acme-dns-route53.zip ملف مضغوط acme-dns-route53.zip يحتوي على الملف القابل للتنفيذ الذي acme-dns-route53.zip للتو:


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

لاحظ أن الملف القابل للتنفيذ يجب أن يكون في جذر ملف zip - وليس في مجلد داخل ملف zip. لضمان ذلك ، استعملت علامة -j في المقتطف أعلاه لتوضيح أسماء الدليل.


يمكن الآن نشر ملف zip ، لكنه لا يزال يحتاج إلى أذونات لتشغيله.


إنشاء دور IAM لوظيفة lambda يمنحه الأذونات اللازمة للتنفيذ


نحتاج إلى إعداد دور IAM الذي يحدد الإذن الذي ستحصل عليه وظيفة lambda عند تشغيلها.
في الوقت الحالي ، دعنا lambda-acme-dns-route53-executor دورًا lambda-acme-dns-route53-executor ونعلق سياسة AWSLambdaBasicExecutionRole المدارة عليه. سيعطي هذا وظيفة lambda الخاصة بنا الأذونات الأساسية التي يحتاجها لتشغيله وتسجيل الدخول إلى خدمة AWS CloudWatch.
أولاً ، يتعين علينا إنشاء ملف JSON لسياسة الثقة. هذا سيوجه أساسًا AWS للسماح لخدمات lambda بتولي دور lambda-acme-dns-route53-executor :


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

يجب أن يكون محتوى ملف JSON الذي تم إنشاؤه كما يلي:


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

ثم استخدم الأمر aws iam create-role لإنشاء الدور باستخدام سياسة الثقة هذه:


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

قم بتدوين ARN الذي تم إرجاعه (Amazon Resource Name) - ستحتاج إلى ذلك في الخطوة التالية.


الآن تم إنشاء دور lambda-acme-dns-route53-executor ، نحتاج إلى تحديد الأذونات التي يتمتع بها هذا الدور. أسهل طريقة للقيام بذلك هي استخدام الأمر aws iam attach-role-policy ، في تمرير سياسة إذن ARN لـ AWSLambdaBasicExecutionRole مثل:


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

ملاحظة: يمكنك العثور على قائمة بسياسات الأذونات الأخرى التي قد تكون مفيدة هنا .


إنشاء وظيفة lambda التي تنفذ acme-dns-route53


نحن الآن على استعداد لنشر وظيفة lambda في AWS ، والتي يمكننا القيام بها باستخدام الأمر aws lambda create-function . تحتاج وظيفة lambda إلى التهيئة باستخدام الخيارات التالية:


  • متغير البيئة AWS_LAMBDA مع القيمة 1 التي تعدل الأداة للاستخدام داخل وظيفة Lambda.
  • DOMAINS هو متغير البيئة الذي يحتوي على قائمة المجالات مفصولة بفواصل والتي سيتم إصدار الشهادات.
  • LETSENCRYPT_EMAIL هو متغير البيئة الذي يحتوي على دعونا تشفير البريد الإلكتروني انتهاء الصلاحية.
  • NOTIFICATION_TOPIC هو متغير البيئة الذي يحتوي على موضوع SNS Notification ARN.
  • STAGING هو متغير البيئة الذي يجب أن يحتوي على قيمة 1 لاستخدام التدريج Let's Encrypt environment أو 0 لبيئة الإنتاج.
  • RENEW_BEFORE هو عدد الأيام التي تحدد الفترة قبل انتهاء الصلاحية والتي يجب خلالها تجديد الشهادة.
  • 1024 ميغابايت هو الحد الأقصى للذاكرة (يمكن تغييره عند الحاجة).
  • 900 ثانية (15 دقيقة) هي المهلة القصوى.
  • acme-dns-route53 هو اسم المعالج لوظيفة lambda.
  • fileb://~/acme-dns-route53.zip هو ملف .zip الذي تم إنشاؤه أعلاه.

المضي قدما ومحاولة نشرها:


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

إنشاء مؤقت CloudWatch يقوم بتشغيل وظيفة lambda مرة واحدة يوميًا


الخطوة الأخيرة هي إنشاء مشغل يومي للوظيفة. للقيام بذلك يمكننا:


  • إنشاء قاعدة CloudWatch مع schedule_expression المطلوب (متى يجب تشغيله).
  • إنشاء هدف القاعدة (ما يجب تشغيله) تحديد ARN وظيفة lambda.
  • إعطاء إذن قاعدة CloudWatch لاستدعاء وظيفة lambda.

لقد قمت بلصق تهيئة Terraform الخاصة بي أدناه ، ولكن من السهل جدًا القيام بذلك إما من وحدة 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}" } 

الآن يمكنك أيضًا الحصول على تجديدات شهادة TLS الآلية بنسبة 100٪!

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


All Articles