@actsecurity/iam-lens 0.1.166 → 0.1.168
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/simulate/contextKeys.d.ts +4 -0
- package/dist/cjs/simulate/contextKeys.d.ts.map +1 -1
- package/dist/cjs/simulate/contextKeys.js +10 -4
- package/dist/cjs/simulate/contextKeys.js.map +1 -1
- package/dist/cjs/simulate/roleSessionTags.d.ts +51 -0
- package/dist/cjs/simulate/roleSessionTags.d.ts.map +1 -0
- package/dist/cjs/simulate/roleSessionTags.js +218 -0
- package/dist/cjs/simulate/roleSessionTags.js.map +1 -0
- package/dist/cjs/simulate/simulate.d.ts +7 -2
- package/dist/cjs/simulate/simulate.d.ts.map +1 -1
- package/dist/cjs/simulate/simulate.js +120 -9
- package/dist/cjs/simulate/simulate.js.map +1 -1
- package/dist/esm/simulate/contextKeys.d.ts +4 -0
- package/dist/esm/simulate/contextKeys.d.ts.map +1 -1
- package/dist/esm/simulate/contextKeys.js +10 -4
- package/dist/esm/simulate/contextKeys.js.map +1 -1
- package/dist/esm/simulate/roleSessionTags.d.ts +51 -0
- package/dist/esm/simulate/roleSessionTags.d.ts.map +1 -0
- package/dist/esm/simulate/roleSessionTags.js +213 -0
- package/dist/esm/simulate/roleSessionTags.js.map +1 -0
- package/dist/esm/simulate/simulate.d.ts +7 -2
- package/dist/esm/simulate/simulate.d.ts.map +1 -1
- package/dist/esm/simulate/simulate.js +121 -10
- package/dist/esm/simulate/simulate.js.map +1 -1
- package/package.json +1 -1
|
@@ -16,6 +16,10 @@ export interface CreateContextKeysOptions {
|
|
|
16
16
|
* Whether resource tags and presence should be loaded from collected data.
|
|
17
17
|
*/
|
|
18
18
|
includeResourceMetadata?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Whether principal tags should be loaded from collected IAM metadata.
|
|
21
|
+
*/
|
|
22
|
+
includePrincipalTags?: boolean;
|
|
19
23
|
}
|
|
20
24
|
/**
|
|
21
25
|
* Placeholder for the caller account AWS supplies on a service-mediated KMS request.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contextKeys.d.ts","sourceRoot":"","sources":["../../../src/simulate/contextKeys.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAEvD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA;AAE9D;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAA;AAE3D;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"contextKeys.d.ts","sourceRoot":"","sources":["../../../src/simulate/contextKeys.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAEvD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA;AAE9D;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAA;AAE3D;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAA;IAEjC;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAED;;;;GAIG;AACH,eAAO,MAAM,2CAA2C,iBAAiB,CAAA;AAEzE,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAyB7C,CAAA;AAED,eAAO,MAAM,YAAY;;;;;;;;;CASxB,CAAA;AAgBD;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAKnE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAExE;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAK7F;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,aAAa,EAAE,gBAAgB,EAC/B,iBAAiB,EAAE,yBAAyB,EAC5C,OAAO,EAAE,MAAM,EACf,mBAAmB,EAAE,WAAW,EAChC,8BAA8B,CAAC,EAAE,MAAM,EACvC,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC;IAAE,oBAAoB,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,CAAC,CA2ItE;AAwBD;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,gBAAgB,GAC9B,OAAO,CAAC,WAAW,CAAC,CAgEtB;AAyCD;;;;;GAKG;AACH,wBAAgB,mCAAmC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE5E"}
|
|
@@ -113,7 +113,11 @@ async function createContextKeys(collectClient, simulationRequest, service, cont
|
|
|
113
113
|
'aws:EpochTime': Math.floor(Date.now() / 1000).toString()
|
|
114
114
|
};
|
|
115
115
|
const principal = simulationRequest.principal;
|
|
116
|
-
if (principal
|
|
116
|
+
if (!principal) {
|
|
117
|
+
contextKeys['aws:userid'] = 'anonymous';
|
|
118
|
+
contextKeys['aws:PrincipalType'] = 'Anonymous';
|
|
119
|
+
}
|
|
120
|
+
else if ((0, principals_js_1.isArnPrincipal)(principal)) {
|
|
117
121
|
const arnParts = (0, iam_utils_1.splitArnParts)(principal);
|
|
118
122
|
const principalArnForContext = resolvedPrincipalArnForContext ??
|
|
119
123
|
(arnParts.resourceType === 'assumed-role'
|
|
@@ -128,9 +132,11 @@ async function createContextKeys(collectClient, simulationRequest, service, cont
|
|
|
128
132
|
const orgStructure = await collectClient.getOrgUnitHierarchyForAccount(principalAccountId);
|
|
129
133
|
contextKeys['aws:PrincipalOrgPaths'] = makeOrgPaths(orgId, orgStructure);
|
|
130
134
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
135
|
+
if (options.includePrincipalTags !== false) {
|
|
136
|
+
const { tags } = await collectClient.getTagsForResource(principalArnForContext, principalAccountId);
|
|
137
|
+
for (const [key, value] of Object.entries(tags)) {
|
|
138
|
+
contextKeys[`aws:PrincipalTag/${key}`] = value;
|
|
139
|
+
}
|
|
134
140
|
}
|
|
135
141
|
contextKeys['aws:PrincipalIsAWSService'] = 'false';
|
|
136
142
|
if (service.toLowerCase() === 'kms') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contextKeys.js","sourceRoot":"","sources":["../../../src/simulate/contextKeys.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"contextKeys.js","sourceRoot":"","sources":["../../../src/simulate/contextKeys.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type ValidatedPolicy } from '@actsecurity/iam-policy';
|
|
2
|
+
/** A tag-key value permitted by a role trust policy. */
|
|
3
|
+
export interface SessionTagKey {
|
|
4
|
+
/** Tag-key spelling from the trust policy. */
|
|
5
|
+
tagKey: string;
|
|
6
|
+
/** Whether the trust-policy comparison ignores case. */
|
|
7
|
+
ignoreCase: boolean;
|
|
8
|
+
}
|
|
9
|
+
/** Describes which tag keys a role session may supply, independently of the role's stored tags. */
|
|
10
|
+
export type RoleSessionTagCapability = {
|
|
11
|
+
type: 'none';
|
|
12
|
+
} | {
|
|
13
|
+
type: 'any';
|
|
14
|
+
} | {
|
|
15
|
+
type: 'allowlist';
|
|
16
|
+
tagKeys: SessionTagKey[];
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Determines which tag keys a role session may supply from the role's trust policy.
|
|
20
|
+
*
|
|
21
|
+
* This result intentionally does not depend on tags currently stored on the role. Deny statements
|
|
22
|
+
* and conditions unrelated to `aws:TagKeys` are ignored. Supported
|
|
23
|
+
* `ForAllValues:StringEquals` operators form a finite allowlist for one Allow statement, while
|
|
24
|
+
* `ForAnyValue`, unsupported operators, and policy-variable values conservatively permit any key.
|
|
25
|
+
*
|
|
26
|
+
* @param trustPolicy the role's validated trust policy, or undefined when it was not collected
|
|
27
|
+
* @returns the role's session-tag key capability
|
|
28
|
+
*/
|
|
29
|
+
export declare function roleSessionTagCapability(trustPolicy: ValidatedPolicy<{
|
|
30
|
+
name: string;
|
|
31
|
+
}> | undefined): RoleSessionTagCapability;
|
|
32
|
+
/**
|
|
33
|
+
* Determines whether a tag key can be supplied by a role session.
|
|
34
|
+
*
|
|
35
|
+
* @param capability the trust-policy-derived session-tag capability
|
|
36
|
+
* @param tagKey the tag key to test
|
|
37
|
+
* @returns true when a role session may supply the key
|
|
38
|
+
*/
|
|
39
|
+
export declare function roleSessionCanSetTagKey(capability: RoleSessionTagCapability, tagKey: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Builds a slash-delimited regex constraint for PrincipalTag keys that cannot be session supplied.
|
|
42
|
+
*
|
|
43
|
+
* The iam-simulate constraint matcher is case-insensitive. Consequently, case variants of a
|
|
44
|
+
* case-sensitive allowlist entry are also excluded from this strict pattern. That may preserve
|
|
45
|
+
* extra conditional results, but it cannot incorrectly make a mutable tag strict.
|
|
46
|
+
*
|
|
47
|
+
* @param capability the trust-policy-derived session-tag capability
|
|
48
|
+
* @returns a strict PrincipalTag pattern, or undefined when every tag key may be supplied
|
|
49
|
+
*/
|
|
50
|
+
export declare function immutablePrincipalTagPattern(capability: RoleSessionTagCapability): string | undefined;
|
|
51
|
+
//# sourceMappingURL=roleSessionTags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roleSessionTags.d.ts","sourceRoot":"","sources":["../../../src/simulate/roleSessionTags.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAA;AAOhC,wDAAwD;AACxD,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAA;IAEd,wDAAwD;IACxD,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,mGAAmG;AACnG,MAAM,MAAM,wBAAwB,GAClC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,aAAa,EAAE,CAAA;CAAE,CAAA;AAQtF;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,eAAe,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,SAAS,GACzD,wBAAwB,CAiC1B;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,wBAAwB,EACpC,MAAM,EAAE,MAAM,GACb,OAAO,CAST;AAED;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,wBAAwB,GACnC,MAAM,GAAG,SAAS,CAUpB"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.roleSessionTagCapability = roleSessionTagCapability;
|
|
4
|
+
exports.roleSessionCanSetTagKey = roleSessionCanSetTagKey;
|
|
5
|
+
exports.immutablePrincipalTagPattern = immutablePrincipalTagPattern;
|
|
6
|
+
const iam_policy_1 = require("@actsecurity/iam-policy");
|
|
7
|
+
const iam_utils_1 = require("@actsecurity/iam-utils");
|
|
8
|
+
const tagSessionAction = 'sts:TagSession';
|
|
9
|
+
const tagKeysConditionKey = 'aws:tagkeys';
|
|
10
|
+
const policyVariablePattern = /\$\{[^}]+\}/;
|
|
11
|
+
/** No trust-policy Allow permits session tags. */
|
|
12
|
+
const noSessionTags = { type: 'none' };
|
|
13
|
+
/** At least one trust-policy Allow may permit any session-tag key. */
|
|
14
|
+
const anySessionTag = { type: 'any' };
|
|
15
|
+
/**
|
|
16
|
+
* Determines which tag keys a role session may supply from the role's trust policy.
|
|
17
|
+
*
|
|
18
|
+
* This result intentionally does not depend on tags currently stored on the role. Deny statements
|
|
19
|
+
* and conditions unrelated to `aws:TagKeys` are ignored. Supported
|
|
20
|
+
* `ForAllValues:StringEquals` operators form a finite allowlist for one Allow statement, while
|
|
21
|
+
* `ForAnyValue`, unsupported operators, and policy-variable values conservatively permit any key.
|
|
22
|
+
*
|
|
23
|
+
* @param trustPolicy the role's validated trust policy, or undefined when it was not collected
|
|
24
|
+
* @returns the role's session-tag key capability
|
|
25
|
+
*/
|
|
26
|
+
function roleSessionTagCapability(trustPolicy) {
|
|
27
|
+
if (!trustPolicy) {
|
|
28
|
+
return noSessionTags;
|
|
29
|
+
}
|
|
30
|
+
if (trustPolicy.errors.length > 0) {
|
|
31
|
+
return anySessionTag;
|
|
32
|
+
}
|
|
33
|
+
const allowedTagKeys = [];
|
|
34
|
+
let hasTagSessionAllow = false;
|
|
35
|
+
for (const statement of (0, iam_policy_1.loadPolicy)(trustPolicy).statements()) {
|
|
36
|
+
if (!statement.isAllow() || !statementAllowsTagSession(statement)) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
hasTagSessionAllow = true;
|
|
40
|
+
const statementCapability = tagCapabilityForStatement(statement);
|
|
41
|
+
if (statementCapability.type === 'any') {
|
|
42
|
+
return anySessionTag;
|
|
43
|
+
}
|
|
44
|
+
if (statementCapability.type === 'allowlist') {
|
|
45
|
+
allowedTagKeys.push(...statementCapability.tagKeys);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (!hasTagSessionAllow) {
|
|
49
|
+
return noSessionTags;
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
type: 'allowlist',
|
|
53
|
+
tagKeys: uniqueTagKeys(allowedTagKeys)
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Determines whether a tag key can be supplied by a role session.
|
|
58
|
+
*
|
|
59
|
+
* @param capability the trust-policy-derived session-tag capability
|
|
60
|
+
* @param tagKey the tag key to test
|
|
61
|
+
* @returns true when a role session may supply the key
|
|
62
|
+
*/
|
|
63
|
+
function roleSessionCanSetTagKey(capability, tagKey) {
|
|
64
|
+
if (capability.type === 'any') {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
if (capability.type === 'none') {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
return capability.tagKeys.some((entry) => tagKeyMatchesEntry(tagKey, entry));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Builds a slash-delimited regex constraint for PrincipalTag keys that cannot be session supplied.
|
|
74
|
+
*
|
|
75
|
+
* The iam-simulate constraint matcher is case-insensitive. Consequently, case variants of a
|
|
76
|
+
* case-sensitive allowlist entry are also excluded from this strict pattern. That may preserve
|
|
77
|
+
* extra conditional results, but it cannot incorrectly make a mutable tag strict.
|
|
78
|
+
*
|
|
79
|
+
* @param capability the trust-policy-derived session-tag capability
|
|
80
|
+
* @returns a strict PrincipalTag pattern, or undefined when every tag key may be supplied
|
|
81
|
+
*/
|
|
82
|
+
function immutablePrincipalTagPattern(capability) {
|
|
83
|
+
if (capability.type === 'any') {
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
if (capability.type === 'none' || capability.tagKeys.length === 0) {
|
|
87
|
+
return '/^aws:PrincipalTag\/.*/';
|
|
88
|
+
}
|
|
89
|
+
const mutableNames = capability.tagKeys.map((entry) => escapeRegex(entry.tagKey)).join('|');
|
|
90
|
+
return `/^aws:PrincipalTag\\/(?!(?:${mutableNames})$).*/`;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Determines whether an Allow statement's Action or NotAction includes `sts:TagSession`.
|
|
94
|
+
*
|
|
95
|
+
* @param statement the parsed trust-policy statement to inspect
|
|
96
|
+
* @returns true when the statement applies to the TagSession action
|
|
97
|
+
*/
|
|
98
|
+
function statementAllowsTagSession(statement) {
|
|
99
|
+
if (statement.isActionStatement()) {
|
|
100
|
+
return statement
|
|
101
|
+
.actions()
|
|
102
|
+
.some((action) => (0, iam_utils_1.actionMatchesPattern)(tagSessionAction, action.value()));
|
|
103
|
+
}
|
|
104
|
+
if (statement.isNotActionStatement()) {
|
|
105
|
+
return !statement
|
|
106
|
+
.notActions()
|
|
107
|
+
.some((action) => (0, iam_utils_1.actionMatchesPattern)(tagSessionAction, action.value()));
|
|
108
|
+
}
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Determines which tag keys one TagSession Allow statement may supply.
|
|
113
|
+
*
|
|
114
|
+
* @param statement a parsed Allow statement that includes TagSession
|
|
115
|
+
* @returns the statement's session-tag capability
|
|
116
|
+
*/
|
|
117
|
+
function tagCapabilityForStatement(statement) {
|
|
118
|
+
const tagKeysConditions = statement
|
|
119
|
+
.conditions()
|
|
120
|
+
.filter((condition) => stringsEqualIgnoreCase(condition.conditionKey(), tagKeysConditionKey));
|
|
121
|
+
if (tagKeysConditions.length === 0 || tagKeysConditions.some(conditionIsUnbounded)) {
|
|
122
|
+
return anySessionTag;
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
type: 'allowlist',
|
|
126
|
+
tagKeys: intersectTagKeyConditions(tagKeysConditions)
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Determines whether a TagKeys condition cannot prove a finite exhaustive key allowlist.
|
|
131
|
+
*
|
|
132
|
+
* @param condition the parsed `aws:TagKeys` condition
|
|
133
|
+
* @returns true when the statement must conservatively be treated as permitting any key
|
|
134
|
+
*/
|
|
135
|
+
function conditionIsUnbounded(condition) {
|
|
136
|
+
const operation = condition.operation();
|
|
137
|
+
if (operation.isIfExists() || operation.setOperator() !== 'ForAllValues') {
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
const baseOperator = operation.baseOperator();
|
|
141
|
+
if (!stringsEqualIgnoreCase(baseOperator, 'StringEquals') &&
|
|
142
|
+
!stringsEqualIgnoreCase(baseOperator, 'StringEqualsIgnoreCase')) {
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
return condition.conditionValues().some((value) => policyVariablePattern.test(value));
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Intersects finite ForAllValues TagKeys allowlists within one statement.
|
|
149
|
+
*
|
|
150
|
+
* @param conditions supported TagKeys conditions from one statement
|
|
151
|
+
* @returns tag keys capable of satisfying every condition
|
|
152
|
+
*/
|
|
153
|
+
function intersectTagKeyConditions(conditions) {
|
|
154
|
+
const conditionEntries = conditions.map(entriesForCondition);
|
|
155
|
+
const hasCaseSensitiveCondition = conditionEntries.some((entries) => entries.some((entry) => !entry.ignoreCase));
|
|
156
|
+
const candidates = hasCaseSensitiveCondition
|
|
157
|
+
? conditionEntries.flat().filter((entry) => !entry.ignoreCase)
|
|
158
|
+
: conditionEntries[0];
|
|
159
|
+
return uniqueTagKeys(candidates.filter((candidate) => conditionEntries.every((entries) => entries.some((entry) => tagKeyMatchesEntry(candidate.tagKey, entry)))));
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Converts one supported TagKeys condition into comparable entries.
|
|
163
|
+
*
|
|
164
|
+
* @param condition the parsed supported condition
|
|
165
|
+
* @returns entries carrying the condition's case-comparison semantics
|
|
166
|
+
*/
|
|
167
|
+
function entriesForCondition(condition) {
|
|
168
|
+
const ignoreCase = stringsEqualIgnoreCase(condition.operation().baseOperator(), 'StringEqualsIgnoreCase');
|
|
169
|
+
return condition.conditionValues().map((tagKey) => ({ tagKey, ignoreCase }));
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Tests a concrete tag key against a trust-policy allowlist entry.
|
|
173
|
+
*
|
|
174
|
+
* @param tagKey the concrete tag key
|
|
175
|
+
* @param entry the allowlist entry and its comparison semantics
|
|
176
|
+
* @returns true when the key matches the entry
|
|
177
|
+
*/
|
|
178
|
+
function tagKeyMatchesEntry(tagKey, entry) {
|
|
179
|
+
return entry.ignoreCase ? stringsEqualIgnoreCase(tagKey, entry.tagKey) : tagKey === entry.tagKey;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Removes semantically duplicate tag-key entries while preserving case-sensitive alternatives.
|
|
183
|
+
*
|
|
184
|
+
* @param entries tag-key entries to deduplicate
|
|
185
|
+
* @returns unique entries
|
|
186
|
+
*/
|
|
187
|
+
function uniqueTagKeys(entries) {
|
|
188
|
+
const unique = [];
|
|
189
|
+
for (const entry of entries) {
|
|
190
|
+
if (!unique.some((existing) => existing.ignoreCase === entry.ignoreCase &&
|
|
191
|
+
(entry.ignoreCase
|
|
192
|
+
? stringsEqualIgnoreCase(existing.tagKey, entry.tagKey)
|
|
193
|
+
: existing.tagKey === entry.tagKey))) {
|
|
194
|
+
unique.push(entry);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return unique;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Compares strings without case sensitivity or normalized string allocations.
|
|
201
|
+
*
|
|
202
|
+
* @param left first value to compare
|
|
203
|
+
* @param right second value to compare
|
|
204
|
+
* @returns true when the values compare equally without case sensitivity
|
|
205
|
+
*/
|
|
206
|
+
function stringsEqualIgnoreCase(left, right) {
|
|
207
|
+
return left.localeCompare(right, undefined, { sensitivity: 'base' }) === 0;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Escapes a literal string for use inside a regular expression.
|
|
211
|
+
*
|
|
212
|
+
* @param value the literal value to escape
|
|
213
|
+
* @returns a regex-safe representation
|
|
214
|
+
*/
|
|
215
|
+
function escapeRegex(value) {
|
|
216
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=roleSessionTags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roleSessionTags.js","sourceRoot":"","sources":["../../../src/simulate/roleSessionTags.ts"],"names":[],"mappings":";;AA0CA,4DAmCC;AASD,0DAYC;AAYD,oEAYC;AA1HD,wDAKgC;AAChC,sDAA6D;AAE7D,MAAM,gBAAgB,GAAG,gBAAgB,CAAA;AACzC,MAAM,mBAAmB,GAAG,aAAa,CAAA;AACzC,MAAM,qBAAqB,GAAG,aAAa,CAAA;AAe3C,kDAAkD;AAClD,MAAM,aAAa,GAA6B,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AAEhE,sEAAsE;AACtE,MAAM,aAAa,GAA6B,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AAE/D;;;;;;;;;;GAUG;AACH,SAAgB,wBAAwB,CACtC,WAA0D;IAE1D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,aAAa,CAAA;IACtB,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,aAAa,CAAA;IACtB,CAAC;IAED,MAAM,cAAc,GAAoB,EAAE,CAAA;IAC1C,IAAI,kBAAkB,GAAG,KAAK,CAAA;IAC9B,KAAK,MAAM,SAAS,IAAI,IAAA,uBAAU,EAAC,WAAW,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC;QAC7D,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,EAAE,CAAC;YAClE,SAAQ;QACV,CAAC;QAED,kBAAkB,GAAG,IAAI,CAAA;QACzB,MAAM,mBAAmB,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAA;QAChE,IAAI,mBAAmB,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACvC,OAAO,aAAa,CAAA;QACtB,CAAC;QACD,IAAI,mBAAmB,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC7C,cAAc,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;QACrD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,OAAO,aAAa,CAAA;IACtB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC;KACvC,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,uBAAuB,CACrC,UAAoC,EACpC,MAAc;IAEd,IAAI,UAAU,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAA;AAC9E,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,4BAA4B,CAC1C,UAAoC;IAEpC,IAAI,UAAU,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClE,OAAO,yBAAyB,CAAA;IAClC,CAAC;IAED,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC3F,OAAO,8BAA8B,YAAY,QAAQ,CAAA;AAC3D,CAAC;AAED;;;;;GAKG;AACH,SAAS,yBAAyB,CAAC,SAAoB;IACrD,IAAI,SAAS,CAAC,iBAAiB,EAAE,EAAE,CAAC;QAClC,OAAO,SAAS;aACb,OAAO,EAAE;aACT,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,gCAAoB,EAAC,gBAAgB,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IAC7E,CAAC;IAED,IAAI,SAAS,CAAC,oBAAoB,EAAE,EAAE,CAAC;QACrC,OAAO,CAAC,SAAS;aACd,UAAU,EAAE;aACZ,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,gCAAoB,EAAC,gBAAgB,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IAC7E,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAS,yBAAyB,CAAC,SAAoB;IACrD,MAAM,iBAAiB,GAAG,SAAS;SAChC,UAAU,EAAE;SACZ,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,sBAAsB,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAA;IAE/F,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACnF,OAAO,aAAa,CAAA;IACtB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,yBAAyB,CAAC,iBAAiB,CAAC;KACtD,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,SAAoB;IAChD,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,EAAE,CAAA;IACvC,IAAI,SAAS,CAAC,UAAU,EAAE,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,cAAc,EAAE,CAAC;QACzE,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,EAAE,CAAA;IAC7C,IACE,CAAC,sBAAsB,CAAC,YAAY,EAAE,cAAc,CAAC;QACrD,CAAC,sBAAsB,CAAC,YAAY,EAAE,wBAAwB,CAAC,EAC/D,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,SAAS,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;AACvF,CAAC;AAED;;;;;GAKG;AACH,SAAS,yBAAyB,CAAC,UAAuB;IACxD,MAAM,gBAAgB,GAAG,UAAU,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;IAC5D,MAAM,yBAAyB,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAClE,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAC3C,CAAA;IACD,MAAM,UAAU,GAAG,yBAAyB;QAC1C,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;QAC9D,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;IAEvB,OAAO,aAAa,CAClB,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAC9B,gBAAgB,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CACjC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CACrE,CACF,CACF,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,SAAoB;IAC/C,MAAM,UAAU,GAAG,sBAAsB,CACvC,SAAS,CAAC,SAAS,EAAE,CAAC,YAAY,EAAE,EACpC,wBAAwB,CACzB,CAAA;IACD,OAAO,SAAS,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;AAC9E,CAAC;AAED;;;;;;GAMG;AACH,SAAS,kBAAkB,CAAC,MAAc,EAAE,KAAoB;IAC9D,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,sBAAsB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAA;AAClG,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CAAC,OAAwB;IAC7C,MAAM,MAAM,GAAoB,EAAE,CAAA;IAClC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IACE,CAAC,MAAM,CAAC,IAAI,CACV,CAAC,QAAQ,EAAE,EAAE,CACX,QAAQ,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU;YACxC,CAAC,KAAK,CAAC,UAAU;gBACf,CAAC,CAAC,sBAAsB,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;gBACvD,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,CACxC,EACD,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAS,sBAAsB,CAAC,IAAY,EAAE,KAAa;IACzD,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,CAAA;AAC5E,CAAC;AAED;;;;;GAKG;AACH,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;AACrD,CAAC"}
|
|
@@ -185,14 +185,19 @@ export declare function simulateVirtualPrincipal(simulationRequest: VirtualPrinc
|
|
|
185
185
|
*/
|
|
186
186
|
export declare function simulateExternalResourceRequest(simulationRequest: ExternalResourceSimulationRequest, collectClient: IamCollectClient): Promise<SimulateRequestResult>;
|
|
187
187
|
/**
|
|
188
|
-
* Convert an iam-lens
|
|
188
|
+
* Convert an iam-lens context key into an iam-simulate Discovery constraint.
|
|
189
|
+
*
|
|
190
|
+
* Caller-provided and explicitly strict keys remain fully authoritative. A stored PrincipalTag
|
|
191
|
+
* whose role session may override it has known presence but an unknown value. All other input keys
|
|
192
|
+
* are strict and continue through the existing special-case handling.
|
|
189
193
|
*
|
|
190
194
|
* @param keyName the literal context key or slash-delimited key pattern
|
|
191
195
|
* @param simulationRequest the normalized request whose context certainty is modeled
|
|
196
|
+
* @param mutablePrincipalTagKeys stored PrincipalTag keys whose values are non-authoritative
|
|
192
197
|
* @returns the Discovery constraint to pass to iam-simulate
|
|
193
198
|
* @internal
|
|
194
199
|
*/
|
|
195
|
-
export declare function discoveryConstraintForStrictKey(keyName: string, simulationRequest: Pick<InternalSimulationRequest, 'customContextKeys' | 'simulationMode' | 'principal'>): DiscoveryContextKeyConstraint;
|
|
200
|
+
export declare function discoveryConstraintForStrictKey(keyName: string, simulationRequest: Pick<InternalSimulationRequest, 'additionalStrictContextKeys' | 'customContextKeys' | 'simulationMode' | 'principal'>, mutablePrincipalTagKeys?: ReadonlySet<string>): DiscoveryContextKeyConstraint;
|
|
196
201
|
/**
|
|
197
202
|
* Compare an actual simulation decision with an optional expected result.
|
|
198
203
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simulate.d.ts","sourceRoot":"","sources":["../../../src/simulate/simulate.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,6BAA6B,EAClC,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EAEzB,KAAK,UAAU,EACf,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"simulate.d.ts","sourceRoot":"","sources":["../../../src/simulate/simulate.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ const resources_js_1 = require("../resources.js");
|
|
|
15
15
|
const sts_js_1 = require("../utils/sts.js");
|
|
16
16
|
const contextKeys_js_1 = require("./contextKeys.js");
|
|
17
17
|
const generatedPolicies_js_1 = require("./generatedPolicies.js");
|
|
18
|
+
const roleSessionTags_js_1 = require("./roleSessionTags.js");
|
|
18
19
|
const kmsRetireGrantAction = 'kms:retiregrant';
|
|
19
20
|
/**
|
|
20
21
|
* Simulate an IAM request using the collected policies for both the principal and resource.
|
|
@@ -148,7 +149,7 @@ async function simulateRequestInternal(input, variant, collectClient) {
|
|
|
148
149
|
? await resolvePrincipalArnForContext(collectClient, simulationRequest.principal)
|
|
149
150
|
: undefined;
|
|
150
151
|
const includeResourceMetadata = variant !== 'externalResource';
|
|
151
|
-
const { contextKeys, resourceTagsAreKnown } = await (0, contextKeys_js_1.createContextKeys)(collectClient, simulationRequest, service, simulationRequest.customContextKeys, principalArnForContext, { includeResourceMetadata });
|
|
152
|
+
const { contextKeys, resourceTagsAreKnown } = await (0, contextKeys_js_1.createContextKeys)(collectClient, simulationRequest, service, simulationRequest.customContextKeys, principalArnForContext, { includePrincipalTags: requiresCollectedPrincipal, includeResourceMetadata });
|
|
152
153
|
const vpcEndpointPolicy = await getVpcEndpointPolicy(collectClient, contextKeys);
|
|
153
154
|
request.contextVariables = contextKeys;
|
|
154
155
|
const simulation = {
|
|
@@ -162,8 +163,15 @@ async function simulateRequestInternal(input, variant, collectClient) {
|
|
|
162
163
|
vpcEndpointPolicies: vpcEndpointPolicy ? [vpcEndpointPolicy] : undefined
|
|
163
164
|
};
|
|
164
165
|
await applyS3Settings(simulation, simulationRequest, variant, collectClient);
|
|
165
|
-
const
|
|
166
|
-
const
|
|
166
|
+
const sessionTagCapability = await sessionTagCapabilityForRequest(collectClient, simulationRequest, principalArnForContext, requiresCollectedPrincipal);
|
|
167
|
+
const mutableExistingPrincipalTagKeys = mutableStoredPrincipalTagKeys(sessionTagCapability, contextKeys, simulationRequest.customContextKeys);
|
|
168
|
+
const principalTagsAreUnknown = variant === 'externalPrincipal' || variant === 'virtualPrincipal';
|
|
169
|
+
const strictContextKeys = makeStrictContextKeys(simulationRequest, contextKeys, resourceTagsAreKnown, (0, iam_utils_1.isS3BucketOrObjectArn)(simulationRequest.resourceArn || ''), principalTagsAreUnknown, sessionTagCapability, mutableExistingPrincipalTagKeys);
|
|
170
|
+
const discoveryContextKeyNames = new Set([
|
|
171
|
+
...strictContextKeys,
|
|
172
|
+
...mutableExistingPrincipalTagKeys
|
|
173
|
+
]);
|
|
174
|
+
const discoveryContextKeyConstraints = [...discoveryContextKeyNames].map((keyName) => discoveryConstraintForStrictKey(keyName, simulationRequest, mutableExistingPrincipalTagKeys));
|
|
167
175
|
const result = await (0, iam_simulate_1.runSimulation)(simulation, {
|
|
168
176
|
simulationMode: simulationRequest.simulationMode,
|
|
169
177
|
discoveryContextKeyConstraints
|
|
@@ -311,9 +319,12 @@ async function applyS3Settings(simulation, request, variant, collectClient) {
|
|
|
311
319
|
* @param contextKeys generated and caller-provided context values
|
|
312
320
|
* @param resourceTagsAreKnown whether all resource tags are known
|
|
313
321
|
* @param s3BucketOrObjectRequest whether S3 bucket tag keys apply
|
|
322
|
+
* @param principalTagsAreUnknown whether synthetic principal tag presence and values are unknown
|
|
323
|
+
* @param sessionTagCapability trust-policy-derived role session-tag capability, when applicable
|
|
324
|
+
* @param mutablePrincipalTagKeys stored PrincipalTag keys whose values are not authoritative
|
|
314
325
|
* @returns strict literal keys and key patterns
|
|
315
326
|
*/
|
|
316
|
-
function makeStrictContextKeys(request, contextKeys, resourceTagsAreKnown, s3BucketOrObjectRequest) {
|
|
327
|
+
function makeStrictContextKeys(request, contextKeys, resourceTagsAreKnown, s3BucketOrObjectRequest, principalTagsAreUnknown, sessionTagCapability, mutablePrincipalTagKeys) {
|
|
317
328
|
const strictContextKeys = [...contextKeys_js_1.knownContextKeys, ...(request.additionalStrictContextKeys ?? [])];
|
|
318
329
|
if (!request.principal) {
|
|
319
330
|
strictContextKeys.push(contextKeys_js_1.CONTEXT_KEYS.userId, contextKeys_js_1.CONTEXT_KEYS.assumedRoot, '/^aws:PrincipalTag\/.*/');
|
|
@@ -326,6 +337,15 @@ function makeStrictContextKeys(request, contextKeys, resourceTagsAreKnown, s3Buc
|
|
|
326
337
|
strictContextKeys.push(contextKeys_js_1.CONTEXT_KEYS.assumedRoot);
|
|
327
338
|
}
|
|
328
339
|
}
|
|
340
|
+
if (!principalTagsAreUnknown && request.principal && (0, iam_utils_1.isIamUserArn)(request.principal)) {
|
|
341
|
+
strictContextKeys.push('/^aws:PrincipalTag\/.*/');
|
|
342
|
+
}
|
|
343
|
+
if (sessionTagCapability) {
|
|
344
|
+
const immutableTagPattern = (0, roleSessionTags_js_1.immutablePrincipalTagPattern)(sessionTagCapability);
|
|
345
|
+
if (immutableTagPattern) {
|
|
346
|
+
strictContextKeys.push(immutableTagPattern);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
329
349
|
if (request.action.startsWith('s3:')) {
|
|
330
350
|
strictContextKeys.push('s3:DataAccessPointAccount', 's3:DataAccessPointArn');
|
|
331
351
|
}
|
|
@@ -336,21 +356,49 @@ function makeStrictContextKeys(request, contextKeys, resourceTagsAreKnown, s3Buc
|
|
|
336
356
|
strictContextKeys.push('/^s3:BucketTag\/.*/');
|
|
337
357
|
}
|
|
338
358
|
}
|
|
359
|
+
// There also may be other tag context keys, so add those too. Mutable role tags must not
|
|
360
|
+
// receive a strict constraint because iam-simulate merges constraints with true-winning semantics.
|
|
339
361
|
for (const key of Object.keys(contextKeys)) {
|
|
340
|
-
if (key
|
|
362
|
+
if (isTagContextKey(key) &&
|
|
363
|
+
!(principalTagsAreUnknown && isPrincipalTagContextKey(key)) &&
|
|
364
|
+
!mutablePrincipalTagKeys.has(key)) {
|
|
341
365
|
strictContextKeys.push(key);
|
|
342
366
|
}
|
|
343
367
|
}
|
|
344
368
|
return strictContextKeys;
|
|
345
369
|
}
|
|
370
|
+
/**
|
|
371
|
+
* Checks whether a context key's first slash-delimited namespace ends in `Tag`.
|
|
372
|
+
*
|
|
373
|
+
* @param key context-key name to inspect
|
|
374
|
+
* @returns true for tag context keys such as `aws:PrincipalTag/Department`
|
|
375
|
+
*/
|
|
376
|
+
function isTagContextKey(key) {
|
|
377
|
+
const slashIndex = key.indexOf('/');
|
|
378
|
+
return (slashIndex >= 3 &&
|
|
379
|
+
key
|
|
380
|
+
.slice(slashIndex - 3, slashIndex + 1)
|
|
381
|
+
.localeCompare('tag/', undefined, { sensitivity: 'base' }) === 0);
|
|
382
|
+
}
|
|
346
383
|
const awsSourceKeyPrefix = 'aws:source';
|
|
384
|
+
const awsPrincipalTagPrefix = 'aws:principaltag/';
|
|
385
|
+
/**
|
|
386
|
+
* Checks whether a context key is in the PrincipalTag namespace.
|
|
387
|
+
*
|
|
388
|
+
* @param key context-key name to inspect
|
|
389
|
+
* @returns true when the key starts with `aws:PrincipalTag/`, ignoring case
|
|
390
|
+
*/
|
|
391
|
+
function isPrincipalTagContextKey(key) {
|
|
392
|
+
return (key
|
|
393
|
+
.slice(0, awsPrincipalTagPrefix.length)
|
|
394
|
+
.localeCompare(awsPrincipalTagPrefix, undefined, { sensitivity: 'base' }) === 0);
|
|
395
|
+
}
|
|
347
396
|
const anonymousAbsentContextKeys = new Set([
|
|
348
397
|
'aws:principalarn',
|
|
349
398
|
'aws:principalaccount',
|
|
350
399
|
'aws:principalorgid',
|
|
351
400
|
'aws:principalorgpaths',
|
|
352
401
|
'aws:username',
|
|
353
|
-
'aws:userid',
|
|
354
402
|
'aws:principalisawsservice',
|
|
355
403
|
'aws:principalservicename',
|
|
356
404
|
'aws:sourceaccount',
|
|
@@ -363,17 +411,80 @@ const anonymousAbsentContextKeys = new Set([
|
|
|
363
411
|
'/^aws:principaltag\/.*/'
|
|
364
412
|
]);
|
|
365
413
|
/**
|
|
366
|
-
*
|
|
414
|
+
* Derives role session-tag capability independently from tags stored on the role.
|
|
415
|
+
*
|
|
416
|
+
* This lookup applies only to Discovery simulations for IAM roles and assumed-role sessions. IAM
|
|
417
|
+
* user tags are handled separately as fully strict because users cannot receive role-session tags.
|
|
418
|
+
*
|
|
419
|
+
* @param collectClient the collect client used to load the canonical role trust policy
|
|
420
|
+
* @param simulationRequest the request whose principal-tag certainty is being modeled
|
|
421
|
+
* @param resolvedPrincipalArnForContext the canonical role ARN resolved for an assumed-role session
|
|
422
|
+
* @param principalIsCollected whether absent principal metadata is authoritative
|
|
423
|
+
* @returns the role's session-tag capability, or undefined when role metadata is not applicable
|
|
424
|
+
*/
|
|
425
|
+
async function sessionTagCapabilityForRequest(collectClient, simulationRequest, resolvedPrincipalArnForContext, principalIsCollected) {
|
|
426
|
+
if (simulationRequest.simulationMode !== 'Discovery' || !principalIsCollected) {
|
|
427
|
+
return undefined;
|
|
428
|
+
}
|
|
429
|
+
const requestPrincipal = simulationRequest.principal;
|
|
430
|
+
const roleArn = requestPrincipal && (0, iam_utils_1.isIamRoleArn)(requestPrincipal)
|
|
431
|
+
? requestPrincipal
|
|
432
|
+
: resolvedPrincipalArnForContext;
|
|
433
|
+
if (!roleArn || !(0, iam_utils_1.isIamRoleArn)(roleArn)) {
|
|
434
|
+
return undefined;
|
|
435
|
+
}
|
|
436
|
+
const accountId = (0, iam_utils_1.splitArnParts)(roleArn).accountId;
|
|
437
|
+
if (!accountId) {
|
|
438
|
+
return undefined;
|
|
439
|
+
}
|
|
440
|
+
const trustPolicy = await collectClient.getResourcePolicyForArn(roleArn, accountId);
|
|
441
|
+
return (0, roleSessionTags_js_1.roleSessionTagCapability)(trustPolicy);
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Finds stored role-tag values that a session may override.
|
|
445
|
+
*
|
|
446
|
+
* Stored tags determine baseline presence, while the independent trust-policy capability determines
|
|
447
|
+
* mutability. A mutable stored tag is always present, but its effective session value is unknown.
|
|
448
|
+
*
|
|
449
|
+
* @param capability the role's session-tag capability, or undefined for non-role requests
|
|
450
|
+
* @param contextKeys generated and caller-provided request context
|
|
451
|
+
* @param customContextKeys authoritative caller-provided context values
|
|
452
|
+
* @returns existing non-custom PrincipalTag context-key names whose values are mutable
|
|
453
|
+
*/
|
|
454
|
+
function mutableStoredPrincipalTagKeys(capability, contextKeys, customContextKeys) {
|
|
455
|
+
if (!capability || capability.type === 'none') {
|
|
456
|
+
return new Set();
|
|
457
|
+
}
|
|
458
|
+
const storedPrincipalTagKeys = Object.keys(contextKeys).filter((key) => isPrincipalTagContextKey(key) && !hasCustomContextKey(customContextKeys, key));
|
|
459
|
+
if (capability.type === 'any') {
|
|
460
|
+
return new Set(storedPrincipalTagKeys);
|
|
461
|
+
}
|
|
462
|
+
return new Set(storedPrincipalTagKeys.filter((key) => {
|
|
463
|
+
const tagKey = key.slice(awsPrincipalTagPrefix.length);
|
|
464
|
+
return (0, roleSessionTags_js_1.roleSessionCanSetTagKey)(capability, tagKey);
|
|
465
|
+
}));
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Convert an iam-lens context key into an iam-simulate Discovery constraint.
|
|
469
|
+
*
|
|
470
|
+
* Caller-provided and explicitly strict keys remain fully authoritative. A stored PrincipalTag
|
|
471
|
+
* whose role session may override it has known presence but an unknown value. All other input keys
|
|
472
|
+
* are strict and continue through the existing special-case handling.
|
|
367
473
|
*
|
|
368
474
|
* @param keyName the literal context key or slash-delimited key pattern
|
|
369
475
|
* @param simulationRequest the normalized request whose context certainty is modeled
|
|
476
|
+
* @param mutablePrincipalTagKeys stored PrincipalTag keys whose values are non-authoritative
|
|
370
477
|
* @returns the Discovery constraint to pass to iam-simulate
|
|
371
478
|
* @internal
|
|
372
479
|
*/
|
|
373
|
-
function discoveryConstraintForStrictKey(keyName, simulationRequest) {
|
|
374
|
-
if (hasCustomContextKey(simulationRequest.customContextKeys, keyName)
|
|
480
|
+
function discoveryConstraintForStrictKey(keyName, simulationRequest, mutablePrincipalTagKeys) {
|
|
481
|
+
if (hasCustomContextKey(simulationRequest.customContextKeys, keyName) ||
|
|
482
|
+
simulationRequest.additionalStrictContextKeys?.includes(keyName)) {
|
|
375
483
|
return { keyName, presenceIsKnown: true, valueIsKnown: true };
|
|
376
484
|
}
|
|
485
|
+
if (mutablePrincipalTagKeys?.has(keyName)) {
|
|
486
|
+
return { keyName, presenceIsKnown: true, valueIsKnown: false };
|
|
487
|
+
}
|
|
377
488
|
if (simulationRequest.principal === undefined &&
|
|
378
489
|
anonymousAbsentContextKeys.has(keyName.toLowerCase())) {
|
|
379
490
|
return { keyName, presenceIsKnown: true, valueIsKnown: true };
|