Mục Tiêu Chương 25
Sau khi hoàn thành chương này, bạn sẽ nắm vững các kỹ năng SELinux cần thiết để bảo vệ Linux server.
Hiểu SELinux Modes
Phân biệt enforcing / permissive / disabled và cách chuyển đổi giữa các mode bằng getenforce và setenforce.
Security Contexts
Hiểu cấu trúc user:role:type:level và cách đọc context bằng ls -Z, ps -Z, id -Z.
Quản lý File Context
Sử dụng chcon, restorecon, và semanage fcontext để gán và phục hồi context cho file.
SELinux Booleans
Xem và thay đổi boolean bằng getsebool -a, setsebool -P. Hiểu các boolean phổ biến cho httpd, samba, ftp.
Quản lý Ports
Liệt kê và thêm port được phép bằng semanage port -l và semanage port -a.
Troubleshooting
Phân tích AVC denials bằng ausearch, audit2why, audit2allow, và sealert.
Lý Thuyết SELinux
Nắm vững kiến trúc và các khái niệm cốt lõi của Security-Enhanced Linux.
SELinux Overview — MAC vs DAC
DAC — Discretionary Access Control
- Kiểm soát quyền truy cập theo owner/group/other (chmod)
- Owner có toàn quyền quyết định ai truy cập file của mình
- Nếu process bị khai thác, attacker có quyền của user đó
- Rủi ro: root có thể làm mọi thứ
MAC — Mandatory Access Control
- Kernel enforce policy cho mọi subject/object
- Process chỉ có quyền được policy cho phép
- Ngay cả root cũng bị giới hạn bởi SELinux policy
- An toàn hơn: damage containment
SELinux Modes
Policy được áp dụng đầy đủ. Hành động vi phạm bị từ chối và ghi AVC denial log. Đây là chế độ production.
Policy không áp dụng nhưng vẫn ghi log AVC denial. Dùng để debug và test policy mới trước khi enforce.
SELinux bị tắt hoàn toàn. Cần reboot khi bật lại để relabel toàn bộ filesystem.
Security Contexts — user:role:type:level
Cấu trúc Security Context
Quản lý File Context
| Lệnh | Mục đích | Lưu vào Policy DB? |
|---|---|---|
| chcon | Đổi context trực tiếp trên file (tạm thời) | Không |
| restorecon | Phục hồi context theo policy DB | Đọc DB |
| semanage fcontext | Ghi rule regex vào policy DB (vĩnh viễn) | Ghi vào DB |
SELinux Booleans
Boolean là công tắc on/off cho phép bật/tắt tính năng trong SELinux policy mà không cần viết policy mới. Flag -P làm thay đổi tồn tại sau khi reboot.
Booleans phổ biến cần nhớ
httpd_can_network_connect — cho phép Apache kết nối mạnghttpd_enable_homedirs — cho phép Apache đọc home dirhttpd_use_nfs — cho phép Apache dùng NFS sharesamba_enable_home_dirs — Samba share home directoryftp_home_dir — FTP truy cập home directoryssh_chroot_rw_homedirs — SSH chroot read/writeQuản lý Ports với SELinux
SELinux kiểm soát port nào service được phép lắng nghe. Nếu service dùng port không chuẩn, cần thêm port vào policy.
Troubleshooting SELinux
Các Vấn Đề SELinux Thường Gặp
Dùng mv thay vì cp
Khi dùng mv, file giữ nguyên context cũ từ vị trí gốc. Dùng cp hoặc chạy restorecon sau khi mv.
restorecon -Rv /destination/
Non-standard directory
Service dùng thư mục ngoài path chuẩn (ví dụ /data thay vì /var/www). Giải pháp: thêm rule vào policy DB.
semanage fcontext -a -t TYPE "/path(/.*)?"
Non-standard port
Service lắng nghe trên port không có trong policy. Giải pháp: thêm port bằng semanage.
semanage port -a -t http_port_t -p tcp PORT
Boolean chưa được bật
Tính năng cần boolean cụ thể nhưng boolean đang off. Ví dụ: Apache truy cập home directory cần boolean.
setsebool -P httpd_enable_homedirs on
Lab Thực Hành
Cấu hình Apache với SELinux non-standard directory — kịch bản hoàn chỉnh phục vụ web từ /data/website
Kiểm tra SELinux mode hiện tại
Xác nhận SELinux đang ở chế độ enforcing trước khi bắt đầu.
Tạo thư mục web non-standard
Tạo thư mục /data/website và nội dung test.
Cấu hình Apache DocumentRoot
Sửa file cấu hình Apache để trỏ DocumentRoot đến thư mục mới.
Kiểm tra SELinux context của thư mục
Xem context hiện tại — sẽ là default_t, không phải httpd_sys_content_t.
Thử start Apache và kiểm tra lỗi
Apache start được nhưng SELinux chặn việc đọc file — trả về 403 Forbidden.
Phân tích AVC denial trong audit log
Dùng audit2why để hiểu nguyên nhân và gợi ý cách sửa.
Fix SELinux context cho thư mục
Ghi rule vào policy DB bằng semanage fcontext, sau đó áp dụng bằng restorecon.
Xác nhận Apache hoạt động
Test lại curl — lần này trả về nội dung thành công với SELinux enforcing.
Tóm tắt quy trình Lab
Câu Hỏi Ôn Tập
10 câu hỏi và đáp án giúp củng cố kiến thức Chapter 25.
SELinux MAC khác DAC như thế nào?
DAC (Discretionary) cho phép owner quyết định ai được truy cập file của mình dựa trên rwx permissions. MAC (Mandatory) do kernel enforce policy cho mọi process và file — ngay cả root cũng bị kiểm soát. Nếu httpd bị exploit, DAC không ngăn được attacker leo thang quyền; MAC giới hạn httpd chỉ làm những gì policy cho phép.
Sự khác nhau giữa enforcing và permissive mode?
Enforcing: policy được áp dụng đầy đủ — hành động vi phạm bị từ chối và ghi AVC denial log. Permissive: policy không áp dụng (không chặn) nhưng vẫn ghi log như thể đang bị chặn. Permissive hữu ích để debug và test policy trước khi áp dụng trên production.
Cấu trúc security context (user:role:type:level) là gì?
User: SELinux user identity (system_u, unconfined_u). Role: RBAC role (object_r cho file, system_r cho process). Type: phần quan trọng nhất — xác định domain/type để policy kiểm soát truy cập (httpd_t, httpd_sys_content_t). Level: MLS sensitivity (s0, s0-s0:c0.c1023).
Tại sao nên dùng cp thay vì mv khi làm việc với SELinux?
Khi dùng mv, file mang theo SELinux context từ vị trí cũ. Ví dụ: mv file từ /home (user_home_t) sang /var/www/html — file vẫn giữ context user_home_t thay vì httpd_sys_content_t. Với cp, file mới được tạo và nhận context của thư mục đích. Nếu phải dùng mv, hãy chạy restorecon sau.
semanage fcontext và chcon khác nhau như thế nào?
chcon thay đổi context trực tiếp trên file ngay lập tức nhưng không lưu vào policy DB — thay đổi sẽ mất khi restorecon chạy hoặc filesystem được relabel. semanage fcontext ghi rule regex vào policy DB (vĩnh viễn qua reboot) nhưng cần chạy thêm restorecon để áp dụng lên filesystem.
setsebool -P có nghĩa gì? Tại sao cần flag -P?
Flag -P viết thay đổi boolean vào policy database (Persistent), làm thay đổi tồn tại sau khi reboot. Nếu không có -P, thay đổi chỉ có hiệu lực trong session hiện tại và sẽ mất sau khi khởi động lại. Luôn dùng -P trong môi trường production.
Lệnh nào xem tất cả AVC denials gần đây?
Dùng ausearch -m avc -ts recent để xem AVC denials trong ~10 phút qua. Dùng -ts today cho toàn bộ hôm nay. Kết hợp với audit2why để giải thích: ausearch -m avc -ts recent | audit2why.
audit2allow được dùng để làm gì? Có rủi ro gì?
audit2allow tự động tạo policy module (.pp file) cho phép các hành động bị deny trong AVC log. Rủi ro: có thể tạo policy quá rộng, cho phép nhiều hơn cần thiết, làm yếu bảo mật. Nên dùng như giải pháp cuối cùng. Luôn kiểm tra nội dung policy trước khi load bằng semodule -i.
Làm thế nào để cho phép Apache nghe trên port 8080 với SELinux?
Dùng semanage port -a -t http_port_t -p tcp 8080. Giải thích: -a (add), -t http_port_t (type phù hợp với httpd), -p tcp (protocol). Sau đó restart Apache. Kiểm tra bằng semanage port -l | grep http.
semanage port -a và semanage port -m khác nhau thế nào?
-a (add) thêm port mới chưa có trong policy — dùng khi port chưa được định nghĩa ở bất kỳ type nào. -m (modify) sửa type của port đã tồn tại trong policy — dùng khi port đã có nhưng gán cho type sai. Nếu dùng -a cho port đã có sẽ báo lỗi "already defined".