SELinux files and processes
Tiếp nối bài học buổi sáng, buổi chiều chúng ta sẽ đi sâu hơn nữa vào cơ chế kiểm soát truy nhập file và process của SELinux. Hãy nhìn vào chi tiết context của file và cách chúng được định nghĩa trong SELinux. Context trong SELinux là một tập hợp các thông tin liên quan đến bảo mật giúp SELinux xác định các policy kiểm soát truy nhập. Trong Linux, mọi thứ đều có security context nhưng security context khác nhau cho những loại object khác nhau. Ta hiển thị SELinux file context cho một file bằng lệnh sau:
ls -alZ /var/*
Ta được như sau:
drwx------. apache apache system_u:object_r:httpd_cache_t:s0 httpd
Có 4 phần phân cách nhau bới dấu “:”
+ Phần đầu là SELinux user context, được chỉ ra là system_u ở đây là một SELinux user.
+ Phần thứ hai là SELinux roles với object_r
+ Phần thứ ba quan trọng nhất là cái định nghĩa loại file (type of context) và chúng ta hiểu rằng nó thuộc về thư mục của một user
+ Phần thứ tư (s0) cho biết tính chất của file và nó làm việc với MLS
Bây giờ ta sẽ xem SELinux process context sử dụng httpd ta đã cài trước đó.
[root@static var]# systemctl start httpd [root@static var]# ps -efZ | grep httpd system_u:system_r:httpd_t:s0 root 2042 1 1 21:43 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND system_u:system_r:httpd_t:s0 apache 2043 2042 0 21:43 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND system_u:system_r:httpd_t:s0 apache 2044 2042 0 21:43 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND system_u:system_r:httpd_t:s0 apache 2045 2042 0 21:43 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND system_u:system_r:httpd_t:s0 apache 2046 2042 0 21:43 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND system_u:system_r:httpd_t:s0 apache 2047 2042 0 21:43 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 2049 1928 0 21:43 pts/0 00:00:00 grep --color=auto httpd
Security context ở đây là:
system_u:system_r:httpd_t:s0
Với users kí hiệu bởi _u, roles kí hiệu bởi _r, và types kí hiệu bởi _t.
SELinux users
SELinux user được định nghĩa trong policy được load vào bộ nhớ lúc khởi động và chỉ có một vài user này. Các user thông thường trên Linux sẽ được map vào các SELinux user. Để xem các mapping này, ta dùng lệnh sau:
[root@static var]# semanage login -l Login Name SELinux User MLS/MCS Range Service __default__ unconfined_u s0-s0:c0.c1023 * root unconfined_u s0-s0:c0.c1023 * system_u system_u s0-s0:c0.c1023 *
Ở đây ta thấy chỉ có user thông thường và root được map vào unconfined_u trong khi đó process và các services được map vào system_u SELinux user. Để xem toàn bộ SELinux user đang có trên hệ thống, ta dùng lệnh sau:
semanage user -l
và được
Các user ở đây bao gồm:
+ guest_u: User này không truy nhập vào X Windows system hay netwoking và cũng không thể thực hiện lệnh su hoặc sudo
+ xguest_u: User này có quyền truy nhập vào GUI và network thông qua duy nhất browser
+ user_u: User này có quyền truy nhập vào GUI và network nhưng không sử dụng được su hoặc sudo
+ staff_u: Giống user_u nhưng có thể sử dụng được su hoặc sudo
+ sysadmin_u: User này gần như có quyền truy nhập tất tả như root.
+ system_u: User này dành cho các system services và không được map vào các account thông thường.
Ứng dụng mớ lý thuyết trên, ta sẽ thực hiện một vài policy trên hệ thống như sau:
1. Giới hạn sử dụng su hoặc sudo
Bằng cách map 1 user vào một SELinux user đã có sẵn, chẳng hạn admin như ví dụ sau, ta đã hạn chế admin sử dụng lệnh su hoặc sudo
semanage login -a -s user_u admin
2. Giới hạn quyền thực thi scripts
Với policy này thì ngoài việc map vào 1 SELinux user không có quyền chạy scripts, ta còn phải giới hạn quyền thực thi scripts trong thư mục của chính user đó
semanage login -a -s guest_u admin
Kiểm tra thuộc tính sau:
getsebool allow_guest_exec_content
Nếu là ON thì ta cần OFF ngay nó như sau:
setsebool allow_guest_exec_content off
3. Giới hạn truy nhập vào dịch vụ
Giả sử user admin có quyền dùng sudo để thực thi các tác vụ như stop/start services như httpd. Ta sẽ phải giới hạn việc truy cập này như sau:
semanage login -a -s user_u admin
Sau đó ta verify lại bằng cách chạy lệnh seinfo như sau:
seinfo -uuser_u -x
ta sẽ thấy:
[root@static ~]# seinfo -uuser_u -x user_u default level: s0 range: s0 roles: object_r user_r
Kết quả trên cho thấy roles user_u có thể access vào. Thêm 1 bước nữa để xem domain nào user_r được cho phép
seinfo -ruser_r -x
Chà, có vẻ rất nhiều đây
[root@static ~]# seinfo -ruser_r -x
user_r
Dominated Roles:
user_r
Types:
abrt_helper_t
alsa_home_t
antivirus_home_t
httpd_user_content_t
httpd_user_htaccess_t
httpd_user_script_t
httpd_user_script_exec_t
httpd_user_rw_content_t
httpd_user_ra_content_t
Ta xem role có thể access vào domain httpd_t bằng lệnh sau:
seinfo -ruser_r -x | grep httpd_t
Không giá trị nào trả về, điều đó có nghĩa là role user_r không được phép đi vào khu vực domain httpd_t và do đó nó không thể start các httpd process hay các daemon.