SElinux: อนุญาตให้ httpd เชื่อมต่อกับพอร์ตเฉพาะ


41

ระบบของฉันใช้งาน CentOS 6.4 ด้วย apache2.2.15 SElinux บังคับใช้และฉันพยายามเชื่อมต่อกับอินสแตนซ์ในพื้นที่ของ redis ผ่านแอพ python / wsgi ของฉัน ฉันได้รับข้อผิดพลาด 13 สิทธิ์ถูกปฏิเสธ ฉันสามารถแก้ไขได้ผ่านคำสั่ง:

setsebool -P httpd_can_network_connect

อย่างไรก็ตามฉันไม่ต้องการให้ httpd เชื่อมต่อกับพอร์ต tcp ทั้งหมดได้อย่างแน่นอน ฉันจะระบุพอร์ต http / เครือข่ายที่อนุญาตให้เชื่อมต่อได้อย่างไร ถ้าฉันสามารถสร้างโมดูลเพื่ออนุญาตให้ httpd เชื่อมต่อกับพอร์ต 6379 (redis) หรือ tcp ใด ๆ บน 127.0.0.1 นั่นจะเป็นสิ่งที่ดีกว่า ไม่แน่ใจว่าทำไมความหวาดระแวงของฉันถึงแข็งแรงมากในเรื่องนี้ แต่เฮ้ ...

ใครรู้บ้าง


มันจะไม่ดีกว่าที่จะบังคับให้ออกไปทางพร็อกซี? ด้วยวิธีนี้คุณสามารถก) สามารถควบคุมสิ่งที่สามารถเข้าถึงได้ได้ดียิ่งขึ้นข) มีการตรวจสอบที่ดีขึ้นว่าเกิดอะไรขึ้นและเมื่อใด
คาเมรอนเคอร์

คำตอบ:


51

โดยค่าเริ่มต้นนโยบาย SELinux จะอนุญาตการเข้าถึงบริการไปยังพอร์ตที่รู้จักซึ่งเชื่อมโยงกับบริการเหล่านั้นเท่านั้น:

# 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.

- เพิ่มพอร์ต Redis (6379) ในนโยบาย 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.

นอกจากนี้คุณยังสามารถติดตั้งsetroubleshoot-serverRPM และเรียกใช้: sealert -a /var/log/audit/audit.log- มันจะให้รายงานที่ดีพร้อมคำแนะนำที่เป็นประโยชน์ (รวมถึงคำสั่งด้านบน)

สคริปต์ PHP เพื่อทดสอบการเชื่อมต่อ:

# 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
ฉันมีปัญหาใน Fedora 23 เพื่อส่งอีเมล (โดยเชื่อมต่อกับ 127.0.0.1 บนพอร์ต 25) จากสคริปต์ perl (โดยใช้ Net :: SMTP) เริ่มต้นจาก httpd "การอนุญาตให้ httpd เชื่อมต่อกับพอร์ต 25" ไม่ใช่สิ่งที่เรากำลังมองหาในกรณีนี้ อันที่จริงการเพิ่มพอร์ต 25 ชนิด SELinux http_port_tล้มเหลวเนื่องจากพอร์ต 25 ถูกใช้ไปแล้ว (สำหรับประเภท SELinux ValueError: Port tcp/25 already definedอื่น): วิธีที่ถูกต้องในการอนุญาตให้ httpd เชื่อมต่อกับพอร์ต 25 คือการตั้งค่าบูลีนนโยบาย SELinux ที่สอดคล้องกันบน: setsebool -P httpd_can_sendmail on(ดูgetseebool -a) (ดำเนินการในตอนที่ 2)
David Tonhofer

1
(ต่อจากตอนที่ 1) แต่ถ้าคุณต้องการที่จะส่งจาก Perl สคริปต์คุณต้องชัดเจนสร้างโมดูล SELinux sealert -b; sealert -a /var/log/audit/audit.log; grep perl /var/log/audit/audit.log | audit2allow -M mypol; semodule -v -i mypol.ppที่ช่วยให้ว่า จากนั้นก็ใช้งานได้!
David Tonhofer

@DavidTonhofer พิมพ์ผิดเล็กน้อยในgetsebool -aคำสั่ง (น้อยกว่าหนึ่งe)
davidjb

1
@DavidTonhofer คุณไม่จำเป็นต้องสร้างนโยบายใหม่สำหรับพอร์ตที่มีอยู่คุณสามารถแก้ไขได้แทน: semanage port -m -t http_port_t -p tcp 25ดูsemanage port --help
HTF

สำหรับ zabbix มีบูลีนแบบพิเศษอยู่บน CentOS 7.5:setsebool -P httpd_can_connect_zabbix true
David Tonhofer

17

คุณอาจต้องใช้

semanage port -m -t http_port_t -p tcp 6379

ถ้า semanage หายไปให้เพิ่มแพ็คเกจ policycoreutils-python

yum install policycoreutils-python

semanageอาจจะเป็นpolicycoreutils-python-utilsตอนนี้ (อย่างน้อยใน Fedora 23)
David Tonhofer

1
CentOS 7 ยังรวมถึงในsemanage policycoreutils-python
jxmallett

ขอบคุณที่ให้คำตอบกับคำถามแทนที่จะเป็นอย่างอื่น
Florian Heigl

3

คุณสามารถวาง selinux ชั่วคราวในโหมดอนุญาตและให้ httpd เชื่อมต่อกับ redis จากนั้นสร้างและสร้างโมดูลนโยบายที่กำหนดเองโดยใช้audit2allow

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.