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