Ta strona wygląda najlepiej z włączoną obsługą JavaScript
Instalacja serwera web na mikr.us z użyciem MariaDB i silnikiem MyISAM
· ☕ 17 min czytania
· 🐧 sysadmin
Cześć,
Trafiła się okazja jak ślepej kurze ziarno dawno temu i upolowałem domenę za darmo sysadmin.info.pl. Pierwotnie zamysł był taki, aby użyć jej do pracy inżynierskiej i tak też się stało. Trzy miesiące później znów nadarzyła się okazja, której nie mogłem przegapić. Tym razem wirtualna maszyna na OpenVZ za śmieszne wręcz pieniądze. Zainteresowanych odsyłam do
https://mikr.us
. Po kliknięciu w link dostaniesz 5% zniżki na serwer na rok.
Tym sposobem stało się możliwe posiadanie wersji live własnej strony, której konfigurację opiszę poniżej krok po kroku. Przy okazji pokażę jak to można wszystko dobrze zabezpieczyć i udowodnić, że domyślna konfiguracja 128 MB RAM i 128 MB swap w zupełności wystarcza, aby posiadać stronę opartą o a jakże popularny CMS WordPress, który jest najczęściej atakowanym CMS-em na świecie. Ale o tym może w innym wpisie. Hardening Linux był tematem mojej pracy inżynierskiej, więc przy okazji podzielę się paroma uwagami związanymi z tą tematyką, jak i też pokażę, co na mikrusie można, a czego nie można.
Poprosiłem o zmianę domyślnego Ubuntu 16:04 na CentOS 7 i dostałem wersję 7.6. No bomba, to mi się podoba. Po małych problemach udało mi się w końcu przywrócić moją stronę do żywych i przy okazji odświeżyć sobie wiedzę z zakresu stawiania serwera web na CentOS. A więc zaczynamy.
Założenie konta na cloudflare.com i ustawienie domeny
Potwierdź maila i przejdź do konfiguracji domeny tam, gdzie masz panel od domeny. Zmień tam serwery DNS (ns1 oraz ns2) na:
aragorn.ns.cloudflare.com
vida.ns.cloudflare.com
Zaloguj się do cloudflare. Dodaj domenę (add domain).
Ustaw rekord AAAA , jako name nazwę domeny i jako adres IPv6 adres w wersji IPv6. Znajdziesz ten adres wpisując w terminalu polecenie:
1
sudo ip a
Będzie on podany w tej postaci: 2001: ….
Skopiuj go sobie, albo spisz bez ostatnich elementów: /128
Wklej go w pole content. Zapisz zmianę.
Kliknij w ikonę SSL/TLS i ustaw jak na obrazku poniżej:
Cloudflare Web Performance and Security
Kliknij w Edge Certificates i ustaw:
Cloudflare Edge Certificates
Poniżej będą opcje, które powinny być włączone:
Cloudflare Settings
Cloudflare Settings
Następnie kliknij w Page rules i dodaj regułę klikając w Create Page Rule.
Nazwę domeny na np.
http://strona.com.pl
(pamiętaj o http nie https).
Wybierz Automatic HTTPS rewrites z rozwijanej listy i ustaw na ON.
Kliknij save and deploy.
W razie pytań o inne ustawienia, napisz w komentarzu, co Ciebie nurtuje.
Logowanie ssh oraz jego zabezpieczenie.
Dostęp do wirtualnej maszyny jest możliwy tylko i wyłącznie po ssh.
W pierwszej kolejności należy dla bezpieczeństwa zmienić hasło root, ponieważ dostajemy tymczasowe hasło do logowania, adres serwera i możemy użyć do pierwszego logowania tylko i wyłącznie konta root, co samo w sobie bezpieczne nie jest.
1
passwd root
Po ustawieniu hasła, musimy dodać sobie użytkownika, którego będziemy używać do logowania się po ssh i w zastępstwie za root, ze względów bezpieczeństwa, Aby jednak móc w razie potrzeby wykonać czasem polecenia na prawach roota, dodamy użytkownika do grupy sudoers.
1
2
3
4
useradd user
passwd user
usermod -aG wheel user
systemctl daemon reload
W następnej kolejności należy zablokować użytkownika root dla połączeń ssh. W tym celu trzeba edytować plik sshd_config.
1
vi /etc/ssh/sshd_config
Znajdujemy wpis i ustawiamy go w ten sposób: PermitRootLogin no Aby móc edytować , wciskamy insert, zmieniamy wartość z yes na no. W następnej kolejności wciskamy Esc, wpisujemy :wq i naciskamy Enter. W ten sposób zapisaliśmy zmiany. Teraz pozostaje jeszcze restart demona ssh.
1
systemctl restart sshd
Zakładam, że każdy wie, jak się łączyć do serwera przy pomocy terminala czy putty. Poniżej opiszę dwie metody generowania pary kluczy (prywatnego i publicznego) zarówno w putty, jak i w terminalu. Otwórz PuTTYgen.exe, naciśnij przycisk Generate, porusz myszą, w celu wygenerowania losowo pary kluczy z wykorzystaniem algorytmu RSA. Po wygenerowaniu kluczy wpisz hasło (passphrase) (wybierz „trudne do odgadnięcia”). Zapisz klucz publiczny. Zapisz klucz prywatny. 2048 bitów w zupełności wystarczy, lecz jeśli ktoś chce zwiększyć poziom bezpieczeństwa, może ustawić 4096 bitów w oknie.
PuTTYgen
Następnie po zalogowaniu się przy pomocy ssh i swojego konta użytkownika, w naszym przypadku będzie to user, wykonaj poniższe polecenia.
1
2
3
4
5
cd /home/user
sudo mkdir .ssh
sudo chmod 700 .ssh
cd .ssh
sudo vi authorized_keys
Kopiujemy z pola od ssh-rsa do końca wszystko, przechodzimy do zalogowanej sesji, wciskamy insert, wklejamy prawym myszki całość, następnie wciskamy Esc, wpisujemy :wq i naciskamy Enter. Potem ustawiamy plik tylko do odczytu poleceniem:
1
sudo chmod 600 authorized_keys
W następnej kolejności edytjemy plik /etc/ssh/sshd_config, jak wyżej. Zmieniamy wartości na: RSAAuthentication yes oraz PubkeyAuthentication yes, a także PermitEmptyPasswords no oraz PasswordAuthentication no. Zapisujemy plik analogicznie, jak wyżej to opisałem. (zakładam, że używanie vi już zostało zrozumiane). Restartujemy ssh poleceniem:
1
sudo systemctl restart sshd
W połączeniu w putty lub w terminalu musimy wskazać plik klucza prywatnego do autoryzacji. Lub w przypadku putty kliknąć dwa razy na plik prywatny, podać hasło i program pageant.exe powinien załadować klucz prywatny do pamięci. Jeśli nie mamy pageant, to serwer zapyta nas o hasło do klucza prywatnego (passphrase), który został ustawiony po wygenerowaniu klucza (to zwiększa poziom bezpieczeństwa, ponieważ nawet w sytuacji, gdy ktoś zdoła przechwycić klucz, nie zna do niego hasła).
W przypadku, gdy korzystasz z terminala, generujesz na swoim komputerze klucz z poziomu terminala poleceniem:
1
ssh-keygen -t rsa -b 4096 -C "twojanazwa@mikr.us"
Następnie kopiujesz klucz do serwera poleceniem:
1
ssh-copy-id root@nazwa.mikr.us -p 12345
Numer portu 12345 zmieniasz na ten, który dostałeś w mailu, a nazwę analogicznie, jak numer portu. Powyżej opisałem, jak zablokować dostęp do ssh dla użytkownika root. Teraz wystarczy tylko zrestartować demona ssh.
1
systemctl restart sshd
Rozłączyć się poleceniem
1
exit
i połączyć ponownie za pomocą
1
ssh root@root@nazwa.mikr.us -p 12345
Zwiększenie poziomu zabezpieczeń można jeszcze uzyskać poprzez dodanie grupy do logowania ssh i dodanie do tej grupy użytkownika.
1
2
3
sudo groupadd grupassh
sudo gpasswd -a <user> grupassh
groups user
Wyświetli się: user : user sudo grupassh lub user : user wheel grupassh
1
sudo vi /etc/ssh/sshd_config
Dodaj:
1
AllowGroupsgrupassh
1
sudo systemctl restart sshd
Dla bezpieczeństwa użytkowników Ubuntu/Debian polecam zainstalować policies.
1
sudo apt-get install libpam-cracklib
Określają one długość hasła, ile razu użytkownik może się zalogować, ile razy można używać tych samych znaków w haśle, określa kompleksowość hasła, jego siłę, liczbę cyfr, małych, dużych liter oraz znaków specjalnych.
Instalacja serwera web/www z użyciem Apache
W pierwszej kolejności wyczyść managera pobierania. W CentOS używany jest yum, natomiast w Debian/Ubuntu apt-get a w nowszych distro apt.
CentOS section
1
sudo yum clean all
Debian section
1
sudo apt-get autoremove && sudo apt-get clean
Zainstaluj wszystkie aktualizacje:
CentOS section
1
sudo yum -y update
Debian section
1
sudo apt-get update && sudo apt-get upgrade
W następnej kolejności zainstaluj Apache (httpd w CentOS, apache2 w Debian/Ubuntu)
CentOS section
1
sudo yum -y install httpd
Debian section
1
sudo apt-get install apache2
Włącz Apache2 przy starcie systemui uruchom usługę.
Co spowoduje stworzenie dowiązania symbolicznego w katalogu /etc/apache2/sites-enabled.
Tworzenie fizycznej struktury i wgranie WordPress na serwer.
Teraz należy stworzyć katalog dla strony w katalogu /var/www/html
1
sudo -i
(wpisz hasło użytkownika, którego utworzyłeś na samym początku)
1
2
cd /var/www/html
sudo mkdir strona.com.pl
Utwórz katalog o nazwie src w katalogu swojej witryny, aby przechowywać nowe kopie plików źródłowych WordPress. W tym przewodniku jako przykład wykorzystano katalog domowy /var/www/html/strona.com.pl/. Przejdź do tego nowego katalogu:
1
2
sudo mkdir -p /var/www/html/strona.com.pl/src/
cd /var/www/html/strona.com.pl/src/
Ustaw użytkownika serwera WWW, www-data, jako właściciela katalogu domowego swojej witryny. www-data jest grupą. W przypadku CentOS będzie to grupa apache.
Zainstaluj najnowszą wersję WordPress i wypakuj ją używając odpowiedniej nazwy w zależności od używanego systemu:
1
2
3
sudo wget http://wordpress.org/latest.tar.gz
sudo -u www-data tar -xvf latest.tar.gz
sudo -u apache tar -xvf latest.tar.gz
Zmień nazwę pliku latest.tar.gz na wordpress, a następnie ustaw datę przechowywania kopii zapasowej oryginalnych plików źródłowych. Będzie to przydatne, jeśli zainstalujesz nowe wersje w przyszłości i będzie potrzeba powrócić do poprzedniej wersji:
Przejdź do katalogu, do którego wyodrębniono WordPress, skopiuj przykładową konfigurację i ustaw ją tak, aby korzystała ze zdalnej bazy danych:
1
2
cd /var/www/html/strona.com.pl/public_html
sudo cp wp-config-sample.php wp-config.php
Zmień zmienne logowania tak, aby pasowały do bazy danych i użytkownika. Edytuj plik:
1
sudo vi /var/www/html/strona.com.pl/public_html/wp-config.php
1
2
3
4
5
6
7
8
9
10
11
/** The name of the database for WordPress */define('DB_NAME','wordpress');
/** MySQL database username */define('DB_USER','user');
/** MySQL database password */define('DB_PASSWORD','haslo_użytkownika_bazy_danych');
/** MySQL hostname */define('DB_HOST','localhost');
Dodaj klucze bezpieczeństwa, aby zabezpieczyć wp-admin.
Użyj Generatora kluczy bezpieczeństwa WordPress, aby utworzyć losowe, skomplikowane hashe, których WordPress użyje do zaszyfrowania danych logowania. Skopiuj wynik i zastąp odpowiednią sekcję w pliku wp-config.php:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**#@+ * AuthenticationUniqueKeysandSalts.
*
* Changethesetodifferentuniquephrases! * Youcangeneratetheseusingthe {@linkhttps://api.wordpress.org/secret-key/1.1/salt/WordPress.orgsecret-keyservice}
* Youcanchangetheseatanypointintimetoinvalidateallexistingcookies. Thiswillforcealluserstohavetologinagain.
*
* @since2.6.0 */
define('AUTH_KEY','put your unique phrase here');
define('SECURE_AUTH_KEY','put your unique phrase here');
define('LOGGED_IN_KEY','put your unique phrase here');
define('NONCE_KEY','put your unique phrase here');
define('AUTH_SALT','put your unique phrase here');
define('SECURE_AUTH_SALT','put your unique phrase here');
define('LOGGED_IN_SALT','put your unique phrase here');
define('NONCE_SALT','put your unique phrase here');
/**#@-*/
Instalacja i konfiguracja Maria DB 10.4 w CentOS 7.6.
1
2
3
4
5
6
7
sudo tee /etc/yum.repos.d/MariaDB.repo<<EOF
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF
Podczas konfiguracji potwierdź y puste hasło root w MariaDB, a w następnym kroku ustaw hasło roota (tego od MariaDB). To hasło powinno być inne, niż hasło roota, które dostałeś w mailu po założeniu serwera na mikr.us.
Po zalogowaniu się do bazy danych utwórz bazę danych i przypisz ją do użytkownika.
1
2
3
4
5
CREATE DATABASE wordpress;CREATE USER 'user'@'localhost' IDENTIFIED BY 'haslo_użytkownika_bazy_danych';GRANT ALL PRIVILEGES ON wordpress.* TO 'user'@'localhost';FLUSH PRIVILEGES;exit
1
mysql -u user -p
Wpisz hasło użytkownika user, którego właśnie stworzyłeś
1
status;
Jeśli wyświetli się wersja MariaDB, to znaczy, że wszystko działa.
1
exit
Zrestartuj serwer baz danych oraz web poleceniami:
Instalacja i konfiguracja Maria DB 10.3 w Ubuntu 16.04 LTS
Aby zainstalować MariaDB 10.3 na Ubuntu 16.04, musisz dodać repozytorium MariaDB do systemu. Uruchom następujące polecenia, aby zaimportować klucz PGP repozytorium MariaDB i dodać repozytorium.
Zostaniesz poproszony o podanie hasła roota MariaDB. Musisz podać je dwukrotnie. Zatwierdź zmianę hasła. Możesz potwierdzić zainstalowaną wersję MariaDB, logując się jako użytkownik root.
1
mysql -u root -p
Po zalogowaniu się wpisz status; (pamiętaj o średnikach w składni SQL). Następnie wpisz exit.
Zalecam przeprowadzenie dokładnie tej samej procedury, co w przypadku instalacji na CentOS. Powyżej widać, jakie kroki po kolei muszą zostać podjęte.
Z rozwijanej listy Software wybieramy Apache, system operacyjny, to albo Ubuntu 16.04, albo Debian 9, albo CentOS/RHEL 7 i postępujemy zgodnie ze wskazówkami.
Wybierz stronę bez www, lub z www, jak tobie pasuje, ponieważ certbot nam rozpozna wirtualny host dla http, który utworzony został wcześniej.
Nie włączaj przekierowania z http na https, ponieważ to zrobisz po stronie Cloudflare. Inaczej napotkasz błąd. Dlatego wybierz 1 , gdy zapyta o redirect.
Certbot zainstaluje automatycznie certyfikat, utworzy plik wirtualnego hosta. Teraz tylko trzeba wejść do katalogu:
1
2
3
4
sudo -i
cd /etc/apache2/sites-available
ls -al
a2ensite strona.com.pl-le-ssl.conf
Polecam zmodyfikować plik wirtualnego hosta dla https, aby ostatecznie wyglądał tak:
CentOS section
1
sudo vi /etc/httpd/conf.d/strona.com.pl-le-ssl.conf
Debian section
1
sudo vi /etc/apache2/sites-available/strona.com.pl-le-ssl.conf
W przypadku Ubuntu 16.04 lokalizacja pliku jest nieco inna.
1
sudo vi /etc/mysql/my.cnf
Wystarczy wkleić w ten plik to, co jest w sekcji [mysqld] powyżej. Aczkolwiek zalecam włączenie logowania błędów do mariadb i ustawić w my.cnf logowanie błędów, jak poniżej jest to widoczne.
1
2
3
4
5
sudo -i
cd /var/log/
mkdir mariadb
cd mariadb
touch error.log
Zapisać zmiany, zrestartować apache2 oraz mariadb
1
sudo systemctl restart mariadb apache2
Instalacja PHP 7.3
CentOS 7.6 section
Założenie jest takie, że istnieje użytkownik dodany do grupy wheel (sudoers) na samym początku tutoriala. Po sudo -i podaje się hasło użytkownika, nie roota.