Pomimo że mijają już trzy lata od publikacji, to nadal wpis Serwer LAMP w Ubuntu jest jednym z najpopularniejszych i najczęściej odwiedzanych na HB. Zgodnie z zapowiedzią w części pierwszej serii, przedstawię poniżej przepis na LAMP w Debianie. Zakładam przy tym, że łączem, które zostanie wykorzystane, będzie DialNet skonfigurowany tak, jak to przedstawiłem we wcześniejszym wpisie tej serii. Dodatkowo, poza LAMP, opiszę instalację i wstępną konfigurację1 OpenSSH.

Instalacja OpenSSH

OpenSSH umożliwia zdalne podłączenie się do komputera, na którym zostało zainstalowane i skonfigurowane. Daje to możliwość bezpiecznego (szyfrowanego) zarządzania serwerem z poziomu innego komputera za pośrednictwem Internetu. Dzięki temu nie trzeba być fizycznie przy komputerze, który ma być serwerem — większość operacji można przeprowadzić zdalnie. Osobiście używam również SFTP zamiast FTP.

Instalacja OpenSSH w Debianie jest bajecznie prosta i sprowadza się do jednego polecenia:

sudo aptitude install ssh

ssh to metapakiet, który wymaga zainstalowania openssh-server oraz openssh-client wraz ze wszystkimi zależnościami.

Konfiguracja i zabezpieczanie OpenSSH

Ścieżka do pliku konfiguracyjnego OpenSSH jest następująca: /etc/ssh/ssh_config. Przed przystąpieniem do edycji tego pliku, dobrym pomysłem jest utworzenie kopii bezpieczeństwa i zabezpieczenie jej przed zapisem:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.original
sudo chmod a-w /etc/ssh/sshd_config.original

Mając backup, można spokojnie przejść do edycji pliku. Po wprowadzeniu i zapisaniu zmian, należy zrestartować serwer SSH następującym poleceniem:

sudo /etc/init.d/ssh restart

Poniżej przedstawię kilka sugestii odnośnie zabezpieczeń, jakich można użyć przy konfigurowaniu SSH:

  • Nasłuchiwanie na niestandardowym porcie. SSH domyślnie nasłuchuje połączenia na porcie 22. Jest dobrym pomysłem zmienienie tego portu, choćby na 2222. Osobiście polecam wybranie czegoś bardziej skomplikowanego — to pierwszy filtr przez jaki będzie musiał się przebić ew. włamywacz. Nie jest to oczywiście nie do obejścia, ale zawsze jest to dodatkowe utrudnienie2:3

    # Port 22
    Port 2222
    
  • Blokada logowania na konto Root. Zdaję sobie sprawę, że niektórzy tego potrzebują, ale jeśli tylko nie jest to konieczne, dobrze jest logowanie na to konto zablokować:

    # PermitRootLogin yes
    PermitRootLogin no
    
  • Możliwość używania SSH tylko dla wybranych użytkowników i/lub grup. To szczególnie przydatne, kiedy z serwera korzysta kilka osób i chce się ograniczyć dostęp do niego przez SSH:

    AllowUsers hadret
    
  • Powyższa reguła sprawi, że jedynym użytkownikiem mogącym się logować przez SSH, będzie hadret. Po spacji można dodać dodatkowych użytkowników. Można też zdefiniować kto nie może się logować przez SSH, wtedy należy dodać następującą regułę:

    DenyUsers hadret
    
  • Tym razem jedynym użytkownikiem nie mogącym się logować przez SSH jest hadret. Także tutaj po spacji można dodać dodatkowych użytkowników.

  • Możliwe jest też blokowanie lub udostępnianie połączenia całym grupom. Po więcej odsyłam do man sshd_config.

  • Inne sposoby to porzucenie logowania z użyciem hasła na rzecz kluczy SSH, akceptowanie połączeń SSH tylko z zaufanych adresów i/lub hostów, czy instalacja pakietów SSHGuard,4 Fail2Ban5 i/lub DenyHosts.6 Jest pewnie jeszcze kilka innych sposobów do podania których zachęcam czytelników w komentarzach.

Instalacja systemu zarządzania relacyjnymi bazami danych MySQL

sudo aptitude install mysql-client mysql-server libpam-mysql

Tak jak dwa pierwsze pakiety są obligatoryjne (i intuicyjne dzięki nazwom), tak trzeci jest opcjonalny. Z tymże użytkownicy GNOME, posiadający pakiet gnome-user-share najprawdopodobniej mają go już zainstalowanego. To jest moduł PAM, który pozwala na wykorzystanie bazy MySQL jako źródła identyfikacji użytkownika.

Konfiguracja MySQL

W trakcie instalacji zostanie wyświetlona prośba o podanie i potwierdzenie hasła dla użytkownika root. Hasło jest co prawda opcjonalne, ale chyba nie muszę pisać, że każdy rozsądny człowiek powinien je ustawić?

Ważnym jest, żeby unikać korzystania z tego konta — oczywiście ze względów bezpieczeństwa. Polecam wobec tego utworzenie nowego konta, np. o takiej samej nazwie, jak Twoje konto użytkownika w systemie.7 Aby to zrobić, najpierw trzeba się zalogować na konto root i podać hasło utworzone w trakcie instalacji:

mysql -h localhost -u root -p

Dalej polecenia wykonuje się już z poziomu mysql:

CREATE USER 'user'@'localhost' IDENTIFIED BY 'pass';
GRANT ALL PRIVILEGES ON *.* TO 'user'@'localhost' WITH GRANT OPTION;
CREATE USER 'user'@'%' IDENTIFIED BY 'pass';
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' WITH GRANT OPTION;

Powyższe komendy utworzą dwóch użytkowników user z hasłem pass z pełnymi uprawnieniami — takimi samymi, jak użytkownik root. Pierwsze konto umożliwia dostęp lokalnie (localhost), drugie umożliwia dostęp z każdego hosta (wildcard %).

Na koniec trzeba jeszcze zapisać zmiany i można opuścić mysql:

flush privileges;
exit;

Dobrym pomysłem jest ograniczenie dostępu nowego użytkownika do jednej bazy danych lub dodawanie mu przywilejów do nowo tworzonych baz na bieżąco. Również inne hasło niż to służące do logowania się na konto użytkownika jest wskazane.

Ponieważ serwer ma być widziany w całym Internecie, a nie tylko na naszym lokalnym jego wycinku, trzeba ustawić w pliku /etc/mysql/my.cnf, aby MySQL nasłuchiwało na wszystkich interfejsach, a nie tylko na localhoście. Sprowadza się to do zahashowania linii bind-address w/w pliku:

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
# bind-address= 127.0.0.1

Pozostało już tylko zrestartować serwer:

sudo /etc/init.d/mysql restart

Instalacja serwera HTTP Apache2 ze wsparciem dla PHP5

Instalacja pakietów apache2 i php5 powinna w zupełności wystarczyć w większości przypadków, ale żeby się upewnić, że wszystkie potrzebne8 moduły zostaną zainstalowane, polecam wykonać następujące polecenie:

sudo aptitude install apache2 apache2.2-common apache2-mpm-prefork apache2-suexec apache2-utils libapache2-mod-fcgid libapache2-mod-php5 php5 php5-common php5-gd php5-mysql php5-cgi php-auth php5-mcrypt php5-imagick

Po instalacji, wpisanie w okno przeglądarki localhost lub 127.0.0.1 powinno wyświetlić “Apache2 It Works!”

Konfiguracja Apacza

Moduły w Apaczu uruchamia się za pomocą polecenia a2enmod, a wyłącza za pomocą a2dismod. Polecam uruchomienie następujących modułów:

sudo a2enmod suexec rewrite ssl actions include

Aby zatwierdzić zmiany, trzeba jeszcze zrestartować serwer:

sudo /etc/init.d/apache2 restart

Więcej o modułach można przeczytać tutaj.

Ponieważ nie lubię korzystać ze ścieżki /var/www,9 korzystam z jeszcze jednego modułu — userdir. Umożliwia on korzystanie ze ścieżki /home/użytkownik/public_html:

cd
mkdir public_html
sudo a2enmod userdir
sudo /etc/init.d/apache2 restart

Utworzenie jakiegoś przykładowego pliku HTML (np. index.html) wewnątrz katalogu public_html i wpisanie adresu http://localhost/~użytkownik powinno wyświetlić tę przykładową stronę. To jednak nie wszystko, gdyż próba otwarcia w ten sposób pliku PHP wyświetli komunikat o pobieraniu pliku — a przecież nie o to chodzi.

Na początek polecam utworzenie prostego pliku PHP, który wyświetli wszystkie informacje odnośnie konfiguracji PHP na serwerze:

cd ~/public_html
echo "" >> test.php

Aby zreperować działanie skryptów PHP z katalogu użytkownika, trzeba poddać edycji plik /etc/apache2/mods-available/php5.conf i zahashować następujące linie:

#    
#        
#            php_admin_value engine Off
#        
#      

Zahashowanie zamiast zmiana wartości php_admin_value engine na On umożliwia wyłączenie PHP u poszczególnych użytkowników za pomocą pliku .htaccess.

I jeszcze tylko restart serwera:

sudo /etc/init.d/apache2 restart

Teraz otwarcie adresu http://localhost/~użytkownik/test.php powinno wyświetlić informacje odnośnie konfiguracji PHP na serwerze.

Dobrze jest rozważyć użycie suPHP.

Podsumowanie

W ten sposób dobiegła końca druga część serii Debian GNU/Linux na łączu DialNet. Przy tak skonfigurowanym łączu, jak podałem w pierwszej części, oraz serwerze, jak podałem powyżej, strony tworzone w katalogu public_html będą dostępne w Internecie pod stałym adresem. W następnym wpisie serii opiszę instalację i konfigurację z wykorzystaniem alternatywnego serwera HTTP — nginx.

Źródła:

OpenSSH

MySQL

Apache i PHP

Wykop

Uważasz, że wpis jest wartościowy? Nie zawahaj się więc go dodać do serwisu Wykop (jeśli masz tam konto) i/lub wykopać w serwisie OSNews.


  1. W tym zabezpieczenie. ↩︎

  2. Trzeba przy tym pamiętać, żeby odblokować również niestandardowy port w firewallu lub routerze. ↩︎

  3. Również łącząc się z serwerem będzie trzeba dodać zmienną -P oraz numer portu, np. ssh -P 2222 login@host↩︎

  4. Sposób konfiguracji został opisany tutaj: Setting up SSHGuard on Debian↩︎

  5. Sposób konfiguracji został opisany tutaj: Fail2Ban: Preventing Brute Force SSH↩︎

  6. Sposób konfiguracji został opisany tutaj: Preventing SSH Dictionary Attacks With DenyHosts. Z zastrzeżeniem, że pakiet denyhosts jest dostępny w repozytoriach Debiana i nie trzeba go już instalować „ręcznie"↩︎

  7. Choć, rzecz jasna, utworzenie innej nazwy użytkownika zwiększy bezpieczeństwo. ↩︎

  8. I te mniej potrzebne też. ↩︎

  9. Głównie ze względu na dostęp do tej ścieżki i różne problemy z uprawnieniami. ↩︎