- เนื้อหานี้มีจุดประสงค์เพื่อย้ำความสำคัญของความปลอดภัยใน Kubernetes
- ตำแหน่งที่เก็บ Secret
- เมื่อผู้ใช้ประกาศรีซอร์สผ่านคำสั่ง
kubectl Kubernetes จะสร้างไฟล์ manifest ที่กำหนดรีซอร์สนั้นแล้วบันทึกไว้ใน etcd
- เมื่อผู้ใช้ประกาศรีซอร์ส Secret ข้อมูล Secret ก็จะถูกเก็บไว้ใน etcd เช่นกัน
- เมื่อผู้ใช้สร้าง pod ที่อ่าน Secret ผ่าน volume หรือตัวแปรสภาพแวดล้อม Secret จะถูกเก็บไว้ใน pod นั้น
- หากแฮ็กทั้ง etcd ที่เก็บ Secret และ pod ที่ใช้งาน secret ก็สามารถทราบพาสเวิร์ดที่เก็บอยู่ใน Secret ได้
- การเตรียมตัวล่วงหน้า
- สร้างคลัสเตอร์ด้วย
kubeadm
- เพื่อการทดลอง ได้สร้างรีซอร์สไว้ล่วงหน้า 3 อย่าง: Secret
credit-card, pod app1, pod app2
- การแฮ็ก etcd
- etcd: คลังข้อมูลแบบคีย์-แวลูที่เก็บสถานะของคลัสเตอร์ Kubernetes ข้อมูลทั้งหมดที่ประกาศไว้ใน Kubernetes จะถูกเก็บที่นี่ และสามารถดู Secret ได้จากการตรวจสอบ etcd
- 1.1 หาพาสเวิร์ดด้วย
etcdctl
- ตรวจดู manifest ของ
kube-apiserver เพื่อดึง certificate authority, กุญแจสาธารณะ และกุญแจส่วนตัวของเซิร์ฟเวอร์ etcd
- จากนั้นหาพาสเวิร์ดผ่านคำสั่ง
etcdctl ซึ่งใช้จัดการ etcd ได้สะดวก
- 1.2 เข้าถึง DB ของ etcd โดยตรงเพื่อนำข้อมูลออกมา
- ค้นหาโปรเซสที่ etcd ทำงานอยู่ แล้วสำรวจข้อมูลทั้งหมดของโปรเซสนั้นเพื่อหาพาสเวิร์ด
ps aux | grep etcd - ดึง PID ของ etcd
ll /proc/<pid>/fd จะเห็นไฟล์ลิงก์ที่ระบุว่า db
- ใช้คำสั่ง
cat /proc/<pid>fd/<db> | grep -A10 -B10 credit-card เพื่อหาพาสเวิร์ดที่สร้างไว้ล่วงหน้า
- การแฮ็ก pod
- ดึงข้อมูลผ่าน
kubectl exec
- หากมีสิทธิ์ที่เหมาะสมในการดู Kubernetes ก็สามารถดึงพาสเวิร์ดผ่านคำสั่ง
kubectl ได้
- เข้าถึงคอนเทนเนอร์โดยตรงแล้วดึงข้อมูล
- หากสามารถใช้คำสั่ง Docker บน worker node ได้อย่างอิสระ ก็สามารถขโมยพาสเวิร์ดได้
- สามารถค้นหาคอนเทนเนอร์บน worker node ที่ pod
app1 ถูก schedule ไป แล้วดึงรายการตัวแปรสภาพแวดล้อมที่ตั้งไว้ในคอนเทนเนอร์นั้น
crictl pods - หา Pod ID ของ app1
crictl ps - หาคอนเทนเนอร์ที่ตรงกับ Pod ID
crictl inspect <container id> | grep -A16 env - ดูรายละเอียดคอนเทนเนอร์นั้นเพื่อดึงตัวแปรสภาพแวดล้อม
- ดึงข้อมูลด้วย ServiceAccount ที่มีสิทธิ์เข้าถึง Secret
- หาก ServiceAccount ของ Pod มีสิทธิ์เข้าถึง Secret ก็สามารถหาพาสเวิร์ดได้จากการเรียก API ภายใน pod
- วิธีป้องกันการแฮ็กที่อธิบายข้างต้น
- ปฏิบัติตาม ‘หลักสิทธิ์เท่าที่จำเป็น’ และไม่สร้าง service account ที่มีสิทธิ์เกินความจำเป็น
- ป้องกันการเปิดเผย credential ของผู้ใช้ เพื่อรับมือกับภัยคุกคามอย่าง social engineering
- เข้ารหัส etcd ผ่านรีซอร์ส
EncryptionConfiguration
ยังไม่มีความคิดเห็น