Connect an AWS account
The IAM role created by CloudFormation template or an access key, the content analysis options, AWS Organizations and what Ctadel reads.
This page describes how to give Ctadel access to an AWS account: read permissions for the inventory and the configuration, and, for the content analyses, permissions to create and delete ephemeral resources, which the template grants by default and which you can refuse option by option. It then describes what the collector reads.
Two ways to authenticate
| Mode | What you create | What Ctadel keeps |
|---|---|---|
| "Assume a role (recommended)" | An IAM role in your account, from the CloudFormation template we provide, with an external ID. | The role ARN and the external ID. No permanent secret; deleting the role cuts the access. |
| "Access key" | An IAM user and its access key. | The key, encrypted. It never expires on its own. |
In both cases, the collector checks the identity it obtained with sts:GetCallerIdentity at the start of each scan and derives the account number from it if you did not enter one.
Creating the role with the CloudFormation template
The CloudFormation template aws-ctadel-role.yaml is handed to you by the Ctadel team. Deploy it in every account to scan:
aws cloudformation deploy \
--template-file aws-ctadel-role.yaml \
--stack-name ctadel-scanner \
--capabilities CAPABILITY_NAMED_IAM \
--parameter-overrides \
CtadelPrincipalArn=<ARN_GIVEN_BY_CTADEL> \
ExternalId=<EXTERNAL_ID>The created role carries the managed policies SecurityAudit and job-function/ViewOnlyAccess, plus a read policy CtadelReadExtras for what those two do not cover: the IAM credential report (root account and key hygiene), Shield, load balancer TLS policies, Lambda function code and configuration, ECR repository and EFS file system policies, EKS access entries, transit gateway attachments, Resolver query logging, the Bedrock and SageMaker inventory, and service-specific credentials.
The trust policy accepts only the principal of your Ctadel instance, and only when the call carries the external ID.
Template parameters
| Parameter | Default | Purpose |
|---|---|---|
CtadelPrincipalArn | none | The IAM principal of your instance, given to you by the Ctadel team. |
ExternalId | none | Shared secret, at least eight characters. Generate it in Ctadel ("Generate" button) and use the same value here. |
RoleName | CtadelScanner | Name of the role. Keep the same name in every account of an organisation. |
MaxSessionSeconds | 43200 | Maximum session length, 3600 to 43200 seconds. A full inventory of a large account exceeds one hour. |
EnableDiskScanning | true | Volume snapshot, copy, temporary scanner machine in your account. |
EnableSSMTransport | false | Drive the scanner machine through AWS Systems Manager instead of SSH: no public address, no inbound rule. Creates an instance profile. |
ScannerArtifactBucket | empty | With SSM, a bucket of your account where the scanner binary is staged under ctadel-scanner/ and then removed. |
EnableDatabaseScanning | true | Temporary copy of an RDS database from a snapshot, read then deleted. |
EnableBucketScanning | true | Reading S3 objects (s3:GetObject), and kms:Decrypt through S3 for objects encrypted with a managed key. Objects read up to 10 MB each. |
EnableKubernetesAccess | true | Ctadel registers itself as an EKS access entry. Set false if you create the access yourself. |
EnableRuntimeEvents | true | Consumption of an SQS queue of CloudTrail notifications. Used by log-based detection, under internal validation and not available to customers. |
With the default values, the role created is therefore not a read-only role: EnableDiskScanning and EnableDatabaseScanning add the creation of snapshots, volumes, instances, key pairs, security groups and temporary RDS instances. Set them to false for a role limited to reading; the inventory, the configuration and bucket reading stay complete, only disks and databases are no longer read. The write permissions these options grant are bounded: deletions (volumes, snapshots, instances, database copy) apply only to resources tagged ctadel-managed=true, and the role can set that tag only while creating a resource. With EnableSSMTransport, commands can only target instances carrying that tag.
The template outputs give RoleArn (to paste into Ctadel), ScannerInstanceProfileName (with SSM) and EnabledCapabilities, a summary of the chosen options.
Declaring the account in Ctadel
- Open "Settings", tab "Integrations", sub-tab "Cloud Providers", then "Add account" on the Amazon Web Services row.
- Enter a "Label".
- Under "How Ctadel authenticates", keep "Assume a role (recommended)".
- Click "Generate" next to "External ID", then deploy the template with that value.
- Paste the
RoleArnoutput into "Role ARN". - Click "Discover": Ctadel assumes the role and lists the account, or the accounts of the organisation.
- Click "Create", or "Add the N accounts" if several were discovered.
At the start of each scan, Ctadel assumes the role with the external ID and obtains temporary credentials, used for the inventory and the content analyses. The requested session lasts twelve hours; one hour if the role refuses.
If you switch mode later, the stored credentials are replaced: fill in every field of the new mode.
Access key mode
Create an IAM user, attach SecurityAudit and ViewOnlyAccess, and add the actions listed under CtadelReadExtras in the template for the same coverage. Choose "Access key" in the dialog and fill in "Access Key" and "Secret Key". The content analysis options then correspond to the CtadelDiskScanning, CtadelDatabaseScanning, CtadelBucketScanning and CtadelKubernetesAccess policies of the template, to reproduce on the user.
A whole organisation
If the role is deployed in the management account and may call organizations:ListAccounts, "Discover" returns every active account of the organisation. Ctadel expects a role of the same name in each member account, which a StackSet deployment of the template produces; "Add the N accounts" creates one entry per account with the matching ARN. Without that permission, discovery falls back to the role's own account.
What the collector reads
The collector enumerates the account's enabled regions with ec2:DescribeRegions; if that call fails, it falls back to a fixed list of seventeen regions. Global services (IAM, CloudFront, Route 53) are read in us-east-1.
| Family | Resources read |
|---|---|
| Account and identities | Account alias, IAM users, groups, roles and policies, credential report, service-specific credentials, EKS access entries, Cognito user pools. |
| Compute | EC2 instances, security groups, EBS volumes and snapshots, Elastic IPs, Auto Scaling groups, Lightsail, Lambda functions and layers, ECS, ECR, EKS clusters and node groups. |
| Network | VPCs and peering, transit gateway attachments, Route 53 and Resolver logging, load balancers, CloudFront, API Gateway and its integrations, WAF, Shield, ACM certificates. |
| Storage and data | S3 buckets, EFS, RDS instances and clusters, DynamoDB, ElastiCache, OpenSearch, Athena, Glue, EMR, AWS Backup. |
| Security and logging | CloudTrail trails, CloudWatch filters and alarms, EventBridge rules, AWS Config recorders and delivery channels, GuardDuty, Security Hub, KMS keys, Secrets Manager, SNS and SQS. |
| AI | Bedrock (agents, guardrails, models, knowledge bases, logging) and SageMaker (notebooks, endpoint configurations, models, domains). |
| Other | Amplify, CodeBuild. |
A region the account has not enabled, that a service control policy denies, or in which a service has no endpoint, is skipped for that service. If some collectors fail, the account goes to the "Partial scan" state with the number of failed collectors; what was read is kept.
Limitations
- Detection on CloudTrail logs (
EnableRuntimeEventsoption, SQS queue) is under internal validation and is not available to customers. You may leave the option atfalse. - The Ctadel principal ARN (
CtadelPrincipalArn) is not shown in the interface; the Ctadel team gives it to you. - If
ec2:DescribeRegionsfails, only the seventeen regions of the fallback list are read. - S3 objects larger than 10 MB are not read.
- Without
lambda:GetFunction, Lambda function code is not read, only its configuration. - In a member account that cannot call
organizations:ListAccounts, a Lambda layer published by another account of the organisation stays of unknown origin. - Disk analysis requires a network path to the scanner machine: a public address by default, a private subnet with peering or VPN, or SSM transport. See Scanner settings.
- On the disk copy, host compliance checks that need a running system are reported as skipped; see Hosts.