DNS-01 çağırışı və AWS istifadə edərək Let's Encrypt SSL sertifikat idarəçiliyinin avtomatlaşdırılması

Yazı SSL sertifikatlarının idarə edilməsini avtomatlaşdırmaq üçün addımları təsvir edir Gəlin CA-nı şifrələyək istifadə etmək DNS-01 problemi и AWS.

acme-dns-route53 bu xüsusiyyəti həyata keçirməyimizə imkan verəcək bir vasitədir. O, Let's Encrypt-dən SSL sertifikatları ilə işləyə, onları Amazon Certificate Manager-də saxlaya, DNS-53 çağırışını həyata keçirmək üçün Route01 API-dən istifadə edə və nəhayət, bildirişləri SNS-ə göndərə bilər. IN acme-dns-route53 AWS Lambda daxilində istifadə üçün daxili funksionallıq da var və bizə lazım olan budur.

Bu məqalə 4 hissəyə bölünür:

  • zip faylı yaratmaq;
  • IAM rolunun yaradılması;
  • işləyən lambda funksiyası yaratmaq acme-dns-route53;
  • gündə 2 dəfə bir funksiyanı işə salan CloudWatch taymerinin yaradılması;

Qeyd: Başlamazdan əvvəl quraşdırmaq lazımdır GoLang 1.9+ и AWS CLI

Zip faylının yaradılması

acme-dns-route53 GoLang-da yazılmışdır və 1.9-dan aşağı olmayan versiyanı dəstəkləyir.

Binar ilə zip faylı yaratmalıyıq acme-dns-route53 içəri. Bunu etmək üçün quraşdırmaq lazımdır acme-dns-route53 əmrindən istifadə edərək GitHub deposundan go install:

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

Binar quraşdırılmışdır $GOPATH/bin kataloq. Nəzərə alın ki, quraşdırma zamanı biz iki dəyişdirilmiş mühit təyin etdik: GOOS=linux и GOARCH=amd64. Onlar Go kompilyatoruna aydınlaşdırırlar ki, o, Linux OS və amd64 arxitekturasına uyğun binar yaratmalıdır - bu, AWS-də işləyir.
AWS proqramımızın zip faylında yerləşdirilməsini gözləyir, ona görə də yaradaq acme-dns-route53.zip yeni quraşdırılmış ikili faylı ehtiva edən arxiv:

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

Qeyd: Binar zip arxivinin kökündə olmalıdır. Bunun üçün istifadə edirik -j bayraq.

İndi zip ləqəbimiz yerləşdirməyə hazırdır, qalan şey lazımi hüquqlara malik bir rol yaratmaqdır.

IAM rolunun yaradılması

İcra zamanı lambdamızın tələb etdiyi hüquqlara malik bir IAM rolu qurmalıyıq.
Gəlin buna siyasət deyək lambda-acme-dns-route53-executor və dərhal ona əsas rol verin AWSLambdaBasicExecutionRole. Bu, lambdamıza AWS CloudWatch xidmətinə logları işlətməyə və yazmağa imkan verəcək.
Əvvəlcə hüquqlarımızı təsvir edən JSON faylı yaradırıq. Bu, mahiyyətcə lambda xidmətlərinə roldan istifadə etməyə imkan verəcək lambda-acme-dns-route53-executor:

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

Faylımızın məzmunu aşağıdakılardır:

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

İndi əmri icra edək aws iam create-role rol yaratmaq üçün:

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

Qeyd: ARN (Amazon Resurs Adı) siyasətini xatırlayın - növbəti addımlarda bizə lazım olacaq.

Rolu lambda-acme-dns-route53-executor yaradılmışdır, indi bunun üçün icazələri müəyyən etməliyik. Bunun ən asan yolu əmrdən istifadə etməkdir aws iam attach-role-policy, keçən siyasət ARN AWSLambdaBasicExecutionRole belədir:

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

Qeyd: digər siyasətlərin siyahısı ilə tanış ola bilərsiniz burada.

Çalışan lambda funksiyasının yaradılması acme-dns-route53

Yaşasın! İndi əmrdən istifadə edərək funksiyamızı AWS-də yerləşdirə bilərsiniz aws lambda create-function. Lambda aşağıdakı mühit dəyişənlərindən istifadə etməklə konfiqurasiya edilməlidir:

  • AWS_LAMBDA - aydınlaşdırır acme-dns-route53 bu icra AWS Lambda daxilində baş verir.
  • DOMAINS — vergüllə ayrılmış domenlərin siyahısı.
  • LETSENCRYPT_EMAIL - ehtiva edir Gəlin E-poçtu Şifrələyək.
  • NOTIFICATION_TOPIC — SNS Bildiriş Mövzunun adı (istəyə görə).
  • STAGING - dəyərində 1 səhnələşdirmə mühitindən istifadə edilir.
  • 1024 MB - yaddaş limiti, dəyişdirilə bilər.
  • 900 saniyə (15 dəq) — fasilə.
  • acme-dns-route53 — arxivdə olan binarımızın adı.
  • fileb://~/acme-dns-route53.zip — yaratdığımız arxivə gedən yol.

İndi yerləşdirək:

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

Gündə 2 dəfə funksiyanı işə salan CloudWatch taymerinin yaradılması

Son addım gündə iki dəfə funksiyamızı çağıran cron qurmaqdır:

  • dəyəri ilə CloudWatch qaydası yaradın schedule_expression.
  • lambda funksiyasının ARN-ni göstərərək bir qayda hədəfi (nə icra edilməlidir) yaradın.
  • lambda funksiyasını çağırmaq üçün qaydaya icazə verin.

Aşağıda mən Terraform konfiqurasiyamı əlavə etmişəm, lakin əslində bu, AWS konsolu və ya AWS CLI-dən istifadə etməklə edilir.

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

İndi siz SSL sertifikatlarını avtomatik yaratmaq və yeniləmək üçün konfiqurasiya edilmişsiniz

Mənbə: www.habr.com

Добавить комментарий