
บทแนะนำขนาดเล็กเกี่ยวกับวิธีใช้ 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)
ความคุ้มค่า
ชื่อ
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/freeipa.example.org@EXAMPLE.ORG
แท็บคีย์:
/etc/krb5.keytab
ผู้ใช้งาน keycloak-svc ต้องสร้างไว้ล่วงหน้าบนเซิร์ฟเวอร์ LDAP ของเรา
ในกรณีของ Active Directory ให้เลือก ผู้ขาย: Active Directory และการตั้งค่าที่จำเป็นจะถูกแทรกลงในแบบฟอร์มโดยอัตโนมัติ
กด ลด
ตอนนี้ไปกันเถอะ:
สหพันธ์ผู้ใช้ -> freeipa.example.org -> นักทำแผนที่ -> ชื่อ
ตัวเลือกเสริม (Option)
ความคุ้มค่า
คุณลักษณะ Ldap
givenName
ตอนนี้เปิดใช้งานการแมปกลุ่ม:
สหพันธ์ผู้ใช้ -> freeipa.example.org -> นักทำแผนที่ -> สร้างบัญชีตัวแทน
ตัวเลือกเสริม (Option)
ความคุ้มค่า
ชื่อ
groups
ประเภทผู้ทำแผนที่
group-ldap-mapper
กลุ่ม LDAP DN
cn=groups,cn=accounts,dc=example,dc=org
กลยุทธ์การดึงกลุ่มผู้ใช้
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE
นี่เป็นการเสร็จสิ้นการตั้งค่าสหพันธรัฐ เรามาต่อที่การตั้งค่าไคลเอ็นต์กัน
การตั้งค่าไคลเอนต์
มาสร้างไคลเอนต์ใหม่ (แอปพลิเคชันที่จะรับผู้ใช้จาก Keycloak) ไปกันเถอะ:
Clients -> สร้างบัญชีตัวแทน
ตัวเลือกเสริม (Option)
ความคุ้มค่า
รหัสลูกค้า
kubernetes
ประเภทการเข้าถึง
confidenrial
URL รูท
http://kubernetes.example.org/
URI การเปลี่ยนเส้นทางที่ถูกต้อง
http://kubernetes.example.org/*
URL ของผู้ดูแลระบบ
http://kubernetes.example.org/
เราจะสร้างขอบเขตสำหรับกลุ่มด้วย:
ขอบเขตไคลเอนต์ -> สร้างบัญชีตัวแทน
ตัวเลือกเสริม (Option)
ความคุ้มค่า
แบบ
No template
ชื่อ
groups
เส้นทางกลุ่มเต็ม
false
และตั้งค่าผู้ทำแผนที่สำหรับพวกเขา:
ขอบเขตไคลเอนต์ -> กลุ่ม -> นักทำแผนที่ -> สร้างบัญชีตัวแทน
ตัวเลือกเสริม (Option)
ความคุ้มค่า
ชื่อ
groups
ประเภทผู้ทำแผนที่
Group membership
ชื่อการอ้างสิทธิ์โทเค็น
groups
ตอนนี้เราจำเป็นต้องเปิดใช้งานการแมปกลุ่มในขอบเขตลูกค้าของเรา:
Clients -> Kubernetes -> ขอบเขตไคลเอนต์ -> ขอบเขตไคลเอนต์เริ่มต้น
เลือก กลุ่ม в ขอบเขตไคลเอนต์ที่มีอยู่กด เพิ่มรายการที่เลือก
ตอนนี้เรามาตั้งค่าการรับรองความถูกต้องของแอปพลิเคชันของเรากันดีกว่า โดยไปที่:
Clients -> Kubernetes
ตัวเลือกเสริม (Option)
ความคุ้มค่า
เปิดใช้งานการอนุญาตแล้ว
ON
มาผลักดันกันเถอะ ประหยัด และนี่ทำให้การตั้งค่าไคลเอนต์เสร็จสมบูรณ์ ตอนนี้อยู่บนแท็บ
Clients -> 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 ได้บนเว็บไซต์ . เพียงคัดลอกค่า 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 สามารถพบได้ใน
การตั้งค่า 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
