Skip to content

Trust GitHub Actions alongside the Source issuer #223

Closed

Description

@alukach

Phase 4 — First shippable milestone.

Today
CI already exchanges real GitHub Actions tokens at /.sts on every same-repo run — but by swapping the trusted issuer, never running GitHub alongside our own. AUTH_ISSUER is a single String, while AUTH_AUDIENCE is already a list.

Do

  • Trust both issuers at once.
  • Pin subjects to a repository and ref. No organization-wide wildcards.
  • Wire GitHub up as an Integration type end to end.

Done when
A workflow in an unrelated repository writes to a product using only its ambient OIDC token, with no stored secret.

Watch

Reconciled: source-cooperative/source.coop#432 was closed in favour of source-cooperative/source.coop#491, which absorbs it; this issue is that epic's proxy step for GitHub Actions. The work is in #237.

See ADR-009.

Depends on source-cooperative/source.coop#546, #221 and #222.


Part of source-cooperative/source.coop#491.

Activity

  1. alukach commented on Sep 21, 2026

    @alukach
    ContributorAuthor

    Reconciled with source-cooperative/source.coop#491:

  2. alukach commented on Sep 23, 2026

    @alukach
    ContributorAuthor

    Contract change from source-cooperative/source.coop#566: no proof of control and no challenge. A manager trusts a GitHub subject on a service account from settings; the workflow mints its token for the proxy (audience= the proxy origin), sets AWS_ROLE_ARN=arn:aws:iam::<service-account-id>:role/FullAccess, AWS_WEB_IDENTITY_TOKEN_FILE, AWS_ENDPOINT_URL_STS=<proxy>/.sts and AWS_ENDPOINT_URL_S3=<proxy>, and the SDK's web-identity provider does the exchange. The proxy verifies the GitHub token, reads the account from RoleArn, asks POST /api/v1/accounts/{id}/trusts/exchanges (#222), and mints from the account's memberships. Subjects stay pinned to one repository and one ref or environment. This is the step the settings page hands out: source-cooperative/source.coop#567

  3. alukach commented on Sep 23, 2026

    @alukach
    ContributorAuthor

    Update: the workflow step the settings page hands out now uses aws-actions/configure-aws-credentials@v6 with sts-endpoint at the proxy, audience = the proxy origin and role-to-assume: arn:aws:iam::<service-account-id>:role/FullAccess (the action requires the aws partition). That makes developmentseed/multistore#126 (GetCallerIdentity, and /.sts/ for the JS SDK's trailing slash) a hard dependency of this issue: the action validates the credentials it exports with a signed GetCallerIdentity. Its Account in the response should be the account segment the caller named, so the action's aws-account-id output is the service account.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions