ข้ามไปยังเนื้อหาหลัก

นโยบาย Admission

Loha ลงลายมือชื่ออิมเมจที่ผ่านเกตความปลอดภัย (การลงลายมือชื่ออิมเมจ) นโยบาย admission นำความเชื่อถือนั้นไปถึงคลัสเตอร์ของคุณ เมื่อใช้นโยบายที่ Loha สร้างให้ admission controller ของคุณจะปฏิเสธอิมเมจจากรีโพสิทอรีที่ Loha บิลด์ซึ่ง Loha ไม่ได้ลงลายมือชื่อ

Loha ไม่ติดตั้งสิ่งใดในคลัสเตอร์ของคุณ และไม่นำนโยบายไปใช้ให้เอง

Loha สร้างนโยบายให้ admission controller สองตัว:

Admission controllerรีซอร์สเวอร์ชัน
KyvernoImageValidatingPolicy (policies.kyverno.io/v1)ยังใช้ไม่ได้ (ดูคำเตือน)
Sigstore policy-controllerClusterImagePolicy (policy.sigstore.dev/v1beta1)เวอร์ชันปัจจุบัน
Kyverno ยังตรวจ provenance ไม่ได้

Kyverno จนถึงอย่างน้อยเวอร์ชัน 1.19.1 ตรวจสอบการรับรอง provenance ของ Loha ไม่ได้ เพราะ Loha ลงลายมือชื่อโดยไม่ใช้ transparency log และการตรวจการรับรองของ Kyverno ไม่สนใจ insecureIgnoreTlog (issue ต้นทาง kyverno/kyverno#17109) จนกว่า Kyverno จะออกเวอร์ชันที่แก้ปัญหานี้ นโยบาย Kyverno จะปฏิเสธอิมเมจของ Loha ทุกอิมเมจในโหมด enforce และรายงานอิมเมจของ Loha ทุกอิมเมจในโหมด audit ให้ใช้ Sigstore policy-controller แทน

นโยบายตรวจอะไร​

นโยบายตรวจทุกพ็อดใน namespace ที่คุณเลือกเปิดใช้ สำหรับอิมเมจแต่ละตัวที่มาจากรีโพสิทอรีในนโยบาย จะต้องมี:

  • ลายมือชื่อจากคีย์ของเวิร์กสเปซคีย์ใดคีย์หนึ่ง ได้แก่ คีย์ที่ใช้งานอยู่ คีย์ที่ปลดระวางแล้ว หรือคีย์ถัดไปของการหมุนคีย์แบบรอเวลา แต่ไม่ใช่คีย์ที่ถูกเพิกถอน
  • การรับรอง SLSA provenance (https://slsa.dev/provenance/v1) ที่ลงลายมือชื่อด้วยคีย์ใดคีย์หนึ่งในคีย์เหล่านั้น และระบุ builder ของ Loha

อิมเมจจากรีโพสิทอรีอื่นไม่ถูกนโยบายนี้ตรวจ

รีโพสิทอรีในนโยบายคือรีโพสิทอรีที่ Loha เคยลงลายมือชื่ออิมเมจอย่างน้อยหนึ่งตัว รวมกับรีโพสิทอรีที่แอดมินเพิ่มไว้ใน การตั้งค่าความปลอดภัยของโค้ด → นโยบาย Admission Loha ลงลายมือชื่อโดยไม่ใช้ transparency log สาธารณะ นโยบายจึงไม่ค้นหา log ดังกล่าว

ดาวน์โหลดนโยบาย​

  • UI: การตั้งค่าความปลอดภัยของโค้ด → นโยบาย Admission เลือก admission controller และโหมด แล้วเลือก ดาวน์โหลดนโยบาย
  • CLI: loha images policy --engine sigstore --mode audit > loha-policy.yaml
  • API: GET /api/v1/security/admission-policy?engine=sigstore&mode=audit ใช้โทเคนที่มี security:read และไม่ได้จำกัดไว้ที่โปรเจกต์เดียว เฮดเดอร์ X-Loha-Policy-Version ในคำตอบระบุเวอร์ชัน

นโยบายพร้อมใช้เมื่อ Loha ลงลายมือชื่ออิมเมจในเวิร์กสเปซอย่างน้อยหนึ่งตัว ก่อนหน้านั้นหน้าเว็บและ CLI จะบอกว่ายังขาดอะไร

นโยบายแต่ละชุดระบุเวอร์ชันไว้ในแอนโนเทชัน loha.cloud/policy-version หน้าการตั้งค่าแสดงเวอร์ชันปัจจุบัน ให้เทียบกับเวอร์ชันที่คลัสเตอร์ของคุณใช้อยู่:

# Sigstore policy-controller
kubectl get clusterimagepolicies -o custom-columns='NAME:.metadata.name,VERSION:.metadata.annotations.loha\.cloud/policy-version'
# Kyverno
kubectl get imagevalidatingpolicies -o custom-columns='NAME:.metadata.name,VERSION:.metadata.annotations.loha\.cloud/policy-version'

นำไปใช้อย่างปลอดภัย​

  1. ติดตั้ง admission controller: Kyverno 1.17 ขึ้นไป หรือ Sigstore policy-controller ซึ่งต้องมีสิทธิ์ดึงข้อมูลจากรีจิสทรีของคุณเพื่ออ่านลายมือชื่อ

    • Kyverno อ่านข้อมูลรับรองรีจิสทรีจาก secret ใน namespace ของตัวเองที่ admission controller ระบุผ่าน --imagePullSecrets
    • policy-controller ใช้ image pull secret ของพ็อด
  2. ใช้นโยบายในโหมด audit: kubectl apply -f loha-policy.yaml

  3. เปิดใช้กับ namespace เดียวก่อน

    • Kyverno: kubectl label namespace <namespace> loha.cloud/verify-images=true

    • Sigstore policy-controller: kubectl label namespace <namespace> policy.sigstore.dev/include=true

      ใน namespace ที่เปิดใช้ policy-controller จะปฏิเสธอิมเมจที่ ไม่มี นโยบายใดตรงเลย เว้นแต่ตั้ง no-match-policy เป็น warn หรือ allow ใน ConfigMap config-policy-controller ให้ตั้งเป็น warn เว้นแต่คุณมีนโยบายครอบคลุมทุกอิมเมจที่รันใน namespace นั้นอยู่แล้ว

  4. อ่านสิ่งที่โหมด audit รายงาน

    • Kyverno เขียน policy report: kubectl get policyreports -n <namespace>
    • policy-controller ส่งคำเตือนกลับไปที่ kubectl และบันทึกไว้ใน log

    แก้ทุกอิมเมจที่จะถูกปฏิเสธ อิมเมจที่ไม่มีลายมือชื่อในรีโพสิทอรีที่ถูกตรวจมักมาจากบิลด์นอก Loha หรือจากบิลด์ที่ Loha ลงลายมือชื่อไม่ได้ (ดูสถานะการรับรองในแท็บ Security ของบิลด์)

  5. เปลี่ยนเป็นโหมด enforce ดาวน์โหลดนโยบายใหม่ในโหมด enforce แล้วนำไปใช้ จากนั้นจึงติดป้าย namespace อื่นทีละ namespace

การหมุนคีย์​

เมื่อแอดมินหมุนคีย์ลงลายมือชื่อของเวิร์กสเปซ Loha จะเตรียมคีย์ใหม่ไว้ก่อน:

  • คีย์ใหม่ปรากฏในนโยบายทันทีในฐานะคีย์ถัดไป แต่ยังไม่ลงลายมือชื่อสิ่งใด
  • คีย์จะเริ่มลงลายมือชื่อหลัง 7 วัน หรือเร็วกว่านั้นหากแอดมินเปิดใช้ในส่วน คีย์ลงลายมือชื่อ
  • เจ้าของและแอดมินของเวิร์กสเปซจะได้รับอีเมลทุกครั้งที่เวอร์ชันของนโยบายเปลี่ยน ให้ดาวน์โหลดนโยบายใหม่และนำไปใช้กับทุกคลัสเตอร์ก่อนที่คีย์ใหม่จะเริ่มลงลายมือชื่อ คลัสเตอร์ที่ยังใช้นโยบายเก่าจะปฏิเสธอิมเมจที่ลงลายมือชื่อด้วยคีย์ใหม่

การเปิดใช้คีย์ถัดไปไม่เปลี่ยนเวอร์ชันของนโยบาย เพราะนโยบายเชื่อถือทั้งสองคีย์อยู่แล้ว

การเพิกถอนมีผลทันที การหมุนคีย์พร้อม เพิกถอน จะนำคีย์ปัจจุบันออกจากนโยบายทันที และหากมีคีย์ที่เตรียมไว้ คีย์นั้นจะเริ่มลงลายมือชื่อทันที ให้นำนโยบายที่อัปเดตแล้วไปใช้ทันที ก่อนจะทำเช่นนั้น คลัสเตอร์ของคุณยังยอมรับอิมเมจที่ลงลายมือชื่อด้วยคีย์ที่ถูกเพิกถอน

ขณะนี้ยังไม่สามารถเพิกถอนคีย์ที่ปลดระวางไปแล้ว

สิ่งที่ฟีเจอร์นี้ไม่ได้ทำ​

  • Loha ไม่ได้นำนโยบายไปใช้ และมองไม่เห็นว่าคลัสเตอร์ของคุณใช้นโยบายอยู่หรือไม่
  • namespace ที่คุณไม่ได้ติดป้ายจะไม่ถูกตรวจ
  • อิมเมจจากรีโพสิทอรีที่ไม่อยู่ในนโยบายจะไม่ถูกนโยบายนี้ตรวจ
  • นโยบายตรวจลายมือชื่อและ provenance ของ Loha ไม่ได้ตรวจผลการสแกน
    • ในโหมด Enforce Loha ลงลายมือชื่อเฉพาะอิมเมจที่ผ่านเกตความปลอดภัย
    • ในโหมด Observe Loha ลงลายมือชื่ออิมเมจที่ผลการสแกนครบแล้วผ่านเกณฑ์ของนโยบาย และ provenance บันทึกโหมดไว้