Blog
Thoughts on engineering, design, and building great products.
Kiểu Tetragon: Từ Quan Sát Đến Cưỡng Chế Bằng bpf_send_signal
Tetragon là công cụ an ninh runtime của hệ Cilium: nó quan sát bằng kprobe/tracepoint (đúng những hook Part II dùng) rồi cưỡng chế ngay trong nhân. Cơ chế cưỡng chế thật của nó là hai helper — bpf_send_signal gửi SIGKILL giết tiến trình, và bpf_override_return ghi đè giá trị trả về syscall. Bài này tự dựng đúng cơ chế đó: một tracepoint exec gọi bpf_send_signal(SIGKILL) để giết một tiến trình ngay khi nó chạy — binary cấm nhận exit 137, binary thường vẫn chạy. Không cần LSM hay reboot.
LSM BPF: Cưỡng Chế An Ninh Ngay Trong Nhân
Tới giờ eBPF của ta chỉ quan sát. LSM BPF thì cưỡng chế: gắn vào các điểm kiểm soát an ninh của nhân (Linux Security Modules) mà SELinux, AppArmor dùng, và một chương trình trả về 0 cho qua hay -EPERM để chặn. Bài này viết một chương trình LSM chặn mở file, và gặp một bài học thật: lần đầu nó nạp và gắn được nhưng không chặn gì — vì bpf chưa nằm trong danh sách LSM hoạt động. Bật bpf bằng tham số boot rồi reboot, cùng chương trình đó chặn thật — cat và python đều nhận Operation not permitted.
Verifier: Vì Sao eBPF Không Sập Nhân
Bài 1 nói thiết kế máy ảo eBPF cho phép verifier chứng minh an toàn. Bài này thấy nó làm thật: ta biên dịch một chương trình XDP đọc byte đầu của gói tin mà quên kiểm giới hạn, nạp vào nhân — verifier từ chối với log chỉ đích danh thanh ghi và lý do. Thêm đúng một câu kiểm data_end, verifier cho qua. Verifier là bộ chứng minh an toàn chạy lúc nạp, theo dõi trạng thái từng thanh ghi trên mọi nhánh — thứ khiến eBPF nạp được mã lạ vào nhân mà không như kernel module.
seccomp-bpf: BPF Cổ Điển Lọc Syscall Trong Mọi Container
Trước eBPF có cBPF — BPF cổ điển, thứ tcpdump dùng. Và nó vẫn đang chạy: seccomp-bpf lọc syscall bằng cBPF, là lớp sandbox nền của container. Bài này phân biệt cBPF với eBPF, soi seccomp thật trên cụm (pause container và CSI sidecar bị giới hạn, pod privileged thì không, systemd-resolved chồng 28 filter), rồi tự viết một filter cBPF chặn mkdir bằng EPERM — tám lệnh thao tác trên struct seccomp_data, cài bằng prctl, chặn thật trong khi printf vẫn chạy.
Node Log Query và Phân Quyền Kubelet Chi Tiết
Bài 65 xem log thành phần hệ thống bằng cách SSH vào từng node chạy journalctl. v1.36 cho query log đó thẳng qua API kubelet, không cần SSH. Và đi kèm là một thay đổi bảo mật: quyền truy cập API kubelet, trước đây gộp một cục trong nodes/proxy, nay tách chi tiết từng endpoint — cho phép cấp đúng nodes/metrics cho agent giám sát mà không trao luôn quyền đọc log hay exec. Bài cuối Part XIV, cả hai chạm tới thành phần ta tự dựng ở Part I.
Admission Policy bằng CEL
Bài 58 dựng admission webhook — một dịch vụ HTTPS riêng có cert, có server phải giữ sống. Từ v1.36, phần lớn nhu cầu đó làm được mà không cần server nào: ValidatingAdmissionPolicy và MutatingAdmissionPolicy viết luật bằng CEL ngay trong API server. Bài này mở Part XIV — các tính năng vừa graduate ở chính v1.36 cụm đang chạy — bằng cách chặn image :latest và tự tiêm label cho pod, hoàn toàn bằng policy object, không một dòng server.
Secret, Lối Vòng và Hardening
Part XI khép lại ở Secret và những lỗ hổng còn sót. Ta đọc thẳng etcd để xác nhận Secret được mã hóa at-rest từ Bài 5, rồi dựng một lối vòng thật: một ServiceAccount không có quyền đọc Secret vẫn moi được giá trị bằng cách tạo một pod mount Secret đó và đọc log. Cuối bài là bảng các bước siết cụm tự dựng — cái nào đã làm trong series, cái nào còn thiếu.