Automatisation de la gestion des certificats SSL Let's Encrypt Ă  l'aide du challenge DNS-01 et AWS

L'article décrit les étapes pour automatiser la gestion des certificats SSL à partir de Chiffrons l'AC en utilisant Défi DNS-01 О AWS.

acme-dns-route53 est un outil qui nous permettra d'implémenter cette fonctionnalité. Il peut fonctionner avec 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, enfin, envoyer des notifications push vers SNS. DANS acme-dns-route53 Il existe également des fonctionnalités intégrées à 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 s'exĂ©cute acme-dns-route53;
  • crĂ©er une minuterie CloudWatch qui dĂ©clenche une fonction 2 fois par jour ;

À noter: Avant de commencer, vous devez installer GoLang 1.9+ о CLI AWS

Création d'un fichier zip

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

Nous devons créer un fichier zip avec un binaire acme-dns-route53 à l'intérieur. Pour ce faire, vous devez installer acme-dns-route53 depuis le 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 $GOPATH/bin annuaire. Veuillez noter que lors de l'installation, nous avons spĂ©cifiĂ© deux environnements modifiĂ©s : GOOS=linux Đž GOARCH=amd64Ils indiquent au compilateur Go de crĂ©er un binaire adaptĂ© Ă  Linux Les systĂšmes d'exploitation et les architectures amd64 sont ceux qui fonctionnent sur AWS.
AWS s'attend Ă  ce que notre programme soit dĂ©ployĂ© dans un fichier zip, alors crĂ©ons acme-dns-route53.zip archive qui contiendra le binaire nouvellement installĂ© :

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

À noter: Le binaire doit ĂȘtre Ă  la racine de l'archive zip. Pour cela nous utilisons -j drapeau.

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

Création d'un rÎle IAM

Nous devons mettre en place un rÎle IAM avec les droits requis par notre lambda lors de son exécution.
Appelons cette politique lambda-acme-dns-route53-executor et donnez-lui immédiatement un rÎle de base AWSLambdaBasicExecutionRole. Cela permettra à notre lambda d'exécuter et d'écrire des journaux sur le service AWS CloudWatch.
Tout d'abord, nous créons 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:${var.region}:<AWS_ACCOUNT_ID>:<TOPIC_NAME>",
                "arn:aws:route53:::hostedzone/*",
                "arn:aws:route53:::change/*",
                "arn:aws:acm:<AWS_REGION>:<AWS_ACCOUNT_ID>:certificate/*"
            ]
        }
    ]
}

Maintenant, exĂ©cutons la commande aws iam create-role pour crĂ©er un rĂŽle :

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

À noter: rappelez-vous l'ARN de la politique (Amazon Resource Name) - nous en aurons besoin dans les prochaines Ă©tapes.

RÎle lambda-acme-dns-route53-executor créé, nous devons maintenant spécifier les autorisations pour celui-ci. Le moyen le plus simple de procéder est d'utiliser la commande aws iam attach-role-policy, en transmettant l'ARN de la stratégie 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

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

Création d'une fonction lambda qui s'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 - c'est clair acme-dns-route53 cette exĂ©cution a lieu dans AWS Lambda.
  • DOMAINS — une liste de domaines sĂ©parĂ©s par des virgules.
  • LETSENCRYPT_EMAIL - contient Chiffrons les e-mails.
  • NOTIFICATION_TOPIC — nom du sujet de notification SNS (facultatif).
  • STAGING - Ă  la valeur 1 un environnement de prĂ©paration est utilisĂ©.
  • 1024 Mo - limite de mĂ©moire, peut ĂȘtre modifiĂ©e.
  • 900 secondes (15 min) – dĂ©lai d'attente.
  • acme-dns-route53 — le nom de notre binaire, qui se trouve dans l'archive.
  • fileb://~/acme-dns-route53.zip — le chemin d'accĂšs Ă  l'archive que nous avons créée.

DĂ©ployons 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}" 
 --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", 
            "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 cron, qui appelle notre fonction deux fois par jour :

  • crĂ©er une rĂšgle CloudWatch avec la valeur schedule_expression.
  • crĂ©ez une cible de rĂšgle (ce qui doit ĂȘtre exĂ©cutĂ©) en spĂ©cifiant l'ARN de la fonction lambda.
  • autorisez la rĂšgle Ă  appeler la fonction lambda.

Ci-dessous, j'ai joint 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 mettre Ă  jour automatiquement les certificats SSL

Source: habr.com

Achetez un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Achetez un hĂ©bergement web fiable avec protection DDoS, serveurs VPS et VDS | ProHoster