SElinux: izinkan httpd untuk terhubung ke port tertentu

41

Sistem saya menjalankan CentOS 6.4 dengan apache2.2.15. SElinux menegakkan dan saya mencoba untuk terhubung ke instance lokal redis melalui aplikasi python / wsgi saya. Saya mendapatkan Galat 13, Izin ditolak. Saya bisa memperbaikinya melalui perintah:

setsebool -P httpd_can_network_connect

Namun, saya tidak benar-benar ingin httpd dapat terhubung ke semua port tcp. Bagaimana saya bisa menentukan port / jaringan mana yang diizinkan untuk terhubung dengan httpd? Jika saya dapat membuat modul untuk memungkinkan httpd terhubung ke port 6379 (redis) atau tcp pada 127.0.0.1, itu akan lebih baik. Tidak yakin mengapa paranoia saya sangat kuat dalam hal ini, tapi hei ...

Adakah yang tahu

savagecitizen
sumber
Bukankah lebih baik memaksanya keluar melalui proxy? Dengan begitu Anda dapat a) memiliki kontrol yang lebih baik atas apa yang dapat diakses b) memiliki audit yang lebih baik atas apa yang terjadi dan kapan.
Cameron Kerr

Jawaban:

51

Secara default, kebijakan SELinux hanya akan memungkinkan akses layanan ke port yang dikenal terkait dengan layanan tersebut:

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

- tambahkan port Redis (6379) ke kebijakan 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.

Anda juga dapat menginstal setroubleshoot-serverRPM dan menjalankan: sealert -a /var/log/audit/audit.log- itu akan memberi Anda laporan yang bagus dengan saran yang berguna (termasuk perintah di atas).

Script PHP untuk menguji koneksi:

# 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";

?>
HTF
sumber
3
Saya mempunyai masalah pada Fedora 23 untuk mengirim email (dengan menghubungkan ke 127.0.0.1 pada port 25) dari skrip perl (menggunakan Net :: SMTP) mulai dari httpd. "Izin untuk httpd untuk terhubung ke port 25" bukan yang dicari dalam kasus itu. Memang menambahkan port 25 dengan jenis SELinux http_port_tgagal karena port 25 sudah digunakan (untuk jenis SELinux lain): ValueError: Port tcp/25 already defined. Cara yang benar untuk mengizinkan httpd terhubung ke port 25 adalah dengan mengatur boolean kebijakan SELinux yang sesuai pada: setsebool -P httpd_can_sendmail on(lihat getseebool -a). (lanjutan di bagian 2)
David Tonhofer
1
(lanjutan dari bagian 1) Tetapi jika Anda ingin mengirim dari script perl, Anda harus secara eksplisit membuat modul SELinux yang memungkinkan bahwa: sealert -b; sealert -a /var/log/audit/audit.log; grep perl /var/log/audit/audit.log | audit2allow -M mypol; semodule -v -i mypol.pp. Lalu berhasil!
David Tonhofer
@DavidTonhofer Kesalahan ketik kecil pada getsebool -aperintah (satu lebih sedikit e).
davidjb
1
@DavidTonhofer Anda tidak perlu membuat kebijakan baru untuk port yang ada, Anda dapat memodifikasinya sebagai gantinya:, semanage port -m -t http_port_t -p tcp 25lihatsemanage port --help
HTF
Untuk zabbix, sudah ada boolean khusus pada CentOS 7.5:setsebool -P httpd_can_connect_zabbix true
David Tonhofer
17

Anda mungkin perlu menggunakan

semanage port -m -t http_port_t -p tcp 6379

Jika semanage tidak ada, tambahkan paket policycoreutils-python

yum install policycoreutils-python
Tom Hallam
sumber
semanagemungkin policycoreutils-python-utilssekarang (setidaknya di Fedora 23)
David Tonhofer
1
CentOS 7 masih termasuk semanagedalam policycoreutils-python.
jxmallett
terima kasih telah memberikan jawaban atas pertanyaan alih-alih yang lain.
Florian Heigl
3

Anda dapat menempatkan selinux sementara dalam mode permisif dan membiarkan httpd terhubung ke redis, kemudian menghasilkan dan membangun modul kebijakan khusus menggunakan audit2allow

SAYA
sumber