Automatisation de la gestion des certificats SSL de Let's Encrypt à l'aide du défi DNS-01 et d'AWS

La publication décrit les étapes pour automatiser la gestion des certificats SSL à partir de Let's Encrypt CA en utilisant le défi DNS-01 et AWS .


acme-dns-route53 est un outil qui nous permettra d'implémenter cette fonctionnalité. Il sait comment utiliser les certificats SSL de Let's Encrypt, les enregistrer dans Amazon Certificate Manager, utiliser l'API Route53 pour implémenter le défi DNS-01 et, finalement, pousser les notifications dans SNS. Acme-dns-route53 a également une fonctionnalité intégrée à utiliser dans AWS Lambda, et c'est ce dont nous avons besoin.


Cet article est divisé en 4 sections:


  • crĂ©er un fichier zip;
  • crĂ©er un rĂŽle IAM;
  • crĂ©er une fonction lambda qui exĂ©cute acme-dns-route53 ;
  • crĂ©er une minuterie CloudWatch qui dĂ©clenche une fonction 2 fois par jour;

Remarque: Avant de commencer, vous devez installer GoLang 1.9+ et AWS CLI


Créer un fichier zip


acme-dns-route53 est écrit en GoLang et prend en charge une version non inférieure à 1.9.


Nous devons créer un fichier zip avec le acme-dns-route53 intérieur. Pour ce faire, installez acme-dns-route53 partir du référentiel GitHub à l'aide de la commande go install :


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

Le binaire est installé dans le $GOPATH/bin . Veuillez noter que lors de l'installation, nous avons spécifié deux variables d'environnement: GOOS=linux et GOARCH=amd64 . Ils indiquent clairement au compilateur Go la nécessité de créer un binaire adapté à l'architecture Linux OS et amd64 - c'est ce qui fonctionne dans AWS.
AWS suppose de déployer notre programme dans un fichier zip, alors créons une archive acme-dns-route53.zip qui contiendra le binaire nouvellement installé:


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

Remarque: le binaire doit ĂȘtre Ă  la racine de l'archive zip. Pour cela, nous utilisons le drapeau -j .


Maintenant notre pseudo zip est prĂȘt pour le dĂ©ploiement, il ne reste plus qu'Ă  crĂ©er un rĂŽle avec les droits nĂ©cessaires.


Créer des rÎles IAM


Nous devons affirmer le rÎle IAM avec les privilÚges dont notre lambda a besoin lors de son exécution.
Appelons cette stratégie lambda-acme-dns-route53-executor et lui donnons immédiatement le rÎle de base d' AWSLambdaBasicExecutionRole . Cela permettra à notre lambda de démarrer et d'écrire des journaux sur le service AWS CloudWatch.
Créez d'abord un fichier JSON qui décrit nos droits. Cela permettra essentiellement aux services lambda d'utiliser le rÎle lambda-acme-dns-route53-executor :


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

Le contenu de notre dossier est le suivant:


 { "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:<AWS_REGION>:<AWS_ACCOUNT_ID>:<TOPIC_NAME>", "arn:aws:route53:::hostedzone/*", "arn:aws:route53:::change/*", "arn:aws:acm:<AWS_REGION>:<AWS_ACCOUNT_ID>:certificate/*" ] } ] } 

Exécutez maintenant la commande aws iam create-role pour créer le rÎle:


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

Remarque: rappelez - vous la stratégie ARN (Amazon Resource Name) - nous en aurons besoin dans les prochaines étapes.


Le rÎle lambda-acme-dns-route53-executor a été créé, nous devons maintenant lui spécifier des autorisations. La méthode la plus simple consiste à utiliser la commande aws iam attach-role-policy , en transmettant la AWSLambdaBasicExecutionRole comme suit:


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

Remarque: une liste avec d'autres politiques peut ĂȘtre trouvĂ©e ici .


Création d'une fonction lambda qui exécute acme-dns-route53


Hourra! Vous pouvez maintenant dĂ©ployer notre fonction sur AWS Ă  l'aide de la commande aws lambda create-function . Le lambda doit ĂȘtre configurĂ© Ă  l'aide des variables d'environnement suivantes:


  • AWS_LAMBDA - permet Ă  acme-dns-route53 de comprendre que l'exĂ©cution se produit dans AWS Lambda.
  • DOMAINS - une liste de domaines sĂ©parĂ©s par des virgules.
  • LETSENCRYPT_EMAIL - Contient Let's Encrypt Email .
  • NOTIFICATION_TOPIC - Nom du sujet de notification SNS (facultatif).
  • STAGING - s'il est dĂ©fini sur 1 , l'environnement de STAGING est utilisĂ©.
  • RENEW_BEFORE - le nombre de jours qui dĂ©terminent la pĂ©riode avant l'expiration de la pĂ©riode pendant laquelle le certificat doit ĂȘtre renouvelĂ©.
  • 1024 Mo - limite de mĂ©moire, sous rĂ©serve de modifications.
  • 900 secondes (15 min) - timeout.
  • acme-dns-route53 - le nom de notre binaire, qui est dans l'archive.
  • fileb://~/acme-dns-route53.zip - chemin vers l'archive que nous avons créée.

Déployez maintenant:


 $ 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\",LETSENCRYPT_EMAIL=begmaroman@gmail.com,STAGING=0,NOTIFICATION_TOPIC=acme-dns-route53-obtained,RENEW_BEFORE=7}" \ --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": "your@email.com", "NOTIFICATION_TOPIC": "acme-dns-route53-obtained", "RENEW_BEFORE": "7", "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" } 

Création d'une minuterie CloudWatch qui déclenche une fonction 2 fois par jour


La derniÚre étape consiste à configurer la couronne, qui appelle notre fonction deux fois par jour:


  • CrĂ©ez une rĂšgle CloudWatch avec une valeur d'expression_horaire.
  • crĂ©er l'objectif de la rĂšgle (ce qui doit ĂȘtre fait) en spĂ©cifiant l'ARN de la fonction lambda.
  • donner l'autorisation Ă  la rĂšgle appelant la fonction lambda.

Ci-dessous, j'ai attaché ma configuration Terraform, mais en fait, cela se fait trÚs simplement à l'aide de la console AWS ou de l'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}" } 

Vous ĂȘtes maintenant configurĂ© pour crĂ©er et renouveler automatiquement les certificats SSL

Source: https://habr.com/ru/post/fr451848/


All Articles