Tìm hiểu về Linux Capability trong Docker - phần 1

vpn

Well-Known Member
10/09/2019
20
52 bài viết
Tìm hiểu về Linux Capability trong Docker - phần 1
LinuxPenguin.png

Trong bài này mình để nguyên từ “capability” trong “Linux capability” mà không dịch là “khả năng” để bạn biết đó là một khái niệm của Linux.

Thế nào là Linux Capabilities?

Theo như trang capabilities man page, capabilites là những đơn vị quyền (privilege) có thể được enable hoặc disable.
Đa số mọi người nghĩ rằng root là có tất cả các quyền. Không hẳn như vậy, user root sở hữu tất cả các capability mới là có tất cả các quyền. Capability được thêm vào kernel trong vòng 15 năm và cũng ngần ấy năm người ta cố gắng chia nhỏ quyền của root.
Mỗi đặc quyền này được gọi là capability. Với capability, chúng ta không cần phải là một superuser để tiến hành các hoạt động đặc quyền. Tất cả những gì chúng ta cần là có các capability cần thiết cho các hoạt động đặc quyền. Do đó, ngay cả khi một chương trình đặc quyền bị xâm phạm, kẻ tấn công chỉ có thể nhận được khả năng hạn chế. Bằng cách này, nguy cơ của chương trình đặc quyền có thể được hạ xuống khá đáng kể.

Ban đầu kernel được cấp phát bitmask 32 bit để định nghĩa các capability này. Một vài năm trước nó được mở rộng lên 64 bit. Hiện tại có khoảng 38 capability được định nghĩa.
Ta có thể xem danh sách 38 capability ở đây:
curl https://raw.githubusercontent.com/torvalds/linux/master/include/uapi/linux/capability.h | grep "CAP_" | awk '{print $2, $3}'

Các ví dụ của Capability như là khả năng gửi raw IP packets, hoặc là bind những port <1024.
Khi chúng ta chạy các container chúng ta có thể bỏ một nhóm các capability trước khi chạy các container mà không làm cho phần lớn các ứng dụng bị lỗi.
Phần lớn các capability được yêu cầu để thao tác với kernel/system, và những capability này được sử dụng bởi container framework (docker), hiếm khi được sử dụng bởi các tiến trình chạy bên trong container.
Tuy nhiên, một vài container yêu cầu một số capability, ví dụ một tiến trình container yêu cầu capability như setuid/setgid để bỏ đặc quyền (drop privileges).
Một vài năm trước grsecutiry đã làm một vài phân tích trên capabilitty và phát hiện rất nhiều trong số capability có thể cho bạn đầy đủ quyền truy cập hệ thống.
May mắn thay chúng ta còn sử dụng những công cụ như SELinux, seccomp, và namespaces để bảo vệ hệ thống máy chủ (host system) khỏi các container.
Tóm lại, từ góc nhìn của security, bỏ đi càng nhiều capability khỏi container càng tốt.

Chú ý: Khi một container framework bỏ capability trước khi khởi động một container, các tiến trình bên trong container không thể mang các capability này trở lại, thậm chí nếu chúng thực thi một ứng dụng setuid. Để biết thêm thông tin, nhìn vào phần `Capability Bounding Set` trong trang capability man page.

Vậy Docker có những mặc định (default) nào?

Chúng ta hãy xem danh sách các capability sẵn sàng cho các tiến trình có đặc quyền (priviledged process) trong một docker container:
chown, dac_override, fowner, fsetid, kill, setgid, setuid, setpcap, net_bind_service, net_raw, sys_chroot, mknod, audit_write, setfcap
Trong OCI/runc thậm chí khắt khe hơn chỉ giữ lại duy nhất `audit_write`, `kill` và `net_bind_service` và user có thể sử dụng ocitools để bổ sung các capability. Bạn có thể thích cách tiếp cận là thêm các capability khi nào mình cần hơn là phải nhớ xóa các capability bạn không cần.

Phần 2 mình sẽ đi sâu hơn vào Capability.
 
Chỉnh sửa lần cuối bởi người điều hành:
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
  • Thích
Reactions: Phan Nguyen Long
Bên trên