0

J'ai un utilisateur de compte principal que je souhaite autoriser à accéder à un compartiment S3 de sous-compte. J'ai installé la pile suivante dans mon sous-compteConfiguration de l'accès inter-compte de l'utilisateur/rôle IAM

AWSTemplateFormatVersion : '2010-09-09' 
Description: 'Skynet stack to allow admin account deploying user to access S3' 

Parameters: 
    AccountId: 
    Type: String 
    Description: Account ID of admin account (containing user to allow) 
    Username: 
    Type: String 
    Description: Username to be allowed access 
    BucketPrefix: 
    Type: String 
    Description: Bucket to be allowed (prefix appended with -{AccountId}-{Region}) 

Resources: 
    CrossAccountRole: 
    Type: AWS::IAM::Role 
    Properties: 
     AssumeRolePolicyDocument: 
     Statement: 
      - Effect: Allow 
      Action: sts:AssumeRole 
      Principal: 
       AWS: 
       - !Sub arn:aws:iam::${AccountId}:user/${Username} 
     Path:/
     Policies: 
     - PolicyName: skynet-s3-delegate 
      PolicyDocument: 
      Statement: 
       - Effect: Allow 
       Action: 
        - s3:ListBucket 
        - s3:GetObject 
       Resource: "*" 

Mais je trouve que je reçois encore une erreur lorsque je tente d'assumer le rôle:

aws s3 cp skynet-lambda.zip s3://skynet-lambda-TARGET_ACCOUNT_ID-ap-southeast-1 --profile skynetci-cross-account

An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::MAIN_ACCOUNT_ID:user/circleci-skynet is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::TARGET_ACCOUNT_ID:role/StackSet-df0e85b0-d6fd-47bf-a0bb-CrossAccountRole-1EW45TXEFAY0D

Pourquoi est-ce si compte tenu que j'ai déjà la politique suivante pour l'utilisateur

{ 
     "Effect": "Allow", 
     "Action": [ 
      "sts:AssumeRole" 
     ], 
     "Resource": "arn:aws:iam::TARGET_ACCOUNT_ID:role/StackSet-df0e85b0-d6fd-47bf-a0bb-CrossAccountRole-1EW45TXEFAY0D" 
    } 

Répondre

6

Vous devez avoir la mise à jour des politiques Bucket pour permettre l'accès au compte croisée d'une politique de l'échantillon serait comme:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
     "Sid": "Example permissions", 
     "Effect": "Allow", 
     "Principal": { 
      "AWS": "arn:aws:iam::AccountB-ID:root" 
     }, 
     "Action": [ 
      "s3:*" 
     ], 
     "Resource": [ 
      "arn:aws:s3:::examplebucket" 
     ] 
     } 
    ] 
} 

Assurez-vous également que l'utilisateur IAM qui tente d'accéder a cette politique en ligne ci-joint:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
     "Sid": "Example", 
     "Effect": "Allow", 
     "Action": [ 
      "s3:*" 
     ], 
     "Resource": [ 
      "arn:aws:s3:::examplebucket" 
     ] 
     } 
    ] 
} 

vous pouvez consulter AWS Documentation

0

pour atteindre votre objectif, vous devez définir une politique de seau dans votre cible S3 bucket:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "DelegateS3Access", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "arn:aws:iam::MAIN_ACCOUNT_ID:USER_NAME" 
      }, 
      "Action": "s3:*", 
      "Resource": [ 
       "arn:aws:s3:::BUCKET_NAME/*", 
       "arn:aws:s3:::BUCKET_NAME" 
      ] 
     } 
    ] 
} 

Autoriser les autorisations S3 pour cet utilisateur.

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
     "Sid": "Example", 
     "Effect": "Allow", 
     "Action": [ 
      "s3:*" 
     ], 
     "Resource": [ 
      "*"    
     ] 
     } 
    ] 
} 

Dans ce cas, vous n'avez pas besoin d'assumer un rôle sur le compte cible. L'utilisateur lui-même sera en mesure d'accéder à un compartiment dans un autre compte.

1

Je joins un exemple de travail que j'ai testé en utilisant deux de mes comptes.

ÉTAPE 1: modèle CloudFormation YAML:

AWSTemplateFormatVersion : '2010-09-09' 
Description: 'Skynet stack to allow admin account deploying user to access S3' 

Parameters: 
    AccountId: 
    Type: String 
    Description: Account ID of admin account (containing user to allow) 
    Username: 
    Type: String 
    Description: Username to be allowed access 
    BucketPrefix: 
    Type: String 
    Description: Bucket to be allowed (prefix appended with -{AccountId}-{Region}) 

Resources: 
    CrossAccountRole: 
    Type: AWS::IAM::Role 
    Properties: 
     AssumeRolePolicyDocument: 
     Statement: 
      - Effect: Allow 
      Action: sts:AssumeRole 
      Principal: 
       AWS: 
       - !Sub arn:aws:iam::${AccountId}:user/${Username} 
     Path:/
     Policies: 
     - PolicyName: skynet-s3-delegate 
      PolicyDocument: 
      Statement: 
       - Effect: Allow 
       Action: 
        - s3:ListBucket 
        - s3:GetObject 
       Resource: "*" 
    RootInstanceProfile: 
    Type: "AWS::IAM::InstanceProfile" 
    Properties: 
     Path: "/" 
     Roles: 
      - 
      Ref: "CrossAccountRole" 

ÉTAPE 2: Créer le profil de compte croix

Modifier ~/.AWS/lettres de créance. Ajoutez un nouveau profil appelé "skynetci-cross-account". Modifiez en fonction de vos paramètres créés à l'étape 1. Vous aurez besoin du rôle arn pour remplacer celui ci-dessous. Vous aurez également besoin du nom de profil du compte auquel vous donnez l'autorisation. Dans cet exemple, le nom du profil est "default".

Exemple ici:

[skynetci-cross-account] 
role_arn = arn:aws:iam::191070ABCDEF:role/Test-CrossAccountRole-IZDDLRUMABCD 
source_profile = default 

ÉTAPE 3: accès croix test

aws --profile skynetci-multicomptes s3 ls s3: // seau nom

+0

Donc, la différence avec l'original est la partie 'InstanceProfile'? Je l'ai cherché et il est censé être utilisé avec des instances EC2? Est-il correct d'utiliser sans EC2? Qu'est-ce qu'un profil d'instance en réalité? Cela ressemble à juste un rôle? Comment compare-t-il la méthode du godet S3? –

+0

Oui, c'est correct. J'ai testé depuis mon bureau.La méthode du seau S3 est juste un autre moyen d'atteindre le même objectif. Remarque: J'ai pris votre modèle de cloud, puis l'ai corrigé car c'est ce que votre question demandait. –

+0

Nous vous remercions de cette méthode alternative. On dirait que la plupart des ppl que j'ai demandé utilisaient la route de la politique du compartiment S3. Je pense que je l'utiliserais à la place. C'est un peu plus intuitif en quelque sorte. Comme dans ce cas, je ne comprends pas vraiment ce que le profil d'instance fait –