@@ -17,7 +17,6 @@ Metadata:
1717 - TrustedIdentity
1818 - ApiBaseUrl
1919 - LambdaPackagesBaseUrl
20- - ResponseActionsVersion
2120 - IsOrganizational
2221 - Partition
2322 - RootOUID
@@ -35,8 +34,6 @@ Metadata:
3534 default : API Base URL
3635 LambdaPackagesBaseUrl :
3736 default : Lambda Packages Base URL
38- ResponseActionsVersion :
39- default : Response Actions Version
4037 EnabledResponseActions :
4138 default : Enabled Response Actions
4239 Regions :
@@ -73,10 +70,6 @@ Parameters:
7370 LambdaPackagesBaseUrl :
7471 Type : String
7572 Description : Base URL for downloading Lambda deployment packages (e.g., https://example.com/packages)
76- ResponseActionsVersion :
77- Type : String
78- Description : Response Actions version
79- Default : " 0.0.16"
8073 EnabledResponseActions :
8174 Type : CommaDelimitedList
8275 Description : List of response actions to enable (make_private, fetch_cloud_logs, create_volume_snapshot, quarantine_user)
@@ -267,6 +260,45 @@ Resources:
267260 - Key : ' sysdig.com/response-actions/resource-name'
268261 Value : ' cross-account-invoker'
269262
263+ # Validation Role
264+ ValidationRole :
265+ Type : AWS::IAM::Role
266+ Properties :
267+ RoleName : !Sub sysdig-secure-ra-${NameSuffix}-validation-role
268+ AssumeRolePolicyDocument :
269+ Version : " 2012-10-17"
270+ Statement :
271+ - Effect : Allow
272+ Principal :
273+ AWS : !Ref TrustedIdentity
274+ Action : sts:AssumeRole
275+ Condition :
276+ StringEquals :
277+ sts:ExternalId : !Ref ExternalID
278+ Policies :
279+ - PolicyName : !Sub sysdig-secure-ra-${NameSuffix}-validation-policy
280+ PolicyDocument :
281+ Version : " 2012-10-17"
282+ Statement :
283+ - Effect : Allow
284+ Action :
285+ - lambda:GetFunction
286+ - lambda:GetPolicy
287+ - lambda:ListFunctions
288+ Resource : !Sub "arn:${Partition}:lambda:*:${AWS::AccountId}:function:sysdig-secure-ra-${NameSuffix}-*"
289+ - Effect : Allow
290+ Action :
291+ - iam:GetRole
292+ - iam:GetRolePolicy
293+ - iam:ListRolePolicies
294+ - iam:ListAttachedRolePolicies
295+ Resource : !Sub "arn:${Partition}:iam::${AWS::AccountId}:role/sysdig-secure-ra-${NameSuffix}-*"
296+ Tags :
297+ - Key : Name
298+ Value : !Sub sysdig-secure-ra-${NameSuffix}-validation-role
299+ - Key : ' sysdig.com/response-actions/resource-name'
300+ Value : ' validation-role'
301+
270302 # Lambda Execution Roles
271303 QuarantineUserRole :
272304 Type : AWS::IAM::Role
@@ -573,8 +605,6 @@ Resources:
573605 ParameterValue : !Select [1, !Split ["/", !GetAtt CreateVolumeSnapshotsRole.Arn]]
574606 - ParameterKey : DeleteVolumeSnapshotsRoleName
575607 ParameterValue : !Select [1, !Split ["/", !GetAtt DeleteVolumeSnapshotsRole.Arn]]
576- - ParameterKey : ResponseActionsVersion
577- ParameterValue : !Ref ResponseActionsVersion
578608 - ParameterKey : LambdaPackagesBaseUrl
579609 ParameterValue : !Ref LambdaPackagesBaseUrl
580610 - ParameterKey : EnabledResponseActions
@@ -638,9 +668,6 @@ Resources:
638668 DeleteVolumeSnapshotsRoleName:
639669 Type: String
640670 Description: Name of the IAM role for delete volume snapshots function
641- ResponseActionsVersion:
642- Type: String
643- Description: Version of response actions packages to download
644671 LambdaPackagesBaseUrl:
645672 Type: String
646673 Description: Base URL for downloading Lambda deployment packages
@@ -810,54 +837,54 @@ Resources:
810837 Condition: CreateQuarantineUserResources
811838 Properties:
812839 ServiceToken: !GetAtt PackageDownloaderFunction.Arn
813- Url: !Sub '${LambdaPackagesBaseUrl}/v${ResponseActionsVersion} /quarantine_user.zip'
840+ Url: !Sub '${LambdaPackagesBaseUrl}/v1.0.2 /quarantine_user.zip'
814841 Bucket: !Ref LambdaPackagesBucket
815- Key: !Sub '${ResponseActionsVersion} /quarantine_user.zip'
842+ Key: "1.0.2 /quarantine_user.zip"
816843
817844 FetchCloudLogsPackage:
818845 Type: Custom::LambdaPackage
819846 Condition: CreateFetchCloudLogsResources
820847 Properties:
821848 ServiceToken: !GetAtt PackageDownloaderFunction.Arn
822- Url: !Sub '${LambdaPackagesBaseUrl}/v${ResponseActionsVersion} /fetch_cloud_logs.zip'
849+ Url: !Sub '${LambdaPackagesBaseUrl}/v1.0.2 /fetch_cloud_logs.zip'
823850 Bucket: !Ref LambdaPackagesBucket
824- Key: !Sub '${ResponseActionsVersion} /fetch_cloud_logs.zip'
851+ Key: "1.0.2 /fetch_cloud_logs.zip"
825852
826853 RemovePolicyPackage:
827854 Type: Custom::LambdaPackage
828855 Condition: CreateQuarantineUserResources
829856 Properties:
830857 ServiceToken: !GetAtt PackageDownloaderFunction.Arn
831- Url: !Sub '${LambdaPackagesBaseUrl}/v${ResponseActionsVersion} /remove_policy.zip'
858+ Url: !Sub '${LambdaPackagesBaseUrl}/v1.0.2 /remove_policy.zip'
832859 Bucket: !Ref LambdaPackagesBucket
833- Key: !Sub '${ResponseActionsVersion} /remove_policy.zip'
860+ Key: "1.0.2 /remove_policy.zip"
834861
835862 ConfigureResourceAccessPackage:
836863 Type: Custom::LambdaPackage
837864 Condition: CreateMakePrivateResources
838865 Properties:
839866 ServiceToken: !GetAtt PackageDownloaderFunction.Arn
840- Url: !Sub '${LambdaPackagesBaseUrl}/v${ResponseActionsVersion} /configure_resource_access.zip'
867+ Url: !Sub '${LambdaPackagesBaseUrl}/v1.0.2 /configure_resource_access.zip'
841868 Bucket: !Ref LambdaPackagesBucket
842- Key: !Sub '${ResponseActionsVersion} /configure_resource_access.zip'
869+ Key: "1.0.2 /configure_resource_access.zip"
843870
844871 CreateVolumeSnapshotsPackage:
845872 Type: Custom::LambdaPackage
846873 Condition: CreateVolumeSnapshotResources
847874 Properties:
848875 ServiceToken: !GetAtt PackageDownloaderFunction.Arn
849- Url: !Sub '${LambdaPackagesBaseUrl}/v${ResponseActionsVersion} /create_volume_snapshots.zip'
876+ Url: !Sub '${LambdaPackagesBaseUrl}/v1.0.2 /create_volume_snapshots.zip'
850877 Bucket: !Ref LambdaPackagesBucket
851- Key: !Sub '${ResponseActionsVersion} /create_volume_snapshots.zip'
878+ Key: "1.0.2 /create_volume_snapshots.zip"
852879
853880 DeleteVolumeSnapshotsPackage:
854881 Type: Custom::LambdaPackage
855882 Condition: CreateVolumeSnapshotResources
856883 Properties:
857884 ServiceToken: !GetAtt PackageDownloaderFunction.Arn
858- Url: !Sub '${LambdaPackagesBaseUrl}/v${ResponseActionsVersion} /delete_volume_snapshots.zip'
885+ Url: !Sub '${LambdaPackagesBaseUrl}/v1.0.2 /delete_volume_snapshots.zip'
859886 Bucket: !Ref LambdaPackagesBucket
860- Key: !Sub '${ResponseActionsVersion} /delete_volume_snapshots.zip'
887+ Key: "1.0.2 /delete_volume_snapshots.zip"
861888
862889 # CloudWatch Log Groups (Regional Resources)
863890 QuarantineUserLogGroup:
@@ -926,15 +953,14 @@ Resources:
926953 Condition: CreateQuarantineUserResources
927954 DependsOn:
928955 - QuarantineUserLogGroup
929- - QuarantineUserPackage
930956 Properties:
931957 FunctionName: !Sub '${ResourceName}-quarantine-user'
932958 Runtime: python3.12
933959 Handler: app.index.handler
934960 Role: !Ref QuarantineUserRoleArn
935961 Code:
936- S3Bucket: !Ref LambdaPackagesBucket
937- S3Key: !Sub '${ResponseActionsVersion}/quarantine_user.zip'
962+ S3Bucket: !GetAtt QuarantineUserPackage.Bucket
963+ S3Key: !GetAtt QuarantineUserPackage.Key
938964 Timeout: 300
939965 MemorySize: 128
940966 Environment:
@@ -954,15 +980,14 @@ Resources:
954980 Condition: CreateFetchCloudLogsResources
955981 DependsOn:
956982 - FetchCloudLogsLogGroup
957- - FetchCloudLogsPackage
958983 Properties:
959984 FunctionName: !Sub '${ResourceName}-fetch-cloud-logs'
960985 Runtime: python3.12
961986 Handler: app.index.handler
962987 Role: !Ref FetchCloudLogsRoleArn
963988 Code:
964- S3Bucket: !Ref LambdaPackagesBucket
965- S3Key: !Sub '${ResponseActionsVersion}/fetch_cloud_logs.zip'
989+ S3Bucket: !GetAtt FetchCloudLogsPackage.Bucket
990+ S3Key: !GetAtt FetchCloudLogsPackage.Key
966991 Timeout: 300
967992 MemorySize: 128
968993 Environment:
@@ -982,15 +1007,14 @@ Resources:
9821007 Condition: CreateQuarantineUserResources
9831008 DependsOn:
9841009 - RemovePolicyLogGroup
985- - RemovePolicyPackage
9861010 Properties:
9871011 FunctionName: !Sub '${ResourceName}-remove-policy'
9881012 Runtime: python3.12
9891013 Handler: app.index.handler
9901014 Role: !Ref RemovePolicyRoleArn
9911015 Code:
992- S3Bucket: !Ref LambdaPackagesBucket
993- S3Key: !Sub '${ResponseActionsVersion}/remove_policy.zip'
1016+ S3Bucket: !GetAtt RemovePolicyPackage.Bucket
1017+ S3Key: !GetAtt RemovePolicyPackage.Key
9941018 Timeout: 300
9951019 MemorySize: 128
9961020 Environment:
@@ -1010,15 +1034,14 @@ Resources:
10101034 Condition: CreateMakePrivateResources
10111035 DependsOn:
10121036 - ConfigureResourceAccessLogGroup
1013- - ConfigureResourceAccessPackage
10141037 Properties:
10151038 FunctionName: !Sub '${ResourceName}-configure-resource-access'
10161039 Runtime: python3.12
10171040 Handler: app.index.handler
10181041 Role: !Ref ConfigureResourceAccessRoleArn
10191042 Code:
1020- S3Bucket: !Ref LambdaPackagesBucket
1021- S3Key: !Sub '${ResponseActionsVersion}/configure_resource_access.zip'
1043+ S3Bucket: !GetAtt ConfigureResourceAccessPackage.Bucket
1044+ S3Key: !GetAtt ConfigureResourceAccessPackage.Key
10221045 Timeout: 300
10231046 MemorySize: 128
10241047 Environment:
@@ -1038,15 +1061,14 @@ Resources:
10381061 Condition: CreateVolumeSnapshotResources
10391062 DependsOn:
10401063 - CreateVolumeSnapshotsLogGroup
1041- - CreateVolumeSnapshotsPackage
10421064 Properties:
10431065 FunctionName: !Sub '${ResourceName}-create-volume-snapshots'
10441066 Runtime: python3.12
10451067 Handler: app.index.handler
10461068 Role: !Ref CreateVolumeSnapshotsRoleArn
10471069 Code:
1048- S3Bucket: !Ref LambdaPackagesBucket
1049- S3Key: !Sub '${ResponseActionsVersion}/create_volume_snapshots.zip'
1070+ S3Bucket: !GetAtt CreateVolumeSnapshotsPackage.Bucket
1071+ S3Key: !GetAtt CreateVolumeSnapshotsPackage.Key
10501072 Timeout: 300
10511073 MemorySize: 128
10521074 Environment:
@@ -1066,15 +1088,14 @@ Resources:
10661088 Condition: CreateVolumeSnapshotResources
10671089 DependsOn:
10681090 - DeleteVolumeSnapshotsLogGroup
1069- - DeleteVolumeSnapshotsPackage
10701091 Properties:
10711092 FunctionName: !Sub '${ResourceName}-delete-volume-snapshots'
10721093 Runtime: python3.12
10731094 Handler: app.index.handler
10741095 Role: !Ref DeleteVolumeSnapshotsRoleArn
10751096 Code:
1076- S3Bucket: !Ref LambdaPackagesBucket
1077- S3Key: !Sub '${ResponseActionsVersion}/delete_volume_snapshots.zip'
1097+ S3Bucket: !GetAtt DeleteVolumeSnapshotsPackage.Bucket
1098+ S3Key: !GetAtt DeleteVolumeSnapshotsPackage.Key
10781099 Timeout: 300
10791100 MemorySize: 128
10801101 Environment:
@@ -1153,6 +1174,14 @@ Resources:
11531174 ParameterValue : !GetAtt DeleteVolumeSnapshotsRole.Arn
11541175 - ParameterKey : DeleteVolumeSnapshotsRoleName
11551176 ParameterValue : !Select [1, !Split ["/", !GetAtt DeleteVolumeSnapshotsRole.Arn]]
1177+ - ParameterKey : ValidationRoleName
1178+ ParameterValue : !Sub sysdig-secure-ra-${NameSuffix}-validation-role
1179+ - ParameterKey : TrustedIdentity
1180+ ParameterValue : !Ref TrustedIdentity
1181+ - ParameterKey : ExternalId
1182+ ParameterValue : !Ref ExternalID
1183+ - ParameterKey : ResourceNamePrefix
1184+ ParameterValue : !Sub sysdig-secure-ra-${NameSuffix}
11561185 - ParameterKey : EnabledResponseActions
11571186 ParameterValue : !Join [",", !Ref EnabledResponseActions]
11581187 StackInstancesGroup :
@@ -1218,6 +1247,18 @@ Resources:
12181247 DeleteVolumeSnapshotsRoleName:
12191248 Type: String
12201249 Description: Name for the delete volume snapshots delegate role
1250+ ValidationRoleName:
1251+ Type: String
1252+ Description: Name for the validation role
1253+ TrustedIdentity:
1254+ Type: String
1255+ Description: ARN of the Sysdig trusted identity
1256+ ExternalId:
1257+ Type: String
1258+ Description: External ID for assuming the validation role
1259+ ResourceNamePrefix:
1260+ Type: String
1261+ Description: Prefix for resource names to scope IAM permissions
12211262 EnabledResponseActions:
12221263 Type: String
12231264 Description: Comma-separated list of response actions to enable
@@ -1480,6 +1521,43 @@ Resources:
14801521 - Key: 'sysdig.com/response-actions/resource-name'
14811522 Value: 'remove-policy-delegate-role'
14821523
1524+ # Validation Role: Read-only access for validating Response Actions deployment
1525+ ValidationDelegateRole:
1526+ Type: AWS::IAM::Role
1527+ Properties:
1528+ RoleName: !Ref ValidationRoleName
1529+ Description: Validation role for reading Response Actions resources
1530+ MaxSessionDuration: 3600
1531+ AssumeRolePolicyDocument:
1532+ Version: '2012-10-17'
1533+ Statement:
1534+ - Effect: Allow
1535+ Principal:
1536+ AWS: !Ref TrustedIdentity
1537+ Action: 'sts:AssumeRole'
1538+ Condition:
1539+ StringEquals:
1540+ 'sts:ExternalId': !Ref ExternalId
1541+ Policies:
1542+ - PolicyName: response-actions-validation
1543+ PolicyDocument:
1544+ Version: '2012-10-17'
1545+ Statement:
1546+ - Effect: Allow
1547+ Action:
1548+ - 'iam:GetRole'
1549+ - 'iam:GetRolePolicy'
1550+ - 'iam:ListRolePolicies'
1551+ - 'iam:ListAttachedRolePolicies'
1552+ Resource: !Sub 'arn:aws:iam::${AWS::AccountId}:role/${ResourceNamePrefix}-*'
1553+ Tags:
1554+ - Key: ManagedBy
1555+ Value: CloudFormation
1556+ - Key: Purpose
1557+ Value: ResponseActions
1558+ - Key: 'sysdig.com/response-actions/resource-name'
1559+ Value: 'validation-delegate-role'
1560+
14831561 Outputs:
14841562 ConfigureAccessDelegateRoleName:
14851563 Condition: CreateMakePrivateResources
@@ -1505,6 +1583,9 @@ Resources:
15051583 Condition: CreateQuarantineUserResources
15061584 Value: !Ref RemovePolicyDelegateRole
15071585 Description: Name of the remove policy delegate role
1586+ ValidationDelegateRoleName:
1587+ Value: !Ref ValidationDelegateRole
1588+ Description: Name of the validation delegate role
15081589
15091590Outputs :
15101591 CrossAccountRoleARN :
@@ -1513,6 +1594,12 @@ Outputs:
15131594 CrossAccountRoleName :
15141595 Description : Name of the cross-account role for Lambda invocation
15151596 Value : !Sub sysdig-secure-ra-${NameSuffix}-cross-account-invoker
1597+ ValidationRoleARN :
1598+ Description : ARN of the validation role for reading Response Actions resources
1599+ Value : !GetAtt ValidationRole.Arn
1600+ ValidationRoleName :
1601+ Description : Name of the validation role for reading Response Actions resources
1602+ Value : !Sub sysdig-secure-ra-${NameSuffix}-validation-role
15161603 Regions :
15171604 Description : Comma-separated list of regions where Lambda functions are deployed
15181605 Value : !Join [",", !Ref Regions]
0 commit comments