Ubuntu 18.04.1 -palvelimen käyttöönotto: UFW, Fail2ban, Apache, PHP7.2-FPM, MariaDB

Johdanto

Tämä on päivitetty dokumentaatio uuden Ubuntu 18.04.1 -palvelimen käyttöönotosta. Käytetyt ohjelmistokomponentit:

  • Xubuntu 18.04.1 64-bit
  • Apache 2.4.18
  • PHP7.2-FPM
  • MariaDB 10.3.10

 

Kyseessä on fyysinen palvelin, jonka asensin vanhan Windows 7 -tietokoneen päälle. Sama dokumentaatio pätee kuitenkin myös vuokrattuihin virtuaalipalvelimiin (VPS). Niissä toki käyttöjärjestelmä tulee valmiiksi asennettuna.


Käyttöjärjestelmän asennus

Käyttöjärjestelmän levykuva ladataan kehittäjän sivuilta. Itse käytin Xubuntu 18.04.1 LTS 64-bit: https://xubuntu.org/download/. Mirroriksi valitsin Ruotsin ja latasin ISO:n.

xubuntu-18.04.1-desktop-amd64.iso

Tein bootattavan USB-tikun Yumi Multibootilla: https://www.pendrivelinux.com/yumi-multiboot-usb-creator/.

Siinä, missä Rufus ja muut ohjelmat ovat olleet satunnaisesti ongelmallisia, Yumi ei ole vielä pettänyt kertaakaan. Sillä on myös helppo laittaa useampi linux-distribuutio samalle tikulle.

  1. Valitsin USB-tikun.
  2. Valitsin haluamani Linux-distribuution. Tällä valinnalla on merkitystä siihen, mitä ISO-kuvia kolmannessa vaiheessa löydetään resurssienhallinnasta.
  3. Valitsin sen Xubuntun ISO:n, jonka latasin kehittäjän sivuilta.

Yumi alkoi järjestelemään tiedostoja tikulle. Kun tikku oli valmis, laitoin sen siihen tietokoneeseen, johon olin sitä asentamassa. Käynnistin koneen boot-menuun (näppäin riippuu valmistajasta) ja valitsin bootattavaksi laitteeksi sen USB-tikun. Aukesi Yumi Multibootin valikko, josta käynnistin haluamalleni levykuvalle.

Kun kysyttiin, haluanko asentaa Xubuntun, vai kokeilla sitä, valitsin kokeilun ilman asennusta. Päästyäni Xubuntun työpöydälle, käynnistin asennusvaiheen sieltä.

  • Language: english
  • Keyboard layout: Finnish
  • Yhdistin langattomaan verkkoon
  • Valitsin “Download updates while installing Ubuntu”. Jätin kolmannen osapuolten ohjelmistot asentamatta.
  • Asennusvaihtoehdoista valitsin “Erase disk and install Ubuntu”. Teen asennusta vanhalle Windows-koneelle, joten aloitan tyhjältä pöydältä poistamalla kaikki osiot levyltä.
  • Painoin “Install Now”. Aukesi varoitus levyn tyhjentämisestä. Painoin “Continue”.
  • Valitsin aikavyöhykkeeksi “Helsinki”.
  • Tein Xubuntuun käyttäjän nimeltä “markus” ja annoin koneelle nimeksi “proto-palvelin”. Suojasin käyttäjän vahvalla salasanalla.
  • Käyttöjärjestelmä asentui koneelle, jonka jälkeen boottasin suoraan koneen kiintolevylle USB-tikun sijaan.

Järjestelmän päivittäminen

Heti ensimmäisenä ajoin seuraavat komennot terminaalissa:

sudo apt-get update
sudo apt-get upgrade

Update päivittää debianin apt-pakettivarastot. Se ajetaan aina ennen, kuin ollaan asentamassa uusia ohjelmia, jotta asennettu ohjelmistoversio on varmasti uusin.

Upgrade päivittää kaikki järjestelmään jo asennetut paketit (tekee sen paketinhallinnan kautta, eli aina ajetaan ensin update, jotta uusimmat versiot ovat saatavilla).


(Vaihtoehtoinen): Uuden käyttäjän lisääminen

Koska tein asennusta fyysiselle palvelimelle, loin jo sen yhteydessä itselleni tunnukset.

Vuokrattujen virtuaalipalvelimien kohdalla tulee kuitenkin muistaa tehdä oma ylläpito-käyttäjä, eikä käyttää palveluntarjoajan antamia root-tunnuksia muuten, kuin tätä kohtaa varten.

Lisäisin uuden unix-käyttäjän, jonka sitten lisään sudo ja adm ryhmiin:

$ sudo adduser testuser
$ sudo adduser testuser sudo
$ sudo adduser testuser adm

Käyttäjälle kirjautuminen ja sudo-oikeuksien toimiminen tulee testata ennen seuraavaa vaihetta.


Root-käyttäjälle kirjatumisen estäminen ja käyttäjän sulkeminen

Tietoturvasyistä estin kirjautumisen root-tunnuksin. Hyökkääjien botit yrittävät automaattisesti sisään root-tunnuksia ja muita yleisiä hallintatunnuksia käyttäen.

Root-käyttäjätunnuksilla kirjautuminen estetty sudo usermod –lock root -komennolla. Lisäksi muokkasin sshd_config-konfiguraatiotiedostoa, josta allaolevan esimerkin mukaisesti:

sudo usermod --lock root
sudoedit /etc/ssh/sshd_config

Kyseinen konfiguraatiotiedosto löytyy vain, jos ssh on asennettuna (sudo apt-get install openssh-server openssh-client).

sshd_configiin:

# Authentication:
LoginGraceTime 120
PermitRootLogin no          
StrictModes yes

Käynnistin SSH:n uudelleen:

sudo service sshd restart

UFW: Palomuurin konfigurointi

Linux-kernelin palomuuriohjelma on Netfilter, jonka kanssa käytetään Iptools-käyttöliittymää. Se on kuitenkin mielestäni aika kankea ja turhan sekava. Siksi olen aina käyttänyt UFW-frontendiä palomuurisääntöjen hallinnoimiseen.

UFW tulee Xubuntussa asennettuna out-of-the-box. Avasin ensiksi reiät palomuurin tarvitsemilleni porteille 22 (ssh) ja 80 (http).

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp

Laitoin palomuurin päälle vasta, kun säännöt tarvittaville porteille oli tehty. Tämä on hyvä käytäntö, koska pilvessä olevia virtuaalipalvelimia hallinnoitaessa on oleellista, ettei vahingossa sulje itseään SSH-yhteydestä.

Palomuuri päälle:

sudo ufw enable

Palomuurisääntöjen tarkistus komennolla:

sudo ufw status verbose

Fail2ban: luvattomien kirjautumisyritysten estäminen

Fail2ban on ohjelma, joka suojaa palvelinta mm. bruteforce-hyökkäyksiltä rajoittamalla kirjautumisyrityksiä ja jakelemalla banneja, jos sallittujen yritysten määrä ylittyy. Se voidaan konfiguroida useille eri demoneille, mutta itse konfiguroin sen tässä ainoastaan SSH-liikenteen valvomiseen.

Fail2ban seuraa tietyn demonin lokitiedostoja ja toimii määritellysti niistä luettujen merkintöjen pohjalta. Bannaus tapahtuu estämällä palomuurista kyseisen IP-osoitteen liikenne Fail2banin konfiguraatiossa määritellyksi ajaksi.

Olen jo aiemmin dokumentoinut sen asennuksen Ubuntulle vähän tarkemmin: https://markuspyharanta.com/2018/07/16/fail2ban-asennus-ja-konfigurointi-ubuntu-server-16-04/

Asensin ohjelman paketinhallinnasta:

sudo apt-get install fail2ban

Siirryin hakemistoon /etc/fail2ban/, jossa on jo oletuksena tiedosto jail.conf. En kuitenkaan tehnyt muutoksia siihen, vaan loin uuden tiedoston nimellä jail.local. Fail2ban lukee ensisijaisesti .local-tiedostoa ja hakee sitten muut asetukset oletustiedostosta jail.conf.

cd /etc/fail2ban/
sudo nano jail.local

Tiedoston sisälle tein säännöt SSH-demonille.

[sshd]
enabled  = true
ignoreip = 127.0.0.1
banaction = ufw
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 3
bantime = 600
findtime = 600

Käynnistin fail2ban:in uudelleen, jotta muutokset tulevat voimaan. Sen jälkeen varmistin, että se pyörii taustalla:

sudo service fail2ban restart
sudo service fail2ban status

Apachen asennus ja konfigurointi

Asensin Apache-webpalvelinohjelmiston paketinhallinnasta:

sudo apt-get install apache2

Asennettu versio:

apache2 -v

Server version: Apache/2.4.29 (Ubuntu)
Server built: 2018-06-27T17:05:04

Oletuksena Apache ei salli sivujen hostaamista käyttäjän kotihakemistosta, joten sallin sen ottamalla userdir-modulin käyttöön:

sudo a2enmod userdir

Muutoksen jälkeen käynnistin Apachen uudelleen:

sudo service apache2 restart

Tein käyttäjäni kotihakemistoon public_html -kansion, josta hostaan sivuja:

cd
mkdir public_html

Seuraavaksi tein sivustoni konfiguraation. Menin hakemistosijaintiin /etc/apache2/sites-available/ ja tein kopion Apachen oletuskonfiguraatiotiedostosta:

cd /etc/apache2/sites-available/
sudo cp 000-default.conf markus.conf

Muokkasin markus.conf-tiedoston seuraavanlaiseksi sudoeditillä:

sudoedit markus.conf

Sisältö:

<VirtualHost *:80>

        ServerAdmin webmaster@localhost
        DocumentRoot /home/markus/public_html/

        <Directory /home/markus/public_html/>
                AllowOverride All
                Require all granted
                Options -Indexes
        </Directory>

        #<FilesMatch \.php$>
        #SetHandler "proxy:unix:/var/run/php/php7.2-fpm-markus.sock|fcgi://localhost/"
        #</FilesMatch>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

<Directory> hallinnoi pääsynvalvontaa sivuston tiedostoihin. AllowOverride All sallii .htaccess -tiedostojen käytön kaikissa kansioissa. Require all granted sallii yhteydet hakemiston tiedostoihin kaikista osoitteista. Apachessa on oletuksena päällä Indexes-asetus, joka mahdollistaa kansion tiedostojen selaamisen nettiselaimessa, ellei sieltä löydy esimerkiksi index.php tiedostoa. Otin sen pois rivillä Options -Indexes.

Huomaa, että <FilesMatch> osuus konfiguraatiosta on myöhempää vaihetta varten ja on siksi kommentoitu vielä tässä vaiheessa risuaidoilla pois.

Tallensin konfiguraation, otin vanhan oletussivuston pois käytöstä ja laitoin uuden konfiguraation käyttöön:

sudo a2dissite 000-default.conf
sudo a2ensite markus.conf

Muutoksen jälkeen latasin uuden konfiguraation ja käynnistin Apachen uudelleen:

sudo service apache2 reload
sudo service apache2 restart

PHP7.2-FPM asennus ja konfigurointi

Asensin ensin PHP7.2-paketin ja testasin sen toimivuuden ennen FPM:ään siirtymistä:

sudo apt-get install php7.2 libapache2-mod-php7.2 php7.2-mysql

Sitten muokkasin tiedostoa /etc/apache2/mods-available/php7.2.conf.

sudoedit /etc/apache2/mods-available/php7.2.conf

Kommentoin sieltä ulos <IfModule>-rivit.

#<IfModule mod_userdir.c>
#   <Directory /home/*/public_html>
#       php_admin_flag engine Off
#    </Directory>
#</IfModule>

Käynnistin Apachen uudelleen.

sudo service apache2 restart

Sitten tein public_html -kansioon tiedoston nimeltä info.php, jonka sisään laitoin:

<?php
phpinfo();
?>

Navigoin selaimella osoitteeseen localhost/info.php. Koska PHP-konfiguraatiosivusto näkyi, PHP toimi.

Seuraavaksi lähdin konfiguroimaan PHP-FPM:ää. Asensin ensin tarvittavan paketin:

sudo apt-get install php7.2-fpm

Otin tarvittavat Apache-modulit käyttöön, jotta FPM toimi:

sudo a2enmod proxy_fcgi
sudo service apache2 restart

Menin hakemistoon /etc/php/7.2/fpm/pool.d/ ja loin sinne uuden konfiguraation nimeltä markus.conf.

sudo nano markus.conf

Sisälle:

[markus]
user = markus
group = markus
listen = /var/run/php/php7.2-fpm-markus.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Lisäksi tarkistin, että tiedostossa /etc/php/7.2/fpm/php-fpm.conf on lopussa seuraava rivi kommentoimatta:

include=/etc/php/7.2/fpm/pool.d/*.conf

Käynnistin php-fpm uudelleen:

sudo service php7.2-fpm restart

Nyt poolin pitäisi olla käynnissä:

sudo service php7.2-fpm status
● php7.2-fpm.service - The PHP 7.2 FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php7.2-fpm.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2018-09-26 15:14:18 UTC; 21h ago
Process: 1469 ExecStartPre=/usr/lib/php/php7.2-fpm-checkconf (code=exited, status=0/SUCCESS)
Main PID: 1605 (php-fpm7.2)
Status: "Processes active: 0, idle: 8, Requests: 516, slow: 0, Traffic: 0req/sec"
Tasks: 9
Memory: 144.1M
CPU: 23.259s
CGroup: /system.slice/php7.2-fpm.service
├─1605 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf)
├─1616 php-fpm: pool markus
├─1617 php-fpm: pool markus
├─1618 php-fpm: pool www
├─1620 php-fpm: pool www

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
markus@markuspyharanta:/etc/php/7.0/fpm/pool.d$

Info.php sivulla ei kuitenkaan vielä näy Server API:na FPM, vaan se on yhä Apache 2.0 Handler.

Vielä piti muokata Apachen konfiguraatiota:

sudoedit /etc/apache2/sites-available/markus.conf

Otetaan nyt kommentoinnit pois riveistä:

<FilesMatch \.php$> 
SetHandler "proxy:unix:/var/run/php/php7.2-fpm-markus.sock|fcgi://localhost/"
</FilesMatch>

Käynnistetään Apache2 uudelleen:

sudo service apache2 restart

Nyt info.php sivu näyttää Server API:ksi FPM/FastCGI. Lisäksi Environment-osio näyttää käyttäjäksi “markus ja kotihakemistoksi “/home/markus/.


MariaDB asennus ja konfigurointi

Ennen käytin aina MySQL-tietokantaa Ubuntu-pohjaisilla palvelimilla. 18.04-version jälkeen MySQL on kuitenkin toiminut ja asentunut huonosti. Esimerkiksi uusimman Raspbianin kanssa MySQL-pakettien asennus asensi automaattisesti MariaDB:n.

Asensin tarvittavat MariaDB-paketit pakentinhallinnasta:

sudo apt-get install mariadb-client mariadb-server

Ubuntu 16.04-palvelimilla MySQL:n pakettien asennuksen yhteydessä asetettiin salasana tietokannan root-käyttäjälle. Nykyään se tehdään vasta, kun paketit ovat asentuneet.

sudo mysql_secure_installation
Set root password? [Y/n] y
New password: password
Re-enter new password: password
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y

Tietokantaan kirjauduin root-tunnuksilla:

sudo mariadb -u root

Tein testitietokannan ja annoin käyttäjälle oikeudet siihen:

MariaDB [(none)]> CREATE DATABASE test;
MariaDB [(none)]> SHOW DATABASES;
MariaDB [(none)]> GRANT ALL ON test.* TO testuser@localhost IDENTIFIED BY 'password';
MariaDB [(none)]> exit

Sitten kokeilin kirjautua kyseisellä käyttäjällä sisään:

markus@proto-palvelin:~$ sudo mariadb -u testuser -p
Enter password:
MariaDB [(none)]>

Testasin oikeuksiani poistamalla tietokannan:

MariaDB [(none)]> DROP DATABASE test;
MariaDB [(none)]> exit

Testikäyttäjääkään en enää tarvinnut, joten poistin sen:

markus@proto-palvelin:~$ sudo mariadb -u root
MariaDB [(none)]> SHOW DATABASES;
MariaDB [(none)]> USE mysql;
MariaDB [(none)]> DESCRIBE user;
MariaDB [(none)]> SELECT User FROM user;
MariaDB [(none)]> DROP USER testuser@localhost;
MariaDB [(none)]> exit

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top