Back to Charts

⚠️ Repo Archive Notice

incubator/buzzfeed-sso/README.md

latest8.7 KB
Original Source

⚠️ Repo Archive Notice

As of Nov 13, 2020, charts in this repo will no longer be updated. For more information, see the Helm Charts Deprecation and Archive Notice, and Update.

Buzzfeed SSO

Single sign-on for your Kubernetes services using Google OAuth (more providers are welcomed)

Blogpost Quickstart guide SSO in Kubernetes with Google Auth Repo

This helm chart is heavily inspired in Buzzfeed's example, and provides a way of protecting Kubernetes services that have no authentication layer globally from a single OAuth proxy.

Many of the Kubernetes OAuth solutions require to run an extra container within the pod using oauth2_proxy, but the project seems to not be maintained anymore. The approach presented on this chart allows to have a global OAuth2 Proxy that can protect services even in different namespaces, thanks to Kube DNS.

We use this chart in production at MindDoc for protecting endpoints that have no built-in authentication (or that would require to run inner containers), like Kibana, Prometheus, etc...

DEPRECATION NOTICE

This chart repository is deprecated. It was moved to minddocdev/buzzfeed-sso.

Introduction

This chart creates a SSO deployment on a Kubernetes cluster using the Helm package manager.

Prerequisites

  • Kubernetes 1.8+ with Beta APIs enabled
  • Kube DNS

Installing the Chart

To install the chart with the release name my-release:

bash
helm install --name my-release incubator/buzzfeed-sso

The command deploys SSO on the Kubernetes cluster using the default configuration. The configuration section lists the parameters that can be configured during installation.

This chart has required variables, see Configuration.

Uninstalling the Chart

To uninstall/delete the my-release deployment:

bash
helm delete --purge my-release

The command removes all the Kubernetes components associated with the chart and deletes the release.

Configuration

The following table lists the configurable parameters of the SSO chart and their default/required values.

ParameterDescriptionDefault
namespacenamespace to usedefault
emailDomainthe sso email domain for authenticationREQUIRED
rootDomainthe parent domain used for protecting your backendsREQUIRED
whitelistedEmailscomma-seperated list of emails which should be whitelistedOPTIONAL
clusterthe cluster name for SSOdev
auth.enabledenable auth componenttrue
auth.annotationsextra annotations for auth pods{}
auth.domainthe auth domain used for OAuth callbacksREQUIRED
auth.extraEnvextra auth env vars[]
auth.replicaCountdesired number of auth pods1
auth.resourcesresource limits and requests for auth pods{ limits: { memory: "256Mi", cpu: "200m" }}
auth.nodeSelectornode selector logic for auth pods{}
auth.tolerationsresource tolerations for auth pods{}
auth.affinitynode affinity for auth pods{}
auth.service.typetype of auth service to createClusterIP
auth.service.portport for the http auth service80
auth.secretsecrets to be generated randomly with `openssl rand -base64 32head -c 32`.
auth.ingressEnabledenable auth ingress.true
auth.ingressPathauth ingress path./
auth.tlstls configuration for central sso auth ingress.{}
auth.customSecretthe secret key to reuse (avoids secret creation via helm)REQUIRED if auth.secret is not set
proxy.enabledenable proxy componenttrue
proxy.annotationsextra annotations for proxy pods{}
proxy.providerUrlInternalurl for split dns deployments
proxy.extraEnvextra proxy env vars[]
proxy.replicaCountdesired number of proxy pods1
proxy.resourcesresource limits and requests for proxy pods{ limits: { memory: "256Mi", cpu: "200m" }}
proxy.nodeSelectornode selector logic for proxy pods{}
proxy.tolerationsresource tolerations for proxy pods{}
proxy.affinitynode affinity for proxy pods{}
proxy.service.typetype of proxy service to createClusterIP
proxy.service.portport for the http proxy service80
proxy.secretsecrets to be generated randomly with `openssl rand -base64 32head -c 32
proxy.customSecretthe secret key to reuse (avoids secret creation via helm)REQUIRED if proxy.secret is not set
proxy.defaultAllowedEmailDomainsthe default allowed domains for upstreams``
provider.googlethe Oauth provider to use (only Google support for now)REQUIRED
provider.google.adminEmailthe Google admin emailundefined
provider.google.slugthe Google provider slugoauth2
provider.google.secretthe Google OAuth secretsREQUIRED if provider.google.customSecret is not set
provider.google.customSecretthe secret key to reuse instead of creating it via helmREQUIRED if provider.google.secret is not set
image.repositorycontainer image repositorybuzzfeed/sso
image.tagcontainer image tagv2.1.0
image.pullPolicycontainer image pull policyIfNotPresent
ingress.enabledset to true to enable the ingresstrue
ingress.annotationsingress load balancer annotations{}
ingress.extraLabelsextra ingress labels{}
ingress.hostsproxied hosts[]
ingress.tlstls certificates for the proxied hosts[]
ingress.gcpBackendConfigGCP LB backend service configuration{}
upstreamsconfiguration of services that use sso[]

Specify each parameter using the --set key=value[,key=value] argument to helm install. For example,

bash
$ helm install --name my-release \
    --set key_1=value_1,key_2=value_2 \
    incubator/buzzfeed-sso

Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example,

bash
helm install --name my-release -f values.yaml incubator/buzzfeed-sso

Tip: This will merge parameters with values.yaml, which does not specify all the required values

Example

NEVER expose your auth.secret, proxy.secret, provider.google.clientId, provider.google.clientSecret and provider.google.serviceAccount. Always keep them in a safe place and do not push them to any repository. As values are merged, you can always generate a different .yaml file. For instance:

yaml
# values.yaml
emailDomain: 'email.coolcompany.foo'

rootDomain: 'coolcompany.foo'

auth:
  domain: sso-auth.coolcompany.foo

proxy:
  cluster: dev

google:
  adminEmail: [email protected]
yaml
# secrets.yaml
auth:
 secret:
    codeSecret: 'randomSecret1'
    cookieSecret: 'randomSecret2'

proxy:
  secret:
    clientId: 'randomSecret3'
    clientSecret: 'randomSecret4'
    cookieSecret: 'randomSecret6'

google:
  secret:
    clientId: 'googleSecret!'
    clientSecret: 'evenMoreSecret'
    serviceAccount: '{ <json content super secret> }'

Therefore, you could push your own values.yaml to a repo and keep secrets.yaml locally safe, and then install/update the chart:

bash
helm install --name my-release -f values.yaml -f secrets.yaml incubator/buzzfeed-sso

Alternatively, you can specify your own secret key, if you have already created it in the cluster. The secret should follow the data format defined in secret.yaml (auth and proxy) and google-secret.yaml (google provider).

yaml
# values.yaml
emailDomain: 'email.coolcompany.foo'

rootDomain: 'coolcompany.foo'

auth:
  domain: sso-auth.coolcompany.foo
  customSecret: my-sso-auth-secret

proxy:
  cluster: dev
  customSecret: my-sso-proxy-secret

provider:
  google:
    adminEmail: [email protected]
    customSecret: my-sso-google-secret

Updating the Chart

You can update the chart values and trigger a pod reload. If the configmap changes, it will automatically retrieve the new values.

bash
helm upgrade -f values.yaml my-release incubator/buzzfeed-sso