Skip to content

Security

llms.txt lists every page for a coding agent.

RoleStackTrusted byCan reach
Backend task roleloom-backendecs-tasks.amazonaws.comEverything Loom’s backend calls, listed below
Backend execution roleloom-backendecs-tasks.amazonaws.comECR pull, log writes, the database secret and its KMS key
Frontend execution roleloom-frontendecs-tasks.amazonaws.comECR pull and log writes; the frontend has no task role, as in Loom’s template
Shared agent execution roleshared-foundationbedrock-agentcore.amazonaws.com, from this account onlyLoom v1.9.0 role.yaml’s statements for any agent, plus pull and read on this stack’s ECR repositories, artifact bucket and ECR key
Per-agent execution role…-agent-role-<agent>, from loom-agent-rolebedrock-agentcore.amazonaws.com, from this account onlyrole.yaml’s statements, with credential providers scoped to loom-<agent>-*
Assistant rolesloom-agentsAgentCoreThe chant-managed assistant’s runtime, gateway and Code Interpreter

Loom never creates or changes IAM itself (since v1.9.0). An agent deploys only with a role that already exists, is registered under Security > IAM roles, and is tagged into the caller’s group. Every role the backend may pass to AgentCore has to be named <project>-*, the backend’s iam:PassRole grant.

The per-agent role is how Loom intends roles to be used: one agent can’t read another’s OAuth or API-key credentials, and disabling one role stops one agent. Create an execution role per agent.

The provisioned role (buildRoles in src/composites/loom-backend.ts) ports Loom v1.9.0’s backend/iac/ecs.yaml TaskRole. A role you bring with LOOM_BACKEND_TASK_ROLE_ARN needs the same grants. <acct> is your account, <project> your LOOM_PROJECT.

PurposeActionsResource
Model invokebedrock:InvokeModel, InvokeModelWithResponseStream, CountTokensarn:aws:bedrock:*:*:inference-profile/*, arn:aws:bedrock:*::foundation-model/*
Model catalogbedrock:ListFoundationModels, ListInferenceProfiles*
Mantle-only models (invoke test)bedrock-mantle:CreateInference*
AgentCore data and control planebedrock-agentcore:*arn:aws:bedrock-agentcore:*:<acct>:*
Runtime versions and endpointsbedrock-agentcore:ListAgentRuntimeVersions, ListAgentRuntimeEndpoints* (no resource type in IAM)
Agent runtime lifecyclebedrock-agentcore-control:{Create,Get,Update,Delete}AgentRuntime[Endpoint], ListAgentRuntimeVersions, ListAgentRuntimeEndpointsarn:aws:bedrock-agentcore:*:<acct>:runtime/*
Evaluationsbedrock-agentcore:ListEvaluators, ListOnlineEvaluationConfigs, ListBatchEvaluations, GetBatchEvaluation* (no resource type in IAM)
bedrock-agentcore:Evaluate on AWS’s built-in evaluatorsarn:aws:bedrock-agentcore:*:aws:evaluator/*
logs:StartQuerylog-group:/aws/bedrock-agentcore/*, log-group:aws/spans
logs:GetQueryResults*
Agent Registryagent-registry:GetRegistry, {Create,Get,Update,Delete}RegistryRecord, ListRegistryRecords, SubmitRegistryRecordForApproval, UpdateRegistryRecordStatus, SearchDiscoverableRegistryRecordsarn:aws:agent-registry:*:<acct>:registry/*
VPC-mode agentsiam:CreateServiceLinkedRole with iam:AWSServiceName = network.bedrock-agentcore.amazonaws.comarn:aws:iam::<acct>:role/aws-service-role/network.bedrock-agentcore.amazonaws.com/AWSServiceRoleForBedrockAgentCoreNetwork
Agent roles (deploy, import)iam:PassRole, GetRole, ListRolePolicies, GetRolePolicy, ListRoleTags, ListAttachedRolePoliciesarn:aws:iam::<acct>:role/<project>-*
Agent log groupslogs:CreateLogGroup, DeleteLogGroup, CreateLogStream, PutLogEvents, FilterLogEvents, GetLogEvents, DescribeLogStreamslog-group:/aws/bedrock-agentcore/*, log-group:/aws/vendedlogs/bedrock-agentcore/*
Vended-log deliverylogs:PutDeliveryDestination, DeleteDeliveryDestination, PutDeliverySourcedelivery-destination:loom-*, delivery-source:loom-*
logs:CreateDelivery, DeleteDeliverydelivery:*
logs:DescribeDeliveries, DescribeLogGroups, DeleteDeliverySource*
App secretssecretsmanager:GetSecretValue, CreateSecret, DeleteSecret, PutSecretValuesecret:loom/*, secret:bedrock-agentcore-identity!*
Database secretsecretsmanager:GetSecretValue, kms:Decrypt, kms:GenerateDataKeyloom-db’s oRdsSecretArn and oSecretsKmsKeyArn
Artifactss3:GetObject, PutObject; s3:ListBucketthe artifact bucket’s objects; the bucket
Cognitocognito-idp:ListUserPools on *; AdminListGroupsForUser, ListUsers, ListUsersInGroup, ListGroups, AdminGetUser, DescribeUserPooluserpool/* in the deploy region

The loom/ and loom- prefixes are fixed in Loom’s code and don’t follow LOOM_PROJECT. The backend/task-role claim runs these pairs through the IAM policy simulator, and backend/deploy-agent deploys an agent through Loom as this role (Validation). To check a role you bring, run aws iam simulate-principal-policy --policy-source-arn <role arn> with the actions and resources in test/claims/backend/task-role.sh.

Loom and the schema migrations connect as the RDS master user, whose credentials are in loom-db’s credentials secret. SQL Yodeler’s plans, status and drift reports connect as loom_reader, a separate user whose password CloudFormation generates into loom-db’s reader secret (oRdsReaderSecretArn). It can read Loom’s tables and yodel’s history and nothing else: it owns no object, every session it opens is read-only, and yodel refuses a deployment whose reader and writer are the same user. just db reader creates it (Migrate Loom’s database).

FromToAllowed byDefault
ClientsALB, port 80 (light) or 443 (production tiers)ALB security group0.0.0.0/0; narrow it with LOOM_ALB_INGRESS_CIDR
ALBFrontend and backend tasksECS task security groupALB security group only
Backend tasksPostgres, port 5432Database security group10.0.0.0/8 as in Loom’s template; LOOM_DB_SOURCE_SG=true limits it to the ECS task security group
Schema migrations (just db)Postgres on the RDS instance, port 5432The tunnel host’s ingress rule on the database security groupOnly while the optional tunnel host is deployed; the session goes through Systems Manager, never a public endpoint
Private networksLoom, through PrivateLinkNLB and VPC endpoint serviceProduction tiers. Connections are accepted without a manual step; add principals to the endpoint service’s permissions to let other accounts connect
Backend tasksAWS APIs and Bedrock (bedrock-runtime, bedrock-mantle.<region>.api.aws)EgressPublic subnets on light; your NAT or endpoints on the production tiers
AgentsModels and toolsAgentCore network modePUBLIC on light, VPC in your private subnets on the production tiers

Light places tasks in public subnets with public IPs, because it builds no NAT. The production tiers place them in private subnets without public IPs.

A user’s scopes come from their cognito:groups: a type group (t-admin or t-user) and resource groups (g-admins-<x>, g-users-<x>). A resource is visible to the groups its loom:group tag names. Since Loom v1.9.0 a resource with no loom:group tag is visible to g-admins-super only. Approval policies carry no group and are visible to anyone with security:read.

The production tiers offer MFA (software token) on the pool and turn on deletion protection for the pool and the database. MFA defaults to OPTIONAL, not ON: Loom’s web app signs in with a username and password and can’t answer an MFA challenge, so a pool that requires MFA locks every user out of the page. LOOM_COGNITO_MFA=ON requires it when users reach Loom another way.

Workflow or OpCredentialsChanges
ci.ymlnoneNothing outside the runner
deploy.yml (and the GitLab and Forgejo deploy jobs)the production environment’s AWS credentialsEvery component stack; inert until DEPLOY=true
watch.ymlproduction environment, readWrites a run record to chant/lifecycle
reconcile.ymlproduction environment, read; GITHUB_TOKEN with contents: write and pull-requests: writeOpens a pull request; never changes the cloud
backup.yml, restore-drill.ymlproduction environmentAdds snapshots; the drill creates and deletes its own instance
cost-report.yml, audit.ymlnone for AWSNothing
loom-upgrade-*, loom-rotate-*, loom-restore, loom-teardownyours, run by a personStop at a gate before the change (Gated Ops)
loom-seed, loom-agent-roleyours, plus a Loom API tokenLoom’s database through its API; loom-agent-role also creates one IAM role stack