Thứ sáu, 05/09/2014 | 00:00 GMT+7

Giới thiệu về SELinux trên CentOS 7 - Phần 1: Các khái niệm cơ bản

Security Enhanced Linux hoặc SELinux là một cơ chế kiểm soát truy cập nâng cao được tích hợp trong hầu hết các bản phân phối Linux hiện đại. Ban đầu nó được phát triển bởi Cơ quan An ninh Quốc gia USA để bảo vệ hệ thống máy tính khỏi sự xâm nhập và giả mạo độc hại. Theo thời gian, SELinux đã được phát hành trong domain công cộng và các bản phân phối khác nhau đã kết hợp nó trong mã của họ.

Nhiều administrator hệ thống nhận thấy SELinux là một lãnh thổ chưa được khám phá. Chủ đề có vẻ khó khăn và đôi khi khá khó hiểu. Tuy nhiên, một hệ thống SELinux được cấu hình đúng cách có thể làm giảm đáng kể rủi ro bảo mật và biết một chút về nó có thể giúp bạn khắc phục sự cố các thông báo lỗi liên quan đến quyền truy cập. Trong hướng dẫn này, ta sẽ tìm hiểu về các khái niệm đằng sau SELinux - các gói, lệnh và file cấu hình của nó - và các thông báo lỗi mà nó ghi lại khi quyền truy cập bị từ chối. Ta cũng sẽ thấy một vài trường hợp thực tế của việc đưa SELinux vào hoạt động.

Ghi chú
Các lệnh, gói và file hiển thị trong hướng dẫn này đã được thử nghiệm trên CentOS 7. Các khái niệm vẫn giữ nguyên đối với các bản phân phối khác.

Trong hướng dẫn này, ta sẽ chạy các lệnh với quyền là user root trừ khi có quy định khác. Nếu bạn không có quyền truy cập vào account root và sử dụng account khác có quyền sudo, bạn cần đặt trước các lệnh bằng từ khóa sudo .

Tại sao SELinux

Trước khi bắt đầu, ta hãy hiểu một vài khái niệm.

SELinux triển khai cái được gọi là MAC (Kiểm soát Truy cập Bắt buộc). Điều này được thực hiện trên những gì đã có trong mọi bản phân phối Linux, DAC (Kiểm soát truy cập tùy ý).

Để hiểu DAC, trước tiên ta hãy xem xét cách thức hoạt động của bảo mật file Linux truyền thống.

Trong mô hình bảo mật truyền thống, ta có ba thực thể: User , Group và Người khác (u, g, o) có thể có sự kết hợp của các quyền Đọc, Ghi và Thực thi (r, w, x) trên một file hoặc folder . Nếu user jo tạo một file trong folder chính của họ, thì user đó sẽ có quyền đọc / ghi đối với file đó và group jo cũng vậy. Thực thể “other” có thể sẽ không có quyền truy cập vào nó. Trong khối mã sau, ta có thể xem xét nội dung giả định của folder chính của jo.

Bạn không cần cài đặt user jo này - ta sẽ cài đặt nhiều user sau trong hướng dẫn.

Chạy một lệnh như sau:

ls -l /home/jo/ 

có thể hiển thị kết quả như sau:

total 4 -rwxrw-r--. 1 jo jo 41 Aug  6 22:45 myscript.sh 

Bây giờ jo có thể thay đổi quyền truy cập này. jo có thể cấp (và hạn chế) quyền truy cập vào file này cho những user và group khác hoặc thay đổi chủ sở hữu của file . Những hành động này có thể để lại các file quan trọng cho những account không cần quyền truy cập này. jo cũng có thể hạn chế để an toàn hơn, nhưng điều đó là tùy ý: không có cách nào để administrator hệ thống thực thi nó cho mọi file trong hệ thống.

Hãy xem xét một trường hợp khác: khi một tiến trình Linux chạy, nó có thể chạy với quyền user root hoặc một account khác có quyền của user siêu cấp. Điều đó nghĩa là nếu một hacker mũ đen chiếm quyền kiểm soát ứng dụng, họ có thể sử dụng ứng dụng đó để truy cập vào bất kỳ tài nguyên nào mà account user có quyền truy cập. Đối với các quy trình đang chạy với quyền user root , về cơ bản, điều này nghĩa là mọi thứ trong server Linux.

Hãy nghĩ về một tình huống mà bạn muốn hạn chế user thực thi các tập lệnh shell từ folder chính của họ. Điều này có thể xảy ra khi bạn có các nhà phát triển làm việc trên một hệ thống production . Bạn muốn họ xem các file log , nhưng bạn không muốn họ sử dụng lệnh su hoặc sudo và bạn không muốn họ chạy bất kỳ tập lệnh nào từ folder chính của họ. Làm thế nào để bạn làm điều đó?

SELinux là một cách để tinh chỉnh các yêu cầu kiểm soát truy cập như vậy. Với SELinux, bạn có thể xác định user hoặc quy trình có thể làm gì. Nó giới hạn mọi quy trình trong domain riêng của nó để quy trình chỉ có thể tương tác với một số loại file nhất định và các quy trình khác từ các domain được phép. Điều này ngăn không cho tin tặc chiếm quyền điều khiển bất kỳ quy trình nào để có được quyền truy cập trên toàn hệ thống.

Cài đặt hệ thống kiểm tra

Để giúp ta tìm hiểu các khái niệm, ta sẽ xây dựng một server thử nghiệm chạy cả web và server SFTP. Ta sẽ bắt đầu với việc cài đặt CentOS 7 với các gói tối thiểu được cài đặt và cài đặt các daemon Apache và vsftp trên server đó. Tuy nhiên, ta sẽ không cấu hình một trong hai ứng dụng này.

Ta cũng sẽ tạo một vài account user thử nghiệm trong server cloud của ta . Ta sẽ sử dụng các account này ở những nơi khác nhau trong suốt bài học.

Cuối cùng, ta sẽ cài đặt các gói liên quan đến SELinux cần thiết. Điều này là đảm bảo ta có thể làm việc với các lệnh SELinux mới nhất.

Cài đặt Dịch vụ Apache và SFTP

Đầu tiên, hãy đăng nhập vào server với quyền là user root và chạy lệnh sau để cài đặt Apache:

yum install httpd 

Đầu ra sẽ hiển thị gói đang được download và yêu cầu bạn cho phép cài đặt:

Loaded plugins: fastestmirror, langpacks ... ... ================================================================================  Package       Arch           Version                     Repository       Size ================================================================================ Installing:  httpd         x86_64         2.4.6-18.el7.centos         updates         2.7 M  Transaction Summary ================================================================================ Install  1 Package  Total download size: 2.7 M Installed size: 9.3 M Is this ok [y/d/N]: 

Nhấn y sẽ cài đặt daemon web server Apache.

Downloading packages: httpd-2.4.6-18.el7.centos.x86_64.rpm                       | 2.7 MB   00:01 Running transaction check Running transaction test Transaction test succeeded Running transaction   Installing : httpd-2.4.6-18.el7.centos.x86_64                             1/1   Verifying  : httpd-2.4.6-18.el7.centos.x86_64                             1/1  Installed:   httpd.x86_64 0:2.4.6-18.el7.centos  Complete! 

Khởi động daemon theo cách thủ công:

service httpd start 

Chạy lệnh service httpd status sẽ hiển thị dịch vụ hiện đang chạy:

Redirecting to /bin/systemctl status  httpd.service httpd.service - The Apache HTTP Server    Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)    Active: active (running) since Tue 2014-08-19 13:39:48 EST; 1min 40s ago  Main PID: 339 (httpd) ... ... 

Tiếp theo ta sẽ cài đặt vsftp:

yum install vsftpd 

Đầu ra sẽ giống như sau:

Loaded plugins: fastestmirror, langpacks ... ... ==============================================================================================================  Package                  Arch                     Version                       Repository              Size ============================================================================================================== Installing:  vsftpd                   x86_64                   3.0.2-9.el7                   base                   165 k  Transaction Summary ============================================================================================================== Install  1 Package  Total download size: 165 k Installed size: 343 k Is this ok [y/d/N]: 

Nhấn y để cài đặt gói.

Tiếp theo, ta sẽ sử dụng lệnh service vsftpd start để khởi động daemon vsftpd. Kết quả kết quả sẽ hiển thị như sau:

Redirecting to /bin/systemctl status  vsftpd.service vsftpd.service - Vsftpd ftp daemon    Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled)    Active: active (running) since Tue 2014-08-19 13:48:57 EST; 4s ago   Process: 599 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)  Main PID: 600 (vsftpd) ... ... 

Cài đặt các gói SELinux

Một số gói được sử dụng trong SELinux. Một số được cài đặt theo mặc định. Đây là danh sách các bản phân phối dựa trên Red Hat:

  • Policycoreutils (cung cấp các tiện ích để quản lý SELinux)
  • Policycoreutils-python (cung cấp các tiện ích để quản lý SELinux)
  • selinux-policy (cung cấp policy tham chiếu SELinux)
  • selinux- nhắm đến policy (cung cấp policy nhắm đến SELinux)
  • libselinux-utils (cung cấp một số công cụ để quản lý SELinux)
  • setroubleshoot-server (cung cấp các công cụ để giải mã thông báo log kiểm tra)
  • setools (cung cấp các công cụ để theo dõi log kiểm tra, policy truy vấn và quản lý ngữ cảnh file )
  • setools-console (cung cấp các công cụ để theo dõi log kiểm tra, policy truy vấn và quản lý ngữ cảnh file )
  • mcstrans (công cụ để dịch các cấp độ khác nhau sang định dạng dễ hiểu)

Một số trong số này đã được cài đặt. Để kiểm tra gói SELinux nào được cài đặt trên hệ thống CentOS 7 của bạn, bạn có thể chạy một vài lệnh như lệnh bên dưới (với các cụm từ tìm kiếm khác nhau sau grep ) với quyền là user root:

rpm -qa | grep selinux 

Đầu ra sẽ giống như sau:

libselinux-utils-2.2.2-6.el7.x86_64 libselinux-2.2.2-6.el7.x86_64 selinux-policy-targeted-3.12.1-153.el7.noarch selinux-policy-3.12.1-153.el7.noarch libselinux-python-2.2.2-6.el7.x86_64 

Bạn có thể tiếp tục và cài đặt tất cả các gói bằng lệnh bên dưới (yum sẽ chỉ cập nhật bất kỳ gói nào bạn đã có) hoặc chỉ những gói bạn thấy thiếu trong hệ thống của bạn :

yum install policycoreutils policycoreutils-python selinux-policy selinux-policy-targeted libselinux-utils setroubleshoot-server setools setools-console mcstrans 

Bây giờ ta sẽ có một hệ thống được tải với tất cả các gói SELinux. Ta cũng có các server Apache và SFTP đang chạy với cấu hình mặc định của chúng. Ta cũng có bốn account regular user đã sẵn sàng để thử nghiệm ngoài account gốc .

Chế độ SELinux

Đã đến lúc bắt đầu chơi với SELinux, vì vậy hãy bắt đầu với các chế độ SELinux. Tại bất kỳ thời điểm nào, SELinux có thể ở bất kỳ trong ba chế độ có thể có:

  • Cưỡng chế
  • Cho phép
  • Tàn tật

Trong chế độ thực thi, SELinux sẽ thực thi policy của bạn trên hệ thống Linux và đảm bảo mọi nỗ lực truy cập trái phép của user và các quy trình đều bị từ chối. Các từ chối truy cập cũng được ghi vào các file log liên quan. Ta sẽ nói về các policy SELinux và log kiểm tra sau.

Chế độ cho phép giống như trạng thái bán kích hoạt. SELinux không áp dụng policy của bạn ở chế độ cho phép, vì vậy không có quyền truy cập nào bị từ chối. Tuy nhiên mọi vi phạm policy vẫn được ghi vào log kiểm tra. Đó là một cách tốt để kiểm tra SELinux trước khi thực thi nó.

Chế độ bị tắt là tự giải thích - hệ thống sẽ không chạy với bảo mật nâng cao.

Kiểm tra trạng thái và chế độ SELinux

Ta có thể chạy lệnh getenforce để kiểm tra chế độ SELinux hiện tại.

getenforce 

SELinux hiện sẽ bị vô hiệu hóa, vì vậy kết quả sẽ giống như sau:

Disabled 

Ta cũng có thể chạy lệnh sestatus :

sestatus 

Khi SELinux bị tắt, kết quả sẽ hiển thị:

SELinux status:        disabled 

Tệp cấu hình SELinux

Tệp cấu hình chính cho SELinux là / etc / selinux / config. Ta có thể chạy lệnh sau để xem nội dung của nó:

cat /etc/selinux/config 

Đầu ra sẽ giống như sau:

# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: #     enforcing - SELinux security policy is enforced. #     permissive - SELinux prints warnings instead of enforcing. #     disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of these two values: #     targeted - Targeted processes are protected, #     minimum - Modification of targeted policy. Only selected processes are protected.  #     mls - Multi Level Security protection. SELINUXTYPE=targeted 

Có hai chỉ thị trong file này. Chỉ thị SELINUX chỉ định chế độ SELinux và nó có thể có ba giá trị khả thi như ta đã thảo luận trước đây.

Chỉ thị SELINUXTYPE xác định policy sẽ được sử dụng. Giá trị mặc định được targeted . Với policy được nhắm đến , SELinux cho phép bạn tùy chỉnh và tinh chỉnh các quyền kiểm soát truy cập. Giá trị có thể có khác là “MLS” (bảo mật đa cấp), một phương thức bảo vệ nâng cao. Ngoài ra với MLS, bạn cần cài đặt thêm một gói.

Bật và tắt SELinux

Kích hoạt SELinux khá đơn giản; nhưng không giống như vô hiệu hóa nó, nên được thực hiện trong một quy trình hai bước. Ta giả định SELinux hiện đã bị tắt và bạn đã cài đặt tất cả các gói SELinux từ phần trước đó.

Bước đầu tiên, ta cần chỉnh sửa file /etc/selinux/config để thay đổi chỉ thị SELINUX thành chế độ cho phép.

vi /etc/sysconfig/selinux 
... SELINUX=permissive ... 

Việc đặt trạng thái thành cho phép trước tiên là cần thiết vì mọi file trong hệ thống cần có ngữ cảnh được gắn nhãn trước khi SELinux có thể được thực thi. Trừ khi tất cả các file được gắn nhãn đúng cách, các quy trình đang chạy trong các domain hạn chế có thể không thành công vì chúng không thể truy cập vào các file có ngữ cảnh chính xác. Điều này có thể khiến quá trình khởi động không thành công hoặc bắt đầu có lỗi. Ta sẽ giới thiệu các ngữ cảnhmiền sau trong hướng dẫn.

Bây giờ, hãy khởi động lại hệ thống:

reboot 

Quá trình khởi động lại sẽ thấy tất cả các file trong server được gắn nhãn với ngữ cảnh SELinux. Vì hệ thống đang chạy ở chế độ cho phép, lỗi SELinux và từ chối truy cập sẽ được báo cáo nhưng nó sẽ không dừng lại bất cứ điều gì.

Đăng nhập vào server của bạn như là user root . Tiếp theo, tìm kiếm chuỗi “SELinux đang ngăn chặn” từ nội dung của file / var / log / messages.

cat /var/log/messages | grep "SELinux is preventing" 

Nếu không có lỗi nào được báo cáo, ta có thể yên tâm chuyển sang bước tiếp theo. Tuy nhiên, bạn vẫn nên tìm kiếm văn bản chứa “SELinux” trong file / var / log / messages. Trong hệ thống của ta , ta đã chạy lệnh sau:

cat /var/log/messages | grep "SELinux" 

Điều này cho thấy một số thông báo lỗi liên quan đến GNOME Desktop đang chạy. Điều này đã xảy ra khi SELInux bị tắt hoặc ở chế độ cho phép:

Aug 20 11:31:14 localhost kernel: SELinux:  Initializing. Aug 20 11:31:16 localhost kernel: SELinux:  Disabled at runtime. Aug 20 11:31:21 localhost journal: Unable to lookup SELinux process context: Invalid argument Aug 20 11:33:20 localhost gnome-session: SELinux Troubleshooter: Applet requires SELinux be enabled to run.  Aug 20 11:37:15 localhost kernel: SELinux:  Initializing. Aug 20 11:37:17 localhost kernel: SELinux:  Disabled at runtime. Aug 20 11:37:23 localhost journal: Unable to lookup SELinux process context: Invalid argument Aug 20 11:37:44 localhost gnome-session: SELinux Troubleshooter: Applet requires SELinux be enabled to run.  Aug 20 11:39:42 localhost kernel: SELinux:  Initializing. Aug 20 11:39:44 localhost kernel: SELinux:  Disabled at runtime. Aug 20 11:39:50 localhost journal: Unable to lookup SELinux process context: Invalid argument 

Các loại lỗi này đều ổn.

Trong giai đoạn thứ hai, ta cần chỉnh sửa file cấu hình để thay đổi chỉ thị SELINUX từ cho phép thành thực thi trong file /etc/sysconfig/selinux :

... SELINUX=enforcing ... 

Tiếp theo, khởi động lại server .

reboot 

Sau khi server trực tuyến trở lại, ta có thể chạy lệnh sestatus để kiểm tra trạng thái SELinux. Bây giờ nó sẽ hiển thị thêm chi tiết về server :

SELinux status:                 enabled SELinuxfs mount:                /sys/fs/selinux SELinux root directory:         /etc/selinux Loaded policy name:             targeted Current mode:                   permissive Mode from config file:          error (Success) Policy MLS status:              enabled Policy deny_unknown status:     allowed Max kernel policy version:      28 

Kiểm tra file / var / log / messages:

cat /var/log/messages | grep "SELinux" 

Không được có lỗi. Đầu ra sẽ giống như sau:

Aug 20 11:42:06 localhost kernel: SELinux:  Initializing. Aug 20 11:42:09 localhost systemd[1]: Successfully loaded SELinux policy in 183.302ms.  Aug 20 11:44:25 localhost kernel: SELinux:  Initializing. Aug 20 11:44:28 localhost systemd[1]: Successfully loaded SELinux policy in 169.039ms. 

Kiểm tra trạng thái và chế độ SELinux ( )

Ta có thể chạy lệnh getenforce để kiểm tra chế độ SELinux hiện tại.

getenforce 

Nếu hệ thống của ta đang chạy ở chế độ thực thi, kết quả sẽ giống như sau:

Enforcing 

Đầu ra sẽ khác nếu SELinux bị tắt:

Disabled 

Ta có thể alo chạy lệnh sestatus để có hình ảnh đẹp hơn.

sestatus 

Nếu SELinux không bị tắt, kết quả sẽ hiển thị trạng thái hiện tại, chế độ hiện tại của nó, chế độ được xác định trong file cấu hình và loại policy .

SELinux status:                 enabled SELinuxfs mount:                /sys/fs/selinux SELinux root directory:         /etc/selinux Loaded policy name:             targeted Current mode:                   enforcing Mode from config file:          enforcing Policy MLS status:              enabled Policy deny_unknown status:     allowed Max kernel policy version:      28 

Khi SELinux bị tắt, kết quả sẽ hiển thị:

SELinux status:        disabled 

Ta cũng có thể tạm thời chuyển đổi giữa chế độ thực thi và chế độ cho phép bằng lệnh setenforce . ( Lưu ý ta không thể chạy setenforce khi SELinux bị tắt.)

Trước tiên, hãy thay đổi chế độ SELinux từ thực thi thành cho phép trong hệ thống CentOS 7 của ta :

setenforce permissive 

Chạy lệnh sestatus bây giờ cho thấy chế độ hiện tại khác với chế độ được xác định trong file cấu hình:

SELinux status:                 enabled SELinuxfs mount:                /sys/fs/selinux SELinux root directory:         /etc/selinux Loaded policy name:             targeted Current mode:                   permissive Mode from config file:          enforcing Policy MLS status:              enabled Policy deny_unknown status:     allowed Max kernel policy version:      28 

Chuyển về thực thi :

setenforce enforcing 

Chính sách SELinux

Trọng tâm của công cụ bảo mật của SELinux là chính sách của nó. Chính sách là những gì tên ngụ ý: một tập hợp các luật xác định quyền bảo mật và quyền truy cập cho mọi thứ trong hệ thống. Và khi ta nói mọi thứ , ta muốn nói đến user , role , quy trình và file . Chính sách xác định cách mỗi thực thể này có liên quan với nhau.

Một số thuật ngữ cơ bản

Để hiểu policy , ta phải học một số thuật ngữ cơ bản. Ta sẽ đi vào chi tiết sau, nhưng đây là một giới thiệu ngắn gọn. Chính sách SELinux xác định quyền truy cập của user vào các role , quyền truy cập role vào các domain và quyền truy cập domain vào các loại.

User

SELinux có một tập hợp user được tạo sẵn. Mỗi account user Linux thông thường được ánh xạ tới một hoặc nhiều user SELinux.

Trong Linux, user chạy một tiến trình. Điều này có thể đơn giản như user jo mở một tài liệu trong trình soạn thảo vi (nó sẽ là account của jo đang chạy quy trình vi) hoặc một account dịch vụ chạy daemon httpd. Trong thế giới SELinux, một tiến trình (daemon hoặc một chương trình đang chạy) được gọi là một chủ đề .

Role

Một role giống như một cổng kết nối giữa user và một tiến trình. Một role xác định user nào có thể truy cập quy trình đó. Role không giống như group , mà giống bộ lọc hơn: user có thể nhập hoặc đảm nhận một role bất kỳ lúc nào miễn là role đó cấp quyền. Định nghĩa role trong policy SELinux xác định user nào có quyền truy cập vào role đó. Nó cũng xác định những domain quy trình mà bản thân role có quyền truy cập. Role phát huy tác dụng vì một phần của SELinux triển khai cái được gọi là Kiểm soát truy cập dựa trên role (RBAC).

Chủ ngữ và tân ngữ

Chủ thể là một quá trình và có thể ảnh hưởng đến một đối tượng .

Một đối tượng trong SELinux là bất cứ thứ gì có thể được thực hiện. Đây có thể là một file , một folder , một cổng, một socket tcp, con trỏ hoặc có thể là một server X. Các hành động mà một chủ thể có thể thực hiện trên một đối tượng là quyền của chủ thể.

Tên domain dành cho Chủ đề

Miền là ngữ cảnh mà chủ thể (quy trình) SELinux có thể chạy trong đó. Bối cảnh đó giống như một lớp bao bọc xung quanh đối tượng. Nó cho quá trình biết những gì nó có thể và không thể làm. Ví dụ: domain sẽ xác định những file , folder , liên kết, thiết bị hoặc cổng nào có thể truy cập được đối với chủ thể.

Loại dành cho đối tượng

Loại là ngữ cảnh cho ngữ cảnh của file quy định mục đích của file . Ví dụ: ngữ cảnh của file có thể cho biết đó là một trang web hoặc file thuộc folder /etc hoặc chủ sở hữu file là một user SELinux cụ thể. Ngữ cảnh của file được gọi là kiểu của nó trong biệt ngữ SELinux.

Vậy policy SELinux là gì?

Chính sách SELinux xác định quyền truy cập của user vào các role , quyền truy cập role vào domain và quyền truy cập domain vào các loại. Đầu tiên user phải được ủy quyền để nhập một role , sau đó role đó phải được ủy quyền để truy cập domain . Đến lượt nó, domain bị hạn chế chỉ truy cập vào một số loại file nhất định.

Bản thân policy này là một loạt các luật nói rằng user tương tự chỉ có thể đảm nhận các role tương tự và những role đó sẽ chỉ được phép truy cập vào các domain tương tự.Đến lượt nó, các domain chỉ có thể truy cập các loại file tương tự. Hình ảnh sau đây cho thấy khái niệm:

 User  SELinux,  Role , Miền và Tệp

Mẹo thuật ngữ: Bit cuối cùng, nơi một tiến trình chạy trong một domain cụ thể chỉ có thể thực hiện một số hoạt động nhất định trên một số loại đối tượng, được gọi là Thực thi kiểu (TE).

Quay lại chủ đề policy , việc triển khai policy SELinux cũng thường được nhắm đến theo mặc định. Nếu bạn nhớ file cấu hình SELinux mà ta đã thấy trước đây, thì chỉ thị SELINUXTYPE được đặt thành targeted . Điều này nghĩa là , theo mặc định, SELinux sẽ chỉ hạn chế một số tiến trình nhất định trong hệ thống (tức là chỉ một số tiến trình được nhắm đến ). Những cái không được nhắm đến sẽ chạy trong các domain chưa xác định.

Giải pháp thay thế là mô hình từ chối theo mặc định trong đó mọi quyền truy cập đều bị từ chối trừ khi được policy chấp thuận. Nó sẽ là một triển khai rất an toàn, nhưng điều này cũng nghĩa là các nhà phát triển phải dự đoán mọi quyền có thể có mà mọi quy trình có thể cần trên mọi đối tượng có thể. Hành vi mặc định cho thấy SELinux chỉ quan tâm đến các quy trình nhất định.

Hành vi policy của SELinux

Chính sách SELinux không phải là thứ thay thế bảo mật DAC truyền thống. Nếu luật DAC cấm user truy cập vào file , luật policy SELinux sẽ không được đánh giá vì tuyến phòng thủ đầu tiên đã chặn quyền truy cập. Các quyết định bảo mật của SELinux có hiệu lực sau khi đánh giá bảo mật DAC.

Khi hệ thống hỗ trợ SELinux khởi động, policy này sẽ được tải vào bộ nhớ. Chính sách SELinux có định dạng module , giống như các module kernel được tải vào lúc khởi động. Và cũng giống như các module kernel , chúng có thể được thêm vào và xóa khỏi bộ nhớ một cách tự động tại thời điểm chạy. Kho lưu trữ policy được sử dụng bởi SELinux theo dõi các module đã được tải. Lệnh sestatus hiển thị tên cửa hàng policy . Lệnh semodule -l liệt kê các module policy SELinux hiện được tải vào bộ nhớ.

Để hiểu rõ điều này, hãy chạy lệnh semodule :

semodule -l | less 

Đầu ra sẽ giống như sau:

abrt    1.2.0 accountsd       1.0.6 acct    1.5.1 afs     1.8.2 aiccu   1.0.2 aide    1.6.1 ajaxterm        1.0.0 alsa    1.11.4 amanda  1.14.2 amtu    1.2.3 anaconda        1.6.1 antivirus       1.0.0 apache  2.4.0 ... ... 

semodule được dùng cho một số tác vụ khác như cài đặt, gỡ bỏ, reload , nâng cấp, bật và tắt module policy SELinux.

Bây giờ có lẽ bạn cần biết vị trí của các file module . Hầu hết các bản phân phối hiện đại bao gồm các version binary của các module như một phần của gói SELinux. Các file policy có phần mở rộng .pp. Đối với CentOS 7, ta có thể chạy lệnh sau:

ls -l /etc/selinux/targeted/modules/active/modules/ 

Danh sách hiển thị một số file có phần mở rộng .pp . Nếu bạn nhìn kỹ, chúng sẽ liên quan đến các ứng dụng khác nhau:

... -rw-r--r--. 1 root root 10692 Aug 20 11:41 anaconda.pp -rw-r--r--. 1 root root 11680 Aug 20 11:41 antivirus.pp -rw-r--r--. 1 root root 24190 Aug 20 11:41 apache.pp -rw-r--r--. 1 root root 11043 Aug 20 11:41 apcupsd.pp ... 

Mặc dù vậy, các file .pp không thể đọc được.

Cách thức hoạt động của module hóa SELinux là khi hệ thống khởi động, các module policy được kết hợp thành cái được gọi là chính sách hoạt động . Chính sách này sau đó được tải vào bộ nhớ. Bạn có thể tìm thấy version binary kết hợp của policy đã tải này trong folder /etc/selinux/targeted/policy .

ls -l /etc/selinux/targeted/policy/ 

sẽ hiển thị policy đang hoạt động.

total 3428 -rw-r--r--. 1 root root 3510001 Aug 20 11:41 policy.29 

Thay đổi cài đặt SELinux Boolean

Mặc dù bạn không thể đọc file module policy , nhưng có một cách đơn giản để điều chỉnh cài đặt của chúng. Điều đó được thực hiện thông qua boolean SELinux.

Để xem nó hoạt động như thế nào, hãy chạy lệnh semanage boolean -l .

semanage boolean -l | less 

Điều này hiển thị các lựa chọn khác nhau có thể được bật hoặc tắt, công việc của chúng và trạng thái hiện tại của chúng:

ftp_home_dir                   (off  ,  off)  Allow ftp to home dir smartmon_3ware                 (off  ,  off)  Allow smartmon to 3ware mpd_enable_homedirs            (off  ,  off)  Allow mpd to enable homedirs xdm_sysadm_login               (off  ,  off)  Allow xdm to sysadm login xen_use_nfs                    (off  ,  off)  Allow xen to use nfs mozilla_read_content           (off  ,  off)  Allow mozilla to read content ssh_chroot_rw_homedirs         (off  ,  off)  Allow ssh to chroot rw homedirs mount_anyfile                  (on   ,   on)  Allow mount to anyfile ... ...    

Ta có thể thấy tùy chọn đầu tiên cho phép daemon FTP truy cập vào folder chính của user . Cài đặt này đã bị tắt vào lúc này.

Để thay đổi cài đặt nào, ta có thể sử dụng lệnh setsebool . Ví dụ, hãy xem xét quyền truy cập ghi FTP ẩn danh:

getsebool ftpd_anon_write 

Điều này cho ta thấy lựa chọn đang tắt vào lúc này:

ftpd_anon_write --> off 

Tiếp theo, ta thay đổi boolean để kích hoạt nó:

setsebool ftpd_anon_write on 

Kiểm tra lại giá trị sẽ hiển thị thay đổi:

ftpd_anon_write --> on 

Các boolean đã thay đổi không phải là vĩnh viễn. Chúng hoàn nguyên về giá trị cũ sau khi khởi động lại. Để làm cho mọi thứ trở nên vĩnh viễn, ta có thể sử dụng lựa chọn -P với lệnh setsebool .

Kết luận

Trong phần đầu tiên của hướng dẫn này, ta đã cố gắng hiểu một vài khái niệm cơ bản về SELinux. Ta đã thấy cách SELinux có thể bảo mật một hệ thống, cách ta có thể kích hoạt nó và những chế độ nào nó có thể chạy. Ta cũng đã đề cập đến chủ đề của policy SELinux. Tiếp theo, ta sẽ học cách sử dụng SELinux để hạn chế quyền truy cập vào các file và quy trình .


Tags:

Các tin liên quan

Giới thiệu về SELinux trên CentOS 7 - Phần 2: Tệp và Quy trình
2014-09-05
Giới thiệu về SELinux trên CentOS 7 - Phần 3: Người dùng
2014-09-05
Cách cài đặt puppet ở chế độ độc lập trên CentOS 7
2014-09-04
Cách cài đặt Node.js trên server CentOS 7
2014-08-18
Cách sử dụng Logstash và Kibana để tập trung log trên CentOS 7
2014-07-15
Cách sử dụng Logstash và Kibana để tập trung log trên CentOS 6
2014-07-08
Cách thiết lập DavMail trên CentOS 6
2014-02-13
Cách cài đặt Ruby 2.1.0 trên CentOS 6.5 bằng RVM
2014-01-22
Cách cài đặt ZeroMQ từ nguồn trên VPS CentOS 6 x64
2013-12-23
Cách cài đặt Diễn đàn Máy đơn giản trên CentOS 6
2013-12-05