Skip to content

Commit 396525a

Browse files
author
iru
authored
feat!: Enable in org-ecs, cloudtrail-s3-sns-sqs ingestor (#103)
1 parent 9915c5d commit 396525a

35 files changed

+528
-333
lines changed

README.md

+6-2
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ Some components may vary, or may be deployed on different accounts (depending on
142142
This would be an overall schema of the **created resources**, for the default setup.
143143

144144
- Cloudtrail / SNS / S3 / SQS
145-
- SSM Parameter for Sysdig API Token Storage
145+
- SSM Parameter for Sysdig API Token Storage
146146
- Sysdig Workload: ECS / AppRunner creation (EKS is pre-required, not created)
147147
- each compute solution require a role to assume for execution
148148
- CodeBuild for on-demand image scanning
@@ -223,6 +223,10 @@ It may take some time, but you should see logs detecting the new image in the EC
223223

224224
## Troubleshooting
225225

226+
## Q-Networking: What's the requirements for the inbound/outbound connection?
227+
A: Refer to [Sysdig SASS Region and IP Ranges Documentation](https://docs.sysdig.com/en/docs/administration/saas-regions-and-ip-ranges/) to get Sysdig SaaS endpoint and allow both outbound (for compute vulnerability report) and inbound (for scheduled compliance checkups)
228+
<br/>ECS type deployment will create following [security-group setup](https://github.com/sysdiglabs/terraform-aws-secure-for-cloud/blob/master/modules/services/cloud-connector-ecs/sec-group.tf)
229+
226230
## Q-General: Need to modify cloud-connector config (to troubleshoot with `debug` loglevel, modify ingestors for testing, ...)
227231
A: both in ECS and AppRunner workload types, cloud-connector configuration is passed as a base64-encoded string through the env var `CONFIG`
228232
<br/>S: Get current value, decode it, edit the desired (ex.:`logging: debug` value), encode it again, and spin it again with this new definition.
@@ -245,7 +249,7 @@ A: Need to check several steps
245249

246250
### Q-AWS: In the ECS compute flavor of secure for cloud, I don't see any logs in the cloud-connector component
247251
A: This may be due to the task not beinb able to start, normally due not not having enough permissions to even fetch the secure apiToken, stored in the AWS SSM service.
248-
<br/>S: Access the task and see if there is any value in the "Stoped Reason" field.
252+
<br/>S: Access the task and see if there is any value in the "Stopped Reason" field.
249253

250254
### Q-AWS: Getting error "Error: failed creating ECS Task Definition: ClientException: No Fargate configuration exists for given values.
251255
A: Your ECS task_size values aren't valid for Fargate. Specifically, your mem_limit value is too big for the cpu_limit you specified

examples/organizational/README.md

+3-4
Original file line numberDiff line numberDiff line change
@@ -179,10 +179,8 @@ $ terraform apply
179179
|------|-------------|------|---------|:--------:|
180180
| <a name="input_sysdig_secure_for_cloud_member_account_id"></a> [sysdig\_secure\_for\_cloud\_member\_account\_id](#input\_sysdig\_secure\_for\_cloud\_member\_account\_id) | organizational member account where the secure-for-cloud workload is going to be deployed | `string` | n/a | yes |
181181
| <a name="input_benchmark_regions"></a> [benchmark\_regions](#input\_benchmark\_regions) | List of regions in which to run the benchmark. If empty, the task will contain all aws regions by default. | `list(string)` | `[]` | no |
182-
| <a name="input_cloudtrail_is_multi_region_trail"></a> [cloudtrail\_is\_multi\_region\_trail](#input\_cloudtrail\_is\_multi\_region\_trail) | true/false whether cloudtrail will ingest multiregional events. testing/economization purpose. | `bool` | `true` | no |
183-
| <a name="input_cloudtrail_kms_enable"></a> [cloudtrail\_kms\_enable](#input\_cloudtrail\_kms\_enable) | true/false whether cloudtrail delivered events to S3 should persist encrypted | `bool` | `true` | no |
184-
| <a name="input_cloudtrail_s3_arn"></a> [cloudtrail\_s3\_arn](#input\_cloudtrail\_s3\_arn) | ARN of a pre-existing cloudtrail\_sns s3 bucket. Used together with `cloudtrail_sns_arn`, `cloudtrail_s3_arn`. If it does not exist, it will be inferred from create cloudtrail | `string` | `"create"` | no |
185-
| <a name="input_cloudtrail_sns_arn"></a> [cloudtrail\_sns\_arn](#input\_cloudtrail\_sns\_arn) | ARN of a pre-existing cloudtrail\_sns. Used together with `cloudtrail_sns_arn`, `cloudtrail_s3_arn`. If it does not exist, it will be inferred from created cloudtrail. Providing an ARN requires permission to SNS:Subscribe, check ./modules/infrastructure/cloudtrail/sns\_permissions.tf block | `string` | `"create"` | no |
182+
| <a name="input_cloudtrail_is_multi_region_trail"></a> [cloudtrail\_is\_multi\_region\_trail](#input\_cloudtrail\_is\_multi\_region\_trail) | true/false whether the created cloudtrail will ingest multi-regional events. testing/economization purpose. | `bool` | `true` | no |
183+
| <a name="input_cloudtrail_kms_enable"></a> [cloudtrail\_kms\_enable](#input\_cloudtrail\_kms\_enable) | true/false whether the created cloudtrail should deliver encrypted events to s3 | `bool` | `true` | no |
186184
| <a name="input_connector_ecs_task_role_name"></a> [connector\_ecs\_task\_role\_name](#input\_connector\_ecs\_task\_role\_name) | Name for the ecs task role. This is only required to resolve cyclic dependency with organizational approach | `string` | `"organizational-ECSTaskRole"` | no |
187185
| <a name="input_deploy_benchmark"></a> [deploy\_benchmark](#input\_deploy\_benchmark) | Whether to deploy or not the cloud benchmarking | `bool` | `true` | no |
188186
| <a name="input_deploy_image_scanning_ecr"></a> [deploy\_image\_scanning\_ecr](#input\_deploy\_image\_scanning\_ecr) | true/false whether to deploy the image scanning on ECR pushed images | `bool` | `false` | no |
@@ -193,6 +191,7 @@ $ terraform apply
193191
| <a name="input_ecs_vpc_id"></a> [ecs\_vpc\_id](#input\_ecs\_vpc\_id) | ID of the VPC where the workload is to be deployed. Defaulted to be created when `ecs_cluster_name is not provided.` | `string` | `"create"` | no |
194192
| <a name="input_ecs_vpc_region_azs"></a> [ecs\_vpc\_region\_azs](#input\_ecs\_vpc\_region\_azs) | List of Availability Zones for ECS VPC creation. e.g.: ["apne1-az1", "apne1-az2"]. If defaulted, two of the default 'aws\_availability\_zones' datasource will be taken | `list(string)` | `[]` | no |
195193
| <a name="input_ecs_vpc_subnets_private_ids"></a> [ecs\_vpc\_subnets\_private\_ids](#input\_ecs\_vpc\_subnets\_private\_ids) | List of VPC subnets where workload is to be deployed. Defaulted to be created when `ecs_cluster_name is not provided.` | `list(string)` | `[]` | no |
194+
| <a name="input_existing_cloudtrail_config"></a> [existing\_cloudtrail\_config](#input\_existing\_cloudtrail\_config) | Optional block. If not set, a new cloudtrail, sns and sqs resources will be created<br/><br>If there's an existing cloudtrail, input mandatory attributes, and one of the 1, 2 or 3 grouped labeled optionals.<br><ul><br> <li>cloudtrail\_s3\_arn: Mandatory ARN of a pre-existing cloudtrail\_sns s3 bucket. Used together with `cloudtrail_sns_arn`, `cloudtrail_s3_arn`. If it does not exist, it will be inferred from create cloudtrail"</li><br> <li>cloudtrail\_sns\_arn: Optional 1. ARN of a pre-existing cloudtrail\_sns. Used together with `cloudtrail_sns_arn`, `cloudtrail_s3_arn`. If it does not exist, it will be inferred from created cloudtrail. Providing an ARN requires permission to SNS:Subscribe, check ./modules/infrastructure/cloudtrail/sns\_permissions.tf block</li><br> <li>cloudtrail\_s3\_role\_arn: Optional 2. ARN of the role to be assumed for S3 access. This role must be in the same account of the S3 bucket. Currently this setup is not compatible with organizational scanning feature</li><br> <li>cloudtrail\_s3\_sns\_sqs\_arn: Optional 3. ARN of the queue that will ingest events forwarded from an existing cloudtrail\_s3\_sns</li><br> <li>cloudtrail\_s3\_sns\_sqs\_url: Optional 3. URL of the queue that will ingest events forwarded from an existing cloudtrail\_s3\_sns<</li><br></ul> | <pre>object({<br> cloudtrail_s3_arn = optional(string)<br> cloudtrail_sns_arn = optional(string)<br> cloudtrail_s3_role_arn = optional(string)<br> cloudtrail_s3_sns_sqs_arn = optional(string)<br> cloudtrail_s3_sns_sqs_url = optional(string)<br> })</pre> | <pre>{<br> "cloudtrail_s3_arn": "create",<br> "cloudtrail_s3_role_arn": null,<br> "cloudtrail_s3_sns_sqs_arn": null,<br> "cloudtrail_s3_sns_sqs_url": null,<br> "cloudtrail_sns_arn": "create"<br>}</pre> | no |
196195
| <a name="input_name"></a> [name](#input\_name) | Name to be assigned to all child resources. A suffix may be added internally when required. Use default value unless you need to install multiple instances | `string` | `"sfc"` | no |
197196
| <a name="input_organizational_member_default_admin_role"></a> [organizational\_member\_default\_admin\_role](#input\_organizational\_member\_default\_admin\_role) | Default role created by AWS for management-account users to be able to admin member accounts.<br/>https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_accounts_access.html | `string` | `"OrganizationAccountAccessRole"` | no |
198197
| <a name="input_tags"></a> [tags](#input\_tags) | sysdig secure-for-cloud tags. always include 'product' default tag for resource-group proper functioning | `map(string)` | <pre>{<br> "product": "sysdig-secure-for-cloud"<br>}</pre> | no |

examples/organizational/cloudtrail.tf

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
locals {
2-
cloudtrail_deploy = var.cloudtrail_sns_arn == "create"
3-
cloudtrail_sns_arn = local.cloudtrail_deploy ? module.cloudtrail[0].sns_topic_arn : var.cloudtrail_sns_arn
4-
cloudtrail_s3_arn = local.cloudtrail_deploy ? module.cloudtrail[0].s3_bucket_arn : var.cloudtrail_s3_arn
2+
deploy_cloudtrail = var.existing_cloudtrail_config == null || var.existing_cloudtrail_config.cloudtrail_sns_arn == "create" || var.existing_cloudtrail_config.cloudtrail_sns_arn == null
3+
cloudtrail_sns_arn = local.deploy_cloudtrail ? module.cloudtrail[0].cloudtrail_sns_arn : var.existing_cloudtrail_config.cloudtrail_sns_arn
4+
cloudtrail_s3_arn = local.deploy_cloudtrail ? module.cloudtrail[0].s3_bucket_arn : var.existing_cloudtrail_config.cloudtrail_s3_arn
55
}
66

77

88
module "cloudtrail" {
9-
count = local.cloudtrail_deploy ? 1 : 0
9+
count = local.deploy_cloudtrail ? 1 : 0
1010
source = "../../modules/infrastructure/cloudtrail"
1111
name = var.name
1212

examples/organizational/main.tf

+7-2
Original file line numberDiff line numberDiff line change
@@ -69,15 +69,20 @@ module "cloud_connector" {
6969

7070
is_organizational = true
7171
organizational_config = {
72-
sysdig_secure_for_cloud_role_arn = module.secure_for_cloud_role.sysdig_secure_for_cloud_role_arn
72+
# see local.deploy_org_management_sysdig_role notes
73+
sysdig_secure_for_cloud_role_arn = local.deploy_org_management_sysdig_role ? module.secure_for_cloud_role[0].sysdig_secure_for_cloud_role_arn : var.existing_cloudtrail_config.cloudtrail_s3_role_arn
7374
organizational_role_per_account = var.organizational_member_default_admin_role
7475
connector_ecs_task_role_name = aws_iam_role.connector_ecs_task.name
7576
}
7677

7778
build_project_arn = length(module.codebuild) == 1 ? module.codebuild[0].project_arn : "na"
7879
build_project_name = length(module.codebuild) == 1 ? module.codebuild[0].project_name : "na"
7980

80-
sns_topic_arn = local.cloudtrail_sns_arn
81+
existing_cloudtrail_config = {
82+
cloudtrail_sns_arn = local.cloudtrail_sns_arn
83+
cloudtrail_s3_sns_sqs_url = var.existing_cloudtrail_config.cloudtrail_s3_sns_sqs_url
84+
cloudtrail_s3_sns_sqs_arn = var.existing_cloudtrail_config.cloudtrail_s3_sns_sqs_arn
85+
}
8186

8287
ecs_cluster_name = local.ecs_cluster_name
8388
ecs_vpc_id = local.ecs_vpc_id

examples/organizational/permissions.tf

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1+
locals {
2+
# only deploy org-management-account lvl role if scanning is deployed and we're not overriding S3Role
3+
# FIXME. main.tf#72 if scanning is activated, using 'cloudtrail_s3_role_arn' won't work, FR: need to provision 2 roles in cloud-connector
4+
deploy_org_management_sysdig_role = var.deploy_image_scanning_ecs || var.deploy_image_scanning_ecr || var.existing_cloudtrail_config.cloudtrail_s3_sns_sqs_arn == null
5+
}
6+
17
module "secure_for_cloud_role" {
8+
count = local.deploy_org_management_sysdig_role ? 1 : 0
29
source = "../../modules/infrastructure/permissions/org-role-ecs"
310
providers = {
411
aws.member = aws.member
@@ -18,7 +25,7 @@ module "secure_for_cloud_role" {
1825
# secure_for_cloud_role <-> ecs_role trust relationship
1926
# note:
2027
# - definition of a ROOT lvl secure_for_cloud_connector_ecs_tas_role to avoid cyclic dependencies
21-
# - duplicated in ../../modules/services/cloud-connector-ecs/ecs-service-security.tf
28+
# - duplicated in ../../modules/services/cloud-connector-ecs/permissions.tf
2229
# -----------------------------------------------------------------
2330
resource "aws_iam_role" "connector_ecs_task" {
2431
provider = aws.member

examples/organizational/variables.tf

+33-15
Original file line numberDiff line numberDiff line change
@@ -28,31 +28,49 @@ variable "organizational_member_default_admin_role" {
2828
#
2929
# cloudtrail configuration
3030
#
31-
32-
variable "cloudtrail_sns_arn" {
33-
type = string
34-
default = "create"
35-
description = "ARN of a pre-existing cloudtrail_sns. Used together with `cloudtrail_sns_arn`, `cloudtrail_s3_arn`. If it does not exist, it will be inferred from created cloudtrail. Providing an ARN requires permission to SNS:Subscribe, check ./modules/infrastructure/cloudtrail/sns_permissions.tf block"
36-
}
37-
38-
variable "cloudtrail_s3_arn" {
39-
type = string
40-
default = "create"
41-
description = "ARN of a pre-existing cloudtrail_sns s3 bucket. Used together with `cloudtrail_sns_arn`, `cloudtrail_s3_arn`. If it does not exist, it will be inferred from create cloudtrail"
42-
}
43-
4431
variable "cloudtrail_is_multi_region_trail" {
4532
type = bool
4633
default = true
47-
description = "true/false whether cloudtrail will ingest multiregional events. testing/economization purpose."
34+
description = "true/false whether the created cloudtrail will ingest multi-regional events. testing/economization purpose."
4835
}
4936

5037
variable "cloudtrail_kms_enable" {
5138
type = bool
5239
default = true
53-
description = "true/false whether cloudtrail delivered events to S3 should persist encrypted"
40+
description = "true/false whether the created cloudtrail should deliver encrypted events to s3"
41+
}
42+
43+
44+
variable "existing_cloudtrail_config" {
45+
type = object({
46+
cloudtrail_s3_arn = optional(string)
47+
cloudtrail_sns_arn = optional(string)
48+
cloudtrail_s3_role_arn = optional(string)
49+
cloudtrail_s3_sns_sqs_arn = optional(string)
50+
cloudtrail_s3_sns_sqs_url = optional(string)
51+
})
52+
default = {
53+
cloudtrail_s3_arn = "create"
54+
cloudtrail_sns_arn = "create"
55+
cloudtrail_s3_role_arn = null
56+
cloudtrail_s3_sns_sqs_arn = null
57+
cloudtrail_s3_sns_sqs_url = null
58+
}
59+
60+
description = <<-EOT
61+
Optional block. If not set, a new cloudtrail, sns and sqs resources will be created<br/>
62+
If there's an existing cloudtrail, input mandatory attributes, and one of the 1, 2 or 3 grouped labeled optionals.
63+
<ul>
64+
<li>cloudtrail_s3_arn: Mandatory ARN of a pre-existing cloudtrail_sns s3 bucket. Used together with `cloudtrail_sns_arn`, `cloudtrail_s3_arn`. If it does not exist, it will be inferred from create cloudtrail"</li>
65+
<li>cloudtrail_sns_arn: Optional 1. ARN of a pre-existing cloudtrail_sns. Used together with `cloudtrail_sns_arn`, `cloudtrail_s3_arn`. If it does not exist, it will be inferred from created cloudtrail. Providing an ARN requires permission to SNS:Subscribe, check ./modules/infrastructure/cloudtrail/sns_permissions.tf block</li>
66+
<li>cloudtrail_s3_role_arn: Optional 2. ARN of the role to be assumed for S3 access. This role must be in the same account of the S3 bucket. Currently this setup is not compatible with organizational scanning feature</li>
67+
<li>cloudtrail_s3_sns_sqs_arn: Optional 3. ARN of the queue that will ingest events forwarded from an existing cloudtrail_s3_sns</li>
68+
<li>cloudtrail_s3_sns_sqs_url: Optional 3. URL of the queue that will ingest events forwarded from an existing cloudtrail_s3_sns<</li>
69+
</ul>
70+
EOT
5471
}
5572

73+
5674
#
5775
# scanning configuration
5876
#

examples/organizational/versions.tf

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
terraform {
22
required_version = ">= 1.0.0"
3+
experiments = [module_variable_optional_attrs]
34
required_providers {
45
aws = {
56
version = ">= 4.0.0"

examples/single-account-apprunner/cloudtrail.tf

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
locals {
22
cloudtrail_deploy = var.cloudtrail_sns_arn == "create"
3-
cloudtrail_sns_arn = local.cloudtrail_deploy ? module.cloudtrail[0].sns_topic_arn : var.cloudtrail_sns_arn
3+
cloudtrail_sns_arn = local.cloudtrail_deploy ? module.cloudtrail[0].cloudtrail_sns_arn : var.cloudtrail_sns_arn
44
}
55

66
module "cloudtrail" {
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
output "cloudtrail_sns_topic_arn" {
2-
value = length(module.cloudtrail) > 0 ? module.cloudtrail[0].sns_topic_arn : var.cloudtrail_sns_arn
2+
value = length(module.cloudtrail) > 0 ? module.cloudtrail[0].cloudtrail_sns_arn : var.cloudtrail_sns_arn
33
description = "ARN of cloudtrail_sns topic"
44
}

examples/single-account-ecs/cloudtrail.tf

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
locals {
22
cloudtrail_deploy = var.cloudtrail_sns_arn == "create"
3-
cloudtrail_sns_arn = local.cloudtrail_deploy ? module.cloudtrail[0].sns_topic_arn : var.cloudtrail_sns_arn
3+
cloudtrail_sns_arn = local.cloudtrail_deploy ? module.cloudtrail[0].cloudtrail_sns_arn : var.cloudtrail_sns_arn
44
}
55

66
module "cloudtrail" {

examples/single-account-ecs/main.tf

+4-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,10 @@ module "cloud_connector" {
5151
build_project_arn = length(module.codebuild) == 1 ? module.codebuild[0].project_arn : "na"
5252
build_project_name = length(module.codebuild) == 1 ? module.codebuild[0].project_name : "na"
5353

54-
sns_topic_arn = local.cloudtrail_sns_arn
54+
existing_cloudtrail_config = {
55+
cloudtrail_sns_arn = local.cloudtrail_sns_arn
56+
}
57+
5558

5659
ecs_cluster_name = local.ecs_cluster_name
5760
ecs_vpc_id = local.ecs_vpc_id
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
output "cloudtrail_sns_topic_arn" {
2-
value = length(module.cloudtrail) > 0 ? module.cloudtrail[0].sns_topic_arn : var.cloudtrail_sns_arn
2+
value = length(module.cloudtrail) > 0 ? module.cloudtrail[0].cloudtrail_sns_arn : var.cloudtrail_sns_arn
33
description = "ARN of cloudtrail_sns topic"
44
}

examples/single-account-k8s/cloud-connector.tf

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ locals {
88
module "cloud_connector_sqs" {
99
source = "../../modules/infrastructure/sqs-sns-subscription"
1010

11-
name = var.name
12-
sns_topic_arn = local.cloudtrail_sns_arn
13-
tags = var.tags
11+
name = var.name
12+
cloudtrail_sns_arn = local.cloudtrail_sns_arn
13+
tags = var.tags
1414
}
1515

1616
module "codebuild" {

examples/single-account-k8s/cloudtrail.tf

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
locals {
22
cloudtrail_deploy = var.cloudtrail_sns_arn == "create"
3-
cloudtrail_sns_arn = var.cloudtrail_sns_arn == "create" ? module.cloudtrail[0].sns_topic_arn : var.cloudtrail_sns_arn
3+
cloudtrail_sns_arn = var.cloudtrail_sns_arn == "create" ? module.cloudtrail[0].cloudtrail_sns_arn : var.cloudtrail_sns_arn
44
}
55

66
module "cloudtrail" {

modules/infrastructure/cloudtrail/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ No modules.
5353

5454
| Name | Description |
5555
|------|-------------|
56+
| <a name="output_cloudtrail_sns_arn"></a> [cloudtrail\_sns\_arn](#output\_cloudtrail\_sns\_arn) | ARN of Cloudtrail SNS topic |
5657
| <a name="output_s3_bucket_arn"></a> [s3\_bucket\_arn](#output\_s3\_bucket\_arn) | ARN of Cloudtrail SNS topic |
57-
| <a name="output_sns_topic_arn"></a> [sns\_topic\_arn](#output\_sns\_topic\_arn) | ARN of Cloudtrail SNS topic |
5858
<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
5959

6060
## Authors

modules/infrastructure/cloudtrail/outputs.tf

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
output "sns_topic_arn" {
1+
output "cloudtrail_sns_arn" {
22
value = aws_sns_topic.cloudtrail.arn
33
description = "ARN of Cloudtrail SNS topic"
44
}

modules/infrastructure/cloudtrail_s3-sns-sqs/main.tf

+3-3
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ resource "aws_s3_bucket_notification" "bucket_notification" {
4747
# sqs
4848
# --------------------
4949
module "cloudtrail_s3_sns_sqs" {
50-
source = "../sqs-sns-subscription"
51-
name = "${var.name}-s3-sqs"
52-
sns_topic_arn = aws_sns_topic.s3_sns.arn
50+
source = "../sqs-sns-subscription"
51+
name = "${var.name}-s3-sqs"
52+
cloudtrail_sns_arn = aws_sns_topic.s3_sns.arn
5353

5454
tags = var.tags
5555
}

modules/infrastructure/permissions/org-role-ecs/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ The aim of this module is to manage the organizational **managed account** requi
77

88

99
## Permissions
10+
1011
* Threat-Detection feature
1112
* S3 Get and List permissions in order to fetch the events
1213
* SNS Subscription permissions in order to subscribe a topic to it

0 commit comments

Comments
 (0)