Các lệnh của SELinux – Chế ngự SELinux không khó

Nắm được các lệnh của SELinux bạn  mới có thể chế ngự được nó. Ở bài trước chúng ta đã biết SELinux là gì, phương thức hoạt động của nó thế nào. Bạn cũng đã biết cách tắt, bật SELinux tạm thời cũng như vĩnh viễn trên hệ thống. Ở bài này chúng ta sẽ làm quen một số các lệnh trong SELinux. Từ đó có thể áp dụng các thiết lập cơ bản trong SELinux cho hệ thống máy chủ của bạn.

Ngữ cảnh – Bộ quy tắc của SELinux

Việc kiểm soát các “khu vực” trên máy chủ để phục vụ cho các đối tượng bên ngoài truy cập vào được selinux quản lý thông qua các “bộ quy tắc”. Như vậy một thư mục trên máy được selinux áp đặt bộ quy tắc nào thì bất kỳ ai cũng chỉ có thể khai thác thư mục đó theo đúng giới hạn của bộ quy tắc đó mà thôi. Như vậy dù cho một chương trình hacker nào đó có thể chiếm được quyền hay giả mạo thì cũng không thể tác động đến toàn bộ máy chủ. Nó chỉ có thể tác động lên các khu vực theo giới hạn từ bộ quy tắc đã thiết lập trong SELinux.

Ta tạm gọi các bộ quy tắc đó là các ngữ cảnh (Context).

Một số ngữ cảnh tiêu biểu:

Tên ngữ cảnh Mô tả giá trị ngữ cảnh
httpd_sys_content_t Thư mục và tệp chỉ đọc được Apache sử dụng
httpd_sys_rw_content_t Các thư mục và tệp có thể đọc và ghi được sử dụng bởi Apache. Nếu gán điều này cho thư mục nào thì bạn (hoặc ứng dụng) có thể tạo hoặc sửa đổi thư mục và tệp bên trong đó.
httpd_log_t Được Apache sử dụng để tạo ra (nếu chưa có) và nối thêm vào (nếu đã có) các tệp nhật ký ứng dụng web.
httpd_cache_t Gán cho một thư mục được Apache sử dụng để lưu vào bộ nhớ đệm, nếu bạn đang sử dụng mod_cache.

Xem danh sách các ngữ cảnh

Để có danh sách đầy đủ các kiểu ngữ cảnh hãy sử dụng lệnh:

Danh sách trả lại có thể rất dài, Nếu bạn muốn khoanh vùng dịch vụ quan tâm, hãy thêm tên dịch vụ đó vào sau tùy chọn grep:

Chẳng hạn, xem các ngữ cảnh liên quan đến httpd, hãy sử dụng lệnh:

Kết quả trả lại:

  • Như vậy hệ thống SELinux trên máy đã tồn tại sẵn nhiều “bộ quy tắc” ta gọi là các ngữ cảnh. Mỗi dịch vụ sẽ có một số ngữ cảnh của nó.
  • Sử dụng tùy chọn | grep <tên dịch vụ> để xem các ngữ cảnh gán cho dịch vụ mà ta quan tâm.

Xem ngữ cảnh của một thư mục

Một thư mục có thể đang được áp dụng một bộ quy tắc SELinux nào đó. Để xem ngữ cảnh của một thư mục bạn có thể dùng lệnh:

Ví dụ: xem ngữ cảnh nào đang gán cho thư mục /var/www/html

Ta thấy ngữ cảnh httpd_sys_content_t đang được áp dụng cho thư mục /var/ww/html

Ví dụ xem ngữ cảnh nào đang gán cho thư mục /var/cache/httpd:

Gán ngữ cảnh lên một thư mục

Ta có thể tự mình gán một chính sách nào đó lên một thư mục cụ thể. Ví dụ trong tình huống ta xây dựng một hệ thống thư mục máy chủ web là /home/public_html, nó không giống như mặc định là /var/ww/html. Khi đó ta phải gán một số chính sách của SELinux lên thư mục /home/public_html. Để thiết lập chính sách lên một thư mục nào đó hãy sử dụng cấu trúc lệnh:

Một số ví dụ:

Gán chính sách httpd_sys_content_t cho thư mục /var/www/html và các thư mục con cũng như các file trong nó:

Gán chính sách httpd_log_t cho thư mục /var/logs để ghi nhật ký ứng dụng:

Tạo chính sách để gán ngữ cảnh httpd_cache_t cho các thư mục bộ nhớ cache:

Tạo chính sách để gán ngữ cảnh httpd_sys_rw_content_t cho thư mục uploads và tất cả các tệp con có thể đọc ghi:

Gán chính sách đọc ghi cho file wp-config.php:

Áp dụng ngữ cảnh đã gán

Các chính sách bạn đã gán sẽ được sẵn sàng áp dụng cho cấu trúc thư mục. Tuy nhiên chúng chưa có hiệu lực. Bây giờ chúng ta sẽ sử dụng lệnh restorecon để áp dụng chúng. Đây cũng là lệnh tương tự mà bạn sẽ sử dụng để áp dụng lại các ngữ cảnh cho các thư mục ứng dụng nếu vì lý do nào đó mà chúng bị xóa hoặc bị hỏng.

Tùy chọn -R có tính đệ quy để áp dụng cho các thư mục con trong thư mục chỉ định

Xem trạng thái cấp phép cho các dịch vụ

Mỗi một dịch vụ trên máy chủ sẽ được SELinux cấp cho một số quyền hạn nhất định. Tức là dịch vụ đó được làm gì và không được làm gì (ví dụ ftpd_anon_write -> off tức là dịch vụ ftp không được quyền ghi tệp lên thư mục). Trước tiên ta cần biết SELinux đang cấp phép cho những dịch vụ nào trên hệ thống. Xem các dịch vụ đang được cấp phép bằng lệnh:

Kết quả:

Thông tin được trình bày trên 4 cột:

  • SELinux boolean: các đối tượng chịu sự kiểm soát của SELinux.
  • State: trạng thái hiện thời của đối tượng. Nếu đối tượng nào bạn chưa điều chỉnh thì giá trị state này sẽ bằng với giá trị mặc định Default.
  • Default: Các giá trị mặc định ban đầu mà SELinux thiết lập cho các đối tượng nó đang kiểm soát.
  • Description: Mô tả ngắn về đối tượng

Danh sách trả lại có thể khá dài, tới vài trang màn hình. Để lọc bớt các kết quả không quan tâm, hay muốn xem trạng thái cấp phép cho một dịch vụ cụ thể ta sử dụng tùy chọn grep. Muốn xem trạng thái của selinux đối với dịch vụ nào ta sử dụng lệnh với cú pháp chung:

Ví dụ: xem trạng thái đối với ftpd services bằng câu lệnh:

Ta thu được:

Nhìn kết quả trên ta đọc được: dịch vụ chuyển file ftp hiện tại đang không được quyền truy cập đầy đủ (full access off) cũng như cấm ghi đối với các tài khoản khách vô danh (anon write off). Chúng ta có thể thay đổi các giá trị này, tuy nhiên vì chúng liên quan đến các chính sách bảo mật nên cần cân nhắc và chắc chắn trước khi thực hiện.

getsebool – Lấy trạng thái cấp phép hiện tại của dịch vụ

Lệnh getsebool với khóa -a cho phép ta đọc trạng thái cấp phép của một dịch vụ trên SELinux. Cú pháp chung của lệnh:

Ví dụ xem trạng thái cấp phép của các dịch vụ liên quan đến ftp

Nhìn vào kết quả trả lại chúng ta có thể thấy dịch vụ nào đang được cho phép: (on hoặc 1) dịch vụ nào đang bị cấm (off hoặc 0)

setsebool – Thay đổi trạng thái cấp phép 1 dịch vụ

Lệnh setsebool cho phép đặt trạng thái hiện tại của một hoặc nhiều boolean SELinux về một giá trị nhất định. Giá trị có thể là 1 trong 2 trạng thái logic (boolean):

  • Trạng thái bật (hoạt động):  1 hoặc true hoặc on
  • Trạng thái tắt (hoặc nghỉ): 0 hoặc false hoặc off

Cú pháp chung của lệnh:

Nếu không có tùy chọn -P, chỉ giá trị boolean hiện tại bị ảnh hưởng; thiết lập sẽ mất hiệu lực khi khởi động lại.

Nếu tùy chọn -P được cung cấp, tất cả các giá trị đang chờ xử lý sẽ được ghi vào tệp chính sách trên đĩa. Vì vậy, chúng sẽ được duy trì liên tục qua các lần khởi động lại.

Ví dụ: Thiết lập cấp phép đọc ghi cho dịch vụ samba:

Xem các port Selinux mở mặc định:

Ta có thể xem SELinux đang mở những port nào cho dịch vụ cụ thể nào sử dụng bằng lệnh semanage port -l (tùy chọn port -l hàm ý là list các port)

Danh sách có thể rất dài, ta khoanh vùng bằng tùy chọn | grep

Ví dụ: List các port mà SElinux đang cho phép httpd sử dụng:

hoặc sử dụng sepolicy

Kết quả của cả 2 câu lệnh trên đều tương tự

Tìm kiếm port đã được sử dụng hay chưa

Sử dụng lệnh semanage thêm tùy chọn grep. Ví dụ xem port 8088 đã sử dụng chưa:

Port tìm thấy sẽ được tô màu đỏ

Thêm một port vào dịch vụ nào đó

Thêm port 8001 cho dịch vụ httpd sử dụng với các kết nối tcp

Kết quả

Xóa port với tham số -d thay cho -a

Lệnh xóa port cũng là lệnh thêm port tuy nhiên thay tham số -a bằng tham số -d. Ví dụ xóa port 8001 vừa thêm vào ở ví dụ trên:

Lời kết

Như vậy qua bài viết này, các bạn đã biết:

  • Xem danh sách các ngữ cảnh trên SELinux
  • Xem ngữ cảnh của một thư mục cụ thể
  • Gán ngữ cảnh cho một thư mục cụ thể
  • Xem trạng thái cấp phép cho các dịch vụ
  • Thay đổi trạng thái cấp phép của một dịch vụ cụ thể
  • Xem port, thêm vào và xóa bớt một port trong SELinux

Rất nhiều các chuyên gia khuyên rằng nên tắt SELinux để bớt rắc rối. Thực ra đây là một cách tồi tệ nhất vì chúng ta đã vô hiệu hóa hệ thống phòng thủ cho VPS của mình. Hy vọng với các kiến thức này, các bạn có thể làm chủ SELinux để bảo vệ VPS của mình.

Cường Còng – Chúc các bạn vui vẻ!