> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tensor9.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Cross-Cloud IAM

> How AWS IAM in your application adapts to a customer's deployment target.

<Info>
  This page describes IAM resources that belong to **your application**: identities, roles, policies and the IAM API calls your application makes. The [Permissions Model](/byoc/fundamentals/permissions-model) describes access granted to the Tensor9 BYOC control plane. Installation documentation covers the appliance's cloud identity.
</Info>

Applications use cloud IAM to define who may call a service, which actions are allowed and which resources are in scope. Those definitions are specific to the origin cloud. A deployment on another cloud must preserve the application's authorization behavior even when the target uses a different identity system.

Tensor9 BYOC adapts AWS IAM through two [adaptation tiers](/byoc/service-adapters/overview#adaptation-tiers). The **[Infrastructure only adaptation tier](/byoc/service-adapters/overview#adaptation-tiers)** maps permissions declared in infrastructure to native grants during deployment. The **[Max adaptation tier](/byoc/service-adapters/overview#adaptation-tiers)** serves supported AWS IAM calls and evaluates the adapted policy inside each appliance.

<div className="t9-diagram-fit">
  <img className="t9-diagram-light" src="https://mintcdn.com/tensor9/vkb24_3RM9XRFZ_1/images/diagrams/cross-cloud-iam-overview-light.svg?fit=max&auto=format&n=vkb24_3RM9XRFZ_1&q=85&s=7f14be765875eb8fb282106ecb95656f" alt="AWS IAM passes through your IAM service adapter into Cedar, Google Cloud IAM or Azure RBAC." width="1000" height="420" data-path="images/diagrams/cross-cloud-iam-overview-light.svg" />

  <img className="t9-diagram-dark" src="https://mintcdn.com/tensor9/vkb24_3RM9XRFZ_1/images/diagrams/cross-cloud-iam-overview-dark.svg?fit=max&auto=format&n=vkb24_3RM9XRFZ_1&q=85&s=9153cf1f922df01e45e6834b0b563421" alt="AWS IAM passes through your IAM service adapter into Cedar, Google Cloud IAM or Azure RBAC." width="1000" height="420" data-path="images/diagrams/cross-cloud-iam-overview-dark.svg" />
</div>

## Origin and targets

This page covers an AWS origin stack: an application built for AWS, using AWS IAM, deployed to a customer running a different cloud. The IAM service adapter reads identities and policy statements from the AWS model, then applies the adaptation tier selected for the deployment. Infrastructure only emits grants in the target cloud's IAM system. Max retains an adapted policy model and authorizes requests inside the appliance.

Google Cloud, Azure and OCI are available as native-IAM targets, where deployment emits grants in that cloud's own IAM system. Private Kubernetes has no native cloud IAM to emit into, so it requires the [Max adaptation tier](/byoc/service-adapters/overview#adaptation-tiers), with [Cedar](https://cedarpolicy.com/en) evaluating the adapted policy inside the appliance. Cedar is also what evaluates your policies at Max on any of the other three.

## Policy compatibility

Before deployment, the IAM service adapter evaluates every statement in a policy document against the selected target. The document receives one of four outcomes:

| Outcome      | Deployment behavior                                                                                                                                                               |
| ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Faithful     | Deployment proceeds with the policy's restrictions intact.                                                                                                                        |
| Narrower     | Deployment proceeds and reports a recommendation. The workload receives less permission than requested and may fail at runtime.                                                   |
| **Wider**    | **Deployment is blocked by default.** You must accept the broader grant explicitly.                                                                                               |
| Incompatible | Deployment is refused because the target cannot express the policy. An acceptance cannot override this result. On the native-grant path, examples include `Deny` and `NotAction`. |

<div className="t9-diagram-fit">
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTc4IiB2aWV3Qm94PSIwIDAgODM2IDE3OCI+CiAgPHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPgogIDxkZWZzPgogICAgPG1hcmtlciBpZD0iYSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8iPgogICAgICA8cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz4KICAgIDwvbWFya2VyPgogIDwvZGVmcz4KICA8cmVjdCB4PSIyNCIgeT0iNjAiIHdpZHRoPSIyMjAiIGhlaWdodD0iNTgiIHJ4PSIxMCIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjY2JkNWUxIi8+CiAgPHRleHQgeD0iMTM0IiB5PSI4NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyI+QVdTIElBTSBwb2xpY3k8L3RleHQ+CiAgPHRleHQgeD0iMTM0IiB5PSIxMDMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTEiIGZpbGw9IiM2NDc0OGIiPmFzIHdyaXR0ZW4gaW4geW91ciBzdGFjazwvdGV4dD4KICA8cGF0aCBkPSJNMjQ0LDg5IEwyOTIsODkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgPHJlY3QgeD0iMzAwIiB5PSI2MCIgd2lkdGg9IjIzNiIgaGVpZ2h0PSI1OCIgcng9IjEwIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiLz4KICA8dGV4dCB4PSI0MTgiIHk9Ijg0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5JQU0gc2VydmljZSBhZGFwdGVyPC90ZXh0PgogIDx0ZXh0IHg9IjQxOCIgeT0iMTAzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjExIiBmaWxsPSIjNjQ3NDhiIj5hZGFwdHMgdGhlIHBvbGljeTwvdGV4dD4KICA8cGF0aCBkPSJNNTM2LDg5IEw1ODQsODkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgPHJlY3QgeD0iNTkyIiB5PSI2MCIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI1OCIgcng9IjEwIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiNjYmQ1ZTEiLz4KICA8dGV4dCB4PSI3MDIiIHk9Ijg0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5DZWRhciBvciBjbG91ZC1uYXRpdmUgSUFNPC90ZXh0PgogIDx0ZXh0IHg9IjcwMiIgeT0iMTAzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjExIiBmaWxsPSIjNjQ3NDhiIj5kZWNpZGVzIGVhY2ggcmVxdWVzdDwvdGV4dD4KPC9zdmc+Cg==" alt="For an AWS origin, an AWS IAM policy passes through your IAM service adapter and maps to Cedar or the target cloud's native IAM." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTc4IiB2aWV3Qm94PSIwIDAgODM2IDE3OCI+CiAgPHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPgogIDxkZWZzPgogICAgPG1hcmtlciBpZD0iYSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8iPgogICAgICA8cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz4KICAgIDwvbWFya2VyPgogIDwvZGVmcz4KICA8cmVjdCB4PSIyNCIgeT0iNjAiIHdpZHRoPSIyMjAiIGhlaWdodD0iNTgiIHJ4PSIxMCIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjNDE0ZTYyIi8+CiAgPHRleHQgeD0iMTM0IiB5PSI4NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyI+QVdTIElBTSBwb2xpY3k8L3RleHQ+CiAgPHRleHQgeD0iMTM0IiB5PSIxMDMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTEiIGZpbGw9IiNjOWNlZDgiPmFzIHdyaXR0ZW4gaW4geW91ciBzdGFjazwvdGV4dD4KICA8cGF0aCBkPSJNMjQ0LDg5IEwyOTIsODkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgPHJlY3QgeD0iMzAwIiB5PSI2MCIgd2lkdGg9IjIzNiIgaGVpZ2h0PSI1OCIgcng9IjEwIiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMwNTk2NjkiLz4KICA8dGV4dCB4PSI0MTgiIHk9Ijg0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5JQU0gc2VydmljZSBhZGFwdGVyPC90ZXh0PgogIDx0ZXh0IHg9IjQxOCIgeT0iMTAzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjExIiBmaWxsPSIjYzljZWQ4Ij5hZGFwdHMgdGhlIHBvbGljeTwvdGV4dD4KICA8cGF0aCBkPSJNNTM2LDg5IEw1ODQsODkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgPHJlY3QgeD0iNTkyIiB5PSI2MCIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI1OCIgcng9IjEwIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiM0MTRlNjIiLz4KICA8dGV4dCB4PSI3MDIiIHk9Ijg0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5DZWRhciBvciBjbG91ZC1uYXRpdmUgSUFNPC90ZXh0PgogIDx0ZXh0IHg9IjcwMiIgeT0iMTAzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjExIiBmaWxsPSIjYzljZWQ4Ij5kZWNpZGVzIGVhY2ggcmVxdWVzdDwvdGV4dD4KPC9zdmc+Cg==" alt="For an AWS origin, an AWS IAM policy passes through your IAM service adapter and maps to Cedar or the target cloud's native IAM." />
</div>

<p className="t9-caption">For an AWS origin, an accepted policy maps to Cedar for runtime authorization or to the target cloud's native IAM during deployment.</p>

A failure applies to the entire policy document. The adapter reports the document name and reason; it does not remove an unsupported statement and continue with the rest.

### Accept a broader grant

Only the Wider outcome can be accepted. At the **[Infrastructure only adaptation tier](/byoc/service-adapters/overview#adaptation-tiers)**, place the annotation immediately above the IAM resource whose target grant may be broader:

```hcl theme={null}
# This bucket-scoped grant may become project-scoped on the target cloud.
#@iam(compat='widen')
resource "aws_iam_role_policy" "object_access" {
  role = aws_iam_role.application.id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Effect   = "Allow"
      Action   = ["s3:GetObject", "s3:PutObject"]
      Resource = "arn:aws:s3:::application-data/*"
    }]
  })
}
```

The annotation applies to that resource. Other policies remain subject to the default block. Keeping the acceptance next to the policy also makes its owner and scope visible during code review.

At the **[Max adaptation tier](/byoc/service-adapters/overview#adaptation-tiers)**, the acceptance travels on the create request instead of through Terraform. Put the tuning entry in the request's `Tags` field. For example:

```bash theme={null}
aws iam create-role \
  --role-name application \
  --assume-role-policy-document file://trust-policy.json \
  --tags \
    Key='t9:tuning:<attribute>[.<subattribute>...]',Value='<string value>'
```

The key after `t9:tuning:` identifies the target attribute. Values are strings on the wire and are parsed into the corresponding native type. Lists use comma-delimited values without brackets, and maps are set one scalar entry at a time. Because the tag is part of the IAM create request, no separate configuration file or client protocol is required. Neither acceptance form can release an Incompatible policy.

### Policy forms that are refused

At Max, the following forms cause the complete policy document to fail:

| Policy form                                     | Reason                                                                                                          |
| ----------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
| `"Action": "s3:Get*"`                           | Declarable action groups are limited to `*` and `<prefix>:*`. `s3:*` is accepted; a narrower prefix is refused. |
| `"Action": ["s3:GetObject", "s3:List*"]`        | One statement combines exact and starred actions. Use separate statements.                                      |
| `NotAction`, `NotResource`, `NotPrincipal`      | The inverse match has no faithful equivalent.                                                                   |
| `"Principal": "*"`                              | The statement grants access to an unbounded principal set.                                                      |
| `"Principal": {"Service": "..."}`               | Service principals are not supported.                                                                           |
| A principal in another AWS account              | Concrete cross-account principals are refused.                                                                  |
| `${aws:username}` or another policy variable    | Policy-variable interpolation is not supported.                                                                 |
| A `?` wildcard                                  | Only `*` wildcards are supported.                                                                               |
| A condition key outside the supported set below | The adapter cannot reconstruct a value for the condition from the request.                                      |

### Supported condition keys

Five condition keys survive into the Cedar policies your adapter evaluates at runtime, and which of
them you get depends on the tier. At Infrastructure only there is a second, separate set: your
permissions become grants in the target cloud's own IAM, and each cloud expresses a different handful
of conditions. That per-cloud table is below, and it is not a subset of these five.

| Condition key                                           | Max       | Infrastructure only |
| ------------------------------------------------------- | --------- | ------------------- |
| `aws:CurrentTime`                                       | Supported | Supported           |
| `aws:EpochTime`                                         | Supported | Refused             |
| `route53:ChangeResourceRecordSetsNormalizedRecordNames` | Supported | Refused             |
| `route53:ChangeResourceRecordSetsRecordTypes`           | Supported | Refused             |
| `route53:ChangeResourceRecordSetsActions`               | Supported | Refused             |

The split is about **where the policy is evaluated**, not about the tier you bought. A condition can only be
checked if something can supply its value at the moment of the decision.

The appliance evaluating a request as it serves it has the request in hand, so it can reconstruct the three
Route 53 keys from the change batch. That is the Max column. A policy compiled into target-cloud grants at
deployment time has no request to read, so only the clock keys survive; that is the Infrastructure-only
column, and it also applies to a policy you declare in Terraform even on a Max deployment, because that
policy goes through the compiler on its way in. If you declare a Route 53 condition in your stack today,
expect the compiler to refuse it whichever tier you are on.

At Infrastructure only your permissions become grants in the target cloud's own IAM at deployment time, and
each cloud carries its own small set of expressible conditions:

| Target       | Conditions it can express                                                                   |
| ------------ | ------------------------------------------------------------------------------------------- |
| Google Cloud | `aws:CurrentTime` with a relational date comparison, as a CEL expression on the binding     |
| Azure        | `aws:CurrentTime` with a relational date comparison                                         |
| OCI          | `aws:CurrentTime`, `aws:RequestedRegion`, `aws:userid`, `aws:username`, `aws:PrincipalType` |

A policy whose conditions fall outside the column that applies does not deploy without the condition. Which
refusal you get follows the same axis: a policy your application submits at runtime fails as a whole document,
and a policy you declare in your stack reaches the widen gate described under
[Accept a broader grant](#accept-a-broader-grant), where the grant is blocked because dropping the condition
would widen it, and deploys only if you accept that widening with `#@iam(compat='widen')`. That is true of a
declared policy on a Max deployment as much as on an Infrastructure-only one, because a declared policy is
compiled either way. The default is the safe direction in both: a condition silently dropped is a grant wider
than the one you wrote.

Every condition key outside the two tables above is refused, including the ones an application is most
likely to use.
Attribute-based access control is unavailable in the Cedar runtime: conditions that depend on
`aws:PrincipalTag`, session tags, `aws:SourceIp`, `aws:PrincipalOrgID` or `aws:SecureTransport` cause the
complete document to fail, as do `aws:PrincipalArn`, `aws:SourceVpc` and service-specific keys such as
`s3:x-amz-acl`. Role tags are stored but are not used during authorization.

Note that OCI's native IAM does express three principal attributes (`aws:userid`, `aws:username` and
`aws:PrincipalType`) when your policy is compiled into its grants. That is not a Cedar capability and it
does not make ABAC available at Max; it is what that one target cloud can say for itself.

The runtime catalog does not contain AWS-managed policy documents. Replace a reference such as `AmazonS3ReadOnlyAccess` with a customer-managed policy that uses supported action forms.

## Cedar runtime authorization

This section describes the Cedar authorization destination: your AWS policies adapted to Cedar and evaluated inside the appliance, whichever cloud that appliance runs in.

At Max, each receiving service adapter verifies the signed AWS request. The principal and resource are synthesized from ARNs in that request and passed to Cedar with the adapted policy set. Cedar applies explicit-deny-wins semantics: a matching deny overrides an allow, and a request with no matching allow is denied.

<div className="t9-diagram-fit">
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjI2IiB2aWV3Qm94PSIwIDAgODM2IDIyNiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPjxkZWZzPjxtYXJrZXIgaWQ9ImEiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj48L2RlZnM+PHJlY3QgeD0iMjQiIHk9IjYwIiB3aWR0aD0iMTg2IiBoZWlnaHQ9IjU4IiByeD0iMTAiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iI2NiZDVlMSIvPjx0ZXh0IHg9IjExNyIgeT0iODQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiMzMzQxNTUiPlNpZ25lZCBBV1MgcmVxdWVzdDwvdGV4dD48dGV4dCB4PSIxMTciIHk9IjEwMyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMSIgZmlsbD0iIzY0NzQ4YiI+c2Vzc2lvbiBjcmVkZW50aWFsczwvdGV4dD48cGF0aCBkPSJNMjEwLDg5IEwyNDAsODkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+PHJlY3QgeD0iMjQ4IiB5PSI2MCIgd2lkdGg9IjIxNCIgaGVpZ2h0PSI1OCIgcng9IjEwIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiLz48dGV4dCB4PSIzNTUiIHk9Ijg0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMzM0MTU1Ij5QcmluY2lwYWwgYW5kIHJlc291cmNlPC90ZXh0Pjx0ZXh0IHg9IjM1NSIgeT0iMTAzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjExIiBmaWxsPSIjNjQ3NDhiIj5zeW50aGVzaXplZCBmcm9tIHRoZSByZXF1ZXN0PC90ZXh0PjxwYXRoIGQ9Ik00NjIsODkgTDQ5Miw4OSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYSkiLz48cmVjdCB4PSI1MDAiIHk9IjYwIiB3aWR0aD0iMTkyIiBoZWlnaHQ9IjU4IiByeD0iMTAiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzA1OTY2OSIvPjx0ZXh0IHg9IjU5NiIgeT0iODQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiMzMzQxNTUiPkNlZGFyIGV2YWx1YXRlczwvdGV4dD48dGV4dCB4PSI1OTYiIHk9IjEwMyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMSIgZmlsbD0iIzY0NzQ4YiI+ZXhwbGljaXQgZGVueSB3aW5zPC90ZXh0PjxwYXRoIGQ9Ik02OTIsODkgTDcyMiw4OSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYSkiLz48dGV4dCB4PSI3MzAiIHk9Ijg2IiBmb250LXNpemU9IjEyIiBmaWxsPSIjNjQ3NDhiIj5BbGxvd2VkPC90ZXh0Pjx0ZXh0IHg9IjczMCIgeT0iMTA0IiBmb250LXNpemU9IjEyIiBmaWxsPSIjNjQ3NDhiIj5vciBkZW5pZWQ8L3RleHQ+PHBhdGggZD0iTTM1NSwxMTggTDM1NSwxNjYgTDQwNCwxNjYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtZGFzaGFycmF5PSI1IDQiIG1hcmtlci1lbmQ9InVybCgjYSkiLz48dGV4dCB4PSI0MTQiIHk9IjE2MyIgZm9udC1zaXplPSIxMiIgZmlsbD0iIzY0NzQ4YiI+Q2Fubm90IGJlIHN5bnRoZXNpemVkPC90ZXh0Pjx0ZXh0IHg9IjQxNCIgeT0iMTgxIiBmb250LXNpemU9IjExIiBmaWxsPSIjNjQ3NDhiIj50aGUgcmVxdWVzdCBpcyBkZW5pZWQ8L3RleHQ+PC9zdmc+" alt="A signed request has its principal and resource synthesized from the request itself, then Cedar evaluates the adapted policies. A request whose principal or resource cannot be synthesized is denied." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjI2IiB2aWV3Qm94PSIwIDAgODM2IDIyNiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPjxkZWZzPjxtYXJrZXIgaWQ9ImEiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj48L2RlZnM+PHJlY3QgeD0iMjQiIHk9IjYwIiB3aWR0aD0iMTg2IiBoZWlnaHQ9IjU4IiByeD0iMTAiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzQxNGU2MiIvPjx0ZXh0IHg9IjExNyIgeT0iODQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiNjYmQ1ZTEiPlNpZ25lZCBBV1MgcmVxdWVzdDwvdGV4dD48dGV4dCB4PSIxMTciIHk9IjEwMyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMSIgZmlsbD0iI2M5Y2VkOCI+c2Vzc2lvbiBjcmVkZW50aWFsczwvdGV4dD48cGF0aCBkPSJNMjEwLDg5IEwyNDAsODkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+PHJlY3QgeD0iMjQ4IiB5PSI2MCIgd2lkdGg9IjIxNCIgaGVpZ2h0PSI1OCIgcng9IjEwIiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMwNTk2NjkiLz48dGV4dCB4PSIzNTUiIHk9Ijg0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmaWxsPSIjY2JkNWUxIj5QcmluY2lwYWwgYW5kIHJlc291cmNlPC90ZXh0Pjx0ZXh0IHg9IjM1NSIgeT0iMTAzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjExIiBmaWxsPSIjYzljZWQ4Ij5zeW50aGVzaXplZCBmcm9tIHRoZSByZXF1ZXN0PC90ZXh0PjxwYXRoIGQ9Ik00NjIsODkgTDQ5Miw4OSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYSkiLz48cmVjdCB4PSI1MDAiIHk9IjYwIiB3aWR0aD0iMTkyIiBoZWlnaHQ9IjU4IiByeD0iMTAiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIvPjx0ZXh0IHg9IjU5NiIgeT0iODQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiNjYmQ1ZTEiPkNlZGFyIGV2YWx1YXRlczwvdGV4dD48dGV4dCB4PSI1OTYiIHk9IjEwMyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMSIgZmlsbD0iI2M5Y2VkOCI+ZXhwbGljaXQgZGVueSB3aW5zPC90ZXh0PjxwYXRoIGQ9Ik02OTIsODkgTDcyMiw4OSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYSkiLz48dGV4dCB4PSI3MzAiIHk9Ijg2IiBmb250LXNpemU9IjEyIiBmaWxsPSIjYzljZWQ4Ij5BbGxvd2VkPC90ZXh0Pjx0ZXh0IHg9IjczMCIgeT0iMTA0IiBmb250LXNpemU9IjEyIiBmaWxsPSIjYzljZWQ4Ij5vciBkZW5pZWQ8L3RleHQ+PHBhdGggZD0iTTM1NSwxMTggTDM1NSwxNjYgTDQwNCwxNjYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtZGFzaGFycmF5PSI1IDQiIG1hcmtlci1lbmQ9InVybCgjYSkiLz48dGV4dCB4PSI0MTQiIHk9IjE2MyIgZm9udC1zaXplPSIxMiIgZmlsbD0iI2M5Y2VkOCI+Q2Fubm90IGJlIHN5bnRoZXNpemVkPC90ZXh0Pjx0ZXh0IHg9IjQxNCIgeT0iMTgxIiBmb250LXNpemU9IjExIiBmaWxsPSIjYzljZWQ4Ij50aGUgcmVxdWVzdCBpcyBkZW5pZWQ8L3RleHQ+PC9zdmc+" alt="A signed request has its principal and resource synthesized from the request itself, then Cedar evaluates the adapted policies. A request whose principal or resource cannot be synthesized is denied." />
</div>

<p className="t9-caption">The request supplies the principal and resource used for authorization. A request that cannot supply either value is denied.</p>

For example, consider a signed `GetObject` request. The receiving S3 adapter verifies the signature, derives the caller and object ARN from the request, and asks Cedar whether the adapted policy allows `s3:GetObject`. A matching deny rejects the call even if another statement allows it. With no matching allow, Cedar also rejects the call.

No directory lookup occurs during this evaluation. Each entity has an ARN attribute, so a policy cannot depend on principal or network attributes that are absent from the request. Actions outside the receiving adapter's service catalog are denied.

Production adapters enforce the decision. Report-only mode is available before cutover: calls that enforcement would deny are recorded and allowed to continue. This setting belongs to each receiving adapter, which lets services move to enforcement independently. If the appliance has not received a policy set, enforcement denies the request.

## Adaptation tiers

The tiers differ in when authorization is decided and whether the application can call the AWS IAM API at runtime.

|                        | [Max adaptation tier](/byoc/service-adapters/overview#adaptation-tiers) | [Infrastructure only adaptation tier](/byoc/service-adapters/overview#adaptation-tiers) |
| ---------------------- | ----------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
| IAM administration API | Supported AWS IAM operations are served inside the appliance            | IAM administration operations are not served                                            |
| Authorization decision | Cedar, inside the appliance                                             | Target cloud's native IAM                                                               |
| Policy location        | Adapted policy set in each appliance                                    | Native grants in the target cloud                                                       |
| Available targets      | Google Cloud, Azure, OCI and Private Kubernetes                         | Google Cloud, Azure and OCI                                                             |

Infrastructure only fits applications whose infrastructure declares all required permissions and that do not administer IAM at runtime. Max is required when the application makes supported AWS IAM administration calls after deployment. It is also required on Private Kubernetes, which has no native IAM to translate grants into.

Tier selection is made from the origin stack and target cloud. The service adapter analysis identifies the services and policy constructs that determine the result.

## Cedar IAM behavior

Everything below applies wherever Cedar is the authorization destination, whichever cloud the appliance runs in. The AWS names in it, such as ARNs and `AssumeRole`, come from the origin model your application still speaks, not from the target cloud.

### Policy synchronization

Each appliance maintains its own policy set. Changes are checked about every 30 seconds, although that interval is not a propagation deadline. There is no fixed upper bound for revocation to take effect.

When the policy source is unavailable, the appliance continues to use its last-known-good policy set and reports that the data is stale. The policy does not expire automatically. A change applied to one appliance has no effect on another.

### Accounts and root credentials

Account IDs in adapted ARNs identify logical accounts within an appliance. The ARN spelling is inherited from the origin model and names nothing in AWS: these do not create AWS accounts or billing relationships, and AWS Organizations policies do not apply.

Each appliance issues one long-lived access key and secret for the logical account root, and shows the secret once. Because this principal has unrestricted access and the IAM API cannot rotate its credential, store it with the controls used for the appliance's most privileged secret.

### API coverage and logging

Each appliance serves 50 origin-model IAM administration operations for roles, customer-managed policies, instance profiles and OIDC providers. It also serves `GetCallerIdentity`, `AssumeRole` and `AssumeRoleWithWebIdentity`. A role's trust policy controls session creation; deleting the role invalidates its sessions.

Allowed calls are absent from the per-request audit log. Diagnostics contain denied calls and report-only findings.

## Cedar IAM limitations

These limitations apply to your AWS policies adapted to Cedar at the [Max adaptation tier](/byoc/service-adapters/overview#adaptation-tiers). They are properties of that adaptation, not of any one target cloud. The [AWS IAM service adapter](/byoc/service-adapters/aws/security-identity/aws-iam) provides operation-by-operation coverage.

| Limitation                                                   | Effect                                                                                                                                                                                      |
| ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Attribute-based access control                               | `aws:PrincipalTag`, session tags, `aws:SourceIp`, `aws:PrincipalOrgID` and `aws:SecureTransport` are unsupported. A policy that uses one fails as a complete document.                      |
| Permissions boundaries                                       | Boundaries are not enforced. Creating a role with one is rejected unless the loss is acknowledged explicitly.                                                                               |
| AWS-managed policies                                         | Their documents are not supplied by the runtime catalog. Re-author them as customer-managed policies.                                                                                       |
| Resource-based policies                                      | General resource-policy evaluation is unavailable.                                                                                                                                          |
| Organizations SCPs                                           | Service control policies are not enforced.                                                                                                                                                  |
| Users, groups, access-key administration and SAML federation | These IAM families are not served.                                                                                                                                                          |
| Audit records for allowed calls                              | Diagnostics do not record each allowed call or identify the matching policy statement.                                                                                                      |
| Access Analyzer, credential reports and Access Advisor       | These features are unavailable.                                                                                                                                                             |
| `SimulateCustomPolicy`                                       | The IAM administration endpoint does not implement this operation. `SimulatePrincipalPolicy` is limited to the workload-identity endpoint, its configured principal and concrete resources. |

`AssumeRole` does not accept role chaining, session policies, `ExternalId` or MFA inputs. A design that depends on `ExternalId` for confused-deputy protection must provide that protection elsewhere.

Cross-account role assumption is supported between configured logical accounts when both the caller's policy and the target role's trust policy allow it. A policy document that names a concrete principal from another AWS account is refused.

## Related topics

* [**Adapter Errors**](/byoc/fundamentals/adapter-errors): Telling an authorization denial apart from a backing-store refusal when a call fails
* [**AWS IAM service adapter**](/byoc/service-adapters/aws/security-identity/aws-iam): Coverage for each supported IAM and STS operation
* [**Permissions Model**](/byoc/fundamentals/permissions-model): Access granted to the Tensor9 BYOC control plane inside a customer's environment
* [**Security Model**](/byoc/fundamentals/security-model): Trust relationships between Tensor9 BYOC, you and your customer
* [**Service Adapters**](/byoc/service-adapters/catalog): Supported services and target-cloud mappings
