Skip to content

Commit beb42c3

Browse files
authored
fix(iam): getDeniedActions returns false deny with organization SCP (#3106)
## Problem Some Organization SCP policies cannot be property evaluated by SimulatePrincipalPolicy and result in false negative results. It is best to ignore actions denied from Organization during SimulatePrincipalPolicy. It is a known problem that some organization SCP policies cannot be simulated correctly by SimulatePrincipalPolicy. This results in permission errors when no permission errors exist. [ERROR]: aws.ecs.openTaskInTerminal: Error: Insufficient permissions to execute command. Configure a task role as described in the documentation. [MissingPermissions] (deniedActions: ssmmessages:CreateControlChannel,ssmmessages:CreateDataChannel,ssmmessages:OpenControlChannel,ssmmessages:OpenDataChannel) ## Solution Ignore denial from Organizations.
1 parent 96cccb6 commit beb42c3

File tree

3 files changed

+20
-1
lines changed

3 files changed

+20
-1
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type": "Bug Fix",
3+
"description": "iamClient ignore permission check when denial comes from organization csp policy"
4+
}

src/shared/clients/iamClient.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,10 @@ export class DefaultIamClient {
5858
throw new Error('No evaluation results found')
5959
}
6060

61-
return permissionResponse.EvaluationResults.filter(r => r.EvalDecision !== 'allowed')
61+
// Ignore deny from Organization SCP. These can result in false negatives.
62+
// See https://github.com/aws/aws-sdk/issues/102
63+
return permissionResponse.EvaluationResults.filter(r => r.EvalDecision !== 'allowed' && r.OrganizationsDecisionDetail?.AllowedByOrganizations !== false)
64+
6265
}
6366

6467
private async createSdkClient(): Promise<IAM> {

src/test/shared/clients/iamClient.test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ describe('iamClient', function () {
2121
const incorrectPermissionsResponse = {
2222
EvaluationResults: [{ EvalActionName: 'example:permission', EvalDecision: 'denied' }],
2323
}
24+
const organizationsDenyPermissionsResponse = {
25+
EvaluationResults: [{
26+
EvalActionName: 'example:permission',
27+
EvalDecision: 'implicitDeny',
28+
OrganizationsDecisionDetail: { "AllowedByOrganizations": false },
29+
}],
30+
}
2431

2532
afterEach(function () {
2633
sinon.restore()
@@ -38,5 +45,10 @@ describe('iamClient', function () {
3845
sinon.stub(iamClient, 'simulatePrincipalPolicy').resolves(correctPermissionsResponse)
3946
assert.deepStrictEqual(await iamClient.getDeniedActions(request), [])
4047
})
48+
49+
it('does not return possibly false organizational implicitDeny', async function () {
50+
sinon.stub(iamClient, 'simulatePrincipalPolicy').resolves(organizationsDenyPermissionsResponse)
51+
assert.deepStrictEqual(await iamClient.getDeniedActions(request), [])
52+
})
4153
})
4254
})

0 commit comments

Comments
 (0)