Skip to content

Stage 7: complete AWS OIDC federation deployment (deferred from PR #61) #62

@hanwencheng

Description

@hanwencheng

Context

PR #61 ships Stage 7 phase 2: OIDC issuer in the Rust broker, AWS-cred wiring through provisioner-scripts, and the operator-side bring-up (DNS + EIP + nginx + certbot + AWS OIDC provider registration). The federation infrastructure is in place; the end-to-end isolation proof is deferred to this issue.

What's done (in PR #61)

  • Broker serves /.well-known/openid-configuration at https://broker.litentry.org with the correct iss claim.
  • Broker serves JWKS at /.well-known/jwks.json with ES256 P-256 key + stable kid.
  • Bearer-gated POST /v1/mint-oidc-jwt issues short-lived JWTs.
  • AWS OIDC provider registered: arn:aws:iam::429071895007:oidc-provider/broker.litentry.org.
  • Public nginx + Let's Encrypt cert auto-renewing.
  • Operator runbook + cloud-setup docs for the registration recipe (cloud-setup.md §4).

What's deferred to this issue

The cloud-enforced PrincipalTag isolation property — "a JWT for wallet A can read s3://bucket/A/ but never s3://bucket/B/" — needs an end-to-end live test before we can call Stage 7 federation truly complete:

  • Update agentkeys-data-role trust policy to the federated variant (replaces static IAM-user trust). Per cloud-setup.md §4.3.
  • Update bucket policy to the PrincipalTag-scoped variant. Per cloud-setup.md §4.4.
  • Acceptance test (cloud-setup.md §4.5):
    # Mint a JWT for wallet A, exchange for AWS temp creds, prove:
    aws s3api list-objects-v2 --bucket "$BUCKET" --prefix "$WALLET/"      # ← OK
    aws s3api list-objects-v2 --bucket "$BUCKET" --prefix "0xdeadbeef/"    # ← MUST AccessDenied

The first AccessDenied is the property Stage 6's static-IAM path can't prove. Until that test passes against real AWS, federation is wired but unproven.

Why deferred

Auth is the upstream blocker. Until the broker can reliably authenticate a session bearer to a specific wallet (currently any auth_token is accepted by the mock-server stub — see #63), running the federation acceptance test is meaningless: any caller could mint a session for any wallet, so PrincipalTag isolation isn't actually being tested.

Once auth lands (either Option A or Option C path), the federation acceptance test becomes a one-afternoon validation step.

Related

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions