Skip to main content

Security Posture

Starter+Enterprise

Security Posture gives you a continuous, real-time view of the highest-risk security issues in your cloud environment. Unlike the Compliance module — which evaluates against formal benchmarks on a scheduled basis — Security Posture runs a live set of checks across IAM, S3, encryption, and network exposure, surfacing critical findings as they occur.


Severity Levels

Every finding in Security Posture is assigned a severity level based on the potential impact of exploitation.

SeverityColourDefinitionExample finding
CriticalRedImmediate risk of data exposure or account compromiseRoot account has an active access key
HighOrangeSignificant risk, exploitation likely without interventionS3 bucket with public read/write access
MediumYellowElevated risk, should be remediated within 30 daysSecurity group allows 0.0.0.0/0 on port 22
LowBlueBest-practice deviation, low immediate impactEBS volume not tagged with owner

The Security Posture dashboard opens on the Summary tab which shows a count of open findings at each severity level and a trend chart for the last 30 days.


IAM Misconfigurations

IAM findings cover the identity and access layer — the most common attack surface in AWS compromises.

Root account checks

CheckSeverityRemediation
Root account has active access keysCriticalDelete all root access keys via the cloud Console
Root account MFA not enabledCriticalEnable virtual or hardware MFA on the root account
Root account used in the last 30 daysHighInvestigate usage and restrict to break-glass scenarios

IAM user checks

CheckSeverityRemediation
Console user with no MFAHighEnforce MFA via an IAM condition key (aws:MultiFactorAuthPresent)
Access key older than 90 daysMediumRotate the access key; automate rotation with Secrets Manager
Access key unused for 45+ daysMediumDisable or delete the unused key
User with AdministratorAccess policyHighReplace with a least-privilege policy scoped to required actions
User with inline policy containing *:*CriticalRemove the wildcard policy; apply a managed policy with explicit allow statements

IAM role checks

CheckSeverityRemediation
Role with * in resource and actionHighScope the policy to specific resources and actions
Role assumable by any principal (Principal: *)CriticalAdd a condition key or restrict the principal to specific accounts
Cross-account role without external IDMediumAdd an sts:ExternalId condition to the trust policy

S3 Public Access Exposure

Public S3 misconfiguration is one of the most common causes of cloud data breaches. Calabi checks multiple layers of S3 access controls.

Bucket-level checks

CheckSeverityWhat Calabi evaluates
Public access block not enabledHighAll four BlockPublicAcls, IgnorePublicAcls, BlockPublicPolicy, RestrictPublicBuckets flags
Bucket ACL grants public readCriticalAllUsers or AuthenticatedUsers in the bucket ACL
Bucket policy allows Principal: *CriticalBucket resource policy with wildcard principal and no condition
Static website hosting enabledMediumwebsite_configuration is set — typically not intentional for data buckets
No default encryptionHighNo server_side_encryption_configuration on the bucket

Object-level checks

CheckSeverityNote
Object ACL grants public readHighObject-level ACLs can override bucket-level blocks in some configurations
Pre-signed URL expiry > 7 daysLowPre-signed URLs with long expiry increase exposure window

Encryption Checks

Calabi verifies that data at rest and in transit is encrypted across the most common AWS storage and database services.

Encryption at rest

ServiceCheckSeverity if failed
EBS volumesencrypted = falseHigh
RDS instancesstorage_encrypted = falseHigh
S3 bucketsNo default encryption configuredHigh
Secrets Manager secretsNo KMS key (using default AWS key only)Medium
SNS topicsNo server-side encryptionLow
SQS queuesNo server-side encryptionLow
EFS file systemsencrypted = falseHigh
Kinesis streamsencryption_type = NONEMedium

Encryption in transit

CheckSeverityRemediation
S3 bucket policy does not enforce HTTPS (aws:SecureTransport)MediumAdd a bucket policy statement that denies requests without aws:SecureTransport: true
Elastic Load Balancer listener on HTTP (port 80) without redirectHighAdd an HTTP-to-HTTPS redirect rule on the listener
RDS instance ca_certificate_identifier is rds-ca-2019 (expired)MediumUpdate to rds-ca-rsa2048-g1 or rds-ca-rsa4096-g1

Security Group Risk Analysis

Open inbound rules — especially those sourced from 0.0.0.0/0 or ::/0 — expose your resources to the internet.

High-risk port checks

Port / ProtocolFindingSeverity
22 (SSH) from 0.0.0.0/0SSH open to the internetCritical
3389 (RDP) from 0.0.0.0/0RDP open to the internetCritical
3306 (MySQL) from 0.0.0.0/0Database port open to the internetCritical
5432 (database) from 0.0.0.0/0Database port open to the internetCritical
1433 (MSSQL) from 0.0.0.0/0Database port open to the internetCritical
27017 (MongoDB) from 0.0.0.0/0Database port open to the internetCritical
0–65535 (all traffic) from 0.0.0.0/0All ports open to the internetCritical
80 / 443 from 0.0.0.0/0Web traffic open to the internetLow (expected for public-facing apps)

Unused security groups

Security groups that are not attached to any network interface or RDS instance are flagged as Low severity. They represent accumulated configuration debt and should be removed to simplify your security posture.


Remediation Workflow

Every finding in Security Posture follows the same remediation pattern:

  1. Find — The finding appears in the Security Posture dashboard with severity, resource ARN, and affected region.
  2. Understand — Click the finding to expand the full description, including the exact condition that triggered it.
  3. Act — Follow the inline remediation steps. Each step links to the relevant AWS documentation page.
  4. Verify — Click Re-check to immediately re-evaluate the specific resource. If the finding condition is resolved, the finding moves to Resolved status.
  5. Suppress (optional) — If a finding is intentional (e.g., a public-facing S3 bucket used for static website hosting), click Suppress and provide a justification. Suppressed findings are excluded from the severity count but remain in the audit log.

Example remediation: S3 bucket ACL grants public read

Finding:    S3 bucket 'my-company-data' ACL grants public read
Severity: Critical
Resource: arn:aws:s3:::my-company-data
Region: us-east-1

Remediation steps:
1. Open the S3 Console and navigate to 'my-company-data'.
2. Click the 'Permissions' tab.
3. Under 'Access control list (ACL)', click 'Edit'.
4. Remove the 'Everyone (public access)' grantee.
5. Under 'Block public access', enable all four checkboxes.
6. Click 'Save changes'.
7. Return to Calabi and click 'Re-check' to confirm the finding is resolved.

AWS Reference: https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html

Exporting Findings

FormatContentsHow to export
CSVAll open findings with severity, resource ARN, region, and check nameClick Export CSV on the Security Posture dashboard
JSONStructured finding data suitable for ingestion into a SIEMClick Export JSON on the Security Posture dashboard

Exports can be filtered by severity level, service category, or region before downloading.


  • Compliance — Run formal CIS, NIST, and AWS benchmark evaluations
  • Query Resources — Write custom SQL for ad-hoc security investigations
  • Configure — Set up alert channels for new Critical and High findings