Blokace SELinuxem přístup k MySQL

Hoj,
potřeboval bych poradit. Když se chci z PHP přes DIBI dostat do databáze (u mě třeba na wz.cz), tak mě v prohlížeči vyskočí hláška “HTTP 500 (Internal Server Error)”. K tomu mě zahlásí SELinux, že mi /usr/sbin/httpd blokuje name_connect. SELinux mi nabízí dva příkazy, které jsem zadal a jsou nefunkční:

setsebool -P httpd_can_network_connect 1
setsebool -P httpd_can_network_connect_db 1

Díky za rady

  1. je to skutecne selinuxem? (setenforce 0)
  2. podivej se ne cele AVC a najdi si moznost vygenerovani vlastniho pravidla pro selinux
  3. mas spravne oznackovanou tu PHP aplikaci?

Jak píše covex zkus nejprve zda je problém v selinuxu, příkazem setenforce 0 dočasně zakážeš vynucování politik. Pokud problém přetrvá… příkazy selinuxu se musí zadat pod rootem nejlépe přes su. Setsebool zapne (vypne) předpřipravenou povolovaci politiku (pravidlo). Máš aktualizace? Nedávno proběhla aktualizace sady politik targeted, která je ve fedoře. Pokud Setsebool nepomůže a problém je v selinuxu tak máš 3 možnosti. 1 potlačit trvale selinux (permissive v souboru config selinuxu v /etc), 2. Vygenerovat modul politiky - příkaz audit2allow, 3. zakázat uvěznění procesu dané služby (přesun do confined domény selinuxu - selinux v targeted hlídá přístupy pouze uvězněných (confined) procesů a to tak že co není vysloveně dovoleno politikou (modulem) je zakázáno, příkaz semanage permissive.)

Pozn. Při problémech se selinuxem neuškodí příkaz pod rootem restorecon -R /
Trvá pár minut ale obnoví všude kontexty (příznaky) dle kterých se selinux řídí (kdo co může číst atd. tomu se říká označkovat).

Jsem v linuxu začátečník … tak se zeptám polopatě. Když dělám PHP projekt, dávám ho dobře do /var/www/html/[nějaká složka]? Za další, nevím jak se označkovává. Může posloužit jako návod tohle? -> http://beginlinux.com/server_training/web-server/976-apache-and-selinux .

apache ve výchozím nastavení hledá index.html v adresáři /var/www/html , pokud máš projekt v nějaké vnořené složce tak je potřeba upravit configurační soubor apache /etc/httpd/conf/httpd.conf (direktiva documentroot) (event. vytvořit doplnkový např. projekt.conf v adresáři /etc/httpd/conf.d - konfigurační soubory zde se načtou společně s hlavním.)
Soubory a složky vnořené do /var/www/ by měly dostat automaticky kontext httpd_sys_content (to je potřeba pro selinux aby je mohl číst apache). Zkontrolovat označkování souborů kontexty můžeš v terminálu příkazem ls -lZ /var/www/html. Ručně můžeš soubory označkovat příkazem su -c ‘restorecon -R /var/www/html’ . Odkaz je ok, popř. pro fedoru je dobrý manuál přímo na stránkách fedoraproject http://docs.fedoraproject.org/en-US/Fedora/13/html/Security-Enhanced_Linux/index.html a zde jsou FAQ http://docs.fedoraproject.org/en-US/Fedora/13/html/SELinux_FAQ/index.html

Popíšu ještě trošku líp jak to vypadá (konečně jsem se měl čas k tomu dostat).
Složka, ve které je projekt se nachází na /var/www/html/Dibi/ … skripty (php) se normálně spouští (např. výpis vlastnosti z objektu …). Problém nastane, když si chci pustit skript z knihovny Dibi (např. dibi::connect()). Objeví se Internal Error 500. Kolega, se kterým spravujeme projekt v repozitáři, tak má nainstalovanej XAMP pod widlema a šlape mu to.
Internal Error nastane, i když si v prohlížeči (Chrome) chci pustit daný php soubor (z Dibi) ručně.
Přijde mi to, jako by byla ta složka s knihovnou zablokovaná.

Jinak, kontexty jsou OK a ten konfigurační soubor nemá smysl. Jedině, že by se to nemohlo volat ručně (localhost/Dibi).

RE: Ještě mě tak napadlo, jestli by se něco nemělo povolit v iptables …

Díky za váš čas :slight_smile:

v iptables nebude potřeba nic nastavovat pokud apache jiné stránky normalně vrací. (pro kontrolu - příkaz iptables -S nebo iptables -L v řetězu INPUT musí být řádek obsahující port 80 (http) ACCEPT). Máte správně nastavená práva složek a souborů projektu? Příkaz ls -l je zobrazí. Je potřeba mít pro soubory alespon rw-r-r (vlastník, skupina, ostatní) a pro složky rwx-rx-rx. Zkuste se podívat do logů, měla by tam být zapsaná nějaká chyba. Log systému je soubor /var/log/messages a log apache je /var/log/httpd/error_log.

ještě mě napadá, máte nainstalované a zavedené v apachi všechny potřebné moduly? (typicky php, rewrite atd dle toho co projekt vyžaduje) v konfiguračním souboru apache direktiva loadmodule.

jen pro zajímavost selinux se aplikuje až poté co projdou unixová práva, tj. pokud je přístup k souboru (složce) zakázán právy unix tak na selinux už nedojde. Každopádně při odladování problému se vyplatí mít selinux v modu permissive (nic neblokuje jen informuje, aktivuje se pro aktuální sezení příkazem setenforce 0)

Tak, tady je log z httpd/error_log

[Sat Jun 30 10:19:10 2012] [error] [client 127.0.0.1] File does not exist: /var/www/html/favicon.ico
[Sat Jun 30 10:19:17 2012] [error] [client 127.0.0.1] PHP Fatal error: Uncaught exception ‘DibiDriverException’ with message ‘Access denied for user ‘root’@‘localhost’ (using password: NO)’ in /var/www/html/Dibi/dibi-2.0.1/dibi/drivers/mysql.php:110\nStack trace:\n#0 /var/www/html/Dibi/dibi-2.0.1/dibi/libs/DibiConnection.php(163): DibiMySqlDriver->connect(Array)\n#1 /var/www/html/Dibi/dibi-2.0.1/dibi/libs/DibiConnection.php(137): DibiConnection->connect()\n#2 /var/www/html/Dibi/dibi-2.0.1/dibi/dibi.php(139): DibiConnection->__construct(Array, 0)\n#3 /var/www/html/Dibi/Connection.php(28): dibi::connect(Array)\n#4 /var/www/html/Dibi/fileForTrying.php(6): Connection->connect()\n#5 {main}\n thrown in /var/www/html/Dibi/dibi-2.0.1/dibi/drivers/mysql.php on line 110, referer: http://localhost/Dibi/
[Sat Jun 30 10:19:17 2012] [error] [client 127.0.0.1] File does not exist: /var/www/html/favicon.ico

Tak, už se to umoudřilo a můžu se přihlásit (přes to Dibi) do lokální databáze (MySQL) jako root.

‘Access denied for user ‘root’@‘localhost’ (using password: NO)’ in /var/www/html/Dibi/dibi-2.0.1/dibi/drivers/mysql.php

dle tohoto to vypadá na chybné přihlášení do mysql. (uživatel,heslo v mysql). Popř. by mohl selinux (pokud ho máte stále aktivní) blokovat přistup apache na port mysql. To se povolí právě těmi dvěma příkazy hned v prvním příspěvku.

Neni mi moc jasne, proc se trapite se selinuxem a pak pristupujete do DB jako root a jeste bez hesla?

Omlouvám se za chaos. Nyní se má věc tak, že mám lokální databázi, ke které se jako root připojím. Nevím v čem byl problém … ale už to funguje. Dík za vaši snahu :slight_smile: