ฉันใช้ Vault CSI Driver บน Charmed Kubernetes v1.19 ซึ่งฉันพยายามดึงความลับจาก Vault สำหรับพ็อดที่ทำงานในเนมสเปซแยกต่างหาก (เว็บแอป
) ด้วยบัญชีบริการของตัวเอง (webapp-sa
) ตามขั้นตอนใน บล็อก.
ดังที่ฉันสามารถเข้าใจได้จนถึงตอนนี้ Pod กำลังพยายามตรวจสอบสิทธิ์กับ Kubernetes API เพื่อให้สามารถสร้างโทเค็น Vault เพื่อเข้าถึงข้อมูลลับจาก Vault ได้ในภายหลัง
$ kubectl รับ po webapp
สถานะพร้อมชื่อเริ่มอายุใหม่
เว็บแอป 0/1 การสร้างคอนเทนเนอร์ 0 22m
ดูเหมือนว่าจะมีปัญหาบางอย่างในการตรวจสอบสิทธิ์กับ Kubernetes API
พ็อดยังคงติดอยู่ในสถานะกำลังสร้างคอนเทนเนอร์พร้อมข้อความ - สร้างโทเค็นบัญชีบริการเพื่อขอพ็อดไม่สำเร็จ
เหตุการณ์:
พิมพ์อายุเหตุผลจากข้อความ
---- ------ ---- ---- -------
ตัวกำหนดตารางเวลาเริ่มต้นปกติ 35m กำหนด webapp/webapp ให้กับ host-03 เรียบร้อยแล้ว
คำเตือน FailedMount 4m38s (x23 มากกว่า 35m) kubelet MountVolume.SetUp ล้มเหลวสำหรับวอลุ่ม "secrets-store-inline": ข้อผิดพลาด rpc: code = Unknown desc = ไม่สามารถเมานต์วัตถุที่เก็บความลับสำหรับ pod webapp/webapp, ข้อผิดพลาด: rpc error: code = Unknown desc = เกิดข้อผิดพลาดในการขอเมานต์: **ล้มเหลวในการสร้างโทเค็นบัญชีบริการสำหรับการร้องขอพ็อด** {webapp xxxx webapp webapp-sa}: เซิร์ฟเวอร์ไม่พบทรัพยากรที่ร้องขอ
ฉันสามารถรับโทเค็นห้องนิรภัยโดยใช้ cli ในพ็อดเนมสเปซ:
$ vault เขียนรับรองความถูกต้อง / kubernetes / เข้าสู่ระบบ บทบาท = ฐานข้อมูล jwt = $ SA_JWT_TOKEN
ค่าคีย์
--- -----
โทเค็น <สนิป>
ฉันได้รับโทเค็นห้องนิรภัยโดยใช้ API เช่นกัน:
$ curl --request POST --data @payload.json https://127.0.0.1:8200/v1/auth/kubernetes/login
{
"request_id":"1234",
<สนิป>
"รับรองความถูกต้อง":{
"client_token":"XyZ",
"ตัวเข้าถึง":"abc",
"นโยบาย":[
"ค่าเริ่มต้น",
"นโยบายเว็บแอป"
]
"token_policies":[
"ค่าเริ่มต้น",
"นโยบายเว็บแอป"
]
"ข้อมูลเมตา":{
"บทบาท":"ฐานข้อมูล",
"service_account_name":"webapp-sa",
"service_account_namespace":"เว็บแอป",
"service_account_secret_name":"webapp-sa-token-abcd",
"service_account_uid":"123456"
},
<สนิป>
}
}
อ้างอิง: https://www.vaultproject.io/docs/auth/kubernetes
ตามเอกสารของห้องนิรภัย ฉันได้กำหนดค่าห้องนิรภัยด้วย Token Reviewer SA ดังนี้:
$ cat vault-auth-service-account.yaml
---
รุ่น api: rbac.authorization.k8s.io/v1
ชนิด: ClusterRoleBinding
ข้อมูลเมตา:
ชื่อ: บทบาทโทเค็นทบทวนผูกพัน
เนมสเปซ: ห้องนิรภัย
บทบาทอ้างอิง:
apiGroup: rbac.authorization.k8s.io
ประเภท: ClusterRole
ชื่อ: ระบบ: auth-delegator
วิชา:
- ประเภท: ServiceAccount
ชื่อ: vault-auth
เนมสเปซ: ห้องนิรภัย
ห้องนิรภัยได้รับการกำหนดค่าด้วย JWT จาก Token Reviewer SA ดังนี้:
$ vault เขียน auth/kubernetes/config \
token_reviewer_jwt="< บัญชีบริการผู้ตรวจสอบ TOKEN JWT>" \
kubernetes_host="https://$KUBERNETES_PORT_443_TCP_ADDR:443"
[email protected]
ฉันได้กำหนดบทบาทห้องนิรภัยเพื่ออนุญาต webapp-sa
เข้าถึงความลับ:
$ vault เขียน auth/kubernetes/role/database \
bound_service_account_names=webapp-sa \
bound_service_account_namespaces=webapp \
นโยบาย = นโยบายเว็บแอพ \
ttl=72ชม
ความสำเร็จ! ข้อมูลที่เขียนถึง: auth/kubernetes/role/database
เดอะ webapp-sa
ได้รับอนุญาตให้เข้าถึงข้อมูลลับตามนโยบายห้องนิรภัยที่กำหนดไว้ดังนี้:
นโยบาย $ vault เขียนนโยบาย webapp - <<EOF
> เส้นทาง "ความลับ/ข้อมูล/db-pass" {
> ความสามารถ = ["อ่าน"]
> }
> สพป
ความสำเร็จ! นโยบายที่อัปโหลด: นโยบายเว็บแอป
Pod และ SA ถูกกำหนดดังนี้:
$ cat webapp-sa-and-pod.yaml
ชนิด: ServiceAccount
api เวอร์ชัน: v1
ข้อมูลเมตา:
ชื่อ: webapp-sa
---
ชนิด: ฝัก
api เวอร์ชัน: v1
ข้อมูลเมตา:
ชื่อ: เว็บแอป
ข้อมูลจำเพาะ:
serviceAccountName: webapp-sa
ตู้คอนเทนเนอร์:
- รูปภาพ: รีจิสทรี/jweissig/app:0.0.1
ชื่อ: เว็บแอป
ปริมาณการติดตั้ง:
- ชื่อ: secret-store-inline
mountPath: "/mnt/secrets-store"
อ่านอย่างเดียว: จริง
ปริมาณ:
- ชื่อ: secret-store-inline
ซีเอสไอ:
ไดรเวอร์: secrets-store.csi.k8s.io
อ่านอย่างเดียว: จริง
ปริมาณแอตทริบิวต์:
ชื่อผู้ให้บริการ: vault
secretProviderClass: "ฐานข้อมูลห้องนิรภัย"
- ใครบ้างมีเงื่อนงำว่าทำไม Pod จึงไม่ตรวจสอบสิทธิ์กับ Kubernetes API
- ฉันต้องเปิดใช้งานการตั้งค่าสถานะบน kube-apiserver เพื่อให้ Token Review API ทำงานหรือไม่
- มีการเปิดใช้งานโดยค่าเริ่มต้นบน Charmed Kubernetes v1.19 หรือไม่
จะขอบคุณสำหรับความช่วยเหลือใด ๆ
ความนับถือ,
ซานะ