Skip to content

Commit f126a93

Browse files
authored
feat(response actions) Support for validation [SSPROD-64190] (#163)
* Preliminary support for validation * Fixed JSON example * Attempting to force cft to recreate lambdas if the version changes
1 parent 714c092 commit f126a93

2 files changed

Lines changed: 170 additions & 51 deletions

File tree

modules/response_actions.cft.yaml

Lines changed: 129 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -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
15091590
Outputs:
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

Comments
 (0)