SElinux: cho phép httpd kết nối với một cổng cụ thể


41

Hệ thống của tôi đang chạy CentOS 6.4 với apache2.2.15. SElinux đang thi hành và tôi đang cố gắng kết nối với một phiên bản redis cục bộ thông qua ứng dụng python / wsgi của tôi. Tôi nhận được Lỗi 13, Quyền bị từ chối. Tôi có thể sửa lỗi này thông qua lệnh:

setsebool -P httpd_can_network_connect

Tuy nhiên, tôi không muốn chính xác httpd có thể kết nối với tất cả các cổng tcp. Làm cách nào tôi có thể chỉ định cổng / mạng httpd nào được phép kết nối? Nếu tôi có thể tạo một mô-đun để cho phép httpd kết nối với cổng 6379 (redis) hoặc bất kỳ tcp nào trên 127.0.0.1, điều đó sẽ thích hợp hơn. Không chắc tại sao chứng hoang tưởng của tôi lại mạnh đến thế này, nhưng này ...

Có ai biết không?


Nó sẽ không tốt hơn để buộc nó đi ra ngoài thông qua một proxy? Bằng cách đó bạn có thể a) kiểm soát tốt hơn những gì có thể truy cập b) kiểm toán tốt hơn những gì đã xảy ra và khi nào.
Cameron Kerr

Câu trả lời:


51

Theo mặc định, chính sách SELinux sẽ chỉ cho phép các dịch vụ truy cập vào các cổng được nhận dạng được liên kết với các dịch vụ đó:

# semanage port -l | egrep '(^http_port_t|6379)'
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
# curl http://localhost/redis.php
Cannot connect to redis server.

- thêm cổng Redis (6379) vào chính sách SELinux

# semanage port -a -t http_port_t -p tcp 6379
# semanage port -l | egrep '(^http_port_t|6379)'
http_port_t                    tcp      6379, 80, 81, 443, 488, 8008, 8009, 8443, 9000
# curl http://localhost/redis.php
Connected successfully.

Bạn cũng có thể cài đặt setroubleshoot-serverRPM và chạy: sealert -a /var/log/audit/audit.log- nó sẽ cung cấp cho bạn một báo cáo hay với các đề xuất hữu ích (bao gồm cả lệnh ở trên).

Tập lệnh PHP để kiểm tra kết nối:

# cat redis.php 
<?php

$redis=new Redis();
$connected= $redis->connect('127.0.0.1', 6379);

if(!$connected) {
        die( "Cannot connect to redis server.\n" );
}

echo "Connected successfully.\n";

?>

3
Tôi gặp sự cố trên Fedora 23 khi gửi e-mail (bằng cách kết nối với 127.0.0.1 trên cổng 25) từ tập lệnh perl (sử dụng Net :: SMTP) bắt đầu từ httpd. "Quyền cho httpd kết nối với cổng 25" không phải là thứ mà người ta đang tìm kiếm trong trường hợp đó. Thật vậy, việc thêm cổng 25 vào loại SELinux http_port_tkhông thành công vì cổng 25 đã được sử dụng (đối với loại SELinux khác) : ValueError: Port tcp/25 already defined. Cách chính xác để cho phép httpd kết nối với cổng 25 là đặt boolean chính sách tương ứng của Selinux trên: setsebool -P httpd_can_sendmail on(xem getseebool -a). (tiếp theo trong phần 2)
David Tonhofer

1
(tiếp tục từ phần 1) Nhưng nếu bạn muốn gửi từ tập lệnh perl, bạn phải tạo một mô-đun SELinux rõ ràng cho phép : sealert -b; sealert -a /var/log/audit/audit.log; grep perl /var/log/audit/audit.log | audit2allow -M mypol; semodule -v -i mypol.pp. Sau đó, nó hoạt động!
David Tonhofer

@DavidTonhofer Lỗi đánh máy nhỏ trong getsebool -alệnh (ít hơn một e).
davidjb

1
@DavidTonhofer bạn không phải tạo chính sách mới cho cổng hiện tại, thay vào đó bạn có thể sửa đổi nó : semanage port -m -t http_port_t -p tcp 25, xemsemanage port --help
HTF

Đối với zabbix, đã có một boolean cụ thể trên CentOS 7.5:setsebool -P httpd_can_connect_zabbix true
David Tonhofer

17

Bạn có thể cần phải sử dụng

semanage port -m -t http_port_t -p tcp 6379

Nếu mất tích thì thêm gói policycoreutils-python

yum install policycoreutils-python

semanagecó thể ở policycoreutils-python-utilsngay bây giờ (ít nhất là trên Fedora 23)
David Tonhofer

1
CentOS 7 vẫn bao gồm semanagetrong policycoreutils-python.
jxmallett

cảm ơn bạn đã đưa ra một câu trả lời cho câu hỏi thay vì một cái gì đó khác.
Florian Heigl

3

Bạn có thể selinux đặt tạm thời trong chế độ dễ dãi và để httpd kết nối với redis, sau đó tạo ra và xây dựng một mô-đun chính sách tùy chỉnh sử dụng audit2allow

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.