Мне было интересно, как использовать simulate-principal-policy с помощью AWS CLI для предполагаемой роли.
Чтобы обеспечить некоторый контекст, в рамках запуска моего приложения я хочу убедиться, что приложение имеет необходимые разрешения для доступа ко всем ресурсам AWS, которые ему нужны. Я делаю это, получая идентификатор вызывающего абонента с помощью aws sts get-caller-identity и использую возвращенный идентификатор вызывающего абонента в качестве источника политики arn для запроса simulate-principal-policy.
Когда наше приложение работает на EC2, оно использует предполагаемую роль. Итак, get-caller-identity возвращает предполагаемую роль arn.
Если я попытаюсь выполнить simulate-principal-policy, используя в качестве источника политики arn моего пользователя arn, команда будет работать нормально.
aws iam simulate-principal-policy --action-names "sqs:Receivemessage" --policy-source-arn "arn:aws:sts::123456789021:user/divesh"
Однако попытка выполнить указанную выше команду с использованием предполагаемой роли сообщает об ошибке.
aws iam simulate-principal-policy --action-names "sqs:Receivemessage" --policy-source-arn "arn:aws:sts::123456789021:assumed-role/development/development-session"
An error occurred (InvalidInput) when calling the SimulatePrincipalPolicy operation: Invalid Entity Arn: arn:aws:sts::123456789021:assumed-role/development/development-session does not clearly define entity type and name.
Наше приложение работает в кластере Kubernetes и использует киам для связывания ролей IAM с подами.
В этом и заключается проблема. Когда мое приложение работает на EC2, get-caller-identity возвращает предполагаемую роль arn.
Даже когда я использую в команде фактическую роль arn, я получаю implicitDeny с "MissingContextValues": ["aws:username"]
Возможно, стоит упомянуть, что наше приложение работает внутри кластера Kubernetes и использует kiam для привязки ролей IAM к подам.
У меня отлично работает. $ aws --profile xxxx iam simulate-principal-policy --policy-source-arn arn:aws:iam::1234567890987:role/admin --action-names "sqs:ReceiveMessage"
Отсутствующие значения контекста могут иметь большее отношение к заданному вами действию и разрешению, которое его предоставляет, чем к самому siulate-principal-policy. Как я уже сказал, я мог вызвать туда с ролью arn и получить ожидаемые результаты (в моем случае это разрешено как часть политики доступа администратора)
Ах да, я не включил ресурс arns в свой запрос :-) Спасибо за это
Но исходный вопрос все еще остается в силе, я все еще не могу использовать предполагаемую роль в вызове simulate-principal-policy
Предполагаемое имя сеанса роли не обязательно уникально для одного сеанса, и я подозревать, который находится в корне ошибки "не ясно ...". Неясно, возможно ли это. (Также не совсем ясно, дает ли он какую-либо значимую ценность, кроме ложного чувства уверенности.)
Я тоже столкнулся с подобной проблемой. Вы в конце концов решили это?
В конце концов я ушел из компании, в которой работал над этой проблемой, но пока я был там, мы решили использовать альтернативный подход для проверки политик, который не предполагал использования simulate-principal-policy.





Проблема с вашим запросом заключается в том, что вы используете «Profile ARN» вместо «Role ARN». Чтобы получить роль Арн, вы можете сделать следующее:
Instance Profile Arn:arn:aws:sts::123456789021:assumed-role/development/development-session становится development/development-session
aws iam get-instance-profile --instance-profile-name Instance Profile Arn
{
"InstanceProfile":{
"Roles":[
{
"Arn":"arn:aws:iam::992863558783:role/YourRole"
}
]
}
}
aws iam simulate-principal-policy --action-names "sqs:Receivemessage" --policy-source-arn "arn:aws:iam::992863558783:role/YourRole"
В Python сценарий выглядел бы так:
import boto3
iam= boto3.client('iam')
profileArn = 'arn:aws:sts::123456789021:assumed-role/development/development-session'
iamProfileName = iamInstanceProfileArn.split(':assumed-role/')[1]
profile = iam.get_instance_profile(InstanceProfileName=iamProfileName)
policySourceArns = []
for role in profile['InstanceProfile']['Roles']:
policySourceArns.append(role['Arn'])
retval = iam.simulate_principal_policy(
PolicySourceArn = policySourceArns[0],
ActionNames = ['sqs:Receivemessage']
)
В вашем примере у вас есть --policy-source-arn`, установленный на arn предполагаемой роли. (
...456789021:assumed-role/dev...) Вы пробовали использовать arn роли?