Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Cześć, posiadam ten config apparmora dla php-fpm - https://forum.dug.net.pl/viewtopic.php?pid=309848#p309848
Przy stawianiu skryptu prestashop powiadomiło mnie o
Permissions on files and folders
Recursive write permissions for Apache user on ~/config/
Recursive write permissions for Apache user on ~/img/
Recursive write permissions for Apache user on ~/mails/
Recursive write permissions for Apache user on ~/modules/
Recursive write permissions for Apache user on ~/translations/
Recursive write permissions for Apache user on ~/upload/
Recursive write permissions for Apache user on ~/download/
Write permissions for Apache user on ~/app/config/[/quote]
W/w pliki mają uprawnienia do zapisywania rekursywnego przez chmod...
Dodałem więc te regułki do configu apparmora, lecz nic to nie zmieniło.../var/www/prestashop/config/** rw,
/var/www/prestashop/img/** rw,
/var/www/prestashop/mails/** rw,
/var/www/prestashop/modules/** rw,
/var/www/prestashop/translations/** rw,
/var/www/prestashop/upload/** rw,
/var/www/prestashop/download/** rw,
/var/www/prestashop/app/config/** rw,[/quote]
Błąd występuje:2017/04/23 19:32:49 [error] 1259#0: *5 FastCGI sent in stderr: "PHP message: PHP Warning: require(/var/www/prestashop/config/config.inc.php): failed to open stream: Permission denied in /var/www/prestashop/index.php on line 27
PHP message: PHP Fatal error: require(): Failed opening required '/var/www/prestashop/config/config.inc.php' (include_path='.:/usr/share/php:/usr/share/pear') in /var
/www/prestashop/index.php on line 27" while reading response header from upstream, client: 127.0.0.1, server: _, request: "GET /prestashop/ HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "localhost"[/quote]Offline
Logi Apparmora masz w zazwyczaj w [b]/var/log/kern.log[/b] albo w DMESG, dla akcji AA są rozstrzygające.
Jeżeli AA coś blokuje, to tam powinno pisać co i dlaczego.
Przykład logu AA:
[26049.302488] audit: type=1400 audit(1492977794.213:4049): apparmor="DENIED" operation="mkdir" profile="/usr/lib64/firefox/firefox" name="/home/pacjent.nv/" pid=12155 comm="Compositor" requested_mask="c" denied_mask="c" fsuid=1000 ouid=1000
Logi z PHP nie rozróżniają blokowania z AA od blokowania przez błędy CHMOD/ACL.
PS:
Na przywołanym w sznurku profilu AA Presta działa na Nginx+PHP-FPM
bez większych problemów.
Ostatnio edytowany przez Jacekalex (2017-04-23 22:10:23)
Offline
Niestety brak logow apparmora w /var/log/{messages,auth.log} czy dmesg.
Wiem o tym ze programy tego nierozrozniaja.
Presta nie dziala "out of the box" na Twoim configu, przynajmniej ta - https://www.prestashop.com/en/developers-versions
Wiem bo to juz przerabialem nie raz, najgorsze jest to ze logow apparmora nie widze (profil enforce).
Offline
Apparmor na pewno włączony?
Co to w ogóle za system operacyjny i jaki kernel?
Program Audit masz przypadkowo zainstalowany? (niezbędny do AA nie jest, za to przechwytuje logi AA i SELinuxa do swojego logu).
Jeśli tak, to zobacz w
/var/log/audit/*
Poza tym pokaż wyniki:
grep -i apparmor /boot/config-$(uname -r)
aa-status
cat /sys/module/apparmor/parameters/audit
Ja sobie do przełączania trybu logowania AA (tryb cichy, normalny) zrobiłem takiego skrypta -przełącznik:
Zwie się:
cat /usr/local/sbin/aalog
a zawiera:
#!/bin/bash AUDIT="/sys/module/apparmor/parameters/audit" grep quiet $AUDIT 2>&1 >/dev/null && echo -n normal > $AUDIT || echo -n quiet > $AUDIT; STATUS=`cat $AUDIT `; echo "Status AUDIT zmieniony na $STATUS ;)"; exit 0;
Pozdro
Ostatnio edytowany przez Jacekalex (2017-04-24 05:42:22)
Offline
Tak, audit jest w systemie zainstalowany, apparmor wlaczony, w jadrze tez jest.
U mnie /sys/module/apparmor/parameters/audit jest w trybie normal.
Ogolnie to logi apparmora zawsze mialem w /var/log/messages
Offline
Jeżeli Audit jest włączony, a w /var/log/audit* nie ma logów AA, to go lepiej skonfiguruj albo odinstaluj, bo widocznie wysyła logi AA do /dev/null.
Poza tym zobacz, czy proces PHP jest faktycznie chroniony, robi się to tak:
cat /proc/$PID/attr/current
np:
for PID in `pgrep php`; do cat /proc/$PID/attr/current; done; /usr/lib*/php5.*/bin/php-fpm (enforce) /usr/lib*/php5.*/bin/php-fpm (enforce)
Ostatnio edytowany przez Jacekalex (2017-04-25 01:07:31)
Offline
Apparmora mozemy spokojnie wykluczyc, wszystko jest ok.
Jedynie to config jest zle napisany, konkretnie:
deny owner /**/*.php mrwlkx,
Dalem mozliwosc odczytu bo musialem, teraz nie moze sobie rename zrobic
"PHP message: PHP Fatal error: Uncaught exception 'Symfony\Component\Filesystem\Exception\IOException' with message 'Cannot rename "
Nieznalazlem nigdzie tej funkcjonalnosci w AA...
Offline
[b]deny owner[/b] jest po to, żeby po ewentualnym załadowaniu przez dziurę np w WP beckdoora c99.php serwer nie mógł go uruchomić.
Dlatego php-fpm może otwierać tylko te pliki, które do niego nie nalezą.
To takie małe, ale bardzo praktyczne rozwiązanie.
Jak koniecznie chcesz aktualizować WP czy coś innego przez panel administracyjny, to zawsze możesz za Nginxem (w trybie proxy albo na innym porcie, chroniony za http-auth albo lepiej certyfikatem PKCS#12) ustawić Lighttpd czy Apacha, który będzie pracował jako inny user systemowy, i będzie miał prawo zapisu plików php, natomiast publiczny Nginx będzie je mógł tylko otwierać.
To wszystko jest do zrobienia, chociaż jest z tym trochę zabawy.
Ale przede wszystkim, jak długo nie potrafisz się dostać do logów AA, to się za Apparmora nie zabieraj w ogóle.
Niby twierdzisz, że AA coś blokuje, ale wyniku polecenia z roota:
aa-status
jakoś nie potrafisz podać o logach w ogóle nie wspominając.
Jeżeli nie ma śladu w logach, to skąd wiesz, że to AA coś zablokował?
Ostatnio edytowany przez Jacekalex (2017-04-26 04:17:38)
Offline
Logi:
# aa-status apparmor module is loaded. 10 profiles are loaded. 2 profiles are in enforce mode. /usr/sbin/mysqld /usr/sbin/php5-fpm (...) 2 processes have profiles defined. 2 processes are in enforce mode. /usr/sbin/mysqld (1275) /usr/sbin/php5-fpm (1248)
Jak widac nie moze zapisywac do /var/lib/php5/sessions/ (musialem tutaj dac rw w apparmorze)
Apr 27 00:08:11 hostname kernel: [ 699.195518] audit: type=1400 audit(1493165493.400:43): apparmor="DENIED" operation="mknod" profile="/usr/sbin/php5-fpm" name="/v ar/lib/php5/sessions/sess_blabla" pid=1823 comm="php5-fpm" requested_mask="c" denied_mask="c" fsuid=111 ouid=111 Apr 27 00:08:11 hostname kernel: [ 699.276105] audit: type=1400 audit(1493165493.484:44): apparmor="DENIED" operation="mknod" profile="/usr/sbin/php5-fpm" name="/v ar/lib/php5/sessions/sess_blabla" pid=1823 comm="php5-fpm" requested_mask="c" denied_mask="c" fsuid=111 ouid=111
Apparmor nie loguje rename wykonane przez php-fpm bo ma rw do tego folderu.
/var/www/prestashop/app/cache/prod/translations/** rw,
2017/04/27 01:21:09 [error] 3563#0: *54 FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught exception 'Symfony\Component\Filesystem\Exception\IOExceptio n' with message 'Cannot rename "/var/www/prestashop/app/cache/prod/translations/catalogue.en-US.[losowe cyfry].phpxGc3a5" to "/var/www/prestashop/app/cache/prod/tran slations/catalogue.en-US.[losowe cyfry].php".' in /var/www/prestashop/vendor/symfony/symfony/src/Symfony/Component/Filesystem/Filesystem.php:279
Najgorzej jest z tymi tlumaczeniami jak wyzej, oraz miliardami rename poblokowanych mimo rw...
Tutaj jest moje dzialajace minimum rw do folderow (wykluczajac miliardy renames)
/var/lib/php5/sessions/** rw, /var/www/prestashop/app/cache/prod/doctrine/** rw, /var/www/prestashop/app/cache/prod/translations/** rw,
W jaki sposob moglbym zrobic wyjatek dla /var/www/prestashop/app/cache/prod/translations/ co do operacji na plikach?
Presta musi miec tam mozliwosc, odczytu/zapisu swoich plikow no i zmiany nazwy pliku (na wiki apparmora napisane bylo ze rw, wystarczy do rename).
Offline
Apr 27 00:08:11 hostname kernel: [ 699.195518] audit: type=1400 audit(1493165493.400:43): apparmor="DENIED" operation="mknod" profile="/usr/sbin/php5-fpm" name="/v ar/lib/php5/sessions/sess_blabla" pid=1823 comm="php5-fpm" requested_mask="c" denied_mask="c" fsuid=111 ouid=111
Spróbuj, czy pójdzie: /var/lib/php5/sessions/** rwkl,
Co do /var/www/presashop, to troszkę nie dogadaliśmy się z koncepcją.
Zobacz bez Apparmora, czy to wchodzi czysto, bo profil AA ma zamknąć php-fpm z w klatce, żeby wobec jakiegoś błędu w PHP nie zrobił rzeczy zabronionej.
Dlatego do aktualizacji i instalacji Presty zaproponowałem jakiś schowany za Nginxem lekki serwer typu Lighttpd, który będzie chodził bez restrykcji,
i będzie właśnie do aktualizacji i administracji skryptem CMS.
Jeżeli natomiast AA blokuje Prestę przy normalnym działaniu strony (nie backendu administracyjnego), to pokaż logi z AA z tych akcji w lokalizacjach:
/var/www/prestashop/app/cache/prod/doctrine/** rw, /var/www/prestashop/app/cache/prod/translations/** rw,
Offline
Rozumiem Twoja koncepcje, ale to nie moze byc wszystko read, only. Uzyszkodnicy musza miec mozliwosc kupienia czegos, oraz log in.
Panel raczej musi byc osobno, i oba serwery www beda w klatkach. Jak sensownie tutaj zrobic sync pomiedzy nginxami, skryptami cron z rsync?
Update presty wykonuje manualnie. Bez apparmora wychodzi to na czysto bo presta moze sobie robic rw i rename do:
/var/www/prestashop/app/cache/prod/translations/** rw,
Z apparmorem oraz zabronieniu dla skryptow php wszystkiego:
2017/04/27 01:21:09 [error] 3563#0: *54 FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught exception 'Symfony\Component\Filesystem\Exception\IOExceptio n' with message 'Cannot rename "/var/www/prestashop/app/cache/prod/translations/catalogue.en-US.[losowe cyfry].phpxGc3a5" to "/var/www/prestashop/app/cache/prod/translations/catalogue.en-US.[losowe cyfry].php".' in /var/www/prestashop/vendor/symfony/symfony/src/Symfony/Component/Filesystem/Filesystem.php:279
Jak widac presta chce zmienic sobie nazwe pliku z catalogue.en-US.[losowe cyfry][b].phpxGc3a5[/b] do catalogue.en-US.[losowe cyfry][b].php[/b]
Wydaje mi sie ze lepiej to rozwiazac skryptem cron sprawdzajacym co 1s lub 10s i robiacym odpowiednie mv, chown, chmod...
/var/www/prestashop/app/cache/prod/translations/ odpowiada za jezyk presty przy czym presta moze nawet 15 plikow lub wiecej utworzyc, potem rename robic dla [b]jedego uzytkownika[/b]. Moim zdaniem to nie wyglada wydajnie ani bezpiecznie.
Offline
Time (s) | Query |
---|---|
0.00010 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00095 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='18.223.210.249' WHERE u.id=1 |
0.00079 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.223.210.249', 1732718599) |
0.00047 | SELECT * FROM punbb_online WHERE logged<1732718299 |
0.00235 | DELETE FROM punbb_online WHERE ident='185.191.171.15' |
0.00030 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=29523 AND t.moved_to IS NULL |
0.00033 | SELECT search_for, replace_with FROM punbb_censoring |
0.00212 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=29523 ORDER BY p.id LIMIT 0,25 |
0.00072 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=29523 |
Total query time: 0.00817 s |