أتمتة إدارة شهادات Let's Encrypt SSL باستخدام تحدي DNS-01 وAWS

يصف المنشور خطوات أتمتة إدارة شهادات SSL من دعونا تشفير CA استخدام تحدي DNS-01 и AWS.

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

تنقسم هذه المقالة إلى 4 أقسام:

  • إنشاء ملف مضغوط.
  • إنشاء دور IAM؛
  • إنشاء وظيفة لامدا التي تعمل ذروة نظام أسماء النطاقات-route53;
  • إنشاء مؤقت CloudWatch الذي يقوم بتشغيل وظيفة مرتين في اليوم؛

ملحوظة: قبل البدء تحتاج إلى التثبيت جولانج 1.9+ и AWS CLI

إنشاء ملف مضغوط

acme-dns-route53 مكتوب بلغة GoLang ويدعم الإصدار الذي لا يقل عن 1.9.

نحن بحاجة إلى إنشاء ملف مضغوط مع ملف ثنائي acme-dns-route53 داخل. للقيام بذلك تحتاج إلى تثبيت acme-dns-route53 من مستودع GitHub باستخدام الأمر go install:

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

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

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

ملحوظة: يجب أن يكون الملف الثنائي في جذر الأرشيف المضغوط. لهذا نستخدم -j علَم.

الآن أصبح لقبنا المضغوط جاهزًا للنشر، وكل ما تبقى هو إنشاء دور بالحقوق اللازمة.

إنشاء دور IAM

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

$ touch ~/lambda-acme-dns-route53-executor-policy.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:${var.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) - سنحتاج إليها في الخطوات التالية.

دور 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

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

إنشاء دالة لامدا التي تعمل ذروة نظام أسماء النطاقات-route53

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

  • AWS_LAMBDA - يوضح الأمر ذروة نظام أسماء النطاقات-route53 يحدث هذا التنفيذ داخل AWS Lambda.
  • DOMAINS — قائمة المجالات مفصولة بفواصل.
  • LETSENCRYPT_EMAIL - يتضمن دعونا تشفير البريد الإلكتروني.
  • NOTIFICATION_TOPIC - اسم موضوع إشعار SNS (اختياري).
  • STAGING - بالقيمة 1 يتم استخدام بيئة التدريج.
  • 1024 ميغابايت - الحد الأقصى للذاكرة، يمكن تغييره.
  • 900 ثانية (15 دقيقة) — مهلة.
  • acme-dns-route53 — اسم الثنائي الموجود في الأرشيف.
  • fileb://~/acme-dns-route53.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",[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"
 }

إنشاء مؤقت CloudWatch الذي يقوم بتشغيل وظيفة مرتين في اليوم

الخطوة الأخيرة هي إعداد cron، الذي يستدعي وظيفتنا مرتين يوميًا:

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

لقد أرفقت أدناه تكوين Terraform الخاص بي، ولكن في الواقع يتم ذلك بكل بساطة باستخدام وحدة تحكم AWS أو 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}"
}

أنت الآن مهيأ لإنشاء شهادات SSL وتحديثها تلقائيًا

المصدر: www.habr.com

إضافة تعليق