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/.
Witam, planuje umiescic oba w oddzielnych chrootach, i zrobic komunikacje po localhoscie z webserverem.
Jak powinien wygladac config? Na co zwrocic uwage?
Moglbym zrobic ldd ew. strace aby znalezc brakujace liby ale jest to bardzo czasochlonne nie mowie nawet o aktualizacji takiego jaila....
Offline
Z chrootami daj sobie spokój, to zabezpieczenie exploity potrafią obejść.
Chyba, żeby chrooty chronić przez Grsecurity, ale Grsec to nie jest zabawa dla noobów.
Zainteresuj się lepiej ACL typu np Apparmor.
Przykładowo taki profil AA naskrobałem dla MariaDB (demon mysqld):
#include <tunables/global> /usr/sbin/mysqld { #include <abstractions/base> #include <abstractions/openssl> #include <abstractions/mysql> #include <abstractions/nameservice> #include <abstractions/private-files> #include <abstractions/ssl_certs> #include <abstractions/ssl_keys> /usr/sbin/mysqld mr, capability setuid, capability setgid, capability dac_override, capability dac_read_search, capability sys_chroot, /etc/mysql/ r, /etc/mysql/** r, /etc/ssl/mysql/* r, /etc/gai.conf r, /etc/resolv.conf r, /etc/nsswitch.conf r, /etc/hosts r, /etc/passwd r, /etc/group r, /etc/fstab r, /etc/mime.types r, /etc/mtab r, /etc/timezone r, /var/run/mysqld rw, /var/run/mysqld/** rwk, /run/mysqld rw, /run/mysqld/** rwk, /media/box/db/mysql/ rw, /media/box/db/mysql/** rwlk, owner @{PROC}/[0-9]*/cmdline r, owner @{PROC}/[0-9]*/fd/ r, owner @{PROC}/[0-9]*/fd/* r, owner @{PROC}/[0-9]*/maps r, owner @{PROC}/[0-9]*/mountinfo r, @{PROC}/[0-9]*/net/if_inet6 r, @{PROC}/[0-9]*/net/ipv6_route r, owner @{PROC}/[0-9]*/stat r, owner @{PROC}/[0-9]*/statm r, owner @{PROC}/[0-9]*/status r, owner @{PROC}/[0-9]*/task/[0-9]*/stat r, @{PROC}/filesystems r, @{PROC}/sys/vm/overcommit_memory r, /dev/random r, /dev/urandom r, /dev/null rw, /dev/zero rw, /lib{,32,64}/ld-*.so mr, /lib{,32,64}/libaio.so.* mr, /lib{,32,64}/libc-*.so mr, /lib{,32,64}/libcrypt*.so mr, /lib{,32,64}/libdl-*.so mr, /lib{,32,64}/libm-*.so mr, /lib{,32,64}/libnss_files-*.so mr, /lib{,32,64}/libpthread-*.so mr, /lib{,32,64}/librt-*.so mr, /lib{,32,64}/libz.so* mr, /usr/lib{,32,64}/binutils/** mr, /usr/lib{,32,64}/gcc/** mr, /usr/lib{,32,64}/libcrypto.so* mr, /usr/lib{,32,64}/libnss_winbind.so* mr, /usr/lib{,32,64}/libssl.so* mr, /usr/lib{,32,64}/mysql/plugin/** mr, /usr/lib{,32,64}/samba/libwinbind-client.so mr, /usr/share/mysql/ r, /usr/share/mysql/** rlk, /var/log/mysql/ r, /var/log/mysql/* w, /tmp/ r, owner /tmp/** rwk, }
Serwerek Mysql działa bez problemu, ale poza to, co mu wolno nosa nie wystawi.
Bazy Mysqla siedzą w:
/media/box/db/mysql/ rw, /media/box/db/mysql/** rwlk,
A tutaj php-fpm:
#include <tunables/global> /usr/lib*/php5.*/bin/php-fpm { #include <abstractions/base> #include <abstractions/php5> #include <abstractions/user-tmp> #include <abstractions/web-data> #include <abstractions/mysql> #include <abstractions/postgresql> capability setuid, capability setgid, capability chown, capability dac_override, capability kill, deny owner /**/*.php mrwlkx, /usr/sbin/sendmail pux, /bin/bash rix, /etc/hosts r, /etc/resolv.conf r, /etc/nsswitch.conf r, /etc/group r, /etc/passwd r, /etc/host.conf r, /etc/gai.conf r, /etc/ssl/openssl.cnf r, /etc/services r, /etc/krb5.conf r, /etc/php/fpm-php5.*/ r, /etc/php/fpm-php5.*/** r, /proc/*/task/ r, /usr/lib64/php5.*/bin/php-fpm mr, /usr/lib64/php5.*/lib64/** mr, /usr/lib64/php5.*/lib/** mr, /usr/share/snmp/mibs/ r, /usr/share/snmp/mibs/** r, /var/lib/net-snmp/mib_indexes/ r, /var/lib/net-snmp/mib_indexes/** r, /var/log/php/ wk, /var/log/php/** wk, /{,var/}run/phpfpm56.pid w, /{,var/}run/php*.sock rwk, owner @{PROC}/[0-9]*/cmdline r, owner @{PROC}/[0-9]*/fd/ r, owner @{PROC}/[0-9]*/fd/* r, owner @{PROC}/[0-9]*/maps r, owner @{PROC}/[0-9]*/mountinfo r, owner @{PROC}/[0-9]*/stat r, owner @{PROC}/[0-9]*/statm r, owner @{PROC}/[0-9]*/status r, owner @{PROC}/[0-9]*/task/ r, owner @{PROC}/[0-9]*/task/[0-9]*/stat r, @{PROC}/[0-9]*/net/if_inet6 r, @{PROC}/[0-9]*/net/ipv6_route r, @{PROC}/filesystems r, owner /tmp/** rmwlk, /var/www/**/logs/** rw, /var/www/**/tmp/** rw, /var/www/**/temp/** rw, /var/www/**/cache/** rw, /var/www/** r, /home/www/**/logs/** rw, /home/www/**/log/** rw, /home/www/**/tmp/** rw, /home/www/**/temp/** rw, /home/www/**/image/** rw, /home/www/**/img/** rw, /home/www/**/download/** rw, /home/www/**/cache/** rw, /home/www/**/.htaccess rw, /home/www/**/robots.txt rw, /home/www/**/*.xml rw, /usr/share/webapps/** r, /usr/share/webapps/**/log/** rw, /usr/share/webapps/**/logs/** rw, /usr/share/webapps/**/rra/** rw, /usr/share/webapps/**/tmp/** rw, /usr/share/webapps/**/cache/** rw, owner /home/www/**/templates_c/** rw, /var/spool/php rwlk, /var/spool/php/** rwlk, }
Przy okazji taka mała niespodzianka, jak ktoś przez np dziurawego Wordpressa wrzuci skrypt c99.php albo podobny, to go nie uruchomi:
deny owner /**/*.php mrwlkx,
bo demon php-fpm nie może nawet tknąć pliku php, który sam zapisał na serwerze, i którego jest właścicielem.
Ostatnio edytowany przez Jacekalex (2017-04-05 21:26:09)
Offline
Dzieki za przyklady - przydadza sie. Chrooty sa oczywiscie "protected by grsecurity".
Chcialbym /var/www oraz /var/lib/mysql trzymac w tmpfs, czy to rozsadne?
Jak powinien wygladac config jailkita w tym wypadku?
Offline
/var/www i /var/lib/mysql w tmpfs?
Przecież to są domyślnie lokalizacje plików strony www i miejsce, gdzie mysql domyślnie trzyma bazy danych.
Wyłączenie serwera (np chwilowy brak zasilania) i wszystkie dane mają diabli wziąć?
Przecież tmpfs to jest ramdysk, znika zasilanie to znika też bezpowrotnie cała zawartość.
Jailkitem się od lat nie zajmuję. wolę sensownie skonfigurować Apparmora.
Ostatnio edytowany przez Jacekalex (2017-04-05 23:39:36)
Offline
Dlaczego nie uzywasz grsec chroot, tylko apparmor?
Zapewnia to wyzszy poziom bezpieczenstwa (php5-fpm & mysqld) wraz z jajkiem grsec?
Offline
Używam grsec chroot, ale do usług, które się automatycznie zamykają w chrootach, jak np Bind.
AA jest mocniejszym zabezpieczeniem realizowanym na poziomie kernela,
w ogóle nie trzeba się przy nim certolić z budowaniem chrootów, po prostu
w profilu pisze, co program może zrobić, a czego nie wolno, i kropka, do tego grzecznie loguje wszystkie akcje blokowania.
Co do standardowego chroota, to tu masz rozprawkę na ten temat:
https://access.redhat.com/blogs/766093/posts/1975883
Ja natomiast czasem mogę stosować grsec, a czasem nie mogę i nie widzę powodu, żeby stosować różne procedury w przypadku A i B.
Ostatnio edytowany przez Jacekalex (2017-04-06 18:28:49)
Offline
Chrooty wzmocnione grsec dobrze izoluja daemony od systemu.
Zamierzam postawic php5-fpm oraz mariadb w chroocie uzywajac jailkit (opcje co do chrootow mam poustawiane w grsec kernelu).
[b]Dodatkowo te chrooty chce wzmocnic apparmorem.[/b]
Nadal nie wiem jak postawic jailkitem php5-fpm i mariadb... (duzo szukalem na necie i nic, nawet zadnego example)...
Zalezy mi na chrootach utworzonych na jailkicie...
Zauwaz ze grsec znaczaco poprawia bezpieczenstwo kernela no i chrootow tez.
Redhata artykul nie wniosl nic nowego...
Ostatnio edytowany przez xc (2017-04-07 19:18:51)
Offline
1 wynik w google http://serverfault.com/questions/251534/setup-php-mysql-for-chrooted-jail-jailkit
Chociaż wszystkie wordpressy i joomle działają na połączeniu do bazy opartym o tcp, więc zabezpieczenie bazy nic nie ma.
php-fpm podzieliłbym na poole z odpowiednimi uprawnieniami.
Offline
[quote=mati75]1 wynik w google http://serverfault.com/questions/251534/setup-php-mysql-for-chrooted-jail-jailkit
Chociaż wszystkie wordpressy i joomle działają na połączeniu do bazy opartym o tcp, więc zabezpieczenie bazy nic nie ma.
php-fpm podzieliłbym na poole z odpowiednimi uprawnieniami.[/quote]
Czyżby?
... else { define('DB_NAME', 'wordpress45'); define('DB_USER', 'wordpress4'); define('DB_PASSWORD', 'straszne_hasełko'); define('DB_HOST', 'localhost:/run/mysqld/mysqld.sock'); define('FS_METHOD', 'direct'); define('DB_CHARSET', 'utf8'); define('DB_COLLATE', ''); } ....
Jak widać nie zawsze i nie koniecznie.
Jak ktoś koniecznie chce się upierać przy chrootach, to zawsze może montować [b]/run/mysqld[/b] we wszystkich chrootach przez [b]mount -o bind ...[/b]
Inna sprawa, że pierdolenie się z chrootami i tak nie daje takich rezultatów, jak porządny ACL, w którym można definiować zasady dostępu do każdego pliku, biblioteki, capabilities i diabli wiedzą, czego jeszcze...
Do tego zawsze można walnąć:
echo y > /sys/module/apparmor/parameters/lock_policy
i mamy AA zablokowany, nawet root nie może zmienić polityk AA (bez rebootowania systemu):
aa-disable pidgin Disabling /usr/bin/pidgin. ERROR: /sbin/apparmor_parser: usuni?cie "/usr/bin/pidgin" nie powiod?o si?. Permission denied; attempted to load a profile while confined?
Uprawnienia w Mysql?
Bycza zabawa na killka wieczorów, ale wygląda to mniej więcej tak:
MariaDB [(none)]> show grants; +-------------------------------------------------------------------------------------------------------------------+ | Grants for wordpress4@localhost | +-------------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'wordpress4'@'localhost' IDENTIFIED BY PASSWORD '*straszne_hasełko_do_bazy' | | GRANT SELECT, CREATE TEMPORARY TABLES, SHOW VIEW ON `wordpress4`.* TO 'wordpress4'@'localhost' WITH GRANT OPTION | | GRANT ALL PRIVILEGES ON `wordpresstest`.* TO 'wordpress4'@'localhost' | | GRANT SELECT ON `wordpress45`.* TO 'wordpress4'@'localhost' | | GRANT SELECT, INSERT, UPDATE ON `wordpress4`.`wp_usermeta` TO 'wordpress4'@'localhost' | | GRANT INSERT ON `wordpress4`.`wp_redirection_404` TO 'wordpress4'@'localhost' | | GRANT SELECT, INSERT ON `wordpress4`.`wp_woocommerce_order_items` TO 'wordpress4'@'localhost' | | GRANT SELECT, INSERT ON `wordpress4`.`wp_commentmeta` TO 'wordpress4'@'localhost' | | GRANT SELECT, INSERT, UPDATE, DELETE ON `wordpress4`.`wp_comments` TO 'wordpress4'@'localhost' | | GRANT SELECT, INSERT ON `wordpress4`.`wp_woocommerce_order_itemmeta` TO 'wordpress4'@'localhost' | | GRANT SELECT, INSERT, UPDATE ON `wordpress4`.`wp_posts` TO 'wordpress4'@'localhost' | | GRANT SELECT, INSERT, UPDATE ON `wordpress4`.`wp_postmeta` TO 'wordpress4'@'localhost' | | GRANT ALL PRIVILEGES ON `wordpresstest`.`wordpresstest` TO 'wordpress4'@'localhost' | | GRANT INSERT, UPDATE, DELETE ON `wordpress4`.`wp_options` TO 'wordpress4'@'localhost' | +-------------------------------------------------------------------------------------------------------------------+ 14 rows in set (0.00 sec)
Pozdro
Ostatnio edytowany przez Jacekalex (2017-04-07 21:40:31)
Offline
Uwazam ze chroot z php5-fpm (oraz dobry config apparmora do tego chroota), oraz chroot z mysqld (oraz dobry config apparmora do tego chroota) jest rozwiazaniem ktorego szukam.
Czy apparmor poradzi sobie z 0 day? W chroocie byc moze tak (mowimy tutaj o grsec).
Robi sie ciezej gdy chodzi unix sockety w chroot. php5-fpm, mysqld w chroocie jest zmuszone sluchac na localhostcie.
Offline
Mysql nie musi słuchać na localhoście, byleby solidnie zabezpieczony był dostęp z netu.
W przypadku serwera przydaje się możliwość zrzucania bazy mysqldumpem albo odpalanie replikacji.
Uruchamianie WP i innych CMSów przez tcp do mysqla można robić, ale socket unix jest odrobinkę szybszy w działaniu, co wynika ze specyfikacji protokołu TCP.
Odpowiedź na selecta z tabeli innodb Mariadb potrafi udzielić w czasie nawet <500μs, nie ma żadnego powodu tracić czasu na zestawianie połączenia TCP.
Czy Apparmor zatrzyma 0-daya? Apparmor chroni poszczególne usługi przez niestandardowym zachowaniem, ale jest tylko jedną z linii obrony.
Może zatrzymać np zdobycie roota przez [url=https://www.exploit-db.com/exploits/15449/]dziurawy serwer Proftpd[/url]
jeśli zastosuje się profil podobny do tego:
#include <tunables/global> /usr/sbin/proftpd { #include <abstractions/base> #include <abstractions/openssl> #include <abstractions/mysql> #include <abstractions/private-files> #include <abstractions/private-files-strict> /usr/sbin/proftpd mr, capability net_bind_service, capability setgid, capability setuid, capability sys_chroot, capability ipc_lock, capability dac_read_search, capability audit_write, capability kill, /etc/pam.d/ftp r, /etc/pam.d/other r, /lib*/security/pam_mysql.so rm, /usr/share/mysql/charsets/Index.xml r, /lib*/security/pam_permit.so rm, /lib*/security/pam_deny.so rm, /etc/ld.so.cache r, /etc/passwd r, /etc/group r, /etc/nsswitch.conf r, /etc/ssl/openssl.cnf r, /etc/services r, /etc/protocols r, /etc/hosts r, /etc/host.conf r, /etc/host.allow r, /etc/host.deny r, /etc/resolv.conf r, /etc/shells r, /etc/ftpusers r, /etc/shadow r, /etc/proftpd/ r, /etc/proftpd/** r, /etc/pam.d/ftp r, /etc/pam.d/other r, /etc/ssl/certs/proftpd.key.pem r, /etc/ssl/certs/proftpd.crt.pem r, /etc/ssl/proftpd/* r, /usr/share/zoneinfo/** r, /usr/share/locale/** r, /usr/share/mysql/** r, /**/ r, owner @{HOME}/ rl, owner @{HOME}/** rwl, owner @{HOME}/Publiczny/ rwl, owner @{HOME}/Publiczny/** rwl, owner @{PROC}/[0-9]*/cmdline r, owner @{PROC}/[0-9]*/fd/ r, owner @{PROC}/[0-9]*/fd/* r, owner @{PROC}/[0-9]*/maps r, owner @{PROC}/[0-9]*/mountinfo r, owner @{PROC}/[0-9]*/stat r, owner @{PROC}/[0-9]*/statm r, owner @{PROC}/[0-9]*/status r, owner @{PROC}/[0-9]*/task/[0-9]*/stat r, @{PROC}/[0-9]*/net/if_inet6 r, @{PROC}/[0-9]*/net/ipv6_route r, @{PROC}/sys/kernel/ngroups_max r, @{PROC}/filesystems r, /{,var/}run/proftpd/ rw, /{,var/}run/proftpd/** rwk, /{,var/}run/clamd.sock rw, /{,var/}run/proftpd rw, /{,var/}run/proftpd/** rwk, /{,var/}run/clamd.sock rw, /tmp/ r, owner /tmp/BanTable rwk, /var/log/proftpd/* rw, /var/log/xferlog rw, /var/log/wtmp rw, }
Przy okazji, grsec ani AA nie są cudownym środkiem "zainstalować i gotowe",
cały system musi być bezpiecznie zaprojektowany, Linux wiele w tym kierunku na zrobione domyślnie, ale to nie zwalnia Administratora z myślenia i należytej staranności.
Całościowo sprawę domyślnego Linuxa opisuje nieźle ten dokument (ma już swoje lata, trochę się zmieniło):
https://gentoo-handbook.lugons.org/doc/pl/security/security-handbook.xml
Do tego ekstra moduły:
AA: http://wiki.apparmor.net/index.php/Documentation
Grsec: https://en.wikibooks.org/wiki/Grsecurity
Możesz też się bawić SELinuxem (zamiast Apparmora), ale ten jest skrajnie niekompatybilny z łatką Grsecurity, za to dużo trudniejszy w konfiguracji.
Ostatnio edytowany przez Jacekalex (2017-04-08 10:28:36)
Offline
Za bardzo odbieglismy od tematu ja chcialbym miec w chroocie php5-fpm.
W nastepnym chroocie mysqld (client & server).
Dodatkowo nalozyc confingi apparmora dla php5-fpm w chrocie oraz mysqld (client & server) w chroocie.
*mysqld jako klient jest mariadb-client a serwer mariadb-server w debianie.
Pojawia sie pytanie jak to zrobic jailkitem? Nie wiem jakich sciezek do /etc mam tam zrobic (bo jest tego duzo a z chroocie ma byc najnajmniej), oraz co do binarek, etc. Nie chce sie meczyc z ldd i strace...
Offline
Time (s) | Query |
---|---|
0.00009 | SET CHARSET latin2 |
0.00003 | SET NAMES latin2 |
0.00089 | 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='3.139.83.248' WHERE u.id=1 |
0.00055 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.139.83.248', 1732726083) |
0.00046 | SELECT * FROM punbb_online WHERE logged<1732725783 |
0.00068 | DELETE FROM punbb_online WHERE ident='18.190.253.56' |
0.00065 | SELECT topic_id FROM punbb_posts WHERE id=309917 |
0.00099 | SELECT id FROM punbb_posts WHERE topic_id=29479 ORDER BY posted |
0.00058 | 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=29479 AND t.moved_to IS NULL |
0.00006 | SELECT search_for, replace_with FROM punbb_censoring |
0.00097 | 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=29479 ORDER BY p.id LIMIT 0,25 |
0.00074 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=29479 |
Total query time: 0.00669 s |