Skip to main content

Obtain an OCP OAuth token for an SSO IdP with Kerberos support

Project description

Non-interactive CLI login for OpenShift clusters via OpenID-connected IdP with Kerberos support

This package can be found on PyPI as ocp-sso-token and is tested on the supported Python versions 3.8, 3.9, 3.10, 3.11 and 3.12.

Quickstart

pip install ocp-sso-token
kinit USER@DOMAIN.COM
ocp-sso-token https://API.CLUSTER:6443 --context CONTEXT --namespace NAMESPACE
oc --context CONTEXT get pod

Problem: several manual steps to log into an OpenShift cluster via OIDC without ROPC

To log into an OpenShift cluster on the command line, oc login supports user/password authentication for various identity providers like LDAP or OIDC with ROPC grant flow.

If no provider with password support is configured, the user is referred to the OAuth login page to obtain a temporary token interactively. After selecting the right provider, the user is forwarded to authenticate with the SSO provider, and redirected back to the cluster afterwards. Another click reveals the temporary token that can now be used for the CLI tools.

For an OpenID provider that supports Kerberos tickets, the authentication with the SSO provider happens transparently. For such setups, logging into a cluster via the CLI roughly requires the following steps:

  • run oc login and click on the link, or visit a bookmark for the cluster login page
  • click on the button for the OpenID provider
  • watch the webpages forwarding to each other
  • click on the link to reveal the temporary token
  • use the shown temporary token/oc login command to log into the cluster

These steps must be performed daily and per cluster.

Approach: automate all the steps above

The Python script in this repository automates all the steps to obtain the temporary token so that the following is possible:

kinit $user@$domain

# either save the token directly in the specified context in ~/.kube/config...
ocp-sso-token $server --context $context --namespace $namespace
oc --context $context get pod

# ...or use the token with oc login
oc login --server $server --token $(ocp-sso-token $server)
oc get pod

Installing the script

# from PyPI
pip install ocp-sso-token

# from source
pip install --user git+https://gitlab.com/cki-project/ocp-sso-token

Using the script to log into an OpenShift cluster via OIDC

usage: ocp-sso-token [-h] [--identity-providers IDENTITY_PROVIDERS]
                     [--context CONTEXT] [--namespace NAMESPACE]
                     api_url

Obtain an OCP OAuth token for a Kerberos ticket

positional arguments:
  api_url               Cluster API URL like https://api.cluster:6443

optional arguments:
  -h, --help            show this help message and exit
  --identity-providers IDENTITY_PROVIDERS
                        Identity provider names (default: SSO,OpenID)
  --context CONTEXT     Instead of printing the token, store it in the given context (default:
                        None)
  --namespace NAMESPACE
                        Namespace to use for --context (default: None)

If your identity provider name is not included in the defaults shown above, add it via --identity-providers. The first matching identity provider will be used.

With --context, the token is directly added to the Kubernetes configuration file (~/.kube/config or KUBECONFIG). Otherwise, the token is printed to the console.

Running a smoke test

kinit user@DOMAIN.COM
server=https://api.cluster:6443; oc --server $server --token $(ocp-sso-token $server) get project

Logging into clusters with custom context names

With --context and --namespace, the obtained tokens are directly configured in the specified contexts:

$ kinit user@DOMAIN.COM
$ ocp-sso-token https://api.cluster1:6443 --context cluster1 --namespace project1
$ ocp-sso-token https://api.cluster2:6443 --context cluster2 --namespace project2

$ oc config get-contexts
CURRENT   NAME       CLUSTER             AUTHINFO            NAMESPACE
          cluster1   api-cluster1:6443   api-cluster1:6443   project1
          cluster2   api-cluster2:6443   api-cluster2:6443   project2

$ oc --context cluster1 get pod
$ oc --context cluster2 get pod

Logging into clusters via oc login

Without --context, the obtained tokens are printed to the console and can be used with oc login. Logging into clusters this way creates context names automatically. This is most useful with a single cluster, but works with multiple clusters as well:

$ kinit user@DOMAIN.COM
$ server=https://api.cluster1:6443; oc login --server $server --token $(ocp-sso-token $server)
$ server=https://api.cluster2:6443; oc login --server $server --token $(ocp-sso-token $server)

$ oc config get-contexts
CURRENT   NAME                                        CLUSTER             AUTHINFO                            NAMESPACE
          default/api-cluster1:6443/user@domain.com   api-cluster1:6443   user@domain.com/api-cluster1:6443   default
*         default/api-cluster2:6443/user@domain.com   api-cluster2:6443   user@domain.com/api-cluster2:6443   default

$ oc --namespace project2 get pod
$ oc --context default/api-cluster1:6443/user@domain.com --namespace project1 get pod
$ oc --context default/api-cluster2:6443/user@domain.com --namespace project2 get pod

Creating a development setup and running the tests

Installing development dependencies:

pip install -e .[dev]

Running linting/tests:

tox

Creating a release

  1. Create a release MR with an update of the version number in ocp_sso_token/__init__.py, e.g to '3.1.4'

  2. Create an annotated tag with the same version prefixed with v and enter the release notes as the tag message, e.g.

    git tag v3.1.4 -a
    

    For the release notes, list the important changes and include the merge requests that introduced them, e.g.

    - Run tests in parallel on multiple Python versions (!8)
    
  3. Push the tag to GitLab, e.g.

    git push origin v3.1.4
    
  4. Wait for the tag pipeline to finish

  5. Check the resulting GitLab and PyPI releases

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ocp-sso-token-1.0.0.tar.gz (18.6 kB view details)

Uploaded Source

Built Distribution

ocp_sso_token-1.0.0-py3-none-any.whl (19.7 kB view details)

Uploaded Python 3

File details

Details for the file ocp-sso-token-1.0.0.tar.gz.

File metadata

  • Download URL: ocp-sso-token-1.0.0.tar.gz
  • Upload date:
  • Size: 18.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.1

File hashes

Hashes for ocp-sso-token-1.0.0.tar.gz
Algorithm Hash digest
SHA256 dcb7d4db73ab063cd92de1a0fdd3aed717390b28c7df26ccf116694f7563a7f5
MD5 74ebfca6d6d5dd05fad55231919395f5
BLAKE2b-256 9630fd842256bb26e7125f7d42f7092a461bfa1e012b51a9c4eee73bb81544b2

See more details on using hashes here.

File details

Details for the file ocp_sso_token-1.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for ocp_sso_token-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d95795209912d2b8d512250c2be1863329efa89e0c065d45360e38fdfb09ea1d
MD5 c059f89d70ba8dcc290968ba01059121
BLAKE2b-256 d313356739f23b9206617b4b581d4ce854720336b7e1a274bfde5a33c428ad78

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page