AWS Identity and Access ManagementContrôles (IAM) - AWS Control Tower

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

AWS Identity and Access ManagementContrôles (IAM)

[CT.IAM.PR.1] Exiger qu'une politique en ligne AWS Identity and Access Management (IAM) ne comporte pas d'instruction incluant « * » dans les éléments Action et Resource

Ce contrôle vérifie que les politiques en ligne AWS Identity and Access Management (IAM) n'incluent pas Effect : Allow with : * over Action Resource :. *

  • Objectif de contrôle : appliquer le moindre privilège

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::IAM::PolicyAWS::IAM::Role,AWS::IAM::User, AWS::IAM::Group

  • AWS CloudFormationrègle de garde : CT.IAM.PR.1spécification des règles

Détails et exemples

Explication

Les politiques IAM définissent un ensemble de privilèges accordés aux utilisateurs, aux groupes ou aux rôles. Conformément aux conseils de sécurité standard du secteur, AWS recommande que vos politiques accordent le moindre privilège, c'est-à-dire n'octroyez que les autorisations nécessaires à l'exécution d'une tâche. Lorsque vous accordez des privilèges administratifs complets au lieu des autorisations minimales requises par l'utilisateur, vous risquez d'exposer les ressources à des actions indésirables.

Au lieu d'accorder des privilèges administratifs complets, déterminez les actions spécifiques que vos utilisateurs doivent effectuer, puis élaborez des politiques permettant aux utilisateurs d'effectuer uniquement ces tâches. Il est plus sûr de commencer avec un minimum d'autorisations et d'accorder des autorisations supplémentaires si nécessaire. Ne commencez pas avec des autorisations indulgentes et essayez de les renforcer plus tard.

Supprimez les politiques IAM comportant une instruction avec Effect : Allow qui autorise Action : * over Resource :*.

Considérations d'utilisation
  • Ce contrôle s'applique uniquement aux politiques en ligne IAM dont les instructions contiennent un Effect de Allow et qui contiennent à la fois l'élément Action et l'Resourceélément.

Remédiation en cas de défaillance des règles

Supprimez les déclarations de politique en ligne IAM avec Effect : Allow that permit Action : * over Resource :. *

Les exemples suivants montrent comment implémenter cette correction.

Politique IAM - Exemple 1

Politique en ligne IAM configurée pour permettre la récupération d'objets depuis un compartiment Amazon S3. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "IAMPolicy": { "Type": "AWS::IAM::Policy", "Properties": { "PolicyName": "sample-inline-policy", "Roles": [ { "Ref": "IAMRole" } ], "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::samplebucket/*" ] } ] } } } }

Exemple YAML

IAMPolicy: Type: AWS::IAM::Policy Properties: PolicyName: sample-inline-policy Roles: - !Ref 'IAMRole' PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - s3:GetObject Resource: - arn:aws:s3:::samplebucket/*

Les exemples suivants montrent comment implémenter cette correction.

Rôle IAM - Deuxième exemple

Rôle IAM configuré avec une politique intégrée permettant de récupérer des objets depuis un compartiment Amazon S3. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "IAMRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": { "Ref": "AWS::AccountId" } }, "Action": [ "sts:AssumeRole" ] } ] }, "Policies": [ { "PolicyName": "sample-inline-policy", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::samplebucket/*" ] } ] } } ] } } }

Exemple YAML

IAMRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: AWS: !Ref 'AWS::AccountId' Action: - sts:AssumeRole Policies: - PolicyName: sample-inline-policy PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - s3:GetObject Resource: - arn:aws:s3:::samplebucket/*

CT.IAM.PR.1spécification des règles

# ################################### ## Rule Specification ## ##################################### # # Rule Name: # iam_inline_policy_no_statements_with_admin_access_check # # Description: # This control checks that AWS Identity and Access Management (IAM) inline policies do not include "Effect": "Allow" with "Action": "*" over "Resource": "*". # # Reports on: # AWS::IAM::Policy, AWS::IAM::Role, AWS::IAM::User, AWS::IAM::Group # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any IAM policy, IAM role, IAM user or IAM group resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM policy resource # And: The policy has no statements with 'Effect' set to 'Allow' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM policy resource # And: The policy has a statement with 'Effect' set to 'Allow' # And: The policy does not have both Action and resource statements # Then: SKIP # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM role, IAM user or IAM group resources # And: 'Policies' is not provided or is an empty list # Then: SKIP # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM role, IAM user or IAM group resources # And: 'Policies' is provided as a non-empty list # And: All IAM policy documents in 'Policies' have no statements with 'Effect' set to 'Allow' # Then: SKIP # Scenario: 6 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM policy resource # And: The policy has a statement with 'Effect' set to 'Allow' # And: The policy statement has one or more Action statements and one or more Resource statements # And: At least one Action statement allows all actions (Action value of '*') # And: At least one Resource statement is a wildcard representing all resources (Resource value of '*') # Then: FAIL # Scenario: 7 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM role, IAM user or IAM group resources # And: 'Policies' is provided as a non-empty list # And: IAM policy document in 'Policies' has a statement with 'Effect' set to 'Allow' # And: The policy has one or more 'Action' statements # And: At least one Action statement allows all actions (Action value of '*') # And: At least one Resource statement is a wildcard representing all resources (Resource value of '*') # Then: FAIL # Scenario: 8 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM policy resource # And: The policy has a statement with 'Effect' set to 'Allow' # And: The policy has one or more Action statements and one or more Resource statements # And: No Action statements allow administrator access (Action value of '*') # And: No Resources are wildcards representing all resources (Resource value of '*') # Then: PASS # Scenario: 9 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM role, IAM user or IAM group resources # And: 'Policies' is provided as a non-empty list # And: IAM policy document in 'Policies' has a statement with 'Effect' set to 'Allow' # And: The policy has one or more 'Action' statements # And: No Action statements allow administrator access (Action value of '*') # And: No Resources are wildcards representing all resources (Resource value of '*') # Then: PASS # # Constants # let AWS_IAM_POLICY_TYPE = "AWS::IAM::Policy" let AWS_IAM_ROLE_TYPE = "AWS::IAM::Role" let AWS_IAM_USER_TYPE = "AWS::IAM::User" let AWS_IAM_GROUP_TYPE = "AWS::IAM::Group" let INPUT_DOCUMENT = this # # Assignments # let iam_policies = Resources.*[ Type == %AWS_IAM_POLICY_TYPE ] let iam_principals = Resources.*[ Type == %AWS_IAM_ROLE_TYPE or Type == %AWS_IAM_USER_TYPE or Type == %AWS_IAM_GROUP_TYPE ] # # Primary Rules # rule iam_inline_policy_no_statements_with_admin_access_check when is_cfn_template(%INPUT_DOCUMENT) %iam_policies not empty { check_policy(%iam_policies.Properties) << [CT.IAM.PR.1]: Require that an AWS Identity and Access Management (IAM) inline policy does not have a statement that includes "*" in the Action and Resource elements [FIX]: Remove IAM inline policy statements with "Effect": "Allow" that permit "Action": "*" over "Resource": "*". >> } rule iam_inline_policy_no_statements_with_admin_access_check when is_cfn_hook(%INPUT_DOCUMENT, %AWS_IAM_POLICY_TYPE) { check_policy(%INPUT_DOCUMENT.%AWS_IAM_POLICY_TYPE.resourceProperties) << [CT.IAM.PR.1]: Require that an AWS Identity and Access Management (IAM) inline policy does not have a statement that includes "*" in the Action and Resource elements [FIX]: Remove IAM inline policy statements with "Effect": "Allow" that permit "Action": "*" over "Resource": "*". >> } rule iam_inline_policy_no_statements_with_admin_access_check when is_cfn_template(%INPUT_DOCUMENT) %iam_principals not empty { check_principal(%iam_principals.Properties) << [CT.IAM.PR.1]: Require that an AWS Identity and Access Management (IAM) inline policy does not have a statement that includes "*" in the Action and Resource elements [FIX]: Remove IAM inline policy statements with "Effect": "Allow" that permit "Action": "*" over "Resource": "*". >> } rule iam_inline_policy_no_statements_with_admin_access_check when is_cfn_hook(%INPUT_DOCUMENT, %AWS_IAM_ROLE_TYPE) { check_principal(%INPUT_DOCUMENT.%AWS_IAM_ROLE_TYPE.resourceProperties) << [CT.IAM.PR.1]: Require that an AWS Identity and Access Management (IAM) inline policy does not have a statement that includes "*" in the Action and Resource elements [FIX]: Remove IAM inline policy statements with "Effect": "Allow" that permit "Action": "*" over "Resource": "*". >> } rule iam_inline_policy_no_statements_with_admin_access_check when is_cfn_hook(%INPUT_DOCUMENT, %AWS_IAM_USER_TYPE) { check_principal(%INPUT_DOCUMENT.%AWS_IAM_USER_TYPE.resourceProperties) << [CT.IAM.PR.1]: Require that an AWS Identity and Access Management (IAM) inline policy does not have a statement that includes "*" in the Action and Resource elements [FIX]: Remove IAM inline policy statements with "Effect": "Allow" that permit "Action": "*" over "Resource": "*". >> } rule iam_inline_policy_no_statements_with_admin_access_check when is_cfn_hook(%INPUT_DOCUMENT, %AWS_IAM_GROUP_TYPE) { check_principal(%INPUT_DOCUMENT.%AWS_IAM_GROUP_TYPE.resourceProperties) << [CT.IAM.PR.1]: Require that an AWS Identity and Access Management (IAM) inline policy does not have a statement that includes "*" in the Action and Resource elements [FIX]: Remove IAM inline policy statements with "Effect": "Allow" that permit "Action": "*" over "Resource": "*". >> } # # Parameterized Rules # rule check_policy(policy) { %policy [ filter_policy_document_with_statement_provided(this) ] { PolicyDocument { check_statement(Statement) } } } rule check_principal(iam_principal) { %iam_principal [ filter_iam_principal_with_inline_policy_provided(this) ] { Policies[*] { check_policy(this) } } } rule check_statement(statement) { %statement [ filter_allow_on_action_and_resource(this) ] { Action exists Resource exists check_admin_access(Action, Resource) } } rule filter_allow_on_action_and_resource(statement) { %statement { Effect == "Allow" Action exists Resource exists } } rule filter_policy_document_with_statement_provided(policy) { %policy { PolicyDocument exists PolicyDocument is_struct PolicyDocument { Statement exists filter_statement_non_empty_list(Statement) or Statement is_struct } } } rule filter_iam_principal_with_inline_policy_provided(iam_principal) { %iam_principal { Policies exists Policies is_list Policies not empty } } rule filter_statement_non_empty_list(statement) { %statement { this is_list this not empty } } rule check_admin_access(actions, resources) { when some %actions[*] == "*" { %resources[*] != "*" } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

Exemples de modèles CT.IAM.PR.1

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Resources: IAMRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: AWS: Ref: AWS::AccountId Action: - sts:AssumeRole IAMPolicy: Type: AWS::IAM::Policy Properties: PolicyName: Fn::Sub: ${AWS::StackName}-inline-policy Roles: - Ref: IAMRole PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - s3:GetObject Resource: - arn:aws:s3:::examplebucket/*

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Resources: IAMRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: AWS: Ref: AWS::AccountId Action: - sts:AssumeRole IAMPolicy: Type: AWS::IAM::Policy Properties: PolicyName: Fn::Sub: ${AWS::StackName}-inline-policy Roles: - Ref: IAMRole PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: '*' Resource: '*'

[CT.IAM.PR.2] Exiger que les politiques AWS Identity and Access Management (IAM) gérées par le client ne contiennent pas d'énoncé incluant « * » dans les éléments Action et Resource

Ce contrôle vérifie si les politiques AWS Identity and Access Management (IAM) gérées par le client n'incluent pas Effect : Allow with Action : * over Resource :*.

  • Objectif de contrôle : appliquer le moindre privilège

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::IAM::ManagedPolicy

  • AWS CloudFormationrègle de garde : CT.IAM.PR.2spécification des règles

Détails et exemples

Explication

Les politiques IAM définissent un ensemble de privilèges accordés aux utilisateurs, aux groupes ou aux rôles. Conformément aux conseils de sécurité standard du secteur, AWS recommande que vos politiques accordent le moindre privilège, c'est-à-dire n'octroyez que les autorisations nécessaires à l'exécution d'une tâche. Lorsque vous accordez des privilèges complets au lieu de l'ensemble minimal d'autorisations requis par l'utilisateur, vous risquez d'exposer les ressources à des actions indésirables.

Au lieu d'accorder des privilèges complets, déterminez les actions spécifiques que vos utilisateurs doivent effectuer, puis élaborez des politiques permettant aux utilisateurs d'effectuer uniquement ces tâches. Il est plus sûr de commencer avec un minimum d'autorisations et d'accorder des autorisations supplémentaires si nécessaire. Ne commencez pas avec des autorisations indulgentes et essayez de les renforcer plus tard.

Supprimez les politiques IAM comportant une instruction avec Effect : Allow qui autorise Action : * over Resource :*.

Considérations d'utilisation
  • Ce contrôle vérifie uniquement les politiques gérées par le client IAM. Il ne vérifie pas les politiques intégrées et AWS gérées.

  • Ce contrôle s'applique uniquement aux politiques en ligne IAM dont les instructions contiennent un Effect de Allow et qui contiennent à la fois l'élément Action et l'Resourceélément.

Remédiation en cas de défaillance des règles

Supprimez les déclarations de politique en ligne IAM avec Effect : Allow that permit Action : * over Resource :. *

Les exemples suivants montrent comment implémenter cette correction.

Politique gérée par IAM - Exemple

Politique gérée par IAM configurée pour permettre la récupération d'objets depuis un compartiment Amazon S3. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "IAMManagedPolicy": { "Type": "AWS::IAM::ManagedPolicy", "Properties": { "Roles": [ { "Ref": "IAMRole" } ], "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::samplebucket/*" ] } ] } } } }

Exemple YAML

IAMManagedPolicy: Type: AWS::IAM::ManagedPolicy Properties: Roles: - !Ref 'IAMRole' PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - s3:GetObject Resource: - arn:aws:s3:::samplebucket/*

CT.IAM.PR.2spécification des règles

# ################################### ## Rule Specification ## ##################################### # # Rule Name: # iam_managed_policy_no_statements_with_admin_access_check # # Description: # This control checks whether AWS Identity and Access Management (IAM) customer managed policies do not include "Effect": "Allow" with "Action": "*" over "Resource": "*". # # Reports on: # AWS::IAM::ManagedPolicy # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any IAM managed policy resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM managed policy resource # And: The policy has no statements with 'Effect' set to 'Allow' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM managed policy resource # And: The policy has a statement with 'Effect' set to 'Allow' # And: The policy does not have both Action and Resource statements # Then: SKIP # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM managed policy resource # And: The policy has a statement with 'Effect' set to 'Allow' # And: The policy statement has one or more Action statements and one or more Resource statements # And: Within a single policy statement at least one Action statement allows all actions (Action value of '*') # And: Within the same policy statement at least one Resource statement is a wildcard representing all # resources (Resource value of '*') # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM managed policy resource # And: The policy has a statement with 'Effect' set to 'Allow' # And: The policy has one or more Action statements and one or more Resource statements # And: Within a single policy statement no Action statements allow all actions (Action value of '*') # And: Within the same policy statement no Resources are wildcards representing all # resources (Resource value of '*') # Then: PASS # # Constants # let AWS_IAM_MANAGED_POLICY_TYPE = "AWS::IAM::ManagedPolicy" let INPUT_DOCUMENT = this # # Assignments # let iam_managed_policies = Resources.*[ Type == %AWS_IAM_MANAGED_POLICY_TYPE ] # # Primary Rules # rule iam_managed_policy_no_statements_with_admin_access_check when is_cfn_template(%INPUT_DOCUMENT) %iam_managed_policies not empty { check(%iam_managed_policies.Properties) << [CT.IAM.PR.2]: Require that AWS Identity and Access Management (IAM) customer-managed policies do not contain a statement that includes "*" in the Action and Resource elements [FIX]: Remove IAM inline policy statements with "Effect": "Allow" that permit "Action": "*" over "Resource": "*". >> } rule iam_managed_policy_no_statements_with_admin_access_check when is_cfn_hook(%INPUT_DOCUMENT, %AWS_IAM_MANAGED_POLICY_TYPE) { check(%INPUT_DOCUMENT.%AWS_IAM_MANAGED_POLICY_TYPE.resourceProperties) << [CT.IAM.PR.2]: Require that AWS Identity and Access Management (IAM) customer-managed policies do not contain a statement that includes "*" in the Action and Resource elements [FIX]: Remove IAM inline policy statements with "Effect": "Allow" that permit "Action": "*" over "Resource": "*". >> } # # Parameterized Rules # rule check(policy) { %policy [ filter_policy_document_with_statement_provided(this) ] { PolicyDocument { check_statement(Statement) } } } rule check_statement(statement) { %statement [ filter_allow_on_action_and_resource(this) ] { Action exists Resource exists check_admin_access(Action, Resource) } } rule filter_allow_on_action_and_resource(statement) { %statement { Effect == "Allow" Action exists Resource exists } } rule filter_policy_document_with_statement_provided(policy) { %policy { PolicyDocument exists PolicyDocument is_struct PolicyDocument { Statement exists filter_statement_non_empty_list(Statement) or Statement is_struct } } } rule filter_statement_non_empty_list(statement) { %statement { this is_list this not empty } } rule check_admin_access(actions, resources) { when some %actions[*] == "*" { %resources[*] != "*" } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

CT.IAM.PR.2exemples de modèles

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Resources: IAMRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: AWS: Ref: AWS::AccountId Action: - sts:AssumeRole IAMManagedPolicy: Type: AWS::IAM::ManagedPolicy Properties: Roles: - Ref: IAMRole PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - s3:GetObject Resource: - arn:aws:s3:::examplebucket/*

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Resources: IAMRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: AWS: Ref: AWS::AccountId Action: - sts:AssumeRole IAMManagedPolicy: Type: AWS::IAM::ManagedPolicy Properties: Roles: - Ref: IAMRole PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: '*' Resource: '*'

[CT.IAM.PR.3] Exiger que les politiques AWS Identity and Access Management (IAM) gérées par le client ne comportent pas d'actions de service génériques

Ce contrôle vérifie que les politiques AWS Identity and Access Management (IAM) gérées par le client ne contiennent pas les instructions Effect suivantes : Allow with Action : Service:* (par exemple, s3 : *) pour des AWS services individuels, et que les politiques n'utilisent pas la combinaison de NotAction avec un de. Effect Allow

  • Objectif de contrôle : appliquer le moindre privilège

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::IAM::ManagedPolicy

  • AWS CloudFormationrègle de garde : CT.IAM.PR.3spécification des règles

Détails et exemples

Explication

Lorsque vous attribuez des autorisations àServices AWS, il est important de définir les actions IAM autorisées dans vos politiques IAM. Nous vous recommandons de fournir des autorisations de moindre privilège en limitant les politiques IAM aux actions requises uniquement. Des politiques trop permissives peuvent entraîner une augmentation des privilèges si elles sont associées à un principal IAM qui n'a peut-être pas besoin d'autorisation.

Considérations d'utilisation
  • Ce contrôle vérifie uniquement les politiques gérées par le client IAM. Il ne vérifie pas les politiques intégrées et AWS gérées.

  • Ce contrôle s'applique uniquement aux politiques gérées par le client IAM dont les instructions contiennent un ou Allow avec un Effect élément Action ou NotAction présent.

Remédiation en cas de défaillance des règles

Supprimez les instructions des politiques gérées par le client IAM avec Effect : Allow et : service:* ou Action Effect : et. Allow NotAction

Les exemples suivants montrent comment implémenter cette correction.

Politique gérée par IAM - Exemple

Politique gérée par IAM configurée pour autoriser l'ListBucketaction Amazon S3. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "IAMManagedPolicy": { "Type": "AWS::IAM::ManagedPolicy", "Properties": { "Roles": [ { "Ref": "IAMRole" } ], "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "*" ] } ] } } } }

Exemple YAML

IAMManagedPolicy: Type: AWS::IAM::ManagedPolicy Properties: Roles: - !Ref 'IAMRole' PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - s3:ListBucket Resource: - '*'

CT.IAM.PR.3spécification des règles

# ################################### ## Rule Specification ## ##################################### # # Rule Name: # iam_managed_policy_no_statements_with_full_access_check # # Description: # This control checks that AWS Identity and Access Management (IAM) customer-managed policies do not contain statements of "Effect": "Allow" with "Action": "Service:*" (for example, s3:*) for individual Services AWS, and that the policies do not use the combination of "NotAction" with an "Effect" of "Allow". # # Reports on: # AWS::IAM::ManagedPolicy # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any IAM Managed Policy resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM Managed Policy resource # And: The policy has no statements with 'Effect' set to 'Allow' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM Managed Policy resource # And: The policy has a statement with 'Effect' set to 'Allow' # And: The policy has one or more 'Action' statements # And: At least one 'Action' statement allows full access to a service ('Action' has a value 'service:*') # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM Managed Policy resource # And: The policy has a statement with 'Effect' set to 'Allow' # And: The policy has one or more 'NotAction' statements # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM Managed Policy resource # And: The policy has a statement with 'Effect' set to 'Allow' # And: The policy has one or more 'Action' statements # And: No 'Action' statements allow full access to a service ('Action' does not have a value 'service:*') # Then: PASS # # Constants # let AWS_IAM_MANAGED_POLICY_TYPE = "AWS::IAM::ManagedPolicy" let WILDCARD_ACTION_PATTERN = /^[\w]*[:]*\*$/ let INPUT_DOCUMENT = this # # Assignments # let iam_managed_policies = Resources.*[ Type == %AWS_IAM_MANAGED_POLICY_TYPE ] # # Primary Rules # rule iam_managed_policy_no_statements_with_full_access_check when is_cfn_template(%INPUT_DOCUMENT) %iam_managed_policies not empty { check(%iam_managed_policies.Properties) << [CT.IAM.PR.3]: Require that AWS Identity and Access Management (IAM) customer-managed policies do not have wildcard service actions [FIX]: Remove statements from IAM customer-managed policies with "Effect": "Allow" and "Action": "service:*" or "Effect": "Allow" and "NotAction". >> } rule iam_managed_policy_no_statements_with_full_access_check when is_cfn_hook(%INPUT_DOCUMENT, %AWS_IAM_MANAGED_POLICY_TYPE) { check(%INPUT_DOCUMENT.%AWS_IAM_MANAGED_POLICY_TYPE.resourceProperties) << [CT.IAM.PR.3]: Require that AWS Identity and Access Management (IAM) customer-managed policies do not have wildcard service actions [FIX]: Remove statements from IAM customer-managed policies with "Effect": "Allow" and "Action": "service:*" or "Effect": "Allow" and "NotAction". >> } # # Parameterized Rules # rule check(policy) { %policy [ filter_policy_document_with_statement_provided(this) ] { PolicyDocument { check_statement_no_wildcard_actions(Statement) check_statement_no_not_action(Statement) } } } rule check_statement_no_wildcard_actions(statement) { %statement [ filter_allow_on_action(this) ] { Action exists check_no_wildcard_action(Action) } } rule check_statement_no_not_action(statement) { %statement [ filter_allow(this) ] { NotAction not exists } } rule filter_allow_on_action(statement) { %statement { Effect == "Allow" Action exists } } rule filter_allow(statement) { %statement { Effect == "Allow" } } rule filter_policy_document_with_statement_provided(policy) { %policy { PolicyDocument exists PolicyDocument is_struct PolicyDocument { Statement exists filter_statement_non_empty_list(Statement) or Statement is_struct } } } rule filter_statement_non_empty_list(statement) { %statement { this is_list this not empty } } rule check_no_wildcard_action(actions) { %actions[*] { this != %WILDCARD_ACTION_PATTERN } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

CT.IAM.PR.3exemples de modèles

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Resources: IAMRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: AWS: Ref: AWS::AccountId Action: - sts:AssumeRole IAMManagedPolicy: Type: AWS::IAM::ManagedPolicy Properties: Roles: - Ref: IAMRole PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - s3:ListBucket Resource: - '*'

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Resources: IAMRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: AWS: Ref: AWS::AccountId Action: - sts:AssumeRole IAMManagedPolicy: Type: AWS::IAM::ManagedPolicy Properties: Roles: - Ref: IAMRole PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: s3:* Resource: '*'

[CT.IAM.PR.4] Exiger qu'aucun utilisateur AWS Identity and Access Management (IAM) ne soit associé à une politique intégrée ou gérée

Ce contrôle vérifie si votre utilisateur AWS Identity and Access Management (IAM) possède des politiques intégrées ou gérées (AWSet celles du client) directement associées. Les utilisateurs IAM devraient plutôt hériter des autorisations des groupes ou des rôles IAM.

  • Objectif de contrôle : appliquer le moindre privilège

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources :AWS::IAM::User,AWS::IAM::Policy, AWS::IAM::ManagedPolicy

  • AWS CloudFormationrègle de garde : CT.IAM.PR.4spécification des règles

Détails et exemples

Explication

Par défaut, les utilisateurs, les groupes et les rôles IAM n'ont aucun accès aux AWS ressources. Les politiques IAM accordent des privilèges aux utilisateurs, aux groupes ou aux rôles. Nous vous recommandons d'appliquer les politiques IAM directement aux groupes et aux rôles, mais pas aux utilisateurs. À mesure que le nombre d'utilisateurs augmente, l'attribution de privilèges au niveau du groupe ou du rôle réduit la complexité de la gestion des accès. La réduction de la complexité de la gestion des accès peut à son tour réduire la possibilité pour un principal de recevoir ou de conserver des privilèges excessifs par inadvertance.

Remédiation en cas de défaillance des règles

Configurez les utilisateurs IAM pour qu'ils héritent des autorisations des groupes IAM.

Les exemples suivants montrent comment implémenter cette correction.

Utilisateur IAM - Exemple

Configuration utilisateur IAM sans stratégie IAM ni pièces jointes à des politiques gérées. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "IAMUser": { "Type": "AWS::IAM::User" } }

Exemple YAML

IAMUser: Type: AWS::IAM::User

Les exemples suivants montrent comment implémenter cette correction.

Politique IAM - Exemple

Politique IAM configurée sans association d'utilisateurs IAM. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "IAMPolicy": { "Type": "AWS::IAM::Policy", "Properties": { "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudformation:DescribeStacks" ], "Resource": "*" } ] }, "PolicyName": "sample-policy", "Roles": [ { "Ref": "IAMRole" } ] } } }

Exemple YAML

IAMPolicy: Type: AWS::IAM::Policy Properties: PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - cloudformation:DescribeStacks Resource: '*' PolicyName: sample-policy Roles: - !Ref 'IAMRole'

Les exemples suivants montrent comment implémenter cette correction.

Politique gérée par IAM - Exemple

Politique gérée par IAM configurée sans association d'utilisateurs IAM. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "IAMManagedPolicy": { "Type": "AWS::IAM::ManagedPolicy", "Properties": { "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudformation:DescribeStacks" ], "Resource": "*" } ] } } } }

Exemple YAML

IAMManagedPolicy: Type: AWS::IAM::ManagedPolicy Properties: PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - cloudformation:DescribeStacks Resource: '*'

CT.IAM.PR.4spécification des règles

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # iam_user_no_policies_check # # Description: # This control checks whether your AWS Identity and Access Management (IAM) user has inline or managed (AWS and customer) policies directly attached. Instead, IAM users should inherit permissions from IAM groups or roles. # # Reports on: # AWS::IAM::User, AWS::IAM::Policy, AWS::IAM::ManagedPolicy # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any IAM user, policy or managed policy resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM user resource # And: 'Policies' or 'ManagedPolicyArns' have been specified as a non-empty list # Then: FAIL # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM policy or managed policy resource # And: 'Users' has been specified and is a non-empty list # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM user resource # And: 'Policies' has not been been specified or is an empty list # And: 'ManagedPolicyArns' has not been been specified or is an empty list # Then: PASS # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM policy or managed policy resource # And: 'Users' has not been specified or is an empty list # Then: PASS # # Constants # let IAM_USER_TYPE = "AWS::IAM::User" let IAM_POLICY_TYPE = "AWS::IAM::Policy" let IAM_MANAGED_POLICY_TYPE = "AWS::IAM::ManagedPolicy" let INPUT_DOCUMENT = this # # Assignments # let iam_users = Resources.*[ Type == %IAM_USER_TYPE ] let iam_policies = Resources.*[ Type == %IAM_POLICY_TYPE ] let iam_managed_policies = Resources.*[ Type == %IAM_MANAGED_POLICY_TYPE ] # # Primary Rules # rule iam_user_no_policies_check when is_cfn_template(%INPUT_DOCUMENT) %iam_users not empty { check_user(%iam_users.Properties) << [CT.IAM.PR.4]: Require that an AWS Identity and Access Management (IAM) user does not have an inline or managed policy attached attached [FIX]: Configure IAM users to inherit permissions from IAM groups. >> } rule iam_user_no_policies_check when is_cfn_template(%INPUT_DOCUMENT) %iam_policies not empty { check_policy(%iam_policies.Properties) << [CT.IAM.PR.4]: Require that an AWS Identity and Access Management (IAM) user does not have an inline or managed policy attached attached [FIX]: Configure IAM users to inherit permissions from IAM groups. >> } rule iam_user_no_policies_check when is_cfn_template(%INPUT_DOCUMENT) %iam_managed_policies not empty { check_policy(%iam_managed_policies.Properties) << [CT.IAM.PR.4]: Require that an AWS Identity and Access Management (IAM) user does not have an inline or managed policy attached attached [FIX]: Configure IAM users to inherit permissions from IAM groups. >> } rule iam_user_no_policies_check when is_cfn_hook(%INPUT_DOCUMENT, %IAM_USER_TYPE) { check_user(%INPUT_DOCUMENT.%IAM_USER_TYPE.resourceProperties) << [CT.IAM.PR.4]: Require that an AWS Identity and Access Management (IAM) user does not have an inline or managed policy attached attached [FIX]: Configure IAM users to inherit permissions from IAM groups. >> } rule iam_user_no_policies_check when is_cfn_hook(%INPUT_DOCUMENT, %IAM_POLICY_TYPE) { check_policy(%INPUT_DOCUMENT.%IAM_POLICY_TYPE.resourceProperties) << [CT.IAM.PR.4]: Require that an AWS Identity and Access Management (IAM) user does not have an inline or managed policy attached attached [FIX]: Configure IAM users to inherit permissions from IAM groups. >> } rule iam_user_no_policies_check when is_cfn_hook(%INPUT_DOCUMENT, %IAM_MANAGED_POLICY_TYPE) { check_policy(%INPUT_DOCUMENT.%IAM_MANAGED_POLICY_TYPE.resourceProperties) << [CT.IAM.PR.4]: Require that an AWS Identity and Access Management (IAM) user does not have an inline or managed policy attached attached [FIX]: Configure IAM users to inherit permissions from IAM groups. >> } # # Parameterized Rules # rule check_user(iam_user) { %iam_user { # Scenario 2 and 4 Policies not exists or exists_and_is_empty_list(Policies) ManagedPolicyArns not exists or exists_and_is_empty_list(ManagedPolicyArns) } } rule check_policy(policy) { %policy { # Scenario 3 and 4 Users not exists or exists_and_is_empty_list(Users) } } rule exists_and_is_empty_list(list_property) { %list_property { this is_list this empty } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

CT.IAM.PR.4exemples de modèles

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Resources: IAMUser: Type: AWS::IAM::User Properties: {}

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Resources: IAMUser: Type: AWS::IAM::User Properties: ManagedPolicyArns: - arn:aws:iam::aws:policy/AdministratorAccess

[CT.IAM.PR.5] Exiger que les politiques intégrées AWS Identity and Access Management (IAM) ne comportent pas d'actions de service génériques

Ce contrôle vérifie si les politiques intégrées AWS Identity and Access Management (IAM) n'incluent pas Effect : Allow avec : Service:* (par exemple s3 Action : *) pour les individus Services AWS ou n'utilisent pas la combinaison de NotAction avec un Effect de. Allow

  • Objectif de contrôle : appliquer le moindre privilège

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::IAM::PolicyAWS::IAM::Role,AWS::IAM::User, AWS::IAM::Group

  • AWS CloudFormationrègle de garde : CT.IAM.PR.5spécification des règles

Détails et exemples

Explication

Lorsque vous attribuez des autorisations àServices AWS, il est important de définir les actions IAM autorisées dans vos politiques IAM. Vous devez limiter les actions IAM aux seules actions nécessaires. Cela vous permet d'octroyer des autorisations de moindre privilège. Des politiques trop permissives peuvent entraîner une augmentation des privilèges si elles sont associées à un principal IAM qui n'a peut-être pas besoin d'autorisation.

Considérations d'utilisation
  • Ce contrôle s'applique uniquement aux politiques en ligne IAM dont les instructions contiennent un ou Allow avec un Effect élément Action ou NotAction présent.

  • Ce contrôle s'applique uniquement aux ressources de rôle, d'utilisateur ou de groupe IAM avec une ou plusieurs politiques intégrées et aux ressources de stratégie IAM avec une ou plusieurs instructions configurées

Remédiation en cas de défaillance des règles

Supprimez les instructions des politiques intégrées IAM avec Effect : Allow et : service:* ou Action Effect : Allow et. NotAction

Les exemples suivants montrent comment implémenter cette correction.

Politique en ligne IAM - Exemple 1

Rôle IAM configuré avec une politique en ligne autorisant l'action S3ListBucket. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "IAMRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": { "Ref": "AWS::AccountId" } }, "Action": [ "sts:AssumeRole" ] } ] }, "Policies": [ { "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "*" ] } ] }, "PolicyName": "sample-policy" } ] } } }

Exemple YAML

IAMRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: AWS: !Ref 'AWS::AccountId' Action: - sts:AssumeRole Policies: - PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - s3:ListBucket Resource: - '*' PolicyName: sample-policy

Les exemples suivants montrent comment implémenter cette correction.

Politique en ligne IAM : deuxième exemple

Utilisateur IAM configuré avec une politique en ligne autorisant l'action S3ListBucket. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "IAMUser": { "Type": "AWS::IAM::User", "Properties": { "Policies": [ { "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "*" ] } ] }, "PolicyName": "sample-policy" } ] } } }

Exemple YAML

IAMUser: Type: AWS::IAM::User Properties: Policies: - PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - s3:ListBucket Resource: - '*' PolicyName: sample-policy

Les exemples suivants montrent comment implémenter cette correction.

Stratégie IAM Inline - Troisième exemple

Groupe IAM configuré avec une politique en ligne autorisant l'action S3ListBucket. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "IAMGroup": { "Type": "AWS::IAM::Group", "Properties": { "Policies": [ { "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "*" ] } ] }, "PolicyName": "sample-policy" } ] } } }

Exemple YAML

IAMGroup: Type: AWS::IAM::Group Properties: Policies: - PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - s3:ListBucket Resource: - '*' PolicyName: sample-policy

Les exemples suivants montrent comment implémenter cette correction.

Politique en ligne IAM - Exemple 4

Stratégie IAM associée à un rôle IAM en tant que politique intégrée et configurée pour autoriser l'action S3. ListBucket L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "IAMPolicy": { "Type": "AWS::IAM::Policy", "Properties": { "PolicyName": "sample-policy", "Roles": [ { "Ref": "IAMRole" } ], "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "*" ] } ] } } } }

Exemple YAML

IAMPolicy: Type: AWS::IAM::Policy Properties: PolicyName: sample-policy Roles: - !Ref 'IAMRole' PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - s3:ListBucket Resource: - '*'

CT.IAM.PR.5spécification des règles

# ################################### ## Rule Specification ## ##################################### # # Rule Name: # iam_inline_policy_no_statements_with_full_access_check # # Description: # This control checks whether AWS Identity and Access Management (IAM) inline policies do not include "Effect": "Allow" with "Action": "Service:*" (e.g. s3:*) for individual Services AWS or use the combination of "NotAction" with an "Effect" of "Allow". # # Reports on: # AWS::IAM::Policy, AWS::IAM::Role, AWS::IAM::User, AWS::IAM::Group # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any IAM policy, IAM role, IAM user or IAM group resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM policy resource # And: The policy has no statements with 'Effect' set to 'Allow' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM role, IAM user or IAM group resource # And: 'Policies' is not provided or is an empty list # Then: SKIP # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM role, IAM user or IAM group resource # And: 'Policies' is provided as a non-empty list # And: All IAM policy documents in 'Policies' have no statements with 'Effect' set to 'Allow' # Then: SKIP # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM policy resource # And: The policy has a statement with 'Effect' set to 'Allow' # And: The policy has one or more 'Action' statements # And: 'Action' statement allows full access to a service ('Action' has a value 'service:*') # Then: FAIL # Scenario: 6 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM policy resource # And: The policy has a statement with 'Effect' set to 'Allow' # And: The policy has one or more 'NotAction' statements # Then: FAIL # Scenario: 7 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM role, IAM user or IAM group resource # And: 'Policies' is provided as a non-empty list # And: IAM policy document in 'Policies' has a statement with 'Effect' set to 'Allow' # And: The policy has one or more 'Action' statements # And: 'Action' statement allows full access to a service ('Action' has a value 'service:*') # Then: FAIL # Scenario: 8 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM role, IAM user or IAM user resource # And: 'Policies' is provided as a non-empty list # And: At least one IAM policy document in 'Policies' has a statement with 'Effect' set to 'Allow' # And: The policy has one or more 'NotAction' statements # Then: FAIL # Scenario: 9 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM policy resource # And: The policy has a statement with 'Effect' set to 'Allow' # And: The policy has one or more 'Action' statements # And: No 'Action' statements allow full access to a service ('Action' does not have a value 'service:*') # Then: PASS # Scenario: 10 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an IAM role, IAM user or IAM user resource # And: 'Policies' is provided as a non-empty list # And: At least one IAM policy document in 'Policies' has a statement with 'Effect' set to 'Allow' # And: The policy has one or more 'Action' statements # And: No 'Action' statements allow full access to a service ('Action' does not have a value 'service:*') # Then: PASS # # Constants # let AWS_IAM_POLICY_TYPE = "AWS::IAM::Policy" let AWS_IAM_ROLE_TYPE = "AWS::IAM::Role" let AWS_IAM_USER_TYPE = "AWS::IAM::User" let AWS_IAM_GROUP_TYPE = "AWS::IAM::Group" let WILDCARD_ACTION_PATTERN = /^[\w]*[:]*\*$/ let INPUT_DOCUMENT = this # # Assignments # let iam_policies = Resources.*[ Type == %AWS_IAM_POLICY_TYPE ] let iam_principals = Resources.*[ Type == %AWS_IAM_ROLE_TYPE or Type == %AWS_IAM_USER_TYPE or Type == %AWS_IAM_GROUP_TYPE ] # # Primary Rules # rule iam_inline_policy_no_statements_with_full_access_check when is_cfn_template(%INPUT_DOCUMENT) %iam_policies not empty { check_policy(%iam_policies.Properties) << [CT.IAM.PR.5]: Require that AWS Identity and Access Management (IAM) inline policies do not have wildcard service actions [FIX]: Remove statements from IAM inline policies with "Effect": "Allow" and "Action": "service:*" or "Effect": "Allow" and "NotAction". >> } rule iam_inline_policy_no_statements_with_full_access_check when is_cfn_hook(%INPUT_DOCUMENT, %AWS_IAM_POLICY_TYPE) { check_policy(%INPUT_DOCUMENT.%AWS_IAM_POLICY_TYPE.resourceProperties) << [CT.IAM.PR.5]: Require that AWS Identity and Access Management (IAM) inline policies do not have wildcard service actions [FIX]: Remove statements from IAM inline policies with "Effect": "Allow" and "Action": "service:*" or "Effect": "Allow" and "NotAction". >> } rule iam_inline_policy_no_statements_with_full_access_check when is_cfn_template(%INPUT_DOCUMENT) %iam_principals not empty { check_principal(%iam_principals.Properties) << [CT.IAM.PR.5]: Require that AWS Identity and Access Management (IAM) inline policies do not have wildcard service actions [FIX]: Remove statements from IAM inline policies with "Effect": "Allow" and "Action": "service:*" or "Effect": "Allow" and "NotAction". >> } rule iam_inline_policy_no_statements_with_full_access_check when is_cfn_hook(%INPUT_DOCUMENT, %AWS_IAM_ROLE_TYPE) { check_principal(%INPUT_DOCUMENT.%AWS_IAM_ROLE_TYPE.resourceProperties) << [CT.IAM.PR.5]: Require that AWS Identity and Access Management (IAM) inline policies do not have wildcard service actions [FIX]: Remove statements from IAM inline policies with "Effect": "Allow" and "Action": "service:*" or "Effect": "Allow" and "NotAction". >> } rule iam_inline_policy_no_statements_with_full_access_check when is_cfn_hook(%INPUT_DOCUMENT, %AWS_IAM_USER_TYPE) { check_principal(%INPUT_DOCUMENT.%AWS_IAM_USER_TYPE.resourceProperties) << [CT.IAM.PR.5]: Require that AWS Identity and Access Management (IAM) inline policies do not have wildcard service actions [FIX]: Remove statements from IAM inline policies with "Effect": "Allow" and "Action": "service:*" or "Effect": "Allow" and "NotAction". >> } rule iam_inline_policy_no_statements_with_full_access_check when is_cfn_hook(%INPUT_DOCUMENT, %AWS_IAM_GROUP_TYPE) { check_principal(%INPUT_DOCUMENT.%AWS_IAM_GROUP_TYPE.resourceProperties) << [CT.IAM.PR.5]: Require that AWS Identity and Access Management (IAM) inline policies do not have wildcard service actions [FIX]: Remove statements from IAM inline policies with "Effect": "Allow" and "Action": "service:*" or "Effect": "Allow" and "NotAction". >> } # # Parameterized Rules # rule check_policy(policy) { %policy [ filter_policy_document_with_statement_provided(this) ] { PolicyDocument { check_statement_no_wildcard_actions(Statement) check_statement_no_not_action(Statement) } } } rule check_principal(iam_principal) { %iam_principal [ filter_iam_principal_with_inline_policy_provided(this) ] { Policies[*] { check_policy(this) } } } rule check_statement_no_wildcard_actions(statement) { %statement [ filter_allow_on_action(this) ] { Action exists check_no_wildcard_action(Action) } } rule check_statement_no_not_action(statement) { %statement [ filter_allow(this) ] { NotAction not exists } } rule filter_allow_on_action(statement) { %statement { Effect == "Allow" Action exists } } rule filter_allow(statement) { %statement { Effect == "Allow" } } rule filter_policy_document_with_statement_provided(policy) { %policy { PolicyDocument exists PolicyDocument is_struct PolicyDocument { Statement exists filter_statement_non_empty_list(Statement) or Statement is_struct } } } rule filter_iam_principal_with_inline_policy_provided(iam_principal) { %iam_principal { Policies exists Policies is_list Policies not empty } } rule filter_statement_non_empty_list(statement) { %statement { this is_list this not empty } } rule check_no_wildcard_action(actions) { %actions[*] { this != %WILDCARD_ACTION_PATTERN } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

CT.IAM.PR.5exemples de modèles

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Resources: IAMRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: AWS: Ref: AWS::AccountId Action: - sts:AssumeRole IAMPolicy: Type: AWS::IAM::Policy Properties: PolicyName: Fn::Sub: ${AWS::StackName}-example Roles: - Ref: IAMRole PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - s3:ListBucket Resource: - '*'

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Resources: IAMRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: AWS: Ref: AWS::AccountId Action: - sts:AssumeRole IAMPolicy: Type: AWS::IAM::Policy Properties: PolicyName: Fn::Sub: ${AWS::StackName}-example Roles: - Ref: IAMRole PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: s3:* Resource: '*'