เรายึดการให้สิทธิ์ LDAP กับ Kubernetes

เรายึดการให้สิทธิ์ LDAP กับ Kubernetes

บทแนะนำขนาดเล็กเกี่ยวกับวิธีใช้ Keycloak เพื่อเชื่อมต่อ Kubernetes กับเซิร์ฟเวอร์ LDAP และตั้งค่าการนำเข้าผู้ใช้และกลุ่ม ซึ่งจะช่วยให้คุณสามารถตั้งค่า RBAC สำหรับผู้ใช้ของคุณ และใช้ auth-proxy เพื่อป้องกัน Kubernetes Dashboard และแอปพลิเคชันอื่นๆ ที่ไม่ทราบวิธีการอนุญาตด้วยตนเอง

การติดตั้ง Keycloak

สมมติว่าคุณมีเซิร์ฟเวอร์ LDAP อยู่แล้ว อาจเป็น Active Directory, FreeIPA, OpenLDAP หรืออะไรก็ได้ หากคุณไม่มีเซิร์ฟเวอร์ LDAP ตามหลักการแล้ว คุณสามารถสร้างผู้ใช้โดยตรงในอินเทอร์เฟซ Keycloak หรือใช้ผู้ให้บริการ oidc สาธารณะ (Google, Github, Gitlab) ผลลัพธ์จะเกือบเหมือนกัน

ก่อนอื่นมาติดตั้ง Keycloak กันก่อน การติดตั้งสามารถดำเนินการแยกกันหรือโดยตรงกับคลัสเตอร์ Kubernetes ตามกฎแล้ว หากคุณมีคลัสเตอร์ Kubernetes หลายตัว การติดตั้งแยกกันจะง่ายกว่า ในทางกลับกัน คุณสามารถใช้ได้ตลอดเวลา แผนภูมิหางเสืออย่างเป็นทางการ และติดตั้งลงในคลัสเตอร์ของคุณโดยตรง

ในการจัดเก็บข้อมูล Keycloak คุณจะต้องมีฐานข้อมูล ค่าเริ่มต้นคือ h2 (ข้อมูลทั้งหมดถูกจัดเก็บไว้ในเครื่อง) แต่ก็สามารถใช้งานได้เช่นกัน postgres, mysql หรือ mariadb.
หากคุณยังคงตัดสินใจติดตั้ง Keycloak แยกต่างหาก คุณสามารถดูคำแนะนำโดยละเอียดเพิ่มเติมได้ใน เอกสารราชการ.

การตั้งค่าสหพันธ์

ก่อนอื่นเรามาสร้างอาณาจักรใหม่กันเถอะ Realm คือพื้นที่ของแอปพลิเคชันของเรา แต่ละแอ็พพลิเคชันสามารถมีขอบเขตของตนเองโดยมีผู้ใช้และการตั้งค่าการอนุญาตที่แตกต่างกัน ขอบเขตหลักถูกใช้โดย Keycloak เองและการใช้มันเพื่อสิ่งอื่นนั้นผิด

กด เพิ่มอาณาจักร

ตัวเลือกเสริม (Option)
ความคุ้มค่า

Name
kubernetes

ชื่อที่แสดง
Kubernetes

ชื่อที่แสดง HTML
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >

Kubernetes จะตรวจสอบตามค่าเริ่มต้นว่าอีเมลของผู้ใช้ได้รับการยืนยันหรือไม่ เนื่องจากเราใช้เซิร์ฟเวอร์ LDAP ของเราเอง การตรวจสอบนี้จึงมักจะส่งคืน false. เรามาปิดการแสดงการตั้งค่านี้ใน Kubernetes:

ขอบเขตไคลเอนต์ -> อีเมลล์ -> นักทำแผนที่ -> ยืนยันอีเมลแล้ว (ลบ)

ตอนนี้มาตั้งค่าสหพันธ์เพื่อสิ่งนี้เราไปที่:

สหพันธ์ผู้ใช้ -> เพิ่มผู้ให้บริการ… -> LDAP

นี่คือตัวอย่างการตั้งค่าสำหรับ FreeIPA:

ตัวเลือกเสริม (Option)
ความคุ้มค่า

ชื่อที่แสดงของคอนโซล
freeipa.example.org

ผู้ขาย
Red Hat Directory Server

แอตทริบิวต์ UUID LDAP
ipauniqueid

URL การเชื่อมต่อ
ldaps://freeipa.example.org

DN ของผู้ใช้
cn=users,cn=accounts,dc=example,dc=org

ผูกDN
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org

ผูกข้อมูลรับรอง
<password>

อนุญาตการตรวจสอบสิทธิ์ Kerberos:
on

อาณาจักร Kerberos:
EXAMPLE.ORG

หัวหน้าเซิร์ฟเวอร์:
HTTP/[email protected]

แท็บคีย์:
/etc/krb5.keytab

ผู้ใช้งาน keycloak-svc ต้องสร้างไว้ล่วงหน้าบนเซิร์ฟเวอร์ LDAP ของเรา

ในกรณีของ Active Directory ให้เลือก ผู้ขาย: Active Directory และการตั้งค่าที่จำเป็นจะถูกแทรกลงในแบบฟอร์มโดยอัตโนมัติ

กด ลด

ตอนนี้ไปกันเถอะ:

สหพันธ์ผู้ใช้ -> freeipa.example.org -> นักทำแผนที่ -> ชื่อ

ตัวเลือกเสริม (Option)
ความคุ้มค่า

คุณลักษณะ Ldap
givenName

ตอนนี้เปิดใช้งานการแมปกลุ่ม:

สหพันธ์ผู้ใช้ -> freeipa.example.org -> นักทำแผนที่ -> สร้างบัญชีตัวแทน

ตัวเลือกเสริม (Option)
ความคุ้มค่า

Name
groups

ประเภทผู้ทำแผนที่
group-ldap-mapper

กลุ่ม LDAP DN
cn=groups,cn=accounts,dc=example,dc=org

กลยุทธ์การดึงกลุ่มผู้ใช้
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

นี่เป็นการเสร็จสิ้นการตั้งค่าสหพันธรัฐ เรามาต่อที่การตั้งค่าไคลเอ็นต์กัน

การตั้งค่าไคลเอนต์

มาสร้างไคลเอนต์ใหม่ (แอปพลิเคชันที่จะรับผู้ใช้จาก Keycloak) ไปกันเถอะ:

ลูกค้าของเรา -> สร้างบัญชีตัวแทน

ตัวเลือกเสริม (Option)
ความคุ้มค่า

รหัสลูกค้า
kubernetes

ประเภทการเข้าถึง
confidenrial

URL รูท
http://kubernetes.example.org/

URI การเปลี่ยนเส้นทางที่ถูกต้อง
http://kubernetes.example.org/*

URL ของผู้ดูแลระบบ
http://kubernetes.example.org/

เราจะสร้างขอบเขตสำหรับกลุ่มด้วย:

ขอบเขตไคลเอนต์ -> สร้างบัญชีตัวแทน

ตัวเลือกเสริม (Option)
ความคุ้มค่า

แบบ
No template

Name
groups

เส้นทางกลุ่มเต็ม
false

และตั้งค่าผู้ทำแผนที่สำหรับพวกเขา:

ขอบเขตไคลเอนต์ -> กลุ่ม -> นักทำแผนที่ -> สร้างบัญชีตัวแทน

ตัวเลือกเสริม (Option)
ความคุ้มค่า

Name
groups

ประเภทผู้ทำแผนที่
Group membership

ชื่อการอ้างสิทธิ์โทเค็น
groups

ตอนนี้เราจำเป็นต้องเปิดใช้งานการแมปกลุ่มในขอบเขตลูกค้าของเรา:

ลูกค้าของเรา -> Kubernetes -> ขอบเขตไคลเอนต์ -> ขอบเขตไคลเอนต์เริ่มต้น

เลือก กลุ่ม в ขอบเขตไคลเอนต์ที่มีอยู่กด เพิ่มรายการที่เลือก

ตอนนี้เรามาตั้งค่าการรับรองความถูกต้องของแอปพลิเคชันของเรากันดีกว่า โดยไปที่:

ลูกค้าของเรา -> Kubernetes

ตัวเลือกเสริม (Option)
ความคุ้มค่า

เปิดใช้งานการอนุญาตแล้ว
ON

มาผลักดันกันเถอะ ประหยัด และนี่ทำให้การตั้งค่าไคลเอนต์เสร็จสมบูรณ์ ตอนนี้อยู่บนแท็บ

ลูกค้าของเรา -> Kubernetes -> หนังสือรับรอง

คุณสามารถได้รับ ลับ ซึ่งเราจะใช้ในภายหลัง

การกำหนดค่า Kubernetes

การตั้งค่า Kubernetes สำหรับการอนุญาต OIDC นั้นค่อนข้างเล็กน้อยและไม่ซับซ้อนมากนัก สิ่งที่คุณต้องทำคือใส่ใบรับรอง CA ของเซิร์ฟเวอร์ OIDC ของคุณลงไป /etc/kubernetes/pki/oidc-ca.pem และเพิ่มตัวเลือกที่จำเป็นสำหรับ kube-apiserver
หากต้องการทำสิ่งนี้ ให้อัปเดต /etc/kubernetes/manifests/kube-apiserver.yaml กับเจ้านายของคุณทั้งหมด:

...
spec:
  containers:
  - command:
    - kube-apiserver
...
    - --oidc-ca-file=/etc/kubernetes/pki/oidc-ca.pem
    - --oidc-client-id=kubernetes
    - --oidc-groups-claim=groups
    - --oidc-issuer-url=https://keycloak.example.org/auth/realms/kubernetes
    - --oidc-username-claim=email
...

และอัปเดตการกำหนดค่า kubeadm ในคลัสเตอร์เพื่อไม่ให้การตั้งค่าเหล่านี้สูญหายระหว่างการอัปเดต:

kubectl edit -n kube-system configmaps kubeadm-config

...
data:
  ClusterConfiguration: |
    apiServer:
      extraArgs:
        oidc-ca-file: /etc/kubernetes/pki/oidc-ca.pem
        oidc-client-id: kubernetes
        oidc-groups-claim: groups
        oidc-issuer-url: https://keycloak.example.org/auth/realms/kubernetes
        oidc-username-claim: email
...

เสร็จสิ้นการตั้งค่า Kubernetes คุณทำซ้ำขั้นตอนเหล่านี้กับคลัสเตอร์ Kubernetes ทั้งหมดได้

การอนุญาตเบื้องต้น

หลังจากขั้นตอนเหล่านี้ คุณจะมีคลัสเตอร์ Kubernetes ที่มีการกำหนดค่าการให้สิทธิ์ OIDC ไว้แล้ว ประเด็นเดียวคือผู้ใช้ของคุณยังไม่ได้กำหนดค่าไคลเอ็นต์รวมถึง kubeconfig ของตนเอง ในการแก้ปัญหานี้ คุณต้องกำหนดค่าการออก kubeconfig โดยอัตโนมัติให้กับผู้ใช้หลังจากการให้สิทธิ์สำเร็จ

ในการทำเช่นนี้คุณสามารถใช้เว็บแอปพลิเคชันพิเศษที่ให้คุณตรวจสอบสิทธิ์ผู้ใช้แล้วดาวน์โหลด kubeconfig ที่เสร็จแล้ว วิธีหนึ่งที่สะดวกที่สุดคือ คูเบรอสซึ่งช่วยให้คุณอธิบายคลัสเตอร์ Kubernetes ทั้งหมดในการกำหนดค่าเดียวและสลับระหว่างคลัสเตอร์เหล่านั้นได้อย่างง่ายดาย

ในการกำหนดค่า Kuberos ก็เพียงพอที่จะอธิบายเทมเพลตสำหรับ kubeconfig และเรียกใช้ด้วยพารามิเตอร์ต่อไปนี้:

kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/template

สำหรับรายละเอียดเพิ่มเติมโปรดดู การใช้ บน Github

นอกจากนี้ยังสามารถใช้ คูเบล็อกอิน หากคุณต้องการอนุญาตโดยตรงบนคอมพิวเตอร์ของผู้ใช้ ในกรณีนี้ ผู้ใช้จะเปิดเบราว์เซอร์พร้อมแบบฟอร์มการอนุญาตบน localhost

สามารถตรวจสอบผลลัพธ์ kubeconfig ได้บนเว็บไซต์ jwt.io. เพียงคัดลอกค่า users[].user.auth-provider.config.id-token จาก kubeconfig ของคุณไปยังแบบฟอร์มบนเว็บไซต์และรับการถอดเสียงทันที

การตั้งค่า RBAC

เมื่อกำหนดค่า RBAC คุณสามารถอ้างถึงทั้งชื่อผู้ใช้ (ฟิลด์ name ในโทเค็น jwt) และสำหรับกลุ่มผู้ใช้ (field groups ในโทเค็น jwt) นี่คือตัวอย่างการตั้งค่าสิทธิ์สำหรับกลุ่ม kubernetes-default-namespace-admins:

kubernetes-ค่าเริ่มต้น-namespace-admins.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: default-admins
  namespace: default
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kubernetes-default-namespace-admins
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: default-admins
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: kubernetes-default-namespace-admins

ตัวอย่างเพิ่มเติมสำหรับ RBAC สามารถพบได้ใน เอกสารอย่างเป็นทางการของ Kubernetes

การตั้งค่า auth-proxy

มีโครงการที่ยอดเยี่ยม กุญแจ-คนเฝ้าประตูซึ่งช่วยให้คุณรักษาความปลอดภัยแอปพลิเคชันใดๆ ก็ได้โดยอนุญาตให้ผู้ใช้ตรวจสอบสิทธิ์กับเซิร์ฟเวอร์ OIDC ฉันจะแสดงให้คุณเห็นว่าคุณสามารถตั้งค่าได้อย่างไรโดยใช้ Kubernetes Dashboard เป็นตัวอย่าง:

แดชบอร์ด-proxy.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: kubernetes-dashboard-proxy
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: kubernetes-dashboard-proxy
    spec:
      containers:
      - args:
        - --listen=0.0.0.0:80
        - --discovery-url=https://keycloak.example.org/auth/realms/kubernetes
        - --client-id=kubernetes
        - --client-secret=<your-client-secret-here>
        - --redirection-url=https://kubernetes-dashboard.example.org
        - --enable-refresh-tokens=true
        - --encryption-key=ooTh6Chei1eefooyovai5ohwienuquoh
        - --upstream-url=https://kubernetes-dashboard.kube-system
        - --resources=uri=/*
        image: keycloak/keycloak-gatekeeper
        name: kubernetes-dashboard-proxy
        ports:
        - containerPort: 80
          livenessProbe:
            httpGet:
              path: /oauth/health
              port: 80
            initialDelaySeconds: 3
            timeoutSeconds: 2
          readinessProbe:
            httpGet:
              path: /oauth/health
              port: 80
            initialDelaySeconds: 3
            timeoutSeconds: 2
---
apiVersion: v1
kind: Service
metadata:
  name: kubernetes-dashboard-proxy
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: kubernetes-dashboard-proxy
  type: ClusterIP

ที่มา: will.com

เพิ่มความคิดเห็น