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.
- Valitsin USB-tikun.
- Valitsin haluamani Linux-distribuution. Tällä valinnalla on merkitystä siihen, mitä ISO-kuvia kolmannessa vaiheessa löydetään resurssienhallinnasta.
- 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