CDK DnsValidatedCertificate: может ли создать сертификат в связанной учетной записи AWS, когда размещенная зона является частью родительской учетной записи? - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь использовать AWS Cloud Development Kit для создания SSL-сертификата для некоторых поддоменов моего веб-сайта.Проблема в том, что я использую AWS Organizations, а соответствующие ресурсы принадлежат разным аккаунтам AWS. размещенная зона для моего домена является частью нашей основной учетной записи, но я использую CDK для развертывания стека в связанной учетной записи.Это означает, что DnsValidatedCertificate класс может запросить новый сертификат (они все еще видны в ACM после отката стека), но выдает ошибку, когда онпытается создать DNS-запись для автоматической проверки запроса.

Вот ошибка (с измененным номером моей учетной записи и именем стека):

 5/6 | 22:44:14 | CREATE_FAILED        | AWS::CloudFormation::CustomResource | SubSubDomainsCertificate/CertificateRequestorResource/Default (SubSubDomainsCertificateCertificateRequestorResourceBC626C85) Failed to create resource. User: arn:aws:sts::123456789012:assumed-role/MyStack-SubSubDomainsCertificateCertificat-16QRI74P8POO2/MyStack-SubSubDomainsCertificateCertificat-BXZ55WHIH1XC is not authorized to access this resource
        new CustomResource (C:\repos\my-project\node_modules\@aws-cdk\aws-cloudformation\lib\custom-resource.ts:92:21)
        \_ new DnsValidatedCertificate (C:\repos\my-project\node_modules\@aws-cdk\aws-certificatemanager\lib\dns-validated-certificate.ts:81:29)
        \_ new MyStack (C:\repos\my-project\.elasticbeanstalk\api-stack.js:91:25)

А вот соответствующий фрагмент кода CDK (опять же, с удаленным HZ и доменом):

    // Executed with `cdk deploy --profile profileForLinkedAwsAccount`
    const hostedZone = route53.HostedZone.fromHostedZoneAttributes(
      this,
      'MyDomainHostedZone',
      {
        hostedZoneId: 'Z2ABC1234RYN', // in master AWS account
        zoneName: 'mydomain.com.'
      }
    );
    const certificate = new certificatemanager.DnsValidatedCertificate(
      this,
      'SubSubDomainsCertificate',
      {
        domainName: `*.demo.mydomain.com`,
        hostedZone,
        region: 'us-east-1',
        validationMethod: certificatemanager.ValidationMethod.DNS // ???
      }
    );

Итак, есть ли способ настроить CDK, который позволит автоматически выполнять проверку DNS?Или мне нужно сделать это как второй шаг, используя другой профиль?

РЕДАКТИРОВАТЬ: По предложению Майкла я добавил роль с именем LinkedAccountCertValidatorRole в учетную запись master AWS.Управляемая политика, которую я прикрепил к роли, и ее доверительные отношения показаны ниже.К сожалению, я все еще получаю ту же ошибку.Кроме того, вкладка Access Advisor указывает, что политика никогда не использовалась этой ролью.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "route53:ChangeResourceRecordSets",
            "Resource": "arn:aws:route53:::hostedzone/Z2ABC1234RYN"
        }
    ]
}
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

IAM может быть боль, чтобы получить право.Прежде всего, созданная вами роль должна иметь доверительные отношения с пользователем / учетными записями / группами, которые могут выполнять эту роль.Я не вижу, чтобы вы упомянули это в своем ОП.Я не знаю, что такое CDK, поэтому я не могу получить четкое представление о том, что вы делаете.

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

Доверенные отношения должны иметь сопоставление с основной учетной записью orgs, например ....

Создание роли в основной учетной записис прикрепленными разрешениями:

My_Role_To_Assume
Assign Permissions in Master:

Trust Relationship(Master Account)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::0123456789012:root"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

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

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "sts:AssumeRole"
      ],
      "Resource": [
        "arn:aws:iam::987654321098:role/My_Role_To_Assume",
        "arn:aws:iam::567890123456:role/My_Other_Role_Assume"
      ]
    }
  ]
}

Затем в учетной записи вы хотите, чтобы роль имела доступ.Создайте роль с тем же именем (необязательно, но гораздо проще запомнить, для чего нужны роли в дальнейшем).

My_Role_To_Assume
Assign Permissions for role in sub-account:

Attach Trust Realtionship policy for sub-account role to trust master account:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::0123456789012:root"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Можно настроить наборы разрешений в каждой учетной записи, чтобы датьгораздо более детальный контроль / доступ к ресурсам.Обычно в основной учетной записи у вас могут отсутствовать какие-либо разрешения, за исключением пароля IAM, управления ключами и т. Д.

Этот подход работает хорошо, и в целом вы создаете доверительные отношения на корневом уровне, ногрупповая политика в основной учетной записи диктует, какие роли могут занимать этот пользователь / группа в рамках дополнительных учетных записей.

Поскольку вы используете интерфейс командной строки, вам нужно будет выполнить вызов aws sts, чтобы принять на себя роль, прежде чем создавать или обновлять ресурсы в дополнительной учетной записи.Есть несколько сценариев, которые обрабатывают это для вас.

Пример:

#! /bin/bash
#
# Dependencies:
#   yum install -y jq
#
# Setup:
#   chmod +x ./assume_cloudadmin_role.sh
#
# Execute:
#   source ./assume_cloudadmin_role.sh
#
# Description:
#   Makes assuming an AWS IAM role (+ exporting new temp keys) easier. You're users access key and secret must allow you to assume the role in the sts CLI call.

unset  AWS_SESSION_TOKEN
export AWS_ACCESS_KEY_ID=<place_your_key_here> #Master Account API Key
export AWS_SECRET_ACCESS_KEY=<place_your_secret_here>#Master Account API Secret
export AWS_REGION=us-east-1

temp_role=$(aws sts assume-role \
                    --role-arn "arn:aws:iam::0123456789012:role/My_Role_To_Assume" \
                    --role-session-name "temp_cli_role")

export AWS_ACCESS_KEY_ID=$(echo $temp_role | jq -r .Credentials.AccessKeyId)
export AWS_SECRET_ACCESS_KEY=$(echo $temp_role | jq -r .Credentials.SecretAccessKey)
export AWS_SESSION_TOKEN=$(echo $temp_role | jq -r .Credentials.SessionToken)

env | grep -i AWS_

Этот вызов установит ваш ключ доступа и секретный токен + токен сеанса для выполнения действий с дополнительной учетной записью.

Надеюсь, у вас все получится!

0 голосов
/ 26 сентября 2019

Ради полноты я выложу простой ответ: используйте класс Certificate вместо DnsValidatedCertificate .Я могу заставить CDK создать запрос сертификата, но не могу попытаться автоматически проверить поддомен.Это означает, что мне нужно:

  1. Перейти найти запрос в Диспетчер сертификатов Amazon связанной учетной записи,
  2. Проверить (или экспортировать) запись CNAMEон просит добавить, и
  3. Переключиться на основную учетную запись AWS и добавить запись в Route53 .
// Executed with `cdk deploy --profile profileForLinkedAwsAccount`
const certificate = new certificatemanager.Certificate(this, 'SubSubDomainsCertificate', {
  domainName: `*.${SUBDOMAIN}.mydomain.com`,
  validationMethod: ValidationMethod.DNS
});

Я остановился на этомвариант, пока что, но было бы неплохо полностью автоматизировать процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...