Как я могу использовать Route 53 в качестве DNS-вызова для Lets Encrypt в Traefik?

Мой локальный домен home.turtlesystems.co.uk. Я использую Traefik в локальном кластере Docker Swarm в этом домене.

Поскольку прямого доступа к кластеру из Интернета нет, я не могу использовать вызов HTTPS для Lets Encrypt, поэтому я пытаюсь использовать Route53 в качестве провайдера DNS.

Я установил зону в Route53 для своего домашнего домена, который является поддоменом turtlesystems.co.uk, которым я владею.

Мой файл traefik.toml выглядит так:

debug = true

defaultEntryPoints = ["http", "https"]

[entryPoints]
   [entryPoints.http]
   address = ":80"
      [entryPoints.http.redirect]
      entryPoint = "https"
   [entryPoints.https]
   address = ":443"
      [entryPoints.https.tls]


# Enable ACME (Let's Encrypt) automate SSL
[acme]
email = "xxxxxxxxxxxxxxxxxxxx"
storage = "/etc/traefik/acme.json"
dnsProvider = "route53"
entryPoint = "https"
onDemand = true
onHostRule = true
acmeLogging = true

[[acme.domains]]
main = "home.turtlesystems.co.uk"

# Allow access to the Web UI
[web]
address = ":8080"

# Configure how docker will be run
[docker]
endpoint = "unix://var/run/docker.sock"
domain = "traefik"
watch = true
exposedbydefault = false
swarmmode = true

Я создал сервис для Portainer со следующими ярлыками Traefik:

traefik.port=9000
traefik.docker.network=traefik-net
traefik.frontend.rule=Host:turtle-host-03.home.turtlesystems.co.uk;PathStripPrefix:/portainer
traefik.backend=portainer
traefik.enable=true
traefik.backend.loadbalancer=wrr

Поскольку у меня включен acmeLogging в файле traefik.toml, я надеялся получить дополнительную информацию о том, что происходит или не происходит, но я получаю только следующие журналы INFO:

reverse_proxy.1.rqebssg613a8@turtle-host-03    | legolog: 2017/12/15 13:16:32 [INFO][home.turtlesystems.co.uk] AuthURL: https://acme-v01.api.letsencrypt.org/acme/authz/z52B_D2iHeITPqT_7K-Z-Y-ieir3VT4l1qGW6tShrd8
reverse_proxy.1.rqebssg613a8@turtle-host-03    | legolog: 2017/12/15 13:16:32 [INFO][turtle-host-03.home.turtlesystems.co.uk] AuthURL: https://acme-v01.api.letsencrypt.org/acme/authz/OxWRpDR3KZm4E0nGngVSRZgF3iE2nhQ3jlNaWtxbd08
reverse_proxy.1.rqebssg613a8@turtle-host-03    | legolog: 2017/12/15 13:16:32 [INFO][home.turtlesystems.co.uk] acme: Could not find solver for: tls-sni-01
reverse_proxy.1.rqebssg613a8@turtle-host-03    | legolog: 2017/12/15 13:16:32 [INFO][home.turtlesystems.co.uk] acme: Trying to solve DNS-01
reverse_proxy.1.rqebssg613a8@turtle-host-03    | time="2017-12-15T13:17:06Z" level=debug msg="Look for provided certificate to validate [turtle-host-03.home.turtlesystems.co.uk]..."
reverse_proxy.1.rqebssg613a8@turtle-host-03    | time="2017-12-15T13:17:06Z" level=debug msg="Look for provided certificate to validate [turtle-host-03.home.turtlesystems.co.uk]..."
reverse_proxy.1.rqebssg613a8@turtle-host-03    | time="2017-12-15T13:17:06Z" level=debug msg="No provided certificate found for domains [turtle-host-03.home.turtlesystems.co.uk], get ACME certificate."
reverse_proxy.1.rqebssg613a8@turtle-host-03    | time="2017-12-15T13:17:06Z" level=debug msg="Challenge GetCertificate turtle-host-03.home.turtlesystems.co.uk"
reverse_proxy.1.rqebssg613a8@turtle-host-03    | time="2017-12-15T13:17:06Z" level=debug msg="No provided certificate found for domains [turtle-host-03.home.turtlesystems.co.uk], get ACME certificate."
reverse_proxy.1.rqebssg613a8@turtle-host-03    | time="2017-12-15T13:17:06Z" level=debug msg="Challenge GetCertificate turtle-host-03.home.turtlesystems.co.uk"
reverse_proxy.1.rqebssg613a8@turtle-host-03    | time="2017-12-15T13:17:07Z" level=debug msg="Look for provided certificate to validate [turtle-host-03.home.turtlesystems.co.uk]..."
reverse_proxy.1.rqebssg613a8@turtle-host-03    | time="2017-12-15T13:17:07Z" level=debug msg="No provided certificate found for domains [turtle-host-03.home.turtlesystems.co.uk], get ACME certificate."
reverse_proxy.1.rqebssg613a8@turtle-host-03    | time="2017-12-15T13:17:07Z" level=debug msg="Challenge GetCertificate turtle-host-03.home.turtlesystems.co.uk"
reverse_proxy.1.rqebssg613a8@turtle-host-03    | legolog: 2017/12/15 13:17:10 [INFO][home.turtlesystems.co.uk] Checking DNS record propagation using [127.0.0.11:53]

Как видно, он пытается использовать запрос DNS, но я не получаю сертификат.

Когда я впервые настроил все это, все работало, на самом деле я написал об этом в блоге, но теперь это не так. Когда я смотрю на свою учетную запись AWS, я вижу, что AWS_ACCESS_KEY, который я создал для этой цели, используется, но, похоже, в Зону ничего не вводится.

Я передаю AWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEY и AWS_REGION в службу Portainer в качестве переменных среды.

Могу ли я включить больше ведения журнала? Можно ли как-то просмотреть журналы в AWS для Route 53?

Обновить

Поиграв с этим, я заметил, что Traefik пытается использовать 127.0.0.11:53 в качестве DNS-сервера, на котором можно попытаться проверить, была ли создана запись TXT.

Затем я добавил --dns и --dns-search в службу Traefik, но это никак не повлияло на адрес, который Trafik использует для DNS. Есть ли другой параметр, который я могу установить в Traefik, чтобы заставить это?


person Russell Seymour    schedule 15.12.2017    source источник


Ответы (2)


  1. Перейдите в AWS, создайте пользовательскую политику AIM. Вставьте следующий JSON в качестве политики:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "route53:ChangeResourceRecordSets",
                "route53:GetChange",
                "route53:GetChangeDetails",
                "route53:ListHostedZones"
            ],
            "Resource": [
                "*"
            ]
            },
            {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:DescribeLoadBalancers",
                "elasticloadbalancing:SetLoadBalancerListenerSSLCertificate"
            ],
            "Resource": [
                "*"
            ]
            },
            {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "iam:ListServerCertificates",
                "iam:GetServerCertificate",
                "iam:UploadServerCertificate"
            ],
            "Resource": [
                "*"
            ]
            }
        ]
    }
    

назовите политику "dnsChallenge" (или как вам угодно)

  1. Создайте нового пользователя AIM и прикрепите указанную выше политику.

Скопируйте ключи нового пользователя, так как вам нужно будет установить их как переменные среды.

  1. Перейдите на AWS Route53 и посмотрите на размещенную зону. Вам понадобятся 2 записи A — для yourdomain.com и *.yourdomain.com, обе указывающие на статический IP-адрес хоста, на котором работает traefik.

Скопируйте идентификатор размещенной зоны для домена, который вы используете подстановочный знак.

Определите следующие переменные среды и убедитесь, что они доступны при запуске traefik.

export AWS_ACCESS_KEY_ID=*****************
export AWS_SECRET_ACCESS_KEY=**********************************
export AWS_HOSTED_ZONE_ID=*************

редактировать traefik.toml

[acme] # Automatically add Let's Encrypt Certificate.
email = "[email protected]"
storage= "acme.json" # Change to fully qualified and exposed path for docker
entryPoint = "https"
OnHostRule = false
acmelogging = true

# caServer = "https://acme-staging-v02.api.letsencrypt.org/directory"
caServer = "https://acme-v02.api.letsencrypt.org/directory"

[acme.dnsChallenge]
  provider = "route53"
  delayBeforeCheck = 0

[[acme.domains]]
  main = "*.yourdomain.com"
  sans = ["yourdomain.com"]

Оттуда рекомендуется запустить его из командной строки и следить за сообщениями.

person bhlowe    schedule 04.05.2018

Добавляя ответ bhlowe, я бы использовал более ограниченный профиль IAM:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "route53:GetChange",
                "route53:ListHostedZonesByName"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "route53:ChangeResourceRecordSets"
            ],
            "Resource": [
                "arn:aws:route53:::hostedzone/<INSERT_YOUR_HOSTED_ZONE_ID_HERE>"
            ]
        }
    ]
}
person iTayb    schedule 30.04.2019