Integrations and automated evidence are typically managed by workspace admins.
See Evidence & audits for how automated evidence fits
alongside manual evidence.
What it’s used for
Keldyn uses the data it reads from AWS to keep evidence for environment separation, access boundaries, network edge, encryption, backups, redundancy, auto-scaling, and monitoring current. Each daily refresh updates the evidence and the freshness status shown on the integration’s Controls covered table. The integration contributes evidence to these SOC 2 controls:Full coverage means the data is the artifact the control asks for.
Partial coverage means the data usefully contributes but does not, on its
own, replace everything the control requires (for example, Backup policy
still needs the approved policy document). Keldyn labels partial coverage in
the auto-generated evidence so it isn’t mistaken for complete coverage.
System redundancy reflects Multi-AZ configuration, not a tested failover.
Auto-scaling configuration reflects that capacity is configured to scale,
not a load-tested outcome. Critical data encryption at rest does not
prove your KMS key-rotation policy. Network monitoring alerts still needs
your incident register as the response record. Segregated change
environments needs an explicitly identified production environment and a
named non-production environment — untagged accounts and VPCs are treated as
unknown, not as production. See Tag environments for separation
evidence.
Before you begin
1
Use an AWS IAM administrator
Creating the role and attaching policies requires
iam:CreateRole,
iam:AttachRolePolicy, iam:PutRolePolicy, and permission to edit the
role trust policy. You do not need to share any AWS access keys with
Keldyn.2
Plan a stable role name
The connect screen uses
KeldynEvidence as the example. Using that name
is recommended so the role is easy to find later. Any role name works as
long as you paste the full ARN back into Keldyn.3
Keldyn only ever reads
Attach SecurityAudit, ViewOnlyAccess, and a small AWS Backup read
grant. Keldyn never creates, updates, or deletes resources in your account.
Set up the integration
Do this in order: copy the values from Keldyn, create the role in AWS, then paste the role ARN back. Keldyn verifies the role by assuming it once before the connection is saved.1
Open Integrations
In the Keldyn web app, go to Integrations and select AWS.
2
Copy the Keldyn account ID and External ID
The connect card shows three values you will put on the role:
- Keldyn AWS account ID — the AWS account the role must trust.
- External ID — unique to your Keldyn organization. Do not reuse another team’s External ID.
- Trust-policy JSON — a ready-to-paste snippet that already includes both values.
3
Create the IAM role in AWS
In the IAM roles console,
select Create role.
- Trusted entity type: Custom trust policy.
- Paste the trust-policy JSON from Keldyn. It must allow
sts:AssumeRolefor the Keldyn principal and includests:ExternalIdset to your organization’s External ID. A role that can be assumed without that External ID is rejected (confused-deputy protection). - Name the role
KeldynEvidence(recommended) and create it.
4
Attach the read-only policies
Open the new role → Permissions and attach:Do not attach AdministratorAccess, PowerUserAccess, or any write policy.
- AWS managed policy SecurityAudit.
- AWS managed policy ViewOnlyAccess.
- A custom inline policy for AWS Backup reads (those APIs are not fully covered by the two managed policies):
5
Paste the role ARN and connect
Copy the role ARN (it looks like
arn:aws:iam::123456789012:role/KeldynEvidence) into IAM role ARN on
the Keldyn AWS page and select Connect. Keldyn assumes the role once
to verify trust and permissions, stores only { role ARN, External ID },
and discards the session.6
Run the first sync
Select Sync now to pull evidence immediately, or wait for the next
scheduled daily refresh. Controls covered and Evidence sources
then show what was collected and how fresh it is.
Trust policy (what Keldyn shows you)
The snippet on the connect card matches this shape. Use the live values from Keldyn — do not invent an External ID.AWS CLI alternative
If you prefer the CLI, copy the account ID and External ID from Keldyn first, then:ViewOnlyAccess is a job-function policy. Its ARN is
arn:aws:iam::aws:policy/job-function/ViewOnlyAccess. In the console it
still appears as ViewOnlyAccess.Tag environments for separation evidence
Segregated change environments only passes when Keldyn can see production and a named non-production environment (development or preview / test / staging). Untagged resources are recorded asunknown,
not assumed to be production.
Keldyn looks at account aliases, AWS Organizations account names (when
readable), and VPC names plus these tags:
If this AWS account is in an organization, granting the role
organizations:ListAccounts (typically only possible on the management
account) lets Keldyn use member-account names as extra separation evidence.
From a member account that call is denied; that is expected and is not a
sync failure. Keldyn then relies on this account’s alias and VPC tags.
Keldyn assumes only the role you paste. It does not assume into other
member accounts. Connect each account you want evidenced as its own
connection if you need per-account coverage.
What data Keldyn collects and why
Keldyn requests read-only access and never writes to your AWS account. It collects only the data below, and only to build control evidence. Regional APIs are read in every enabled region.Keldyn does not collect object contents, secret values, or KMS plaintext.
A missing Multi-AZ setting, an HTTP listener, or a security group that
allows
0.0.0.0/0 or ::/0 on all ports, SSH (22), or RDP (3389) is
recorded as real (unfavorable) evidence — not a sync failure.Authentication
Keldyn authenticates with cross-accountsts:AssumeRole plus your
organization’s External ID. That is the same third-party pattern AWS
documents for vendors.
- You never paste access keys.
- Session credentials last about an hour and are never stored.
- Disconnecting in Keldyn, or deleting/updating the role so AssumeRole fails, immediately stops further reads.
Permissions Keldyn uses
These are the reads that matter for evidence. The two managed policies plus the Backup grant cover them; you do not need to attach each API by hand.Troubleshooting “Access required”
A control shows Access required (or stays unknown) when the role cannot read the matching data in every enabled region. Common causes:- SecurityAudit or ViewOnlyAccess is missing.
- The Backup inline policy is missing, which blocks backup-plan, job, and restore-test evidence.
- A service-control policy (SCP) or permissions boundary denies a read in some regions. Incomplete regional coverage keeps the control from passing on a partial snapshot.
- Load-balancer listeners are unreadable
(
elasticloadbalancing:DescribeListeners), so encryption-in-transit cannot be proven. - An S3 bucket encryption policy cannot be read in the bucket’s own region.
- AWS Organizations
ListAccountsis denied (normal on a member account). Environment-separation then depends on this account’s alias and VPC tags.
- The role ARN is wrong, renamed, or deleted.
- The trust policy principal does not match the Keldyn account shown on the connect card.
- The
sts:ExternalIdcondition is missing or does not match the External ID on the connect card. - The role can be assumed without an External ID — Keldyn refuses that configuration. Add the condition and connect again.
Keeping evidence current
Keldyn refreshes AWS evidence automatically each day. Evidence that hasn’t refreshed within its expected cadence is marked stale, and failed pulls are marked failed so you can spot gaps. You can also trigger an immediate refresh at any time with Sync now. AWS ages out some history on its own (for example, Auto Scaling activity is kept for about six weeks, and Backup job lists are bounded). Keldyn accumulates backup jobs, restore tests, scaling activity, and alarm/GuardDuty history rather than replacing them on each refresh, so a record captured while it was live stays available for an audit period longer than AWS’s own retention window. The first sync after connecting shows only what AWS still holds.Next steps
Evidence & audits
Learn how automated integration evidence works alongside manual evidence and
audits.