Skip to content

Commit

Permalink
Clarify audience value in Concierge-only auth doc, and other doc updates
Browse files Browse the repository at this point in the history
Also renamed a couple of integration test files to make their names
more clear.
  • Loading branch information
cfryanr committed Apr 3, 2023
1 parent 985260d commit 19b60fe
Show file tree
Hide file tree
Showing 8 changed files with 103 additions and 10 deletions.
93 changes: 88 additions & 5 deletions site/content/docs/howto/configure-concierge-jwt.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,12 @@ This guide shows you how to use this capability _without_ the Pinniped Superviso
This is most useful if you have only a single cluster and want to authenticate to it via an existing OIDC provider.

If you have multiple clusters, you may want to [install]({{< ref "install-supervisor" >}}) and [configure]({{< ref "configure-supervisor" >}}) the Pinniped Supervisor.
Then you can [configure the Concierge to use the Supervisor for authentication]({{< ref "configure-concierge-supervisor-jwt" >}}).
Then you can [configure the Concierge to use the Supervisor for authentication]({{< ref "configure-concierge-supervisor-jwt" >}})
instead of following the guide below.

## Prerequisites

Before starting, you should have the [command-line tool installed]({{< ref "install-cli" >}}) locally and [Concierge running in your cluster]({{< ref "install-concierge" >}}).
Before starting, you should have the [Pinniped command-line tool installed]({{< ref "install-cli" >}}) locally and [Concierge running in your cluster]({{< ref "install-concierge" >}}).

You should also have some existing OIDC issuer configuration:

Expand All @@ -37,6 +38,7 @@ metadata:
name: my-jwt-authenticator
spec:
issuer: https://my-issuer.example.com/any/path
# This audience value must be the same as your OIDC client's ID.
audience: my-client-id
claims:
username: email
Expand All @@ -60,6 +62,9 @@ pinniped get kubeconfig \
> my-cluster.yaml
```

Note that the value for the `--oidc-client-id` flag must be your OIDC client's ID, which must also be the same
value declared as the `audience` in the JWTAuthenticator.

This creates a kubeconfig YAML file `my-cluster.yaml` that targets your JWTAuthenticator using `pinniped login oidc` as an [ExecCredential plugin](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#client-go-credential-plugins).

It should look something like below:
Expand Down Expand Up @@ -126,6 +131,82 @@ You should see:
--user my-username@example.com
```

## Including group membership

If your OIDC provider supports adding user group memberships as a claim in the ID tokens, then you can
use Pinniped to transmit those group memberships into Kubernetes.

For example, one popular OIDC provider can include group memberships in an ID token claim called `groups`,
if the client requests the scope called `groups` at authorization time.

Unfortunately, each OIDC provider handles scopes a little differently, so please refer to your provider's documentation
to see if it is possible for the provider to add group membership information to the ID token.

### Update the JWTAuthenticator

Update the JWTAuthenticator to describe the name of the ID token claim where groups names will reside:

```yaml
apiVersion: authentication.concierge.pinniped.dev/v1alpha1
kind: JWTAuthenticator
metadata:
name: my-jwt-authenticator
spec:
issuer: https://my-issuer.example.com/any/path
audience: my-client-id
claims:
username: email
# Tell the JWTAuthenticator the name of the ID token claim
# where groups names will reside. For example, the name of
# the ID token claim is "groups", then set it as the value
# here. The name of this key is always "groups".
groups: groups
```

If you've saved this into a file `my-jwt-authenticator.yaml`, then update it into your cluster using:

```sh
kubectl apply -f my-jwt-authenticator.yaml
```

### Generate an updated kubeconfig file

Generate a kubeconfig file to target the updated JWTAuthenticator. Note that this is almost the same command
as before, but since our particular OIDC issuer requires that we also request the `groups` scope at
authorization time, then we add it to the list of scopes here.

```sh
pinniped get kubeconfig \
--oidc-client-id my-client-id \
--oidc-scopes openid,email,groups \
--oidc-listen-port 12345 \
> my-cluster.yaml
```

### Use the kubeconfig file

Use the kubeconfig with `kubectl` to access your cluster, as before:

```sh
# Remove the client-side session cache, which is equivalent to
# performing a client-side logout.
rm -rf ~/.config/pinniped
# Log in again by issuing a kubectl command.
kubectl --kubeconfig my-cluster.yaml get namespaces
```

To see the username and group membership as understood by the Kubernetes cluster, you can use
this command:

```sh
pinniped whoami --kubeconfig my-cluster.yaml
```

If your groups configuration worked, then you should see your list of group names from your OIDC provider
included in the output. These group names may now be used with Kubernetes RBAC to provide authorization to
resources on the cluster.

## Other notes

- Pinniped kubeconfig files do not contain secrets and are safe to share between users.
Expand All @@ -137,7 +218,9 @@ You should see:
- If your OIDC provider supports [wildcard port number matching](https://tools.ietf.org/html/draft-ietf-oauth-security-topics-16#section-2.1) for localhost URIs, you can omit the `--oidc-listen-port` flag to use a randomly chosen ephemeral TCP port.

- The Pinniped command-line tool can only act as a public client with no client secret.
If your provider only supports non-public clients, consider using the Pinniped Supervisor.
If your provider only supports non-public clients, consider using the Pinniped Supervisor instead of following this guide.

- In general, it is not safe to use the same OIDC client across multiple clusters.
If you need to access multiple clusters, please [install the Pinniped Supervisor]({{< ref "install-supervisor" >}}).
- In general, it is not safe to use the same OIDC client across multiple clusters. Each cluster should use its own OIDC client
to ensure that tokens sent to one cluster cannot also be used for another cluster.
If you need to provide access to multiple clusters, please consider [installing the Pinniped Supervisor]({{< ref "install-supervisor" >}})
instead of following this guide.
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ spec:
base: "OU=my-department,OU=Users,DC=activedirectory,DC=example,DC=com"
# Specify how to filter the search to find the specific user by username.
# "{}" will be replaced # by the username that the end-user had typed
# "{}" will be replaced by the username that the end-user had typed
# when they tried to log in.
filter: "&(objectClass=person)(userPrincipalName={})"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ spec:
base: "ou=Users,o=YOUR_ORG_ID,dc=jumpcloud,dc=com"

# Specify how to filter the search to find the specific user by username.
# "{}" will be replaced # by the username that the end-user had typed
# "{}" will be replaced by the username that the end-user had typed
# when they tried to log in.
filter: "&(objectClass=inetOrgPerson)(uid={})"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ spec:
base: "ou=users,dc=pinniped,dc=dev"
# Specify how to filter the search to find the specific user by username.
# "{}" will be replaced # by the username that the end-user had typed
# "{}" will be replaced by the username that the end-user had typed
# when they tried to log in.
filter: "&(objectClass=inetOrgPerson)(uid={})"
Expand Down
5 changes: 5 additions & 0 deletions site/content/docs/howto/install-concierge.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,11 @@ Pinniped uses [ytt](https://carvel.dev/ytt/) from [Carvel](https://carvel.dev/)

- `ytt --file . --file site/dev-env.yaml | kapp deploy --app pinniped-concierge --file -`

## Other notes

_Important:_ Configure Kubernetes authorization policies (i.e. RBAC) to prevent non-admin users from reading the
resources, especially the Secrets, in the Concierge's namespace.

## Next steps

Next, configure the Concierge for
Expand Down
5 changes: 5 additions & 0 deletions site/content/docs/howto/install-supervisor.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,11 @@ Pinniped uses [ytt](https://carvel.dev/ytt/) from [Carvel](https://carvel.dev/)

`ytt --file . --file site/dev-env.yaml | kapp deploy --app pinniped-supervisor --file -`

## Other notes

_Important:_ Configure Kubernetes authorization policies (i.e. RBAC) to prevent non-admin users from reading the
resources, especially the Secrets, in the Supervisor's namespace.

## Next steps

Next, [configure the Supervisor as an OIDC issuer]({{< ref "configure-supervisor" >}})!
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2020-2022 the Pinniped contributors. All Rights Reserved.
// Copyright 2020-2023 the Pinniped contributors. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package integration

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2020 the Pinniped contributors. All Rights Reserved.
// Copyright 2020-2023 the Pinniped contributors. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package integration
Expand Down

0 comments on commit 19b60fe

Please sign in to comment.