اتوماسیون مدیریت گواهینامه Let's Encrypt SSL با استفاده از چالش DNS-01 و AWS

این پست مراحلی را برای مدیریت خودکار گواهی‌های SSL از آن شرح می‌دهد بیایید CA را رمزگذاری کنیم استفاده كردن چالش DNS-01 и AWS.

acme-dns-route53 ابزاری است که به ما امکان پیاده سازی این ویژگی را می دهد. می‌تواند با گواهی‌های SSL از Let's Encrypt کار کند، آنها را در مدیر گواهی آمازون ذخیره کند، از Route53 API برای اجرای چالش DNS-01 استفاده کند، و در نهایت، اعلان‌ها را به SNS ارسال کند. که در acme-dns-route53 همچنین عملکرد داخلی برای استفاده در AWS Lambda وجود دارد و این همان چیزی است که ما به آن نیاز داریم.

این مقاله به 4 بخش تقسیم شده است:

  • ایجاد یک فایل فشرده؛
  • ایجاد نقش IAM؛
  • ایجاد یک تابع لامبدا که اجرا می شود acme-dns-route53;
  • ایجاد یک تایمر CloudWatch که یک عملکرد را 2 بار در روز فعال می کند.

توجه داشته باشید: قبل از شروع باید نصب کنید GoLang 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 روشن می کنند که باید یک باینری مناسب برای سیستم عامل لینوکس و معماری amd64 ایجاد کند - این همان چیزی است که روی AWS اجرا می شود.
AWS انتظار دارد برنامه ما در یک فایل فشرده مستقر شود، پس بیایید ایجاد کنیم acme-dns-route53.zip بایگانی که حاوی باینری تازه نصب شده است:

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

توجه داشته باشید: باینری باید در ریشه آرشیو zip باشد. برای این ما استفاده می کنیم -j پرچم.

اکنون نام مستعار زیپ ما آماده استقرار است، تنها چیزی که باقی می ماند ایجاد یک نقش با حقوق لازم است.

ایجاد نقش IAM

ما باید یک نقش IAM با حقوق مورد نیاز لامبدا در طول اجرای آن راه اندازی کنیم.
بیایید نام این سیاست را بگذاریم lambda-acme-dns-route53-executor و بلافاصله یک نقش اساسی به او بدهید AWSLambdaBasicExecutionRole. این به لامبدا ما اجازه می‌دهد تا گزارش‌ها را در سرویس 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 (نام منبع آمازون) را به خاطر بسپارید - در مراحل بعدی به آن نیاز خواهیم داشت.

نقش 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

توجه داشته باشید: فهرستی با سایر سیاست ها را می توان یافت اینجا.

ایجاد یک تابع لامبدا که اجرا می شود acme-dns-route53

هورا! اکنون می توانید با استفاده از دستور تابع ما را در AWS مستقر کنید aws lambda create-function. لامبدا باید با استفاده از متغیرهای محیطی زیر پیکربندی شود:

  • AWS_LAMBDA - روشن می کند acme-dns-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 که یک عملکرد را 2 بار در روز فعال می کند

آخرین مرحله راه اندازی cron است که دو بار در روز تابع ما را فراخوانی می کند:

  • یک قانون CloudWatch با مقدار ایجاد کنید schedule_expression.
  • با مشخص کردن ARN تابع لامبدا، یک هدف قانون ایجاد کنید (آنچه باید اجرا شود).
  • به قانون اجازه فراخوانی تابع لامبدا بدهید.

در زیر پیکربندی 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

اضافه کردن نظر