Skip to content

GitHub

Every GitHub action run gets an identity unique to a repository and branch. To use this identity, you first need to get a JWT for the CI/CD proxy audience. Tremolo Security built a GitHub action to simplify this process:

# Get a token for the aud cicd.tremolo.dev, must match cicd_prxy.oidc.audience in your values.yaml
- name: get oidc token
  uses: tremolosecurity/action-generate-oidc-jwt@v1.1
  with:
    audience: "cicd.tremolo.dev"
    environmentVariableName: "JWT"

# Use the token in a kubectl command
- name: patch deployment
  run: |
        kubectl config set-cluster kubernetes --server=https://cicd.tremolo.dev
        kubectl config set-context kubernetes --cluster=kubernetes --user=cicdproxy
        kubectl config set-credentials cicdproxy --token=$JWT
        kubectl config use-context kubernetes
        kubectl patch deployment run-service -n myapp -p "{\"spec\":{\"template\":{\"spec\":{\"containers\":[{\"name\":\"pause\",\"image\":\"ghcr.io/${{ env.REPO }}:${{ env.TAG }}\"}]}}}}"

RBAC

The sub of the token provided to the CI/CD proxy will have the form:

repo:ORG_USER_NAME/REPO_NAME/ref:refs/heads/BRANCH

Where:

  • ORG_USER_NAME - The organization or username of the repository
  • REPO_NAME - The name of of the GitHub repository
  • BRANCH - The branch the action is running against

So for instance, the mlbiam GitHub user runs an action in the k8s-build-and-deploy-container repository on the main branch will have the sub: repo:mlbiam/k8s-build-and-deploy-container:ref:refs/heads/main claim in the JWT. This means that the User subject in your RBAC bindings need to reference repo:mlbiam/k8s-build-and-deploy-container:ref:refs/heads/main. For instance:

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: update-deployment
  namespace: myapp
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: update-deployment
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: repo:mlbiam/k8s-build-and-deploy-container:ref:refs/heads/main

Allows our action to do whatever the Role update-deployment allows.