Skip to content

Commit 6cd4bc1

Browse files
authored
Validate identity base SIDs (#4016)
1 parent 6513670 commit 6cd4bc1

File tree

4 files changed

+50
-2
lines changed

4 files changed

+50
-2
lines changed

src/cfnlint/data/schemas/other/iam/policy.json

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"items": {
1010
"type": "string"
1111
},
12+
"minItems": 1,
1213
"type": [
1314
"string",
1415
"array"

src/cfnlint/data/schemas/other/iam/policy_identity.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@
4343
"$ref": "policy#/definitions/Resource"
4444
},
4545
"Sid": {
46-
"$ref": "policy#/definitions/Statement/properties/Sid"
46+
"$ref": "policy#/definitions/Statement/properties/Sid",
47+
"pattern": "^[A-Za-z0-9]+$"
4748
}
4849
}
4950
}

src/cfnlint/rules/resources/iam/IdentityPolicy.py

+3
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ def __init__(self):
2727
"Resources/AWS::IAM::Role/Properties/Policies/*/PolicyDocument",
2828
"Resources/AWS::IAM::User/Properties/Policies/*/PolicyDocument",
2929
"Resources/AWS::SSO::PermissionSet/Properties/InlinePolicy",
30+
"Resources/AWS::IAM::UserPolicy/Properties/PolicyDocument",
31+
"Resources/AWS::IAM::RolePolicy/Properties/PolicyDocument",
32+
"Resources/AWS::IAM::GroupPolicy/Properties/PolicyDocument",
3033
],
3134
"identity",
3235
"policy_identity.json",

test/unit/rules/resources/iam/test_identity_policy.py

+44-1
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
SPDX-License-Identifier: MIT-0
44
"""
55

6+
from collections import deque
67
from unittest import TestCase
78

89
from cfnlint.context import Context
910
from cfnlint.helpers import FUNCTIONS
10-
from cfnlint.jsonschema import CfnTemplateValidator
11+
from cfnlint.jsonschema import CfnTemplateValidator, ValidationError
1112
from cfnlint.rules.resources.iam.IdentityPolicy import IdentityPolicy
1213

1314

@@ -238,3 +239,45 @@ def test_duplicate_sid(self):
238239
self.assertEqual(len(errs), 1, errs)
239240
self.assertEqual(errs[0].message, "array items are not unique for keys ['Sid']")
240241
self.assertListEqual(list(errs[0].path), ["Statement"])
242+
243+
def test_pattern_sid(self):
244+
validator = CfnTemplateValidator()
245+
246+
policy = {
247+
"Version": "2012-10-17",
248+
"Statement": [
249+
{
250+
"Sid": "A ",
251+
"Effect": "Allow",
252+
"Action": "*",
253+
"Resource": "*",
254+
},
255+
],
256+
}
257+
258+
errs = list(
259+
self.rule.validate(
260+
validator=validator, policy=policy, schema={}, policy_type=None
261+
)
262+
)
263+
self.assertListEqual(
264+
errs,
265+
[
266+
ValidationError(
267+
message="'A ' does not match '^[A-Za-z0-9]+$'",
268+
validator="pattern",
269+
path=deque(["Statement", 0, "Sid"]),
270+
schema_path=deque(
271+
[
272+
"properties",
273+
"Statement",
274+
"items",
275+
"properties",
276+
"Sid",
277+
"pattern",
278+
]
279+
),
280+
rule=IdentityPolicy(),
281+
)
282+
],
283+
)

0 commit comments

Comments
 (0)