Hệ thống bảo mật Linux

Một trong những lý do dẫn đến sự thành công to lớn của hệ điều hành Linux trên các thiết bị di động và máy chủ nhúng là mức độ bảo mật khá cao của nhân, các dịch vụ và ứng dụng liên quan. Nhưng nếu nhìn kỹ hơn đối với kiến ​​​​trúc của nhân Linux thì không thể tìm thấy trong đó một hình vuông chịu trách nhiệm về bảo mật như vậy. Hệ thống con bảo mật Linux ẩn ở đâu và nó bao gồm những gì?

Thông tin cơ bản về Mô-đun bảo mật Linux và SELinux

Linux nâng cao bảo mật là một bộ quy tắc và cơ chế truy cập dựa trên các mô hình truy cập bắt buộc và dựa trên vai trò để bảo vệ hệ thống Linux khỏi các mối đe dọa tiềm ẩn và khắc phục những thiếu sót của Kiểm soát truy cập tùy ý (DAC), hệ thống bảo mật Unix truyền thống. Dự án có nguồn gốc từ Cơ quan An ninh Quốc gia Hoa Kỳ và được trực tiếp phát triển chủ yếu bởi các nhà thầu Secure Computing Corporation và MITER, cũng như một số phòng thí nghiệm nghiên cứu.

Hệ thống bảo mật Linux
Mô-đun bảo mật Linux

Linus Torvalds đã đưa ra một số nhận xét về những phát triển mới của NSA để chúng có thể được đưa vào nhân Linux chính thống. Ông mô tả một môi trường chung, với một tập hợp các thiết bị chặn để kiểm soát các hoạt động với các đối tượng và một tập hợp các trường bảo vệ nhất định trong cấu trúc dữ liệu hạt nhân để lưu trữ các thuộc tính tương ứng. Môi trường này sau đó có thể được sử dụng bởi các mô-đun hạt nhân có thể tải được để triển khai bất kỳ mô hình bảo mật mong muốn nào. LSM đã nhập đầy đủ nhân Linux v2.6 vào năm 2003.

Khung LSM bao gồm các trường bảo vệ trong cấu trúc dữ liệu và các lệnh gọi đến các chức năng chặn tại các điểm quan trọng trong mã hạt nhân để thao tác chúng và thực hiện kiểm soát truy cập. Nó cũng bổ sung thêm chức năng đăng ký các mô-đun bảo mật. Giao diện /sys/kernel/security/lsm chứa danh sách các mô-đun đang hoạt động trên hệ thống. Móc LSM được lưu trữ trong danh sách được gọi theo thứ tự được chỉ định trong CONFIG_LSM. Tài liệu chi tiết về hook được bao gồm trong tệp tiêu đề include/linux/lsm_hooks.h.

Hệ thống con LSM cho phép hoàn thành việc tích hợp đầy đủ SELinux với cùng một phiên bản hạt nhân Linux ổn định v2.6. Gần như ngay lập tức, SELinux trở thành tiêu chuẩn thực tế cho môi trường Linux an toàn và được đưa vào các bản phân phối phổ biến nhất: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

Thuật ngữ SELinux

  • Danh tính — Người dùng SELinux không giống với id người dùng Unix/Linux thông thường; họ có thể cùng tồn tại trên cùng một hệ thống, nhưng về bản chất hoàn toàn khác nhau. Mỗi tài khoản Linux tiêu chuẩn có thể tương ứng với một hoặc nhiều tài khoản trong SELinux. Danh tính SELinux là một phần của bối cảnh bảo mật tổng thể, xác định miền nào bạn có thể và không thể tham gia.
  • Tên miền - Trong SELinux, miền là bối cảnh thực thi của một chủ thể, tức là một tiến trình. Miền xác định trực tiếp quyền truy cập mà một tiến trình có. Về cơ bản, một miền là danh sách những gì quy trình có thể thực hiện hoặc những gì một quy trình có thể thực hiện với các loại khác nhau. Một số ví dụ về miền là sysadm_t dành cho quản trị hệ thống và user_t là miền người dùng không có đặc quyền thông thường. Hệ thống init chạy trong miền init_t và tiến trình được đặt tên chạy trong miền name_t.
  • Vai trò — Điều gì đóng vai trò trung gian giữa các miền và người dùng SELinux. Vai trò xác định người dùng có thể thuộc về miền nào và họ có thể truy cập loại đối tượng nào. Cơ chế kiểm soát truy cập này ngăn chặn nguy cơ tấn công leo thang đặc quyền. Các vai trò được ghi vào mô hình bảo mật Kiểm soát truy cập dựa trên vai trò (RBAC) được sử dụng trong SELinux.
  • Các loại — Thuộc tính danh sách Thực thi Loại được gán cho một đối tượng và xác định ai có thể truy cập nó. Tương tự như định nghĩa miền, ngoại trừ miền đó áp dụng cho một quy trình và loại áp dụng cho các đối tượng như thư mục, tệp, ổ cắm, v.v.
  • Chủ ngữ và tân ngữ - Các tiến trình là chủ thể và chạy trong một ngữ cảnh cụ thể hoặc miền bảo mật. Tài nguyên hệ điều hành: tệp, thư mục, ổ cắm, v.v., là các đối tượng được gán một loại nhất định, nói cách khác là mức độ riêng tư.
  • Chính sách của SELinux — SELinux sử dụng nhiều chính sách khác nhau để bảo vệ hệ thống. Chính sách SELinux xác định quyền truy cập của người dùng vào các vai trò, vai trò đối với miền và miền đối với loại. Đầu tiên, người dùng được phép nhận một vai trò, sau đó vai trò đó được phép truy cập vào các miền. Cuối cùng, một miền chỉ có thể có quyền truy cập vào một số loại đối tượng nhất định.

LSM và kiến ​​trúc SELinux

Mặc dù có tên như vậy nhưng LSM thường không phải là mô-đun Linux có thể tải được. Tuy nhiên, giống như SELinux, nó được tích hợp trực tiếp vào kernel. Bất kỳ thay đổi nào đối với mã nguồn LSM đều yêu cầu biên dịch kernel mới. Tùy chọn tương ứng phải được bật trong cài đặt kernel, nếu không mã LSM sẽ không được kích hoạt sau khi khởi động. Nhưng ngay cả trong trường hợp này, nó vẫn có thể được kích hoạt bằng tùy chọn bộ nạp khởi động hệ điều hành.

Hệ thống bảo mật Linux
ngăn xếp kiểm tra LSM

LSM được trang bị các hook trong các hàm kernel cốt lõi có thể phù hợp để kiểm tra. Một trong những tính năng chính của LSM là chúng được xếp chồng lên nhau. Do đó, các kiểm tra tiêu chuẩn vẫn được thực hiện và mỗi lớp LSM chỉ bổ sung thêm các điều khiển và điều khiển bổ sung. Điều này có nghĩa là lệnh cấm không thể được khôi phục. Điều này được thể hiện trong hình; nếu kết quả kiểm tra DAC định kỳ là không thành công thì vấn đề thậm chí sẽ không đến được các móc LSM.

SELinux áp dụng kiến ​​trúc bảo mật Flask của hệ điều hành nghiên cứu Fluke, đặc biệt là nguyên tắc đặc quyền tối thiểu. Bản chất của khái niệm này, như tên gọi của nó, là chỉ cấp cho người dùng hoặc xử lý những quyền cần thiết để thực hiện các hành động đã định. Nguyên tắc này được thực hiện bằng cách sử dụng kiểu gõ truy cập bắt buộc, do đó việc kiểm soát quyền truy cập trong SELinux dựa trên mô hình miền => kiểu.

Nhờ kiểu truy cập bắt buộc, SELinux có khả năng kiểm soát truy cập lớn hơn nhiều so với mô hình DAC truyền thống được sử dụng trong hệ điều hành Unix/Linux. Ví dụ: bạn có thể giới hạn số cổng mạng mà máy chủ ftp sẽ kết nối, cho phép ghi và thay đổi tệp trong một thư mục nhất định nhưng không xóa chúng.

Các thành phần chính của SELinux là:

  • Máy chủ thực thi chính sách – Cơ chế chính để tổ chức kiểm soát truy cập.
  • Cơ sở dữ liệu chính sách bảo mật hệ thống.
  • Tương tác với bộ chặn sự kiện LSM.
  • Selinuxfs - Pseudo-FS, giống như /proc và được gắn vào /sys/fs/selinux. Được nhân Linux tự động điền vào khi chạy và chứa các tệp chứa thông tin trạng thái SELinux.
  • Truy cập bộ đệm vectơ - Một cơ chế phụ trợ để tăng năng suất.

Hệ thống bảo mật Linux
SELinux hoạt động như thế nào

Tất cả đều hoạt động như thế này.

  1. Một chủ thể nhất định, theo thuật ngữ SELinux, thực hiện một hành động được phép trên một đối tượng sau khi kiểm tra DAC, như minh họa trong hình trên cùng. Yêu cầu thực hiện một thao tác này sẽ được chuyển đến bộ chặn sự kiện LSM.
  2. Từ đó, yêu cầu, cùng với bối cảnh bảo mật chủ thể và đối tượng, được chuyển đến mô-đun Tóm tắt và Hook Logic của SELinux, chịu trách nhiệm tương tác với LSM.
  3. Cơ quan ra quyết định về quyền truy cập của chủ thể vào một đối tượng là Máy chủ thực thi chính sách và nó nhận dữ liệu từ SELinux AnHL.
  4. Để đưa ra quyết định về quyền truy cập hoặc từ chối, Máy chủ thực thi chính sách sẽ chuyển sang hệ thống con bộ nhớ đệm Access Vector Cache (AVC) cho các quy tắc được sử dụng nhiều nhất.
  5. Nếu không tìm thấy giải pháp cho quy tắc tương ứng trong bộ đệm thì yêu cầu sẽ được chuyển đến cơ sở dữ liệu chính sách bảo mật.
  6. Kết quả tìm kiếm từ cơ sở dữ liệu và AVC được trả về Policy Enforcement Server.
  7. Nếu chính sách được tìm thấy khớp với hành động được yêu cầu thì thao tác đó sẽ được cho phép. Nếu không, hoạt động bị cấm.

Quản lý cài đặt SELinux

SELinux hoạt động ở một trong ba chế độ:

  • Thực thi - Tuân thủ nghiêm ngặt các chính sách bảo mật.
  • Cho phép - Vi phạm các hạn chế được cho phép; một ghi chú tương ứng được thực hiện trong tạp chí.
  • Đã tắt—Chính sách bảo mật không có hiệu lực.

Bạn có thể xem SELinux đang ở chế độ nào bằng lệnh sau.

[admin@server ~]$ getenforce
Permissive

Thay đổi chế độ trước khi khởi động lại, ví dụ: đặt chế độ này thành thực thi hoặc 1. Tham số cho phép tương ứng với mã số 0.

[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #то же самое

Bạn cũng có thể thay đổi chế độ bằng cách chỉnh sửa tệp:

[admin@server ~]$ cat /etc/selinux/config

# 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=enforcing
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.

SELINUXTYPE=mục tiêu

Điểm khác biệt với setenfoce là khi hệ điều hành khởi động, chế độ SELinux sẽ được thiết lập theo giá trị của tham số SELINUX trong file cấu hình. Ngoài ra, những thay đổi về việc thực thi <=> bị vô hiệu hóa chỉ có hiệu lực bằng cách chỉnh sửa tệp /etc/selinux/config và sau khi khởi động lại.

Xem báo cáo trạng thái ngắn gọn:

[admin@server ~]$ sestatus

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: 31

Để xem các thuộc tính SELinux, một số tiện ích tiêu chuẩn sử dụng tham số -Z.

[admin@server ~]$ ls -lZ /var/log/httpd/
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200920
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200927
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201004
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201011
[admin@server ~]$ ps -u apache -Z
LABEL                             PID TTY          TIME CMD
system_u:system_r:httpd_t:s0     2914 ?        00:00:04 httpd
system_u:system_r:httpd_t:s0     2915 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     2916 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     2917 ?        00:00:00 httpd
...
system_u:system_r:httpd_t:s0     2918 ?        00:00:00 httpd

So với đầu ra thông thường của ls -l, có một số trường bổ sung ở định dạng sau:

<user>:<role>:<type>:<level>

Trường cuối cùng biểu thị một cái gì đó giống như phân loại bảo mật và bao gồm sự kết hợp của hai yếu tố:

  • s0 - tầm quan trọng, cũng được viết dưới dạng khoảng cấp thấp-cao
  • c0, c1… c1023 - danh mục.

Thay đổi cấu hình truy cập

Sử dụng semodule để tải, thêm và xóa các mô-đun SELinux.

[admin@server ~]$ semodule -l |wc -l #список всех модулей
408
[admin@server ~]$ semodule -e abrt #enable - активировать модуль
[admin@server ~]$ semodule -d accountsd #disable - отключить модуль
[admin@server ~]$ semodule -r avahi #remove - удалить модуль

Đội thứ nhất đăng nhập semanage kết nối người dùng SELinux với người dùng hệ điều hành, người dùng thứ hai sẽ hiển thị danh sách. Cuối cùng, lệnh cuối cùng với khóa chuyển -r sẽ xóa ánh xạ người dùng SELinux sang tài khoản hệ điều hành. Phần giải thích về cú pháp cho các giá trị Phạm vi MLS/MCS có ở phần trước.

[admin@server ~]$ semanage login -a -s user_u karol
[admin@server ~]$ 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 *
[admin@server ~]$ semanage login -d karol

Đội người dùng semanage được sử dụng để quản lý ánh xạ giữa người dùng và vai trò SELinux.

[admin@server ~]$ semanage user -l
                Labeling   MLS/       MLS/                          
SELinux User    Prefix     MCS Level  MCS Range             SELinux Roles
guest_u         user       s0         s0                    guest_r
staff_u         staff      s0         s0-s0:c0.c1023        staff_r sysadm_r
...
user_u          user       s0         s0                    user_r
xguest_u        user       s0         s0                    xguest_r
[admin@server ~]$ semanage user -a -R 'staff_r user_r'
[admin@server ~]$ semanage user -d test_u

Các tham số lệnh:

  • -a thêm mục ánh xạ vai trò tùy chỉnh;
  • -l danh sách người dùng và vai trò phù hợp;
  • -d xóa mục ánh xạ vai trò người dùng;
  • -R danh sách các vai trò gắn liền với người dùng;

Tệp, Cổng và Giá trị Boolean

Mỗi mô-đun SELinux cung cấp một bộ quy tắc gắn thẻ tệp, nhưng bạn cũng có thể thêm quy tắc của riêng mình nếu cần. Ví dụ: chúng tôi muốn máy chủ web có quyền truy cập vào thư mục /srv/www.

[admin@server ~]$ semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?
[admin@server ~]$ restorecon -R /srv/www/

Lệnh đầu tiên đăng ký các quy tắc đánh dấu mới và lệnh thứ hai đặt lại, hay đúng hơn là đặt, các loại tệp theo các quy tắc hiện hành.

Tương tự, các cổng TCP/UDP được đánh dấu theo cách mà chỉ các dịch vụ thích hợp mới có thể lắng nghe chúng. Ví dụ: để máy chủ web nghe trên cổng 8080, bạn cần chạy lệnh.

[admin@server ~]$ semanage port -m -t http_port_t -p tcp 8080

Một số lượng đáng kể các mô-đun SELinux có các tham số có thể nhận giá trị Boolean. Toàn bộ danh sách các tham số như vậy có thể được xem bằng cách sử dụng getsebool -a. Bạn có thể thay đổi giá trị boolean bằng setsebool.

[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_cgi --> on
[admin@server ~]$ setsebool -P httpd_enable_cgi off
[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_homedirs --> off

Hội thảo, truy cập vào giao diện PGadmin-web

Hãy xem một ví dụ thực tế: chúng tôi đã cài đặt pgadmin7.6-web trên RHEL 4 để quản trị cơ sở dữ liệu PostgreSQL. Chúng tôi đi bộ một chút nhiệm vụ với các cài đặt của pg_hba.conf, postgresql.conf và config_local.py, đặt quyền cho thư mục, cài đặt các mô-đun Python bị thiếu từ pip. Mọi thứ đã sẵn sàng, chúng tôi khởi động và đón nhận 500 Lỗi máy chủ nội bộ.

Hệ thống bảo mật Linux

Chúng tôi bắt đầu với các nghi phạm điển hình, kiểm tra /var/log/httpd/error_log. Có một số mục thú vị ở đó.

[timestamp] [core:notice] [pid 23689] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
...
[timestamp] [wsgi:error] [pid 23690] [Errno 13] Permission denied: '/var/lib/pgadmin'
[timestamp] [wsgi:error] [pid 23690] [timestamp] [wsgi:error] [pid 23690] HINT : You may need to manually set the permissions on
[timestamp] [wsgi:error] [pid 23690] /var/lib/pgadmin to allow apache to write to it.

Tại thời điểm này, hầu hết các quản trị viên Linux sẽ rất muốn chạy setencorce 0 và mọi chuyện sẽ kết thúc ở đó. Thành thật mà nói, tôi đã làm điều đó lần đầu tiên. Tất nhiên đây cũng là một lối thoát, nhưng không phải là cách tốt nhất.

Mặc dù có thiết kế cồng kềnh nhưng SELinux có thể thân thiện với người dùng. Chỉ cần cài đặt gói setroubleshoot và xem nhật ký hệ thống.

[admin@server ~]$ yum install setroubleshoot
[admin@server ~]$ journalctl -b -0
[admin@server ~]$ service restart auditd

Xin lưu ý rằng dịch vụ Auditd phải được khởi động lại theo cách này và không sử dụng systemctl, mặc dù có sự hiện diện của systemd trong HĐH. Trong nhật ký hệ thống sẽ được chỉ định không chỉ thực tế ngăn chặn mà còn là lý do và cách vượt qua lệnh cấm.

Hệ thống bảo mật Linux

Chúng tôi thực hiện các lệnh này:

[admin@server ~]$ setsebool -P httpd_can_network_connect 1
[admin@server ~]$ setsebool -P httpd_can_network_connect_db 1

Chúng tôi kiểm tra quyền truy cập vào trang web pgadmin4, mọi thứ đều hoạt động.

Hệ thống bảo mật Linux

Hệ thống bảo mật Linux

Nguồn: www.habr.com

Thêm một lời nhận xét