![]() |
Przegląd tematu | ![]() |
![]() |
|
1. Wstęp
2. Bezpieczeństwo Apache 2.1 Modularna budowa Apache 2.2 Ujawnianie informacji o sobie przez Apache 2.3 Apache pod Linuxem... 2.4 Ochroniarz na etacie, czyli krótko o logach... 2.5 Wskazówki dotyczące przygotowania Apache do pracy pod Windows 3. Ogólne bezpieczeństwo systemu Linux 4. Konfiguracja iptables, czyli swoisty firewall dla Linux'a 1. WSTĘP Dostęp do łączy szerokopasmowych staje się powoli coraz bardziej powszechny i kusząca staje się perspektywa wykorzystania domowego komputera jako niewielkiego serwera WWW. W związku z faktem, iż coraz więcej osób decyduje się na postawienie własnego serwera, chciałbym przedstawić w tym artykule podstawowe sposoby zabezpieczenia domowego serwera. Dla niektórych metody przedstawione w tym artykule mogą wydawać się absurdalnie podstawowe i obowiązkowe. Tak w istocie też jest, lecz jak sie okazuje nie każdy je stosuje i wykorzystuje do zabezpieczenia serwera. Mam nadzieję, że publikacja tego artykułu przyczyni się do zwiększenia bezpieczeństwa waszych serwerow i nie zostaną one skompromitowane przez początkujących włamywaczy ;-D 2. BEZPIECZEŃSTWO SERWERA HTTP APACHE 2.1 Modularna budowa Apache Jeśli ktoś cokolwiek wie na temat bezpieczeństwa komputerowego, wie na pewno, że im mniej usług/modułów etc. w systemie, tym lepiej (bezpieczniej). Złota zasada jest taka: Pozostawiamy wszystko co jest niezbędne - resztę wyrzucamy. Tak też jest w przypadku Apache, który został napisany zgodnie z obowiązującymi trendami promującymi budowę modularną. Oznacza to , że lwią częśc funkcji umieszcza się w odzielnych bibliotekach i ładowane są tylko wtedy, gdy używamy oprogramowania do specyficznych zastosowań. Ma to wiele zalet np. możliwość nieskończonego rozszerzania funkcjonalności. Niestety z punktu widzenia bezpieczenstwa rozwiazanie to ma jedną potężną wadę. Otóż dodatkowe biblioteki to potencjalne miejsca występowania luk. Niektore funkcje sa groźne dla serwera. I tak na przyklad mod_info może ujawniac zbyt wiele informacji o serwerze a mod_autoindex wprawnemu włamywaczowi pozwoli na listowanie katalogów serwera. Dla Apache główna zasada dotycząca modułów brzmi następująco: Używamy jedynie modułów, które są absolutnie niezbędne do poprawnego udostępniania stron. Wszelkie moduły oferujące dodatkowe funkcje usuwamy... Do poprawnego udostępniania statycznych stron potrzebne jest jedynie 5 z 34 standardowo ładowanych modułów (sic. !!!). Ładowane moduły możemy wyedytować oczywiście w pliku http.conf. Proponuję pozostawić następujące linijki: AddModule mod_log_config.c //odpowiada za logowanie żądań AddModule mod_mime.c //zapewnia prawidłowe kodowanie dokumentów, obsługę MIME AddModule mod_dir.c //obsługuje pliki startowe witryn WWW, tj. index.html, main.html etc. AddModule mod_access.c //dostarcza mechanizmy kontroli dostępu do stron WWW na podst. IP, nazwy domenowej etc. AddModule mod_auth.c //wymagany do implementacji uwierzytelniania dostępu HTTP Basic Auth Oczywiście każdy wie co jest mu potrzebne i do tej listy może dorzucić niezbędne moduły (np. do PHP). Więcej informacji dotyczących funkcji poszczególnych modułów znajdziecie oczywiście na www.apache.org Chciałbym dodać, że opisana powyżej optymalizacja ma jeszcze jedną istotną zaletę - oprócz podniesienia bezpieczeństwa, podnosi również wydajność serwera ![]() 2.2 Ujawnianie informacji o sobie przez Apache Apache w standardowej konfiguracji ma skłonność do nadmiernego ujawniania informacji o sobie. Wpisując coś w rodzaju [ www ] dostajemy jak na dloni informację o wersji Apache, systemie (Linux czy Windows), oraz wersji PHP (o ile takowa jest zainstalowana na serwerze). Aby zlikwidować tą zdradziecką stopkę oraz zapobiec ujawnieniu zbyt wielu informacji o wersji i konfiguracji naszego Apache'a powinnismy zmienić następujące dyrektywy (w pliku httpd.conf): UseCanonicalName Off ServerSignature Off // ta dyrektywa odpowiada za tą paskudną (moim zdaniem) stopkę HostnameLookups Off ServerTokens Prod Oprócz tego jeśli zastosowaliście się do rady z poprzedniego podpunktu macie wyłączony moduł mod_info ![]() 2.3 Apache pod Linuxem PUBLIC_HTML Użytkownicy, którzy mają konta na waszych serwerach chcieliby zapewne mieć własne strony. Standardowa konfiguracja Apache'a jak wiemy nie umożliwia nam tego. Trzeba zatem przekonfigurować serwer. Moduł który odpowiada za obsługę kont użytkowników to mod_userdir (należy go wrzucić spowrotem na listę ładowanych modułów jeśli zastosowaliśmy się do paragrafu 2.1). Należy również wyłączyć w pliku httpd.conf linię UserDir disable (stawiamy znaczek # przed tą dyrektywę) oraz uaktywnić linię UserDir public_html. Należy również umożliwić Apache dostęp do katalogu użytkownika oraz zasobów strony: chmod 711 /home/nazwausera Apache potrzebuje prawa odczytu do katalogu public_html: chmod a+r -R /home/nazwausera/public_html Możemy oczywiście również ustalić kto może wogóle mieć stronę ![]() Podane linie należy umieścić jeszcze po definicji uaktywnionej linii UserDir: Kod: AllowOverride FileInfo AuthConfig Limit Options MultiViews Indexes SymLinksIfOwnerMatch Order allow, deny Allow from all Order deny, allow Deny from all Włączenie stron domowych użytkowników to pierwsza część zadań administracyjnych. Drugą równie istotną są prawa nadane przez dyrektywę Directory. W konfiguracji tuż pod ustawieniami dla UserDir znajduje się nieaktywna konfiguracja praw dostępu do stron domowych. Uaktywniamy ją usuwając znaki "#" lini az do 2.4 Ochroniarz na etacie - czyli krótko o logach W codziennej praktyce powinniśmy korzystać z dwóch rodzajów aplikacji: wykrywaczy włamań oraz monitorów zmian w systemie. Godne polecenia są programy GFI LANguard System Integrity Monitor 3 oraz Snort. Pierwszy z nich śledzi zmiany we wskazanych plikach i katalogach. Drugi natomiast stał się klasykiem w swej dziedzinie. Przypomina nieco zwyczajny firewall. Monitoruje docierające do naszego komputera pakiety i odpowiednio reaguje na anomalie. Podsumowując, stosując powyższe działania zmniejszają możliwość włamania przez niezbyt doświadczonych włamywaczy. Należy pamiętać o aktualizowaniu Apache, oraz o przeglądaniu logów. Dobrym rozwiązaniem jest również uruchomienie Apache w osobnym środowisku - tak zwany chroot Apache. 2.5 Wskazówki dotyczące przygotowania Apache do pracy pod Windows Mam nadzieję że nikt z Was nie będzie stawiał swojego serwera pod Windows, aczkolwiek żeby nikt nie zarzucił mi dyskryminacji, napiszę parę słów również o bezpieczeństwie Apache w tym systemie. Defaultowa instalacja Apache instaluje się w katalogu Program Files, czyli w sąsiedztwie samego systemu. Nie jest to bezpieczne... Proponuję zainstalować go wraz z innymi pierdołami (PHP, MySQL, PhpMyAdmin i reszta) na osobno wydzielonej partycji w formacie NTFS (żaden inny nie wchodzi wogóle w grę...). NTFS jest szybszy od FAT(32), umożliwia kontrolę dostępu przez poszczególnych użytkowników, nakładanie quoty (zarządzanie przydziałami). Pierwsze co powinniśmy zrobić zaraz po instalacji Apache, to ustalenie restrykcji związanych z dostępem do katalogów programu. Powinniśmy zwrócić również uwagę na to z prawami jakiego użytkownika uruchamiany jest Apache. Fakt ten zapewnie zdziwi użytkowników Linuxa którzy są w lepszej sytuacji, ponieważ Apache domyślnie uruchamia sie z prawami użytkownika nobody i ma ustawione (powiedzmy ze prawidlowo - uwagi dot. tego znajdziesz w dalszej części artykułu) chmody. Standardowo Apache pracuje w Windows z prawami konta LocalSystem lub System. Wiąże się z tym wielkie niebezpieczeństwo, bowiem każdy kto przejmie kontrolę nad naszym serwerem będzie mógł robić wszystko - począwszy od przeglądania dysków do usuwania plików. Aby ograniczyć prawa, z jakimi uruchamiamy Apache'a postępujemy wg tych punktów: 1. Start/Panel Sterowania/Narzędzia administracyjne/Zarządzanie komputerem Start/Control Panel/Administrative Tools/Computer Management 2. Zakładamy nowe konto i sprawdzamy czy zostało przydzielone do grupy zwykłych userów 3. Następną czynnością jest ustalenie odpowiednich praw dla nowego konta, czyli: 3.1 Uruchamiamy ponownie konsolę MMC > patrz punkt 1 3.2 Włączamy przystawkę Group Policy lub Local Security Policy 3.3 Uaktywniamy dwa przywileje dla Apache'a: * Działaj jako część systemu (Act as part of the operating system) * Loguj jako usługę (Log as a service) 4. Ostatnim etapem jest skonfigurowanie usługi Apache do uruchamiania z prawami nowego konta 4.1 Tak jak ostatnio > Zarządzanie komputerem > Zakładka Logowanie 4.2 Konfigurujemy odpowiednio (koniecznie wpisz hasło do konta serwera WWW) Ponadto, konto Apache'a powinno mieć prawo do odczytu i wykonania wszystkich folderów i plików serwera Apache. W przypadku katalogu zawierającym nasze niezwykle cenne logi ;D (/logs) przyznajemy prawa odczytu i zapisu. Jeśli chodzi o katalogi zawierające witryny i inne gadżety dajemy prawa do odczytu i wykonania (jeśli korzystamy z php pamiętajmy o tym że niektóre aplikacje webowe korzystają z plików - katalogom z tymi skryptami dajemy oczywiście prawa do zapisu). Myślę, że w tym miejscu nie muszę przypominać o aktualnym programie antywirusowym, odpowiednio skonfigurowanym firewallu (nie polecam tego standardowego z Windows XP, blee) etc... System aktualizujemy na bierząco. Śledzimy występowanie wszystkich bugów, ściągamy łatki dla Windows. Wyłączamy niepotrzebne usługi w Windows (nie będę o tym pisał bo mimo wszystko uważam że w tym arcie nie powinienem nawet wspominać o pomyśle postawienia serwera na Windows - google sie kłania dla zainteresowanych). NIE KORZYSTAMY Z INTERNET EXPLORER'A!!! Nawet żeby na chwilę otworzyć google!!! Internet Explorer ma nadal mnóstwo niezałatanych dziur. Zamiast niego polecam (już darmową zresztą) Operę - w tym miejscu pozdro dla używających FireFox'a którego ostatnimi czasy ciągle trzeba bylo pilnować i aktualizować hehehe ![]() 3. Ogólne bezpieczeństwo systemu Linux A. SUIDY Każdy użytkownik mający dostęp do shella może uruchamiać programy zainstalowane na serwerze. Niektóre z nich mają nałożone specjalne prawa, ktore maja prawa wlasciciela - tzw. suidy. Niestety najczęściej właścicielem jest sam root. Z założenia programy mają nałożone suidy po to aby użytkownik mogł wykonywać je bez logowania się jako root. Takie dodatkowe prawa na serwerze mogą się okazać dość istotnym zagrożeniem np. może pojawić się jakiś exploit który wykorzystuje błąd w danej aplikacji i potencjalny włamywacz może uzyskać uprawnienia roota na naszym serwerze. Aby zwiększyć bezpieczeństwo systemu należy zostawić suidy tylko i wyłącznie dla programów które muszą je mieć - reszcie należy odebrać prawa: 1. logujemy się na root (su), odszukujemy w systemie pliki z suidami i zapisujemy rezultat do pliku: find / -user root -perm -4000 > suids 2. Po pomyślnym wykonaniu powyższego polecenia mamy w pliku wszystkie nazwy plików z pełnymi ścieżkami dostępu, których właścicielem jest root, oraz mają nałożony suid 3. Używając jakiegoś edytora tekstu edytujemy plik. Proponuję usunąć z listy następujące programy: passwd - użytkownik musi mieć prawo zmienić sobie hasło mtr - odpowiednik traceroute sudo - umożliwia uruchamianie programów z prawami innego usera sendmail, exim - poczta X - jeżeli bedą uruchamiane XWindow su - logowanie na roota ping - kazdy wie co to jest Jeżeli uważamy że inne programy także powinny zniknąć z listy - usuwamy je 4. zapisujemy plik i wykonujemy polecenie: chmod -s `cat suidy` B. DOSTĘP DO PLIKÓW KONFIGURACYJNYCH Odbieramy prawa do poszczególnych katalogów/plików: chmod 751 /etc chmod 700 /boot /root chmod 750 /bin/mt-st chmod 750 /sbin/badblocks chmod 750 /sbin/debugfs chmod 750 /sbin/depmod chmod 750 /sbin/dumpe2fs chmod 750 /sbin/explodepkg chmod 750 /sbin/fdisk chmod 750 /sbin/fsck chmod 750 /sbin/fsck.ext2 chmod 750 /sbin/fsck.minix chmod 750 /sbin/ftl_check chmod 750 /sbin/ftl_format chmod 750 /sbin/halt chmod 750 /sbin/hwclock chmod 750 /sbin/ifconfig chmod 750 /sbin/ifport chmod 750 /sbin/ifuser chmod 750 /sbin/init chmod 750 /sbin/insmod chmod 750 /sbin/installpkg chmod 750 /sbin/isapnp chmod 750 /sbin/killall5 chmod 750 /sbin/lilo chmod 750 /sbin/makepkg chmod 750 /sbin/mke2fs chmod 750 /sbin/mkfs chmod 750 /sbin/mkfs.minix chmod 750 /sbin/mkdosfs chmod 750 /sbin/mkraid chmod 750 /sbin/mkswap chmod 750 /sbin/modinfo chmod 750 /sbin/netconfig.color chmod 750 /sbin/netconfig.tty chmod 750 /sbin/pkgtool chmod 750 /sbin/pnpdump chmod 750 /sbin/removepkg chmod 750 /sbin/rpc.portmap chmod 750 /sbin/quotaon chmod 750 /sbin/rdev chmod 750 /sbin/runlevel chmod 750 /sbin/setserial chmod 750 /sbin/swapon chmod 750 /sbin/tune2fs chmod 750 /sbin/upgradepkg chmod 750 /sbin/uugetty chmod 750 /usr/bin/eject chmod 4750 /usr/bin/gpasswd chmod 750 /usr/bin/lpq chmod 750 /usr/bin/lprm chmod 4750 /usr/bin/lpr chmod 750 /usr/bin/minicom chmod 700 /usr/bin/nohup chmod 700 /usr/bin/script chmod 500 /usr/lib/news/bin/inndstart chmod 500 /usr/lib/news/bin/startinnfeed chmod 750 /usr/lib/setup/cpkgtool chmod 750 /usr/lib/setup/hdsetup chmod 750 /usr/sbin/atd chmod 750 /usr/sbin/atrun chmod 750 /usr/sbin/crond chmod 750 /usr/sbin/ctrlaltdel chmod 750 /usr/sbin/dhcpd chmod 750 /usr/sbin/dhcrelay chmod 750 /usr/sbin/edquota chmod 750 /usr/sbin/groupadd chmod 750 /usr/sbin/groupdel chmod 750 /usr/sbin/groupmod chmod 750 /usr/sbin/grpck chmod 750 /usr/sbin/grpconv chmod 750 /usr/sbin/grpunconv chmod 750 /usr/sbin/hdparm chmod 750 /usr/sbin/imapd chmod 750 /usr/sbin/in.comsat chmod 755 /usr/sbin/in.fingerd chmod 755 /usr/sbin/in.identd chmod 750 /usr/sbin/in.talkd chmod 000 /usr/sbin/in.rexecd chmod 000 /usr/sbin/in.rlogind chmod 000 /usr/sbin/in.rshd chmod 750 /usr/sbin/in.telnetd chmod 000 /usr/sbin/in.tftpd chmod 750 /usr/sbin/in.timed chmod 750 /usr/sbin/inetd chmod 750 /usr/sbin/ipop3d chmod 750 /usr/sbin/klogd chmod 2750 /usr/sbin/lpc chmod 740 /usr/sbin/lpd chmod 750 /usr/sbin/lpf chmod 550 /usr/sbin/makemap chmod 750 /usr/sbin/mouseconfig chmod 750 /usr/sbin/named chmod 750 /usr/sbin/newusers chmod 750 /usr/sbin/nmbd chmod 750 /usr/sbin/ntpdate chmod 750 /usr/sbin/ntpq chmod 750 /usr/sbin/ntptime chmod 750 /usr/sbin/ntptrace chmod 750 /usr/sbin/pppd chmod 750 /usr/sbin/pwck chmod 750 /usr/sbin/pwconv chmod 750 /usr/sbin/pwunconv chmod 550 /usr/sbin/quotastats chmod 750 /usr/sbin/rpc.bootparamd chmod 750 /usr/sbin/rpc.mountd chmod 750 /usr/sbin/rpc.nfsd chmod 750 /usr/sbin/rpc.rusersd chmod 750 /usr/sbin/rpc.rwalld chmod 750 /usr/sbin/rpc.yppasswdd chmod 750 /usr/sbin/rpc.ypxfrd chmod 750 /usr/sbin/rpcinfo chmod 750 /usr/sbin/showmount chmod 750 /usr/sbin/smbd chmod 750 /usr/sbin/syslogd chmod 750 /usr/sbin/tcpd chmod 750 /usr/sbin/tcpdchk chmod 750 /usr/sbin/tcpdmatch chmod 750 /usr/sbin/tcpdump chmod 750 /usr/sbin/timeconfig chmod 750 /usr/sbin/useradd chmod 750 /usr/sbin/userdel chmod 750 /usr/sbin/usermod chmod 750 /usr/sbin/vipw Mała uwaga - zamiast kopiować każdą linijkę i wklejać kopiujemy całą powyższą listę, otwieramy konsolę i dajemy shift+insert myślę ze o niczym nie zapomnialem |