Sannvottu í Kubernetes með GitHub OAuth og Dex

Ég kynni þér kennsluleiðbeiningar til að búa til aðgang að Kubernetes klasa með Dex, dex-k8s-authenticator og GitHub.

Sannvottu í Kubernetes með GitHub OAuth og Dex
Staðbundið meme frá rússnesku Kubernetes spjalla inn Telegram

Inngangur

Við notum Kubernetes til að búa til kraftmikið umhverfi fyrir þróunar- og QA teymið. Þannig að við viljum veita þeim aðgang að þyrpingunni fyrir bæði mælaborðið og kubectl. Ólíkt OpenShift er vanilla Kubernetes ekki með innbyggða auðkenningu, þannig að við notum verkfæri þriðja aðila fyrir þetta.

Í þessari uppsetningu notum við:

  • dex-k8s-authenticator  — vefforrit til að búa til kubectl config
  • dex — OpenID Connect veitandi
  • GitHub - einfaldlega vegna þess að við notum GitHub í fyrirtækinu okkar

Við reyndum að nota Google OIDC, en því miður mistókst að koma þeim af stað með hópa, þannig að samþættingin við GitHub hentaði okkur nokkuð vel. Án hópkortlagningar verður ekki hægt að búa til RBAC stefnur byggðar á hópum.

Svo, hvernig virkar Kubernetes heimildarferlið okkar í sjónrænni framsetningu:

Sannvottu í Kubernetes með GitHub OAuth og Dex
Heimildarferli

Smá smáatriði og lið fyrir lið:

  1. Notandi skráir sig inn á dex-k8s-authenticator (login.k8s.example.com)
  2. dex-k8s-authenticator framsendir beiðnina til Dex (dex.k8s.example.com)
  3. Dex vísar á GitHub innskráningarsíðuna
  4. GitHub býr til nauðsynlegar heimildarupplýsingar og skilar þeim til Dex
  5. Dex sendir mótteknar upplýsingar til dex-k8s-authenticator
  6. Notandinn fær OIDC tákn frá GitHub
  7. dex-k8s-authenticator bætir tákni við kubeconfig
  8. kubectl sendir táknið til KubeAPIServer
  9. KubeAPIServer skilar aðgangi að kubectl byggt á samþykktu tákninu
  10. Notandinn fær aðgang frá kubectl

Undirbúningsstarfsemi

Auðvitað erum við nú þegar með Kubernetes þyrping uppsettan (k8s.example.com), og kemur einnig með HELM foruppsett. Við erum líka með stofnun á GitHub (super-org).
Ef þú ert ekki með HELM skaltu setja það upp mjög einfalt.

Fyrst þurfum við að setja upp GitHub.

Farðu á stillingasíðu fyrirtækisins, (https://github.com/organizations/super-org/settings/applications) og búðu til nýtt forrit (Authorized OAuth App):
Sannvottu í Kubernetes með GitHub OAuth og Dex
Að búa til nýtt forrit á GitHub

Fylltu út reitina með nauðsynlegum vefslóðum, til dæmis:

  • Heimasíðaslóð: https://dex.k8s.example.com
  • Heimildarhringingarvefslóð: https://dex.k8s.example.com/callback

Farðu varlega með tengla, það er mikilvægt að missa ekki skástrik.

Sem svar við útfylltu eyðublaði mun GitHub búa til Client ID и Client secret, geymdu þau á öruggum stað, þau munu nýtast okkur (til dæmis notum við Vault til að geyma leyndarmál):

Client ID: 1ab2c3d4e5f6g7h8
Client secret: 98z76y54x32w1

Undirbúa DNS færslur fyrir undirlén login.k8s.example.com и dex.k8s.example.com, sem og SSL vottorð fyrir inngöngu.

Við skulum búa til SSL vottorð:

cat <<EOF | kubectl create -f -
apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: cert-auth-dex
  namespace: kube-system
spec:
  secretName: cert-auth-dex
  dnsNames:
    - dex.k8s.example.com
  acme:
    config:
    - http01:
        ingressClass: nginx
      domains:
      - dex.k8s.example.com
  issuerRef:
    name: le-clusterissuer
    kind: ClusterIssuer
---
apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: cert-auth-login
  namespace: kube-system
spec:
  secretName: cert-auth-login
  dnsNames:
    - login.k8s.example.com
  acme:
    config:
    - http01:
        ingressClass: nginx
      domains:
      - login.k8s.example.com
  issuerRef:
    name: le-clusterissuer
    kind: ClusterIssuer
EOF
kubectl describe certificates cert-auth-dex -n kube-system
kubectl describe certificates cert-auth-login -n kube-system

Klasaútgefandi með titil le-clusterissuer ætti nú þegar að vera til, en ef ekki, búðu til það með því að nota HELM:

helm install --namespace kube-system -n cert-manager stable/cert-manager
cat << EOF | kubectl create -f -
apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
  name: le-clusterissuer
  namespace: kube-system
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: [email protected]
    privateKeySecretRef:
      name: le-clusterissuer
    http01: {}
EOF

KubeAPIServer stillingar

Til að kubeAPIServer virki þarftu að stilla OIDC og uppfæra þyrpinguna:

kops edit cluster
...
  kubeAPIServer:
    anonymousAuth: false
    authorizationMode: RBAC
    oidcClientID: dex-k8s-authenticator
    oidcGroupsClaim: groups
    oidcIssuerURL: https://dex.k8s.example.com/
    oidcUsernameClaim: email
kops update cluster --yes
kops rolling-update cluster --yes

Við notum sparka til að dreifa klasa, en þetta virkar svipað fyrir aðrir klasastjórar.

Dex stillingar og dex-k8s-authenticator

Til að Dex virki þarftu að hafa vottorð og lykil frá Kubernetes meistaranum, við skulum fá það þaðan:

sudo cat /srv/kubernetes/ca.{crt,key}
-----BEGIN CERTIFICATE-----
AAAAAAAAAAABBBBBBBBBBCCCCCC
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
DDDDDDDDDDDEEEEEEEEEEFFFFFF
-----END RSA PRIVATE KEY-----

Við skulum klóna dex-k8s-authenticator geymsluna:

git clone [email protected]:mintel/dex-k8s-authenticator.git
cd dex-k8s-authenticator/

Með því að nota gildisskrár getum við stillt breytur á sveigjanlegan hátt fyrir okkar HELM töflur.

Við skulum lýsa uppsetningunni fyrir Dex:

cat << EOF > values-dex.yml
global:
  deployEnv: prod
tls:
  certificate: |-
    -----BEGIN CERTIFICATE-----
    AAAAAAAAAAABBBBBBBBBBCCCCCC
    -----END CERTIFICATE-----
  key: |-
    -----BEGIN RSA PRIVATE KEY-----
    DDDDDDDDDDDEEEEEEEEEEFFFFFF
    -----END RSA PRIVATE KEY-----
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: "true"
  path: /
  hosts:
    - dex.k8s.example.com
  tls:
    - secretName: cert-auth-dex
      hosts:
        - dex.k8s.example.com
serviceAccount:
  create: true
  name: dex-auth-sa
config: |
  issuer: https://dex.k8s.example.com/
  storage: # https://github.com/dexidp/dex/issues/798
    type: sqlite3
    config:
      file: /var/dex.db
  web:
    http: 0.0.0.0:5556
  frontend:
    theme: "coreos"
    issuer: "Example Co"
    issuerUrl: "https://example.com"
    logoUrl: https://example.com/images/logo-250x25.png
  expiry:
    signingKeys: "6h"
    idTokens: "24h"
  logger:
    level: debug
    format: json
  oauth2:
    responseTypes: ["code", "token", "id_token"]
    skipApprovalScreen: true
  connectors:
  - type: github
    id: github
    name: GitHub
    config:
      clientID: $GITHUB_CLIENT_ID
      clientSecret: $GITHUB_CLIENT_SECRET
      redirectURI: https://dex.k8s.example.com/callback
      orgs:
      - name: super-org
        teams:
        - team-red
  staticClients:
  - id: dex-k8s-authenticator
    name: dex-k8s-authenticator
    secret: generatedLongRandomPhrase
    redirectURIs:
      - https://login.k8s.example.com/callback/
envSecrets:
  GITHUB_CLIENT_ID: "1ab2c3d4e5f6g7h8"
  GITHUB_CLIENT_SECRET: "98z76y54x32w1"
EOF

Og fyrir dex-k8s-authenticator:

cat << EOF > values-auth.yml
global:
  deployEnv: prod
dexK8sAuthenticator:
  clusters:
  - name: k8s.example.com
    short_description: "k8s cluster"
    description: "Kubernetes cluster"
    issuer: https://dex.k8s.example.com/
    k8s_master_uri: https://api.k8s.example.com
    client_id: dex-k8s-authenticator
    client_secret: generatedLongRandomPhrase
    redirect_uri: https://login.k8s.example.com/callback/
    k8s_ca_pem: |
      -----BEGIN CERTIFICATE-----
      AAAAAAAAAAABBBBBBBBBBCCCCCC
      -----END CERTIFICATE-----
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: "true"
  path: /
  hosts:
    - login.k8s.example.com
  tls:
    - secretName: cert-auth-login
      hosts:
        - login.k8s.example.com
EOF

Settu upp Dex og dex-k8s-authenticator:

helm install -n dex --namespace kube-system --values values-dex.yml charts/dex
helm install -n dex-auth --namespace kube-system --values values-auth.yml charts/dex-k8s-authenticator

Við skulum athuga virkni þjónustunnar (Dex ætti að skila kóða 400 og dex-k8s-authenticator ætti að skila kóða 200):

curl -sI https://dex.k8s.example.com/callback | head -1
HTTP/2 400
curl -sI https://login.k8s.example.com/ | head -1
HTTP/2 200

RBAC stillingar

Við búum til ClusterRole fyrir hópinn, í okkar tilviki með skrifvarinn aðgang:

cat << EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-read-all
rules:
  -
    apiGroups:
      - ""
      - apps
      - autoscaling
      - batch
      - extensions
      - policy
      - rbac.authorization.k8s.io
      - storage.k8s.io
    resources:
      - componentstatuses
      - configmaps
      - cronjobs
      - daemonsets
      - deployments
      - events
      - endpoints
      - horizontalpodautoscalers
      - ingress
      - ingresses
      - jobs
      - limitranges
      - namespaces
      - nodes
      - pods
      - pods/log
      - pods/exec
      - persistentvolumes
      - persistentvolumeclaims
      - resourcequotas
      - replicasets
      - replicationcontrollers
      - serviceaccounts
      - services
      - statefulsets
      - storageclasses
      - clusterroles
      - roles
    verbs:
      - get
      - watch
      - list
  - nonResourceURLs: ["*"]
    verbs:
      - get
      - watch
      - list
  - apiGroups: [""]
    resources: ["pods/exec"]
    verbs: ["create"]
EOF

Við skulum búa til stillingar fyrir ClusterRoleBinding:

cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: dex-cluster-auth
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-read-all
subjects:
  kind: Group
  name: "super-org:team-red"
EOF

Nú erum við tilbúin til prófunar.

Próf

Farðu á innskráningarsíðuna (https://login.k8s.example.com) og skráðu þig inn með GitHub reikningnum þínum:

Sannvottu í Kubernetes með GitHub OAuth og Dex
Innskráningarsíða

Sannvottu í Kubernetes með GitHub OAuth og Dex
Innskráningarsíðu vísað á GitHub

Sannvottu í Kubernetes með GitHub OAuth og Dex
 Fylgdu útbúnum leiðbeiningum til að fá aðgang

Eftir að hafa afritað límt af vefsíðunni getum við notað kubectl til að stjórna klasaauðlindum okkar:

kubectl get po
NAME                READY   STATUS    RESTARTS   AGE
mypod               1/1     Running   0          3d

kubectl delete po mypod
Error from server (Forbidden): pods "mypod" is forbidden: User "[email protected]" cannot delete pods in the namespace "default"

Og það virkar, allir GitHub notendur í fyrirtækinu okkar geta séð tilföng og skráð sig inn í belg, en þeir hafa ekki réttindi til að breyta þeim.

Heimild: www.habr.com

Bæta við athugasemd