AWS CodeCommit с многофакторной аутентификацией. Продолжайте получать фатальные: невозможно получить доступ .. Запрошенный URL вернул ошибку: 403

В чем проблема?

У моего пользователя IAM есть две политики: AdministratorAccess и ForceMultiFactorAuthentication. Когда политика ForceMultiFactorAuthentication подключена, из командной строки Windows я получаю сообщение об ошибке 403 при попытке сделать что-либо с репозиторием (например: git clone ..). Когда я удаляю политику, я могу работать с репозиторием (например, git clone работает).

Мой вопрос

Есть ли что-то в моей политике ForceMultiFactorAuthentication, что мешает работе codecommit? Как правильно настроить CodeCommit с многофакторной аутентификацией?

Общие этапы отдыха

  1. Создайте группу пользователей IAM с именем «Администраторы» с разрешениями AdministratorAccess и ForceMultiFactorAuthentication.
  2. Создайте пользователя IAM без полномочий root
  3. Добавить пользователя IAM без полномочий root в группу администраторов
  4. Войдите в систему как пользователь IAM без полномочий root, на вкладке «Учетные данные безопасности» настройте аутентификацию MFA (сканируйте QR-код и т. д.) И создайте учетные данные HTTPS Git для AWS CodeCommit.
  5. Создайте репозиторий в CodeCommit
  6. Из командной строки попробуйте git clone https://git-codecommit... локально
  7. Командная строка возвращает fatal: unable to access 'https://git-codecommit...': The requested URL returned error: 403
  8. Мой пользователь IAM без полномочий root удаляет политику ForceMultiFactorAuthentication из группы администраторов
  9. git clone .. и клонирует репо. Оно работает.

Не имеет смысла, потому что...

У моего пользователя IAM есть AdministratorAccess. Кроме того, сводка политики показывает, что CodeCommit имеет полный доступ ко всем ресурсам.


Моя политика ForceMultiFactorAuthentication приведена ниже (и очень похожа на предоставляется AWS):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowViewAccountInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetAccountPasswordPolicy",
                "iam:GetAccountSummary",
                "iam:ListVirtualMFADevices",
                "iam:ListUsers"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowManageOwnPasswords",
            "Effect": "Allow",
            "Action": [
                "iam:ChangePassword",
                "iam:GetUser"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnAccessKeys",
            "Effect": "Allow",
            "Action": [
                "iam:CreateAccessKey",
                "iam:DeleteAccessKey",
                "iam:ListAccessKeys",
                "iam:UpdateAccessKey"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnSigningCertificates",
            "Effect": "Allow",
            "Action": [
                "iam:DeleteSigningCertificate",
                "iam:ListSigningCertificates",
                "iam:UpdateSigningCertificate",
                "iam:UploadSigningCertificate"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnSSHPublicKeys",
            "Effect": "Allow",
            "Action": [
                "iam:DeleteSSHPublicKey",
                "iam:GetSSHPublicKey",
                "iam:ListSSHPublicKeys",
                "iam:UpdateSSHPublicKey",
                "iam:UploadSSHPublicKey"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnGitCredentials",
            "Effect": "Allow",
            "Action": [
                "iam:CreateServiceSpecificCredential",
                "iam:DeleteServiceSpecificCredential",
                "iam:ListServiceSpecificCredentials",
                "iam:ResetServiceSpecificCredential",
                "iam:UpdateServiceSpecificCredential"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnVirtualMFADevice",
            "Effect": "Allow",
            "Action": [
                "iam:CreateVirtualMFADevice",
                "iam:DeleteVirtualMFADevice"
            ],
            "Resource": "arn:aws:iam::*:mfa/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnUserMFA",
            "Effect": "Allow",
            "Action": [
                "iam:DeactivateMFADevice",
                "iam:EnableMFADevice",
                "iam:ListMFADevices",
                "iam:ResyncMFADevice"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "DenyAllExceptListedIfNoMFA",
            "Effect": "Deny",
            "NotAction": [
                "iam:CreateVirtualMFADevice",
                "iam:EnableMFADevice",
                "iam:GetUser",
                "iam:ListMFADevices",
                "iam:ListVirtualMFADevices",
                "iam:ResyncMFADevice",
                "sts:GetSessionToken",
                "iam:ListUsers"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}

person Jarad    schedule 30.05.2021    source источник


Ответы (1)


Следующий раздел вашей политики ForceMultiFactorAuthentication запрещает all запросы (кроме действий, упомянутых в разделе NotAction), которые не прошли проверку подлинности с помощью MFA.

{
            "Sid": "DenyAllExceptListedIfNoMFA",
            "Effect": "Deny",
            "NotAction": [
                "iam:CreateVirtualMFADevice",
                "iam:EnableMFADevice",
                "iam:GetUser",
                "iam:ListMFADevices",
                "iam:ListVirtualMFADevices",
                "iam:ResyncMFADevice",
                "sts:GetSessionToken",
                "iam:ListUsers"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }

С помощью HTTPS GIT credentials вы выполняете аутентификацию в репозитории CodeCommit, используя имя пользователя и пароль. Токен сеанса не используется (в основном код MFA). Таким образом, невозможно проверить MFA для аутентификации. В результате ваш запрос отклонен. Аналогично обстоит дело с аутентификацией пары ключей SSH для CodeCommit.

Чтобы исправить это, вы можете добавить необходимые codecommit действия в NotAction список политики. Вам также необходимо включить kms действий. Поскольку данные в репозиториях CodeCommit шифруются при передаче и хранении. Поэтому разрешение требуется для действий по шифрованию и расшифровке, когда вы выполняете операции клонирования, извлечения или отправки из/в репозитории.

Следующая политика исправит вашу ошибку CodeCommit 403.

{
            "Sid": "DenyAllExceptListedIfNoMFA",
            "Effect": "Deny",
            "NotAction": [
                "iam:CreateVirtualMFADevice",
                "iam:EnableMFADevice",
                "iam:GetUser",
                "iam:ListMFADevices",
                "iam:ListVirtualMFADevices",
                "iam:ResyncMFADevice",
                "sts:GetSessionToken",
                "iam:ListUsers",
                "codecommit:GitPull",
                "codecommit:GitPush",
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:GenerateDataKey",
                "kms:GenerateDataKeyWithoutPlaintext",
                "kms:DescribeKey"

            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }

Поскольку вы уже привязали политику доступа администратора к своему пользователю, вам не требуется все содержимое политики ForceMultiFactorAuthentication. Указанной выше политики достаточно. Если вы хотите включить ограничение MFA для всех пользователей IAM (пользователей без прав администратора), используйте все содержимое вашей политики, прикрепив его к пользователям.

person Jyothish Kumar S    schedule 30.05.2021
comment
Вау, ты гений. Ваше решение сработало. Один вопрос. Варианта kms:ReEncrypt нет. Веб-интерфейс сказал, что это ошибка и нужно использовать kms:ReEncryptFrom и/или kms:ReEncryptTo. Должен ли я использовать оба тогда? - person Jarad; 30.05.2021
comment
Я рад, что это сработало. Я удалил kms:ReEncrypt из решения. Я считаю, что вышеуказанной политики достаточно. Проверьте, можете ли вы выполнять все операции Git с указанной выше политикой. если вы получите какую-либо дополнительную ошибку, связанную с kms, попробуйте добавить kms:ReEncryptFrom и kms:ReEncryptFrom и проверить - person Jyothish Kumar S; 30.05.2021
comment
Я только что проверил. Для моего варианта использования было достаточно двух действий codecommit pull/push, kms:Encrypt и kms:Decrypt. Другие kms действия пока не затронули меня, но если у меня возникнут проблемы, я попробую добавить их в будущем! - person Jarad; 30.05.2021
comment
В порядке. Спасибо за обновления - person Jyothish Kumar S; 30.05.2021