From a505838649f1216cd6627824780e57da960e523d Mon Sep 17 00:00:00 2001 From: Ravina Dhruve <136399755+ravinadhruve10@users.noreply.github.com> Date: Mon, 26 Aug 2024 12:14:02 -0700 Subject: [PATCH] Support for Modular Agentless Scanning for Volume access (org) (#10) Change summary: ---------------- - Added the respective tf file for Org onboarding case - Added test example for scanning (org) - Updated the self-managed stacksets during org onboarding to skip creation with delegated_admin conditional check - Updated the README - Added top-level README Testing: -------- Validated the changes with org onboarding of actual OU with mgmt account on AWS. --- README.md | 94 ++++++- modules/agentless-scanning/README.md | 5 + modules/agentless-scanning/main.tf | 51 +++- modules/agentless-scanning/organizational.tf | 249 ++++++++++++++++++ .../organization/agentless_scanning.tf | 20 ++ 5 files changed, 404 insertions(+), 15 deletions(-) create mode 100644 modules/agentless-scanning/organizational.tf create mode 100644 test/examples/organization/agentless_scanning.tf diff --git a/README.md b/README.md index 8f8b299..45260b5 100644 --- a/README.md +++ b/README.md @@ -1 +1,93 @@ -# terraform-aws-secure \ No newline at end of file +# Sysdig Secure for Cloud in AWS + +Terraform module that deploys the [**Sysdig Secure for Cloud** stack in **AWS**](https://docs.sysdig.com/en/docs/installation/sysdig-secure-for-cloud/deploy-sysdig-secure-for-cloud-on-aws). +
+ +With Modular Onboarding, introducing the following design and install structure for `terraform-aws-secure`: + +* **[Onboarding]**: It onboards an AWS Account or Organization for the first time to Sysdig Secure for Cloud, and collects +inventory and organizational hierarchy in the given AWS Organization. Managed through `onboarding` module.
+ +Provides unified threat-detection, compliance, forensics and analysis through these major components: + +* **[CSPM](https://docs.sysdig.com/en/docs/sysdig-secure/posture/)**: It evaluates periodically your cloud configuration, using Cloud Custodian, against some benchmarks and returns the results and remediation you need to fix. Managed through `config-posture` module.
+ +* **[CDR (Cloud Detection and Response)](https://docs.sysdig.com/en/docs/sysdig-secure/insights/)**: It sends periodically activity logs to Sysdig by directing those to a dedicated Event Bridge which will be queried by the Sysdig backend to retrieve the data for log ingestion. Enabled via `event-bridge` integrations module.
+ +* **[Vulnerability Management Agentless Scanning](https://docs.sysdig.com/en/docs/sysdig-secure/vulnerabilities/)**: It uses disk snapshots to provide highly accurate views of vulnerability risk, access to public exploits, and risk management. Managed through `agentless-scanning` module.
+ +For other Cloud providers check: [GCP](https://github.com/draios/terraform-google-secure-for-cloud), [Azure](https://github.com/draios/terraform-azurerm-secure-for-cloud) + +
+ +## Modules + +### Feature modules + +These are independent feature modules which deploy and manage all the required Cloud resources and Sysdig resources +for the respective Sysdig features. They manage both, onboarding a single AWS Account or an AWS Organization to Sysdig Secure for Cloud. + +`onboarding`, `config-posture` and `agentless-scanning` are independent feature modules. + +### Integrations + +The modules under `integrations` are feature agnostic modules which deploy and manage all the required Cloud resources and Sysdig resources +for shared Sysdig integrations. That is to say, one or more Sysdig features can be enabled by installing an integration. + +These modules manage both, onboarding a single AWS Account or an AWS Organization to Sysdig Secure for Cloud. + +`event-bridge` is an integration module. + +## Examples and usage + +The modules in this repository can be installed on a single AWS account, or on an entire AWS Organization, or organizational units within the org. + +The `test` directory has sample `examples` for all these module deployments i.e under `single_account`, or `organization` sub-folders. + +For example, to onboard a single AWS account, with CSPM enabled, with modular installation :- +1. Run the terraform snippet under `test/examples/single_account/onboarding_with_posture.tf` with + the appropriate attribute values populated. +2. This will install the `onboarding` module, which will also create a Cloud Account on Sysdig side. +3. It will also install the `config-posture` module, which will also install cloud resources as well as Sysdig resources + for successfully running CSPM scans. +4. On Sysdig side, you will be able to see the Cloud account onboarded with required components, and CSPM feature installed and enabled. + +To run this example you need have your [aws master-account profile configured in CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) and to execute: +```terraform +$ terraform init +$ terraform plan +$ terraform apply +``` + +Notice that: +* This example will create resources that cost money.
Run `terraform destroy` when you don't need them anymore +* All created resources will be created within the tags `product:sysdig-secure-for-cloud`, within the resource-group `sysdig-secure-for-cloud` + +
+ +## Best practices + +For contributing to existing modules or adding new modules, below are some of the best practices recommended :- +* Module names referred and used in deployment snippets should be consistent with those in their source path. +* A module can fall into one of two categories - feature module or an integrations module. +* Every user-facing deployment snippet will, + - at the top level first call the feature module or integrations module from this repo. These modules deploy corresponding cloud resources and Sysdig component resources. + - the corresponding feature resource will be added as the last block and enabled from the module installed component resource reference. + See sample deployment snippets in `test/examples` for more. +* integrations modules are shared and could enable multiple features. Hence, one should be careful with changes to them. +* Module naming follows the pattern with "-" , resource and variable naming follows the pattern with "_". + + +## Troubleshooting + +### Q: I'm not able to see Cloud Identity & Access Management (CIEM) results +A: Make sure you installed both [onboarding](https://github.com/draios/terraform-aws-secure/tree/master/modules/onboarding) and [event-bridge](https://github.com/draios/terraform-aws-secure/tree/master/modules/integrations/event-bridge) modules + + +## Authors + +Module is maintained and supported by [Sysdig](https://sysdig.com). + +## License + +Apache 2 Licensed. See LICENSE for full details. diff --git a/modules/agentless-scanning/README.md b/modules/agentless-scanning/README.md index 9284531..aa557e8 100644 --- a/modules/agentless-scanning/README.md +++ b/modules/agentless-scanning/README.md @@ -44,6 +44,10 @@ No modules. | [aws_cloudformation_stack_set_instance.primary_acc_stackset_instance](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudformation_stack_set_instance) | resource | | [sysdig_secure_cloud_auth_account_component.aws_scanning_role](https://registry.terraform.io/providers/sysdiglabs/sysdig/latest/docs/resources/secure_cloud_auth_account_component) | resource | | [sysdig_secure_cloud_auth_account_component.aws_crypto_key](https://registry.terraform.io/providers/sysdiglabs/sysdig/latest/docs/resources/secure_cloud_auth_account_component) | resource | +| [aws_cloudformation_stack_set.scanning_role_stackset](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudformation_stack_set) | resource | +| [aws_cloudformation_stack_set_instance.scanning_role_stackset_instance](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudformation_stack_set_instance) | resource | +| [aws_cloudformation_stack_set.ou_resources_stackset](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudformation_stack_set) | resource | +| [aws_cloudformation_stack_set_instance.ou_stackset_instance](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudformation_stack_set_instance) | resource | | [aws_iam_policy_document.scanning](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document) | data source | | [aws_iam_policy_document.scanning_assume_role_policy](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document) | data source | | [aws_iam_policy_document.kms_operations](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document) | data source | @@ -51,6 +55,7 @@ No modules. | [aws_iam_session_context.current](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_session_context) | data source | | [sysdig_secure_trusted_cloud_identity.trusted_identity](https://registry.terraform.io/providers/sysdiglabs/sysdig/latest/docs/data-sources/secure_trusted_cloud_identity) | data source | | [sysdig_secure_tenant_external_id.external_id](https://registry.terraform.io/providers/sysdiglabs/sysdig/latest/docs/data-sources/secure_tenant_external_id) | data source | +| [aws_organizations_organization.org](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/organizations_organization) | data source | ## Inputs diff --git a/modules/agentless-scanning/main.tf b/modules/agentless-scanning/main.tf index e14a638..e565458 100644 --- a/modules/agentless-scanning/main.tf +++ b/modules/agentless-scanning/main.tf @@ -69,7 +69,8 @@ resource "random_id" "suffix" { # IAM Policy Document used by Stackset roles for the KMS operations policy data "aws_iam_policy_document" "kms_operations" { - count = !var.auto_create_stackset_roles ? 0 : 1 + # skip in org case if delegated_admin is used + count = (var.is_organizational && var.delegated_admin) || !var.auto_create_stackset_roles ? 0 : 1 statement { sid = "KmsOperationsAccess" @@ -84,9 +85,11 @@ data "aws_iam_policy_document" "kms_operations" { } resource "aws_iam_role" "scanning_stackset_admin_role" { - count = !var.auto_create_stackset_roles ? 0 : 1 - name = "AWSCloudFormationStackSetAdministrationRoleForScanning" - tags = var.tags + # skip resource creation in org case if delegated_admin is used + count = (var.is_organizational && var.delegated_admin) || !var.auto_create_stackset_roles ? 0 : 1 + + name = "AWSCloudFormationStackSetAdministrationRoleForScanning" + tags = var.tags assume_role_policy = <