DNS-01 sorgulaması ve AWS kullanılarak Let's Encrypt SSL sertifika yönetiminin otomasyonu

Gönderide, SSL sertifikalarının yönetimini otomatikleştirmeye yönelik adımlar açıklanmaktadır. CA'yı Şifreleyelim kullanma DNS-01 mücadelesi и AWS.

acme-dns-rota53 bu özelliği uygulamamıza olanak sağlayacak bir araçtır. Let's Encrypt'in SSL sertifikalarıyla çalışabilir, bunları Amazon Sertifika Yöneticisi'ne kaydedebilir, DNS-53 mücadelesini uygulamak için Route01 API'yi kullanabilir ve son olarak bildirimleri SNS'ye iletebilir. İÇİNDE acme-dns-rota53 AWS Lambda'nın içinde kullanıma yönelik yerleşik işlevsellik de mevcuttur ve ihtiyacımız olan şey de budur.

Bu makale 4 bölüme ayrılmıştır:

  • bir zip dosyası oluşturmak;
  • bir IAM rolü oluşturma;
  • çalışan bir lambda işlevi oluşturma acme-dns-rota53;
  • bir işlevi günde 2 kez tetikleyen bir CloudWatch zamanlayıcısı oluşturmak;

Not: Başlamadan önce yüklemeniz gerekir Go Lang 1.9+ и AWS CLI'si

Zip dosyası oluşturma

acme-dns-route53, GoLang'da yazılmıştır ve 1.9'dan düşük olmayan sürümü destekler.

İkili bir zip dosyası oluşturmamız gerekiyor acme-dns-route53 içeri. Bunu yapmak için yüklemeniz gerekir acme-dns-route53 komutunu kullanarak GitHub deposundan go install:

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

İkili dosya yüklü $GOPATH/bin dizin. Kurulum sırasında iki değiştirilmiş ortam belirttiğimizi lütfen unutmayın: GOOS=linux и GOARCH=amd64. Go derleyicisine Linux işletim sistemi ve amd64 mimarisine uygun bir ikili dosya oluşturması gerektiğini açıkça belirtiyorlar; AWS'de çalışan şey bu.
AWS, programımızın bir zip dosyasında dağıtılmasını bekliyor; o halde hadi şunu oluşturalım: acme-dns-route53.zip yeni kurulan ikili dosyayı içerecek arşiv:

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

Not: İkili dosya zip arşivinin kökünde olmalıdır. Bunun için kullanıyoruz -j bayrak.

Artık zip takma adımız dağıtıma hazır, geriye kalan tek şey gerekli haklara sahip bir rol oluşturmak.

IAM rolü oluşturma

Yürütülmesi sırasında lambdamızın gerektirdiği haklara sahip bir IAM rolü kurmamız gerekiyor.
Bu politikaya diyelim lambda-acme-dns-route53-executor ve hemen ona temel bir rol verin AWSLambdaBasicExecutionRole. Bu, lambda'mızın AWS CloudWatch hizmetine günlük yazmasına ve çalıştırmasına olanak tanıyacaktır.
Öncelikle haklarımızı anlatan bir JSON dosyası oluşturuyoruz. Bu aslında lambda hizmetlerinin bu rolü kullanmasına izin verecektir. lambda-acme-dns-route53-executor:

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

Dosyamızın içeriği aşağıdaki gibidir:

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

Şimdi komutu çalıştıralım aws iam create-role bir rol oluşturmak için:

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

Not: ARN (Amazon Kaynak Adı) politikasını unutmayın; sonraki adımlarda buna ihtiyacımız olacak.

Rol lambda-acme-dns-route53-executor oluşturuldu, şimdi bunun için izinleri belirtmemiz gerekiyor. Bunu yapmanın en kolay yolu komutu kullanmaktır. aws iam attach-role-policy, geçiş politikası ARN AWSLambdaBasicExecutionRole следующим обрахом:

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

Not: diğer politikaların yer aldığı bir liste bulunabilir burada.

Çalışan bir lambda işlevi oluşturma acme-dns-rota53

Yaşasın! Artık şu komutu kullanarak fonksiyonumuzu AWS'ye dağıtabilirsiniz: aws lambda create-function. Lambda aşağıdaki ortam değişkenleri kullanılarak yapılandırılmalıdır:

  • AWS_LAMBDA - açıkça ortaya koyuyor acme-dns-rota53 bu yürütme AWS Lambda'nın içinde gerçekleşir.
  • DOMAINS — virgülle ayrılmış alan adlarının listesi.
  • LETSENCRYPT_EMAIL - içerir E-postayı Şifreleyelim.
  • NOTIFICATION_TOPIC — SNS Bildirim Konusunun adı (isteğe bağlı).
  • STAGING - değerde 1 hazırlama ortamı kullanılır.
  • 1024 MB - hafıza sınırı, değiştirilebilir.
  • 900 saniye (15 dakika) — zaman aşımı.
  • acme-dns-route53 — arşivdeki ikili dosyamızın adı.
  • fileb://~/acme-dns-route53.zip — oluşturduğumuz arşivin yolu.

Şimdi dağıtalım:

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

Bir işlevi günde 2 kez tetikleyen CloudWatch zamanlayıcı oluşturma

Son adım, işlevimizi günde iki kez çağıran cron'u ayarlamaktır:

  • değere sahip bir CloudWatch kuralı oluşturun schedule_expression.
  • lambda fonksiyonunun ARN'sini belirterek bir kural hedefi (neyin yürütülmesi gerektiği) oluşturun.
  • lambda işlevini çağırmak için kurala izin verin.

Aşağıda Terraform yapılandırmamı ekledim ancak aslında bu, AWS konsolu veya AWS CLI kullanılarak çok basit bir şekilde yapılıyor.

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

Artık SSL sertifikalarını otomatik olarak oluşturup güncelleyecek şekilde yapılandırıldınız

Kaynak: habr.com

Yorum ekle