Sử dụng Ghi nhãn cổng SELinux để cho phép dịch vụ sử dụng cổng không chuẩn

Tác giả sysadmin, T.M.Hai 31, 2022, 02:55:05 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 3 Khách đang xem chủ đề.

Sử dụng Ghi nhãn cổng SELinux để cho phép dịch vụ sử dụng cổng không chuẩn


Theo mặc định, chính sách SELinux xác định các cổng mà một dịch vụ cụ thể được phép liên kết và sử dụng với việc ghi nhãn cổng. Điều này làm tăng tính bảo mật của hệ thống bằng cách ngăn các dịch vụ ngẫu nhiên hoặc mã độc không thể liên kết với một cổng được xác định rõ ràng mà có thể được sử dụng bởi một dịch vụ hợp pháp.

Để thay đổi dịch vụ sử dụng cổng không chuẩn, chúng tôi phải thay đổi chính sách SELinux và chỉ định loại cổng SELinux được phép sử dụng các cổng cụ thể.

Chúng ta có thể xem danh sách các bản ghi hiện được xác định bằng lệnh semanage như hình bên dưới.

Mã nguồn [Chọn]
[root@centos 7 ~]# semanage port -l
Trên máy chủ thử nghiệm của tôi, kết quả này cho ra 390 dòng khác nhau, khá nhiều, bạn có thể thu hẹp kết quả bằng cách chuyển đầu ra thành grep cho tên của dịch vụ hoặc cổng mà bạn đang theo dõi.

Chẳng hạn, chúng ta có thể thấy rằng loại cổng SELinux cho SSH được phép sử dụng cổng TCP 22 theo mặc định bên dưới nhưng không có gì khác.

Mã nguồn [Chọn]
[root@centos7 ~]# semanage port -l | grep ssh
ssh_port_t                     tcp      22

Chúng tôi có thể kiểm tra điều này bằng cách sửa đổi tệp /etc/ssh/sshd_config, theo mặc định, nó chỉ định "Cổng 22" là cổng mà sshd lắng nghe các kết nối, tôi đã sửa đổi tệp này thành "Cổng 2222" và tải lại dịch vụ sshd. Sau khi tải lại, lệnh netstat cho thấy sshd không còn nghe trên cổng 22 hoặc 2222. Sử dụng lệnh sealert từ gói máy chủ setroubleshoot, chúng ta có thể lấy thêm thông tin từ tệp /var/log/audit/audit.log như hiển thị bên dưới.

Mã nguồn [Chọn]
[root@centos7 ~]# sealert -a /var/log/audit/audit.log
100% done'list' object has no attribute 'split'
100% done
found 1 alerts in /var/log/audit/audit.log
--------------------------------------------------------------------------------

SELinux is preventing /usr/sbin/sshd from name_bind access on the tcp_socket port 2222.

*****  Plugin bind_ports (92.2 confidence) suggests   ************************

If you want to allow /usr/sbin/sshd to bind to network port 2222
Then you need to modify the port type.
Do
# semanage port -a -t PORT_TYPE -p tcp 2222
    where PORT_TYPE is one of the following: ssh_port_t, vnc_port_t, xserver_port_t.

Kết quả cho chúng ta thấy lệnh "semanage port" mà chúng ta cần chạy để cho phép SSH sử dụng cổng TCP 2222. Cờ -a thêm bản ghi, cờ -t chỉ định loại cổng SELinux, trong khi -p là giao thức (TCP hoặc UDP) cho cổng được chỉ định.

Mã nguồn [Chọn]
semanage port -a -t ssh_port_t -p tcp 2222
Lệnh này là liên tục và những thay đổi sẽ vẫn còn ngay cả sau khi khởi động lại hệ thống.

Sau khi chạy phần này, chúng ta có thể chạy lại semanage port -l và xác nhận rằng SSH hiện được phép sử dụng cổng TCP 22 hoặc 2222.

Mã nguồn [Chọn]
[root@centos7 ~]# semanage port -l | grep ssh
ssh_port_t                     tcp      2222, 22

Điều quan trọng cần lưu ý là một cổng cụ thể chỉ có thể được sử dụng bởi một dịch vụ tại một thời điểm, ví dụ: nếu chúng tôi cố gắng chỉ định cổng TCP 22 hoặc 2222 ở nơi khác vào thời điểm này, chúng tôi sẽ gặp lỗi.

Mã nguồn [Chọn]
[root@centos7 ~]# semanage port -a -t http_port_t -p tcp 22
ValueError: Port tcp/22 already defined

[root@centos7 ~]# semanage port -a -t http_port_t -p tcp 2222
ValueError: Port tcp/2222 already defined

Ngoài ra, chúng ta có thể sử dụng lệnh semanage với cờ -C, vì toàn bộ nội dung của -l dài gần 400 dòng mặc dù chúng ta có thể thu hẹp kết quả bằng grep, -C sẽ chỉ hiển thị các tùy chỉnh. Trong ví dụ bên dưới, chúng tôi thấy thay đổi cổng 2222 gần đây hiện là tùy chỉnh duy nhất của chúng tôi.

Mã nguồn [Chọn]
[root@centos7 ~]# semanage port -lC
SELinux Port Type              Proto    Port Number
ssh_port_t                     tcp      2222

Thay vào đó, nếu chúng ta muốn áp dụng cổng TCP 2222 cho Apache, chúng ta có thể sử dụng semanage với cờ -m để sửa đổi loại cổng SELinux từ ssh_port_t thành http_port_t như được hiển thị bên dưới.

Mã nguồn [Chọn]
[root@centos7 ~]# semanage port -m -t http_port_t -p tcp 2222

[root@centos7 ~]# semanage port -lC
SELinux Port Type              Proto    Port Number
http_port_t                    tcp      2222

Chúng tôi cũng có thể xóa hoàn toàn một bản ghi bằng cách sử dụng cờ -d, sau đó đầu ra của -C xác nhận không còn bất kỳ tùy chỉnh nào nữa.

Mã nguồn [Chọn]
[root@centos7 ~]# semanage port -d -t http_port_t -p tcp 2222
[root@centos7 ~]# semanage port -lC
[root@centos7 ~]#

Lệnh sepolicy đi kèm với gói policycoreutils-devel cũng có thể được sử dụng để xem các loại cổng SELinux đã được đặt trên một cổng cụ thể.

Mã nguồn [Chọn]
[root@centos7 ~]# sepolicy network -p 2222
2222: tcp ssh_port_t 2222

[root@centos7 ~]# sepolicy network -p 22
22: tcp ssh_port_t 22

[root@centos7 ~]# sepolicy network -t ssh_port_t
ssh_port_t: tcp: 2222,22

Ngoài ra, nếu hệ thống Linux của bạn đã cài đặt GUI, bạn có thể cài đặt gói policycoreutils-gui qua yum rồi chạy lệnh 'system-config-selinux' để mở GUI. Từ menu Cổng mạng ở bên trái, bạn có thể định cấu hình các loại cổng SELinux như hình bên dưới.


Nếu bạn gặp khó khăn trong việc ghi nhớ bất kỳ điều nào trong số này, chỉ cần tham khảo trang hướng dẫn cổng semanage để biết thêm thông tin và ví dụ.

Mã nguồn [Chọn]
man semanage-port
Theo mặc định, SELinux chỉ cho phép các dịch vụ đã biết liên kết với các cổng đã biết và được xác định. Nếu chúng tôi muốn thay đổi một dịch vụ để sử dụng một cổng không mặc định, chúng tôi sẽ cần sửa đổi loại cổng SELinux bằng lệnh "cổng semanage" hoặc thông qua GUI như đã minh họa.