← All articles
Cloud Security 8 min read

Securing Amazon Bedrock: IAM, Data Boundaries, and Guardrails for GenAI on AWS

Generative AI on AWS runs on the same control plane as everything else in your account. Here is how to secure Amazon Bedrock with least-privilege IAM, private networking, invocation logging, and guardrails.

CloudDefender Team ·

Listen to article

Narrated by Andy

Download

When a team ships its first generative AI feature on AWS, the security conversation tends to focus entirely on the model: is it accurate, will it hallucinate, could someone jailbreak it. Those are real questions, but they obscure a simpler fact. Amazon Bedrock is an AWS service like any other. It is reached through IAM, it runs inside your account’s network boundary, it emits logs, and it touches data. That means it can be secured with the same controls you already apply to S3, Lambda, and every other service, and it should be, because a GenAI feature that is wired into your account carelessly is just a new way to expose the account.

The good news is that this reframing makes the problem tractable. You do not need a novel security model for AI. You need to apply your existing cloud security discipline, least privilege, network isolation, logging, and data governance, to a service that many teams rush into production without that discipline because it feels like a product feature rather than infrastructure. This article walks the four boundaries that matter.

Four boundaries around a Bedrock call1. Identity (IAM)Who can call InvokeModel, and whichspecific models. No wildcards.Scope by principal and model ARN.2. NetworkVPC endpoint (PrivateLink) keepstraffic off the public internet.Endpoint policy limits models.3. DataPrompts and outputs may hold PII.Classify, minimize, control whosees invocation logs.4. BehaviorModel invocation logging on.Guardrails filter in and out.CloudTrail for the control plane.
Bedrock security is your existing cloud security applied to one more service.

Boundary one: identity and least privilege

Access to Bedrock is governed by IAM, and the most important action to control is bedrock:InvokeModel (along with its streaming and agent variants). The common mistake is to grant it with a resource of *, allowing any principal that can reach Bedrock to invoke any model. That is the same anti-pattern as an S3 policy that grants access to every bucket, and it deserves the same scrutiny.

Scope invocation to the specific model ARNs a workload actually uses. A summarization feature that runs on one model family does not need permission to invoke every foundation model in the region. Scope it by principal too: the Lambda or container behind a feature should have its own role, not a shared one, so that its Bedrock access is auditable and revocable independently. Where you offer model choice, an IAM policy that lists the approved model ARNs becomes a governance control, ensuring teams cannot quietly adopt a model that has not been reviewed or approved for your data.

Bedrock also has a management surface beyond invocation: creating guardrails, provisioning throughput, managing custom models, and configuring logging. These control-plane actions should be separated from the runtime invocation permissions and restricted to administrators, following the same separation of duties you apply elsewhere. A feature’s runtime role should never be able to reconfigure the guardrails that constrain it.

Boundary two: keep the traffic private

By default, calls to Bedrock traverse a public AWS API endpoint. For workloads inside a VPC, you can and generally should route Bedrock traffic through an interface VPC endpoint powered by AWS PrivateLink, so requests never leave the AWS network. This is the same pattern you would use for any sensitive service, and it brings the same benefit: the data plane is not reachable from, or exposed to, the public internet.

The endpoint is also a policy enforcement point. A VPC endpoint policy can restrict which principals may use it and which models they may invoke, giving you a network-layer control that complements the IAM identity-layer control. Combined with security groups that limit which subnets can reach the endpoint, this keeps GenAI traffic inside a defined perimeter rather than flowing out through a NAT gateway to a public endpoint.

Boundary three: govern the data

Prompts and completions are data, and they are frequently more sensitive than teams assume. A prompt may carry customer records pulled in for context, internal documents fed to a retrieval system, or personal information a user pasted into a chat. Treating that data casually is where many GenAI features quietly create a compliance problem.

Start with what AWS itself commits to, because it removes one common fear: AWS states that content you submit to Bedrock is not used to train the underlying foundation models, is not shared with model providers, and stays within the region you call. That addresses the “is my data training someone else’s model” question. It does not, however, absolve you of governing the data on your side of the boundary.

The obligations that remain are yours. Minimize what you put in a prompt; do not stuff an entire customer record into context when a few fields will do. Classify the data your feature handles so you know whether it falls under a regime like GDPR or HIPAA, and configure accordingly. And treat invocation logs as sensitive: if you enable model invocation logging (and you should, for the reasons below), those logs contain the full prompts and responses, so the S3 bucket or CloudWatch log group that receives them needs encryption, tight access control, and a retention policy, exactly as you would protect any store of potentially personal data.

Boundary four: log and constrain behavior

You cannot secure what you cannot see, and Bedrock gives you two distinct visibility layers. CloudTrail captures the control-plane and management events: who invoked a model, who changed a guardrail, who provisioned throughput. Model invocation logging, configured separately, captures the data-plane detail of the requests and responses themselves, delivered to CloudWatch Logs or S3. Enable both. CloudTrail answers “who did what to the service,” and invocation logging answers “what was actually asked and returned,” which is what you need to investigate an incident or demonstrate compliance.

On the constraint side, Amazon Bedrock Guardrails let you define policies that filter both input and output: blocking disallowed topics, filtering harmful content, and detecting or redacting sensitive information such as personal identifiers before it reaches the model or the user. Guardrails are not a complete defense against a determined adversary, and they should not be your only control, but they provide a consistent, centrally-managed policy layer that applies regardless of how a given application was written. That consistency is valuable: it means a safety policy does not depend on every developer remembering to implement it.

Bringing it together with posture management

Each of these boundaries is a setting that can drift. An IAM policy gets loosened during a debugging session and never tightened. A new feature ships calling a public endpoint because someone forgot the VPC endpoint. Invocation logging is on in one region and off in another. Individually small, collectively these gaps are how a well-designed GenAI deployment degrades into an exposed one.

This is precisely the problem continuous cloud security posture management exists to solve, and Bedrock belongs in its scope. The same engine that checks whether your S3 buckets block public access and whether your IAM roles avoid wildcards can check whether Bedrock invocation logging is enabled, whether model access is scoped, and whether traffic is routed privately. Adding your GenAI services to posture monitoring, rather than treating them as a special case outside it, is what keeps the four boundaries intact over time.

Takeaway

Amazon Bedrock is not a security exception. It is a powerful AWS service that reads data, holds permissions, and runs in your account, which makes it exactly the kind of thing your existing controls were built for. Scope bedrock:InvokeModel to specific models and principals, keep traffic on PrivateLink, govern prompts and logs as the sensitive data they are, turn on both CloudTrail and invocation logging, and apply guardrails as a consistent policy layer. Then fold all of it into continuous posture management so the configuration cannot silently drift. Secure the service the way you secure the rest of your cloud, and generative AI stops being a new class of risk and becomes one more workload you already know how to defend.

CloudDefender

Defend your cloud. Continuously.

CloudDefender Suite gives security teams continuous posture management, threat detection, and compliance automation across AWS, Azure, and GCP — with zero false-positive fatigue.

Try CloudDefender →