【问题标题】:Traefik + Let's Encrypt on AWS LightsailTraefik + 让我们在 AWS Lightsail 上加密
【发布时间】:2021-09-08 11:27:29
【问题描述】:

我目前正在使用TraefikLego 来为我的docker 容器建立HTTPS 连接(如here 所述) 在下面的documentation中,提到我需要使用下面的provider来做DNS Challenge。

但我收到此错误:

AccessDeniedException: User: arn:aws:sts::<USER_ID>:assumed-role/AmazonLightsailInstanceRole/<AN_ID> is not authorized to perform: lightsail:CreateDomainEntry on resource: arn:aws:lightsail:us-east-1:<INSTANCE_ID>:*

另一个用于 DeleteDomainEntry,即使我对用于配置的 IAM 用户拥有Resource: * 上的lightsail:* 权限。

如果我理解正确的话,Lightsail 是为其他 AWS 服务单独管理的,因此我们需要使用 STS 来连接它(如果我错了,请告诉我)。所以我的问题是,如何设置临时令牌的权限才能执行 CreateDomainEntry 和 DeleteDomainEntry?

更多信息

  • 我的实例所在区域是eu-west-3(我尝试在乐高配置中更改区域,但不起作用)
  • 在错误中看到的 与在域的 ARN 中找到的 id 不对应。在 CLI 中执行 aws lightsail get-domains --region us-east-1 时,它对应于 supportCode 中的第一个数字。
  • Lego 和 Traefik 不直接调用 AssumeRole,也不创建临时令牌(查看源代码)
  • 我在 Traefik 环境配置中使用 AWS_ACCESS_KEY_ID_FILEAWS_SECRET_ACCESS_KEY_FILE

【问题讨论】:

    标签: amazon-web-services docker traefik lets-encrypt amazon-lightsail


    【解决方案1】:

    错误消息表明 Lego 使用分配给您的 lightsail 实例的 IAM 角色发出了请求。我猜您的实例没有修改 lightsail 的 DNS 设置的权限。

    您应该在 AWS IAM 中创建一个新用户并启用编程访问以获取 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY

    然后,将这些值作为环境变量传递给运行 Lego 的容器。 Lego 将使用这些环境变量通过 us-east-1 中的 Lightsail API 进行身份验证。 [1]

    我的实例的区域是 eu-west-3(我尝试在 Lego 配置中更改区域,但不起作用)

    您的 Lego 实例必须调用 us-east-1 中的 AWS API,请参阅 [2][3]。

    Lego 和 Traefik 不直接调用 AssumeRole,也不创建临时令牌

    我猜 Traefik/Lego 使用 EC2 实例元数据服务自动承担 lightsail 实例角色,参见 [4]:

    对于在实例上运行的应用程序、AWS CLI 和适用于 Windows PowerShell 的工具命令,您不必显式获取临时安全凭证 — AWS 开发工具包、AWS CLI 和适用于 Windows PowerShell 的工具会自动从EC2 实例元数据服务并使用它们。要使用临时安全凭证在实例外部进行调用(例如,测试 IAM 策略),您必须提供访问密钥、秘密密钥和会话令牌。

    我在 Traefik 环境配置中使用 AWS_ACCESS_KEY_ID_FILE 和 AWS_SECRET_ACCESS_KEY_FILE。

    我在乐高源代码 [1] 中找不到那些环境变量。确保 Lego 实际使用的是您配置的 AWS 凭证。上面发布的错误消息表明它没有使用它们,而是回退到实例配置文件。

    [1]https://github.com/go-acme/lego/blob/master/providers/dns/lightsail/lightsail.go#L81
    [2]https://docs.aws.amazon.com/cli/latest/reference/lightsail/create-domain-entry.html#examples
    [3]https://github.com/go-acme/lego/blob/master/providers/dns/lightsail/lightsail.go#L69
    [4]https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#instance-metadata-security-credentials

    【讨论】:

      【解决方案2】:

      有太多令人困惑的事情。 Martin Löper 的回答和answer on the github issue I opened 帮我把事情弄清楚了。

      这是令人困惑的地方:

      • Lego lightsail provider documentation 列出环境变量,然后说The environment variable names can be suffixed by _FILE to reference a file instead of a value。事实证明,乐高的代码从未在凭证上调用他们的getOrFile 方法。此外,AWS sdk 不会检查 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 后缀为 _FILE 的变量。

      • 来自 AWS 的错误消息有点误导。我一直认为这是一个权限问题,但实际上这是一个身份验证问题(在我看来有点不同)。

      这里是如何解决它(与建议的有点不同):

      我使用AWS_SHARED_CREDENTIALS_FILE(提到here)环境变量,以便我可以通过指定/run/secrets/aws_shared_credentials 文件来使用docker 机密。这更安全(更多信息here)。 AWS sdk 会自动检测这个环境变量并正确初始化这个new session

      【讨论】:

        猜你喜欢
        • 2019-02-21
        • 2019-09-27
        • 1970-01-01
        • 2021-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-01
        • 2020-04-18
        相关资源
        最近更新 更多