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;
  • CloudWatch таймерди түзүү, ал функцияны күнүнө 2 жолу иштетет;

Эскертүү: Баштоодон мурун орнотуу керек 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 OS жана 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 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 таймерин түзүү

Акыркы кадам - ​​бул биздин функцияны күнүнө эки жолу чакырган 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 сертификаттарын автоматтык түрдө түзүү жана жаңыртуу үчүн конфигурациялангансыз

Source: www.habr.com

Комментарий кошуу