DNS-01 چیلنج اور AWS کا استعمال کرتے ہوئے Let's Encrypt SSL سرٹیفکیٹ مینجمنٹ کی آٹومیشن

پوسٹ میں SSL سرٹیفکیٹس کے انتظام کو خودکار کرنے کے اقدامات کی وضاحت کی گئی ہے۔ آئیے CA کو انکرپٹ کریں۔ استعمال کرتے ہوئے DNS-01 چیلنج и AWS.

acme-dns-route53 ایک ایسا آلہ ہے جو ہمیں اس خصوصیت کو نافذ کرنے کی اجازت دے گا۔ یہ Let's Encrypt سے SSL سرٹیفکیٹس کے ساتھ کام کر سکتا ہے، انہیں Amazon سرٹیفکیٹ مینیجر میں محفوظ کر سکتا ہے، DNS-53 چیلنج کو لاگو کرنے کے لیے Route01 API کا استعمال کر سکتا ہے، اور آخر میں SNS پر اطلاعات کو دھکیل سکتا ہے۔ میں acme-dns-route53 AWS Lambda کے اندر استعمال کے لیے بلٹ ان فعالیت بھی موجود ہے، اور ہمیں یہی ضرورت ہے۔

اس مضمون کو 4 حصوں میں تقسیم کیا گیا ہے:

  • زپ فائل بنانا؛
  • IAM کردار بنانا؛
  • ایک لیمبڈا فنکشن بنانا جو چلتا ہے۔ acme-dns-route53;
  • کلاؤڈ واچ ٹائمر بنانا جو دن میں 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. وہ گو کمپائلر پر واضح کرتے ہیں کہ اسے لینکس OS اور amd64 فن تعمیر کے لیے موزوں بائنری بنانے کی ضرورت ہے - یہ وہی ہے جو AWS پر چلتا ہے۔
AWS توقع کرتا ہے کہ ہمارا پروگرام زپ فائل میں لگایا جائے گا، تو آئیے تخلیق کرتے ہیں۔ acme-dns-route53.zip آرکائیو جس میں نئی ​​انسٹال شدہ بائنری ہوگی:

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

نوٹ: بائنری زپ آرکائیو کی جڑ میں ہونی چاہیے۔ اس کے لیے ہم استعمال کرتے ہیں۔ -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 MB - میموری کی حد، تبدیل کی جا سکتی ہے۔
  • 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"
 }

کلاؤڈ واچ ٹائمر بنانا جو دن میں 2 بار فنکشن کو متحرک کرتا ہے۔

آخری مرحلہ کرون کو ترتیب دینا ہے، جو ہمارے فنکشن کو دن میں دو بار کال کرتا ہے:

  • قدر کے ساتھ CloudWatch کا اصول بنائیں schedule_expression.
  • لیمبڈا فنکشن کے ARN کی وضاحت کرکے ایک اصول کا ہدف (جس پر عمل کیا جانا چاہئے) بنائیں۔
  • لیمبڈا فنکشن کو کال کرنے کے اصول کو اجازت دیں۔

ذیل میں میں نے اپنا Terraform config منسلک کیا ہے، لیکن درحقیقت یہ 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

نیا تبصرہ شامل کریں