DNS-01 шақыруын және AWS көмегімен Let's Encrypt SSL сертификатын басқаруды автоматтандыру

Пошта SSL сертификаттарын басқаруды автоматтандыру қадамдарын сипаттайды CA шифрлаймыз қолдану DNS-01 шақыруы и AWS.

acme-dns-route53 бұл мүмкіндікті жүзеге асыруға мүмкіндік беретін құрал болып табылады. Ол Let's Encrypt компаниясының SSL сертификаттарымен жұмыс істей алады, оларды Amazon Certificate Manager қолданбасында сақтай алады, DNS-53 тапсырмасын орындау үшін Route01 API пайдалана алады және, сайып келгенде, SNS хабарландыруларын жібере алады. IN acme-dns-route53 Сондай-ақ AWS Lambda ішінде пайдалануға арналған кірістірілген функционалдылық бар және бұл бізге қажет.

Бұл мақала 4 бөлімге бөлінген:

  • zip файлын құру;
  • IAM рөлін құру;
  • жұмыс істейтін лямбда функциясын жасау acme-dns-route53;
  • функцияны күніне 2 рет іске қосатын CloudWatch таймерін жасау;

Ескерту: Бастамас бұрын орнату керек GoLang 1.9+ и AWS CLI

Zip файлын жасау

acme-dns-route53 GoLang тілінде жазылған және 1.9-дан төмен емес нұсқасын қолдайды.

Бізге екілік файлы бар zip файлын жасау керек 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 бағдарламамызды zip файлында орналастыруды күтеді, сондықтан жасайық acme-dns-route53.zip жаңадан орнатылған екілік файлды қамтитын мұрағат:

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

Ескерту: Екілік файл zip мұрағатының түбірінде болуы керек. Ол үшін біз пайдаланамыз -j жалау.

Енді біздің zip лақап атымыз қолдануға дайын, тек қажетті құқықтары бар рөлді жасау ғана қалады.

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 (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

Ескерту: басқа саясаттары бар тізімді табуға болады осында.

Жұмыс істейтін лямбда функциясын жасау 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"
 }

Функцияны күніне 2 рет іске қосатын CloudWatch таймерін жасау

Соңғы қадам - ​​бұл функцияны күніне екі рет шақыратын cron орнату:

  • мәні бар CloudWatch ережесін жасаңыз schedule_expression.
  • lambda функциясының 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

пікір қалдыру