• เนื้อหานี้มีจุดประสงค์เพื่อย้ำความสำคัญของความปลอดภัยใน 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

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น