Автоматикунонии идоракунии сертификати SSL-ро бо истифода аз DNS-01 ва AWS рамзгузорӣ кунем

Дар ин паём қадамҳои автоматикунонии идоракунии сертификатҳои SSL аз Биёед CA-ро рамзгузорӣ кунем истифода Мушкилоти DNS-01 и AWS.

acme-dns-route53 асбобест, ки ба мо имкон медиҳад, ки ин хусусиятро амалӣ созем. Он метавонад бо сертификатҳои SSL аз Let's Encrypt кор кунад, онҳоро дар Amazon Certificate Manager захира кунад, Route53 API-ро барои татбиқи мушкилоти DNS-01 истифода барад ва дар ниҳоят, огоҳиномаҳоро ба SNS пахш кунад. ДАР 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"
 }

Эҷоди таймери CloudWatch, ки як функсияро дар як рӯз 2 маротиба ба вуҷуд меорад

Қадами охирин ин насб кардани cron аст, ки функсияи моро дар як рӯз ду маротиба даъват мекунад:

  • қоидаҳои CloudWatch бо арзиш эҷод кунед schedule_expression.
  • бо муайян кардани 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-ро ба таври худкор эҷод ва навсозӣ кунед

Манбаъ: will.com

Илова Эзоҳ