Di Kubernetes de bi karanîna GitHub OAuth û Dex verast bikin

Ez ji bo hilberîna gihandina komek Kubernetes bi karanîna Dex, dex-k8s-authenticator û GitHub fêrbûnek pêşkêşî we dikim.

Di Kubernetes de bi karanîna GitHub OAuth û Dex verast bikin
Memê herêmî ji sohbeta Kubernetes a bi zimanê rûsî tê de Têlxiram

Pîrozbahiyê

Em Kubernetes bikar tînin da ku ji bo pêşkeftin û tîmê QA hawîrdorên dînamîkî biafirînin. Ji ber vê yekê em dixwazin hem ji bo dashboard û hem jî kubectl bigihîjin komê. Berevajî OpenShift, vanilla Kubernetes ne xwedan pejirandina xwemalî ye, ji ber vê yekê em ji bo vê amûrên sêyemîn bikar tînin.

Di vê veavakirinê de em bikar tînin:

  • dex-k8s-authenticator  - serîlêdana webê ji bo çêkirina konfigurasyona kubectl
  • dex - Pêşkêşvanê OpenID Connect
  • GitHub - tenê ji ber ku em GitHub di pargîdaniya xwe de bikar tînin

Me hewl da ku Google OIDC bikar bînin, lê mixabin me nekin ku em wan bi koman bidin dest pê kirin, ji ber vê yekê entegrasyona bi GitHub re pir baş li me xweş bû. Bêyî nexşeya komê, dê ne gengaz be ku li ser bingeha koman polîtîkayên RBAC werin afirandin.

Ji ber vê yekê, pêvajoya destûra meya Kubernetes çawa di nûneriyek dîtbar de dixebite:

Di Kubernetes de bi karanîna GitHub OAuth û Dex verast bikin
Pêvajoya desthilatdariyê

Piçek hûrgilî û xal bi xal:

  1. Bikarhêner têketin dex-k8s-authenticator (login.k8s.example.com)
  2. dex-k8s-authenticator daxwazê ​​ji Dex re dişîne (dex.k8s.example.com)
  3. Dex beralî dike rûpela têketina GitHub
  4. GitHub agahdariya destûrnameyê ya pêwîst diafirîne û li Dex vedigerîne
  5. Dex agahdariya wergirtî ji dex-k8s-authenticator re derbas dike
  6. Bikarhêner nîşanek OIDC ji GitHub distîne
  7. dex-k8s-authenticator token li kubeconfig zêde dike
  8. kubectl tokenê ji KubeAPIServer re derbas dike
  9. KubeAPIServer li ser bingeha tokena derbasbûyî gihîştina kubectl vedigerîne
  10. Bikarhêner ji kubectl tê gihîştinê

Çalakiyên amadekar

Bê guman, me jixwe komek Kubernetes sazkirî ye (k8s.example.com), û di heman demê de bi HELM-a pêş-sazkirî re jî tê. Li ser GitHub (super-org) rêxistinek me jî heye.
Heke we HELM tune, wê saz bikin pir hêsan e.

Pêşî divê em GitHub saz bikin.

Biçe rûpela mîhengên rêxistinê, (https://github.com/organizations/super-org/settings/applications) û serîlêdanek nû biafirînin (Authorized OAuth App):
Di Kubernetes de bi karanîna GitHub OAuth û Dex verast bikin
Afirandina serîlêdanek nû li ser GitHub

Zeviyan bi URL-yên pêwîst dagirin, mînakî:

  • URL rûpela malper: https://dex.k8s.example.com
  • URL-ya vegerandina gazîkirina destûrnameyê: https://dex.k8s.example.com/callback

Ji lînkan haydar bin, girîng e ku şikestî winda nekin.

Di bersiva formek dagirtî de, GitHub dê çêbike Client ID и Client secret, wan li cîhek ewle bihêlin, ew ê ji me re kêrhatî bin (mînak, em bikar tînin Jûra qasê ji bo veşartina razan):

Client ID: 1ab2c3d4e5f6g7h8
Client secret: 98z76y54x32w1

Ji bo subdomain tomarên DNS-ê amade bikin login.k8s.example.com и dex.k8s.example.com, û her weha sertîfîkayên SSL ji bo têketinê.

Ka em sertîfîkayên SSL biafirînin:

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

ClusterIssuer bi sernavê le-clusterissuer divê jixwe hebe, lê heke na, wê bi karanîna HELM biafirînin:

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

Veavakirina KubeAPIServer

Ji bo ku kubeAPIServer bixebite, hûn hewce ne ku OIDC-ê mîheng bikin û komê nûve bikin:

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

Em bikar tînin peîn ji bo belavkirina koman, lê ev ji bo heman rengî dixebite rêveberên komê yên din.

Veavakirina Dex û dex-k8s-authenticator

Ji bo ku Dex bixebite, hûn hewce ne ku xwediyê sertîfîkayek û mifteyek ji masterê Kubernetes bin, em wê ji wir bistînin:

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

Ka em depoya dex-k8s-authenticator klon bikin:

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

Bi karanîna pelên nirxan, em dikarin bi nermî guhêrbaran ji bo xwe mîheng bikin nexşeyên HELM.

Ka em konfigurasyona Dex-ê diyar bikin:

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

Û ji bo 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

Dex û dex-k8s-authenticator saz bikin:

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

Ka em fonksiyona karûbaran kontrol bikin (Dex divê koda 400 vegerîne, û dex-k8s-authenticator divê koda 200 vegerîne):

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

veavakirina RBAC

Em ji bo komê ClusterRole diafirînin, di doza me de bi gihîştina tenê xwendinê:

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

Ka em ji bo ClusterRoleBinding mîhengek biafirînin:

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

Niha em ji bo ceribandinê amade ne.

Testsên

Biçe rûpela têketinê (https://login.k8s.example.com) û bi karanîna hesabê xweya GitHub têkevin:

Di Kubernetes de bi karanîna GitHub OAuth û Dex verast bikin
Rûpelê têketinê

Di Kubernetes de bi karanîna GitHub OAuth û Dex verast bikin
Rûpelê têketinê ji GitHub re hate verast kirin

Di Kubernetes de bi karanîna GitHub OAuth û Dex verast bikin
 Rêwerzên çêkirî bişopînin da ku bigihîjin

Piştî kopî-paskirina ji rûpela malperê, em dikarin kubectl bikar bînin da ku çavkaniyên komê birêve bibin:

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"

Û ew dixebite, hemî bikarhênerên GitHub di rêxistina me de dikarin çavkaniyan bibînin û têkevin nav podan, lê mafên wan tune ku wan biguhezînin.

Source: www.habr.com

Add a comment