Lập trình 22/09/2026 9 phút

Slowloris đo thật: 400 kết nối gửi một byte mỗi 500 ms, chỉ 6,4 Kbit mỗi giây, làm server Go không timeout trèo lên 252 goroutine và từ chối 80% client thật; ReadHeaderTimeout dọn sạch, giới hạn 50 kết nối mỗi IP thì không cả spike

Một client mở 400 kết nối tới server Go và gửi header nhỏ giọt một byte mỗi 500 ms, không bao giờ hoàn tất request. Server http.Server{} mặc định không timeout: trèo lên 252 goroutine, cạn file descriptor với 37 lần too many open files, client thật rớt từ 20/20 còn 2/10. Thêm ReadHeaderTimeout 3 giây: spike 252 goroutine trong 2 giây rồi timeout đóng hết, goroutine về 2, client thật 10/10. Thêm giới hạn 50 kết nối mỗi IP ở tầng Accept: 350 trên 400 bị đóng ngay, 0 lần cạn file descriptor. Băng thông tấn công chỉ 6,4 Kbit mỗi giây.

Lập trình 22/09/2026 8 phút

Tổng kết sê-ri bảo mật kết nối: checklist mười hai phần với từng con số đã đo, từ ECDSA rẻ hơn RSA bốn lần và AES-GCM nhanh gấp 26 lần khi CPU có lệnh phần cứng, tới slowloris 6,4 Kbit mỗi giây hạ một server quên đặt timeout

Gom mười một phần đo thật thành một checklist hành động, mỗi mục kèm con số đo trên cùng cặp máy aarch64. Cấu hình TLS: ECDSA P-256 cho chuỗi 860 byte và bắt tay 0,54 ms, để Go tự chọn cipher vì AES-GCM nhanh 26 lần khi có lệnh AES. mTLS và xoay: thêm 100 microsecond server, xoay 2.000 kết nối mở không rơi, lùi NotBefore cứu client lệch giờ. Secret và timeout: Redacted cho log và ulimit core 0, bcrypt 12 cho ngưỡng 250 ms, ghim thuật toán JWT, luôn đặt ReadHeaderTimeout vì slowloris 6,4 Kbit mỗi giây đủ hạ server. Số tuyệt đối tuỳ phần cứng, tỉ lệ thì mang đi được.

Lập trình 22/09/2026 9 phút

Capabilities đo thật: root trong container không phải root đầy đủ, Docker mặc định chỉ cấp 14 trong hơn 40 capability, nên chown và bind cổng thấp chạy được nhưng date -s, mount và ip addr add bị chặn, và --cap-drop ALL đưa CapEff về 0

Linux chia quyền root thành hơn 40 capability riêng. Docker mặc định chỉ cấp 14 cho root trong container, bỏ khoảng 26 cái nguy hiểm. Đo bằng CapEff trong /proc/self/status và test từng syscall bằng exit code: chown, tạo device node, raw socket, bind cổng dưới 1024 chạy được; date -s, mount tmpfs, ip addr add bị chặn vì thiếu SYS_TIME, SYS_ADMIN, NET_ADMIN. --cap-add NET_ADMIN đổi CapEff từ a80425fb thành a80435fb và bật ip addr add; --cap-drop CHOWN chặn chown; --cap-drop ALL đưa CapEff về 0 chặn tất cả, rồi --cap-add một cái cho CapEff chỉ bit đó.

Lập trình 22/09/2026 10 phút

Seccomp đo thật: Docker gắn sẵn profile lọc syscall, keyctl bị chặn trả EPERM dù tiến trình đủ quyền, còn seccomp=unconfined cho nó chạy và đổi errno sang EINVAL, chứng minh seccomp là lớp độc lập dưới capability, chi phí lọc khoảng 24 ns mỗi lần

Seccomp là bộ lọc syscall ở tầng kernel, độc lập với capability. Docker gắn sẵn profile mặc định chặn khoảng 40-50 syscall nguy hiểm. Đo bằng Seccomp trong /proc/self/status (mặc định = 2 mode FILTER, unconfined = 0) và errno của keyctl(GET_KEYRING_ID): mặc định trả EPERM (errno 1, bị filter chặn), seccomp=unconfined trả EINVAL (errno 22, syscall đã chạy). errno đổi 1 sang 22 chứng minh chính seccomp chặn, không phải thiếu quyền. Khác unshare(CLONE_NEWUSER) do capability gác. Chi phí lọc: 3 triệu getuid, filter 172 ns so với 148 ns mỗi syscall, cộng khoảng 24 ns.

Lập trình 22/09/2026 9 phút

Tổng kết sê-ri container nội bộ: checklist chạy app backend, gom 11 phép đo thành một lệnh docker run đóng gói cẩn thận với --init, --cap-drop ALL, --read-only, trần bộ nhớ CPU pids fd, rồi đọc lại từng knob từ /proc và cgroup để chứng minh cờ đã ăn

Bài tổng kết sê-ri Container nội bộ: gom 11 phép đo từ namespace, cgroup, OverlayFS, capabilities, seccomp, file descriptor, PID 1 tới bộ nhớ thành một checklist cấu hình thực chiến. Dựng một lệnh docker run đóng gói cẩn thận (--init, --cap-drop ALL, --security-opt no-new-privileges, --read-only, --memory, --cpus, --pids-limit, --ulimit) rồi đọc lại từng knob từ /proc và /sys/fs/cgroup để chứng minh cờ đã ăn: PID 1 thành docker-init, CapEff về 0, memory.max 256 MB, pids.max 100, rootfs read-only. So sánh với container mặc định để thấy mặc định siết sẵn một phần nhưng để tài nguyên là max.