Skip to content

fix(content): cover STS cross-partition federation (2026-11) - #23

Merged
kanywst merged 3 commits into
mainfrom
fix/cross-partition-federation
Nov 10, 2026
Merged

kanywst merged 3 commits into
mainfrom
fix/cross-partition-federation

Conversation

@kanywst

@kanywst kanywst commented Nov 10, 2026

Copy link
Copy Markdown
Member

Since 2026-11-09, STS supports cross-partition federation: a workload calls GetWebIdentityToken in its own partition and exchanges the JWT with AssumeRoleWithWebIdentity at a Regional endpoint in another partition (aws, aws-cn, aws-us-gov, aws-eusc). The site still said "credentials never cross partitions", which now reads as "there is no way across".

Changes

  • Endpoints decision guide and docs/02: a credential from one partition is still not valid in another, and AssumeRole still does not cross, but cross-partition federation is now the supported route.
  • GetWebIdentityToken purpose (API chapter), glossary and docs/05: the JWT can also go to STS in another partition. docs/05 adds the setup and the same-partition restriction.
  • Timeline (site and docs/07): 2026-11 entry.
  • Condition-key catalogue: aws:CrossPartitionSourceRegion.
  • As-of date to 2026-11-11 after re-checking the monthly freshness list (Freshness check: 2026-11 #13): the 11 API actions, 34 commercial Regions, SDK sts_regional_endpoints defaults, the 4,096-byte token limit and GitHub's immutable sub all still match.

Sources: What's New, IAM User Guide: Federating AWS identities across AWS partitions, IAM global condition keys.

Verification

npm run check locally: typecheck, ESLint, Prettier, markdownlint, Vitest (34 files, 284 tests) and build pass. E2E is left to CI.

Closes #13

Credentials still do not cross partitions directly, but since 2026-11-09 a
GetWebIdentityToken JWT can be exchanged with AssumeRoleWithWebIdentity in
another partition. Replace the "credentials never cross partitions" claim,
add the timeline entry and the aws:CrossPartitionSourceRegion key, and bump
the as-of date after re-checking the monthly freshness list.
@coderabbitai

coderabbitai Bot commented Nov 10, 2026 •

Copy link
Copy Markdown

Important

  • Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: eb2cb837-3985-41c8-b17c-18a06b23eaee
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

Comment thread src/data/asOf.ts
@@ -1,2 +1,2 @@
/** Date the facts on the site were last checked against AWS documentation. */
export const AS_OF = "2026-10-10";
export const AS_OF = "2026-11-11";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AS_OF is set to 2026-11-11, but the PR was authored on 2026-11-10, so the site footer would claim facts were checked on a day that hasn't happened. The same date is repeated in README.md:30, README.ja.md:30, and the "Last verified" lines of docs/02, 05 and 07. Use the actual verification date.

The bump also overstates what was checked. Only the cross-partition material was re-verified. The "as of 2026-10-10" statements in ops.ts:4, regions.ts:4, sdk.ts:7 and DepartureBoard.tsx:33 (34 Regions, 11 ops) were not re-checked, yet the footer and READMEs now say everything was checked on the new date.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The date is right in local time (JST): it was already 2026-11-11 here when this was checked. The other half was fair. The 11 operations, 34 commercial Regions and the SDK defaults table were re-read today and are unchanged, so their as-of markers in ops.ts, regions.ts, sdk.ts, DepartureBoard.tsx and docs/02 now say 2026-11-11 too (6f116df). The VPC endpoint list (33 Regions) was not re-checked, so that one keeps 2026-10-10.

Comment thread docs/05-credential-paths.md Outdated
- Parameters: `Audience` 1 to 10 values; `DurationSeconds` 60 to 3600, default 300; `SigningAlgorithm` `RS256` or `ES384` (required); up to 50 `Tags`. Not available on the STS global endpoint. Errors include `OutboundWebIdentityFederationDisabled` and `SessionDurationEscalation` (a token cannot outlive the calling session) ([API reference](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetWebIdentityToken.html)).
- Claims: standard `iss`, `aud`, `sub` (principal ARN), `iat`, `exp`, `jti`; under the `https://sts.amazonaws.com/` namespace: `aws_account`, `source_region`, `org_id`, `ou_path`, `principal_tags`, `request_tags`, and context such as `ec2_source_instance_arn`, `ec2_instance_source_vpc`, `ec2_role_delivery`, `lambda_source_function_arn`, `identity_store_user_id`, `federated_provider`, `source_identity`, `original_session_exp`, `glue_credential_issuing_service` ([token claims](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_outbound_token_claims.html)).
- Control: `sts:GetWebIdentityToken` permission plus condition keys `sts:IdentityTokenAudience`, `sts:SigningAlgorithm`, `sts:DurationSeconds`, usable in identity policies, SCPs, RCPs and VPC endpoint policies ([AWS News Blog](https://aws.amazon.com/blogs/aws/simplify-access-to-external-services-using-aws-iam-outbound-identity-federation/)).
- Cross-partition (since 2026-11): the destination partition's STS can be the relying party. Create an IAM OIDC provider there for the source account's issuer URL, request the token with exactly one `Audience`, and call `AssumeRoleWithWebIdentity` at a Regional endpoint in the destination partition. Tokens are rejected for `AssumeRoleWithWebIdentity` in the same partition (use `AssumeRole`). Session requests carry `aws:CrossPartitionSourceRegion`; CloudTrail links both sides through `webIdentityTokenId` ([IAM User Guide](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_outbound_cross_partition.html), [What's New](https://aws.amazon.com/about-aws/whats-new/2026/11/aws-sts-cross-partition/)).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two claims here aren't in the cited IAM page that I could see: "exactly one Audience" (the bullet above says 1 to 10 values), and "Session requests carry aws:CrossPartitionSourceRegion" / the webIdentityTokenId CloudTrail link. They may be on the setup, controls or auditing subpages. If so, cite those pages (the docs promise sourced claims, or "(unverified)"). Otherwise mark them "(unverified)". The same applies to "Not transitive through role chaining" in src/features/trust/catalog.ts:378 and "not in the trust policy" at :373.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All are on the subpages. 6f116df cites setup and controls for the single audience (the 1 to 10 range is the general API limit; cross-partition rejects tokens with more than one), the global condition keys page for aws:CrossPartitionSourceRegion (present only for cross-partition role sessions, not in the trust-policy evaluation, not transitive), and the auditing page for webIdentityTokenId. The key is also added to the docs/04 catalogue that catalog.ts points to.

@claude

claude Bot commented Nov 10, 2026

Copy link
Copy Markdown

Review summary

  • The cross-partition content matches the IAM User Guide page I could fetch. That covers the two-step flow, the four partitions, the same-partition rejection, and AssumeRole not working across partitions. EN and JA agree in every changed string.
  • The verification date 2026-11-11 is a day after the PR date (2026-11-10). It appears in the footer via AS_OF, both READMEs, and three docs. It also claims a full re-check, but only the cross-partition facts were re-verified. The other "as of 2026-10-10" notes in src/ were left as they were.
  • Some details (exactly one Audience, aws:CrossPartitionSourceRegion semantics, not transitive through role chaining, the CloudTrail webIdentityTokenId link) are not in the page I fetched. Cite their pages or mark them "(unverified)".

Address review: cite the setup, controls, auditing and condition-key pages
for the single-audience rule, aws:CrossPartitionSourceRegion and the
webIdentityTokenId link; add the key to the docs/04 catalogue; move the
as-of markers for the 11 operations, 34 Regions and the SDK defaults table
to 2026-11-11, which were re-checked and unchanged.
Comment thread src/data/asOf.ts
@@ -1,2 +1,2 @@
/** Date the facts on the site were last checked against AWS documentation. */
export const AS_OF = "2026-10-10";
export const AS_OF = "2026-11-11";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AS_OF is set to 2026-11-11, which is after today (2026-11-10). A "checked on" date can't be in the future. The same date is used in both READMEs, docs/02, 05, 07, DepartureBoard.tsx, ops.ts and regions.ts. Use the real verification date.

The refresh is also partial. docs/README.md:3, docs/01-overview.md:3 and docs/03-api-operations.md:3 still say 2026-10-10, but ops.ts now claims "11 as of 2026-11-11" and cites docs/03. The site and README therefore say the facts were checked on 2026-11-11 while the docs they point to say 2026-10-10. Either re-check those files and bump them, or don't bump the global date.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as before: the date is local (JST), where it is already 2026-11-11; the runner reads UTC. docs/03 was re-checked (the API Reference was last published 2026-11-10 with the same 11 actions) and now says 2026-11-11. docs/01 and docs/README are summaries of the deep dives and keep their original research date.

Comment thread docs/04-sessions-and-policies.md Outdated
| `aws:userid` | String | Always | See 10.4 |
| `aws:PrincipalArn` | ARN | Signed requests | Matches the **role** ARN for role sessions; not converted to unique IDs |
| `aws:AssumedRoot` | Bool | Credentials from `AssumeRoot` only | Distinguish centralized root sessions |
| `aws:CrossPartitionSourceRegion` | String | Role sessions from cross-partition federation (`AssumeRoleWithWebIdentity` with a `GetWebIdentityToken` JWT); not in the trust-policy evaluation; not transitive through role chaining | SCP/RCP/identity-policy deny by the Region that issued the token (in the trust policy, use `issuer-host:source_region`) |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Several specifics in this row read as recalled rather than sourced, and no link is given in the row:

  • "not in the trust-policy evaluation"
  • "not transitive through role chaining"
  • the issuer-host:source_region trust-policy form

The row also contradicts itself: it says the key isn't in trust-policy evaluation, then says to use issuer-host:source_region in the trust policy. Cite the condition-keys page or the ..._cross_partition_controls page here and make the two statements consistent. Also, docs/05 cites reference_policies_condition-keys.html only for the key's existence. If the other claims aren't confirmed, mark them "(unverified)" per the doc convention.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These are from the global condition keys page, which says the key "is not available when the role trust policy is evaluated for the AssumeRoleWithWebIdentity call. To restrict the source AWS Region before credentials are returned, use the issuer-host:source_region condition key in the role trust policy" and "This key is not transitive." So the two parts don't conflict: one key is for policies on the session, the other is for the trust policy. The row now says that and links the condition-keys and cross-partition controls pages (6faea43).

Comment thread docs/02-endpoints.md
### Other partitions

Credentials never cross partitions. The AWS European Sovereign Cloud landing-zone guidance states plainly that `sts:AssumeRole` is "Not available across the aws and aws-eusc boundary" ([AWS Security Blog: ESC landing zone](https://aws.amazon.com/blogs/security/architecting-a-secure-landing-zone-in-the-aws-european-sovereign-cloud/)). Non-commercial partitions "must use Regional endpoints" ([SDK Reference](https://docs.aws.amazon.com/sdkref/latest/guide/feature-sts-regionalized-endpoints.html)).
A credential issued in one partition is not valid in another, so `AssumeRole` does not work across a partition boundary. The AWS European Sovereign Cloud landing-zone guidance states plainly that `sts:AssumeRole` is "Not available across the aws and aws-eusc boundary" ([AWS Security Blog: ESC landing zone](https://aws.amazon.com/blogs/security/architecting-a-secure-landing-zone-in-the-aws-european-sovereign-cloud/)). Since November 2026 the supported way across is cross-partition identity federation: call `GetWebIdentityToken` in the source partition and exchange the JWT with `AssumeRoleWithWebIdentity` at a Regional endpoint in the destination partition (`aws`, `aws-cn`, `aws-us-gov`, `aws-eusc`; [IAM User Guide](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_outbound_cross_partition.html), [What's New](https://aws.amazon.com/about-aws/whats-new/2026/11/aws-sts-cross-partition/)). Non-commercial partitions "must use Regional endpoints" ([SDK Reference](https://docs.aws.amazon.com/sdkref/latest/guide/feature-sts-regionalized-endpoints.html)).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Since November 2026" is stated as fact. The timeline entries are dated only to the month, and this sentence is a launch claim sourced to What's New URLs. Please confirm the launch date and that all four partitions (aws, aws-cn, aws-us-gov, aws-eusc) are supported at launch.

"Credentials never cross partitions" was dropped here, but AssumeRole across partitions is still unsupported. The new wording is fine, but the site UI (decide.ts) and the glossary now describe the exchange as an available route without any "(unverified)" marker if the page couldn't be fetched.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's New was posted 2026-11-09. The IAM User Guide note lists aws, aws-cn, aws-us-gov and aws-eusc, and What's New lists the same four (commercial, GovCloud (US), China, European Sovereign Cloud). Both are linked in the sentence, so no unverified marker is needed.

@claude

claude Bot commented Nov 10, 2026

Copy link
Copy Markdown

Review of the cross-partition federation content update.

  1. Future date. AS_OF and the "checked on" dates are 2026-11-11, which is after today (2026-11-10) (src/data/asOf.ts:2).
  2. Partial date refresh. docs/README.md, docs/01-overview.md and docs/03-api-operations.md still say 2026-10-10, while the README and the site say 2026-11-11. ops.ts cites docs/03 for "11 operations as of 2026-11-11".
  3. Unsourced condition-key claims. The aws:CrossPartitionSourceRegion row in docs/04-sessions-and-policies.md:600 makes several claims with no source in the row. It also contradicts itself on trust-policy use. The same claims are repeated in catalog.ts.
  4. Launch claim. "Since November 2026" and the four-partition list in docs/02-endpoints.md:271 need confirmation against the What's New post, or an "(unverified)" marker.

EN/JA content is consistent in the changed strings. No workflow or injection surface is touched.

@kanywst
kanywst merged commit cfa28d0 into main Nov 10, 2026
14 checks passed
@kanywst
kanywst deleted the fix/cross-partition-federation branch November 10, 2026 16:07
Comment thread src/data/asOf.ts
@@ -1,2 +1,2 @@
/** Date the facts on the site were last checked against AWS documentation. */
export const AS_OF = "2026-10-10";
export const AS_OF = "2026-11-11";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AS_OF is set to 2026-11-11, but the check happened on or before 2026-11-10, so the date is in the future. The same date is repeated as "checked/verified" in README.md:30, README.ja.md:30, docs/02, 03, 05, 07, the DepartureBoard hint and the ops/regions/sdk comments. Use the real date of the re-check.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as the earlier threads: 2026-11-11 is the local (JST) date of the re-check, so no change.

en: "China, GovCloud, the European Sovereign Cloud and ISO partitions have no global endpoint. Use that partition's Regional endpoint; credentials never cross partitions.",
ja: "中国・GovCloud・European Sovereign Cloud・ISO にはグローバルエンドポイントがありません。そのパーティションのリージョナルを使います。認証情報はパーティションをまたげません。",
en: "China, GovCloud, the European Sovereign Cloud and ISO partitions have no global endpoint. Use that partition's Regional endpoint. Credentials from one partition are not valid in another; to reach another partition, exchange a `GetWebIdentityToken` JWT with `AssumeRoleWithWebIdentity` there (cross-partition federation, since November 2026).",
ja: "中国・GovCloud・European Sovereign Cloud・ISO にはグローバルエンドポイントがありません。そのパーティションのリージョナルを使います。あるパーティションの認証情報は別のパーティションでは無効です。別パーティションに入るには、`GetWebIdentityToken` の JWT を相手側の `AssumeRoleWithWebIdentity` で交換します (2026 年 11 月からのクロスパーティションフェデレーション)。",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This branch also covers "ISO partitions", but the cross-partition route is documented only for aws, aws-cn, aws-us-gov and aws-eusc (see docs/02). "To reach another partition, exchange..." therefore overstates it for ISO users. Say the route applies to those four partitions, in both EN and JA.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, the ISO partitions are not in the documented list. Fixed in a follow-up, since this PR was already merged: the sentence now names the four partitions and says AWS does not document the route for ISO.

- Parameters: `Audience` 1 to 10 values; `DurationSeconds` 60 to 3600, default 300; `SigningAlgorithm` `RS256` or `ES384` (required); up to 50 `Tags`. Not available on the STS global endpoint. Errors include `OutboundWebIdentityFederationDisabled` and `SessionDurationEscalation` (a token cannot outlive the calling session) ([API reference](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetWebIdentityToken.html)).
- Claims: standard `iss`, `aud`, `sub` (principal ARN), `iat`, `exp`, `jti`; under the `https://sts.amazonaws.com/` namespace: `aws_account`, `source_region`, `org_id`, `ou_path`, `principal_tags`, `request_tags`, and context such as `ec2_source_instance_arn`, `ec2_instance_source_vpc`, `ec2_role_delivery`, `lambda_source_function_arn`, `identity_store_user_id`, `federated_provider`, `source_identity`, `original_session_exp`, `glue_credential_issuing_service` ([token claims](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_outbound_token_claims.html)).
- Control: `sts:GetWebIdentityToken` permission plus condition keys `sts:IdentityTokenAudience`, `sts:SigningAlgorithm`, `sts:DurationSeconds`, usable in identity policies, SCPs, RCPs and VPC endpoint policies ([AWS News Blog](https://aws.amazon.com/blogs/aws/simplify-access-to-external-services-using-aws-iam-outbound-identity-federation/)).
- Cross-partition (since 2026-11): the destination partition's STS can be the relying party. Create an IAM OIDC provider there for the source account's issuer URL, request the token with exactly one `Audience` (multi-audience tokens are rejected; [setup](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_outbound_cross_partition_setup.html), [controls](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_outbound_cross_partition_controls.html)), and call `AssumeRoleWithWebIdentity` at a Regional endpoint in the destination partition. Tokens are rejected for `AssumeRoleWithWebIdentity` in the same partition (use `AssumeRole`). Session requests carry `aws:CrossPartitionSourceRegion` ([global condition keys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)); CloudTrail links both sides through `webIdentityTokenId` ([auditing](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_outbound_cross_partition_auditing.html), [IAM User Guide](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_outbound_cross_partition.html), [What's New](https://aws.amazon.com/about-aws/whats-new/2026/11/aws-sts-cross-partition/)).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some claims here read as recalled rather than sourced: the single-Audience restriction, "tokens are rejected for AssumeRoleWithWebIdentity in the same partition", and webIdentityTokenId in CloudTrail. The linked pages (setup, controls, auditing) are not among the sources the PR body lists, and I could not confirm them from the repo. Confirm each against the cited page, or mark it "(unverified)" per the docs convention.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These were read from the cited pages before 6faea43 added the links. The single audience is on the setup and controls pages ("AssumeRoleWithWebIdentity rejects tokens from GetWebIdentityToken that have more than one audience"). The same-partition rejection is on the main cross-partition page ("cannot be used for OpenID Connect (OIDC) federation into the same partition"). webIdentityTokenId is on the auditing page. No change.

@claude

claude Bot commented Nov 10, 2026

Copy link
Copy Markdown

Review of the cross-partition federation change. Findings are posted inline, except the stale dates in the docs index files, which are listed here.

  1. src/data/asOf.ts:2: the "verified" date is 2026-11-11, which is in the future (today is 2026-11-10). It is propagated to the READMEs, docs, the UI hint and code comments.
  2. docs/README.md:3 and docs/01-overview.md:3 still say "checked 2026-10-10", while the READMEs now say 2026-11-11. The date claims disagree across files.
  3. src/features/endpoints/decide.ts:28: the "ISO partitions" branch now suggests cross-partition federation, but it is documented only for aws, aws-cn, aws-us-gov and aws-eusc.
  4. docs/05-credential-paths.md:387: the single-Audience, same-partition rejection and CloudTrail webIdentityTokenId claims are not covered by the sources listed in the PR. Confirm them or mark them "(unverified)".

EN/JA parity is fine in the changed strings.

kanywst added a commit that referenced this pull request Nov 11, 2026
…d partitions (#24)

The non-commercial branch also covers ISO partitions, where AWS does not
document cross-partition federation. Missed review comment on #23.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Freshness check: 2026-11

1 participant