SELinux blokuje exec() v PHP

AKL

SELinux blokuje exec() v PHP
« kdy: 14. 12. 2013, 17:25:45 »
Mám Fedora 19 x64, kernel 3.11.10.
Když z PHP/Apache zavolám exec(), příp. system(), nic se neprovede a ve /var/log/httpd/error_log se objeví záznam "sudo: unable to open audit system: Permission denied"
To by na první pohled napovídalo, že by mohl být problém s definicí v /etc/sudoers. Zkusil jsem teda zápis "apache ALL=(ALL) NOPASSWD: ALL", což ale k žádné změně nevedlo.
Následně jsem zkusil vypnout SELinux, který mám v defaultním nastavení jako enforcing targeted. Do /etc/selinux/config jsem teda zapsal "SELINUX=disabled" a po rebootu najednou exec() šlapal bezvadně.

Do SELinuxu teprve pronikám, jsem zatím jakési unterBFU  ;D, takže si s tímto problémem nevím rady. Jak jsem zjistil, ve /var/log/audit/audit.log ani v /var/log/messages o tomto problému žádný záznam není. Záznam jsem našel pouze v tom výše uvedeném logu error_log.

Na internetu je na toto téma milionšest různých diskuzí, ale bohužel žádná mě nenavedla správným směrem. Zatím nechci kapitulovat, takže o zákazu SELinuxu, což by zjevně bylo to nejjednodušší řešení, neuvažuji. Myslím, že problém zřejmě bude v nevhodně nakongurovaném kontextu někde něčeho....
Kde ale? A čeho? Že by třeba něco v /usr/lib64/php/modules/ ? Někde chybí kontext httpd_sys_script_exec_t??
Budu vděčný za každou radu. Předem všem moc díky.
« Poslední změna: 15. 12. 2013, 22:24:46 od Petr Krčmář »


SELinux

Re:Apache, PHP, exec() - problém s nastavením SELinuxu
« Odpověď #1 kdy: 14. 12. 2013, 19:14:43 »
První věc, kterou bych doporučil je nevypínat selinux pomocí hodnoty disabled. Pak budeš muset provést kompletní relabel, až budeš chtít selinux znovu zapnout a s vypnutým selinuxem nemůžeš problém debugovat. Dočasně můžeš selinux vypnout příkazem "setenforce 0". Pokud chceš, aby toto nastavení přežilo reboot nastav v /etc/selinux/config "SELINUX=permissive".

  • Zkontroluj, že běží auditd, přepni selinux do permissivního módu(před restartem spusť "touch /.autorelabel"), spusť tvůj php skript.
  • Spusť a případně pošli výstup z příkazu "sealert -a /var/log/audit/audit.log" (před celou akcí pro jistou otoč logy auditu - tedy před spuštěním tvého skriptu)
  • Pošli výstup (pokud sem ještě budeš psát) z příkazu "getsebool -a | grep httpd"

To by pro začátek asi mohlo stačit.

AKL

Re:Apache, PHP, exec() - problém s nastavením SELinuxu
« Odpověď #2 kdy: 14. 12. 2013, 20:43:11 »
Děkuji za reakci a hlavně za návod.

Aktuální nastavení httpd přepínačů:
httpd_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_connect_ftp --> off
httpd_can_connect_ldap --> off
httpd_can_connect_mythtv --> off
httpd_can_connect_zabbix --> off
httpd_can_network_connect --> off
httpd_can_network_connect_cobbler --> off
httpd_can_network_connect_db --> off
httpd_can_network_memcache --> off
httpd_can_network_relay --> off
httpd_can_sendmail --> off
httpd_dbus_avahi --> off
httpd_enable_cgi --> on
httpd_enable_ftp_server --> off
httpd_enable_homedirs --> off
httpd_execmem --> off
httpd_graceful_shutdown --> on
httpd_manage_ipa --> off
httpd_mod_auth_ntlm_winbind --> off
httpd_mod_auth_pam --> off
httpd_read_user_content --> off
httpd_run_stickshift --> on
httpd_serve_cobbler_files --> off
httpd_setrlimit --> on
httpd_ssi_exec --> off
httpd_sys_script_anon_write --> off
httpd_tmp_exec --> off
httpd_tty_comm --> off
httpd_unified --> on
httpd_use_cifs --> off
httpd_use_fusefs --> off
httpd_use_gpg --> off
httpd_use_nfs --> off
httpd_use_openstack --> off
httpd_use_sasl --> off
httpd_verify_dns --> off

Co se týče permissive modu - hned po jeho aktivaci a spuštění skriptu nastalo generování desítek alertů. Tam je zjevně celý komplex problémů, které se SELinuxu nelíbí.Obsahu těch alertů sice zatím příliš nerozumím, ale neskromně se domnívám, že tohle snad už zvládnu. Původně jsem doufal, že stačí jen nadefinovat vhodný typ pro objekty a bude to OK. Zjevně tahle domněnka byla naivní a tak jednoduché to není.