Ebben az útmutatóban sorra vesszük az Ubuntu 18.04 LTS (Bionic Beaver) szolgáltatásainak üzembe helyezéséhez szükséges lépéseket, majd telepítjük az ISPConfigot, végül pedig elvégezzük a szerver biztonságossá tételét (hardening).

MEGJEGYZÉS

Az ISPConfig telepíthető többszerveres konfigurációban is, mi ebben az útmutatóban csak a főszerver (master) telepítését ismertetjük. Az ISPConfig telepítése ki is hagyható, ha nincs szükség webes kezelőfelületre a szerver és annak felhasználóinak adminisztrálásához (például egyfelhasználós környezetben, ha nem kell több webhelyet adminisztrálni). Ebben az esetben a megjegyzéseket követve néhány opcionális lépést ki lehet hagyni, végeredményül azonban továbbra is egy biztonságos szerverkörnyezet áll majd a rendelkezésünkre, amely éles üzemben is használható.

Az eredeti, angol nyelvű útmutató itt található: https://www.howtoforge.com/tutorial/perfect-server-ubuntu-18.04-with-apache-php-myqsl-pureftpd-bind-postfix-doveot-and-ispconfig/

Az alábbi, magyar nyelvű útmutató az következő plusz információt nyújtja az eredetihez képest:

  • helyenként részletesebb magyarázatok
  • az ext4 mellett az xfs fájlrendszer támogatása a kvóták beállításánál
  • a pontos idő rendszeres szinkronizálása ntpdate segítségével
  • jelszóval védett phpmyadmin
  • e-mailes értesítés minden SSH-bejelentkezés és -kijelentkezés esetén
  • mod_evasive Apache-modul a szigorúbb webes védelem és a DDoS-támadások megelőzése érdekében
  • fail2ban-szabályok az Apache és a roundcube védelméhez

Előfeltételek

Az útmutatóban szereplő lépések feltételezik egy már telepített Ubuntu 18.04 LTS szerver meglétét, amelyhez a felhasználó root jogosultsággal rendelkezik. Ez VPS-szerverek esetén általában automatikusan megtörténik a VPS létrehozásakor, saját környezetben viszont egy telepítési adathordozóról kell először telepíteni az operációs rendszert. Ez az útmutató ezekkel a lépésekkel nem foglalkozik, csak a már müködő rendszer konfigurálásával. Ugyanígy nem tér ki arra sem, hogyan lehet bejelentkezni a frissen telepített rendszerre SSH-n keresztül.

FIGYELEM!

A sikeres konfigurálás érdekében érdemes egy teljesen újonnan telepített rendszert használni, mivel egyéb esetben a korábbi beállítások ütközést okozhatnak az egyes lépések utasításainak végrehajtása során.

Az összes használt parancs root jogosultságot igényel, ezért a konzolra történő bejelentkezést vagy az SSH-kapcsolat létrejöttét követően elsőként érdemes kiadni az alábbi parancsot:

sudo -s

Az egyes fájlok szerkesztéséhez a nano szerkesztőt használjuk a példákban. Érdemes megismerkedni a használatával és a benne elérhető parancsokkal, mindenesetre kezdőknek segítségül jelezzük, hogy a módosítások mentéséhez és a fájlok bezáráshoz a CTRL + X billentyűkombinációt kell lenyomni, majd az Y billentyűt.

Az /etc/apt/sources.list tartalmának ellenőrzése és a források frissítése

Amennyiben a telepítés valamilyen fizikai adathordozóról történt, előfordulhat, hogy az még szerepel a telepítési források között. Ennek ellenőrzéséhez érdemes megnyitni az /etc/apt/sources.list fájlt:

nano /etc/apt/sources.list

majd meggyőződni annak tartalmáról:

## Note, this file is written by cloud-init on first boot of an instance
## modifications made here will not survive a re-bundle.
## if you wish to make changes you can:
## a.) add 'apt_preserve_sources_list: true' to /etc/cloud/cloud.cfg
## or do the same in user-data
## b.) add sources in /etc/apt/sources.list.d
## c.) make changes to template file /etc/cloud/templates/sources.list.tmpl

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://archive.ubuntu.com/ubuntu bionic main restricted
deb-src http://archive.ubuntu.com/ubuntu bionic main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://archive.ubuntu.com/ubuntu bionic-updates main restricted
deb-src http://archive.ubuntu.com/ubuntu bionic-updates main restricted

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://archive.ubuntu.com/ubuntu bionic universe
deb-src http://archive.ubuntu.com/ubuntu bionic universe
deb http://archive.ubuntu.com/ubuntu bionic-updates universe
deb-src http://archive.ubuntu.com/ubuntu bionic-updates universe

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://archive.ubuntu.com/ubuntu bionic multiverse
deb-src http://archive.ubuntu.com/ubuntu bionic multiverse
deb http://archive.ubuntu.com/ubuntu bionic-updates multiverse
deb-src http://archive.ubuntu.com/ubuntu bionic-updates multiverse

## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb http://archive.ubuntu.com/ubuntu bionic-backports main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu bionic-backports main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu bionic-security main restricted
deb-src http://security.ubuntu.com/ubuntu bionic-security main restricted
deb http://security.ubuntu.com/ubuntu bionic-security universe
deb-src http://security.ubuntu.com/ubuntu bionic-security universe
deb http://security.ubuntu.com/ubuntu bionic-security multiverse
deb-src http://security.ubuntu.com/ubuntu bionic-security multiverse

## Uncomment the following two lines to add software from Canonical's
## 'partner' repository.
## This software is not part of Ubuntu, but is offered by Canonical and the
## respective vendors as a service to Ubuntu users.
# deb http://archive.canonical.com/ubuntu bionic partner
# deb-src http://archive.canonical.com/ubuntu bionic partner

Ezt követően pedig jöhet a rendszer frissítése:

apt-get update
apt-get upgrade

Ha a frissítések között újabb kernelverziók is láthatók, akkor ezt követheti egy:

apt-get dist-upgrade
apt-get autoremove

majd pedig egy újraindítás:

reboot

Az alapértelmezett rendszerhéj beállítása

Az Ubuntu alapértelmezett rendszerhéja a dash, ám nekünk a bashre lesz szükségünk, ehhez pedig az alábbi parancsot kell kiadni:

dpkg-reconfigure dash
Use dash as the default system shell (/bin/sh)? <-- No

FIGYELEM!

Ennek a lépésnek az elmulasztása esetén az ISPConfig ugyan nem lesz telepíthető, de a rendszer ettől még használható lesz.

 

Az AppArmor letiltása

Az Ubuntu egyik beépített biztonsági szolgáltatása az AppArmor, ám általában inkább több problémát okoz, mint amennyit segítene a biztonság fokozása terén, ezért érdemes letiltani. Az általa biztosított biztonsági megoldásokat bőven pótoljuk majd a későbbiekben.

service apparmor stop
update-rc.d -f apparmor remove 
apt-get remove apparmor apparmor-utils

FIGYELEM!

Ennek a lépésnek az elmulasztása esetén az ISPConfig ugyan nem lesz telepíthető, de a rendszer ettől még használható lesz.

A rendszeróra szinkronizálása és naprakészen tartása (opcionális)

Minden rendszeren fontos, hogy pontos legyen a rendszeridő, ehhez pedig érdemes telepíteni az ntp nevű csomagot, illetve rendszeres időközönként szinkronizálni az egyik időkiszolgálóval.

apt-get -y install ntp ntpdate

Ezt követően szerkeszteni kell a crontabot, és be kell szúrni az alábbi sort.

nano /etc/crontab 

00 2 * * * root ntpdate time.kfki.hu

Ebben a példában minden nap hajnali 2-kor fut le a szinkronizálás a magyarországi time.kfki.hu szerverrel. Érdemes mindig egy közeli szervert kiválasztani a szinkronizáláshoz. Nemzetközi környezetben a pool.ntp.org használata javasolt.

A postfix, dovecot, mariaDB, rkhunter és binutils telepítése

A postfix telepítéséhez biztosnak kell lennünk abban, hogy nincs telepítve a sendmail:

service sendmail stop; update-rc.d -f sendmail remove

Ha nincs telepítve, az alábbi hibaüzenet jelenik meg:

Failed to stop sendmail.service: Unit sendmail.service not loaded.

Ekkor jöhet a többi csomag telepítése:

apt-get -y install postfix postfix-mysql postfix-doc mariadb-client mariadb-server openssl getmail4 rkhunter binutils dovecot-imapd dovecot-pop3d dovecot-mysql dovecot-sieve dovecot-lmtpd sudo
General type of mail configuration: <-- Internet Site
System mail name: <-- mail.sajatdomain.hu

A mail.sajatdomain.hu helyett egy olyan domainnevet kell megadni, amelyet éles rendszerek esetén aztán majd beállítunk a DNS-ben is. Soha ne olyan nevet adjunk itt meg, amely egyben weboldal címe is lesz, hanem egy technikai nevet, amelyet webes tartalom kiszolgálására biztosan nem használunk.

Ezt követően engedélyezzük a TLS és SASL működését:

nano /etc/postfix/master.cf

Ki kell szedni a megjegyzésből a submission és az smtp alábbi szakaszait, valamint be kell szúrni 1-1 sort is:

[...]
submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
[...]

Fontos, hogy a -o előtti szóközök nem hagyhatók le.

Most újraindíthatjuk a szolgáltatást:

service postfix restart

Majd beállítjuk, hogy a MariaDB a kívülről jövő kapcsolatokat is engedélyezze:

nano /etc/mysql/mariadb.conf.d/50-server.cnf

Ehhez megjegyzésbe (#) kell tenni a localhostra (127.0.0.1-re) vonatkozó alábbi sort:

[...]
# 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

[...]

Ezt követően jelszóval kell ellátnunk az adatbáziskiszolgáló root jogosultságú felhasználóját, letiltjuk az anonim felhasználókat, illetve a távoli bejelentkezést root jogosultságokkal:

mysql_secure_installation
Enter current password for root (enter for none): <-- Enter billentyű szöveg beírása nélkül
Set root password? [Y/n] <-- y
New password: <-- A MariaDB root jelszava
Re-enter new password: <-- A jelszó még egyzer
Remove anonymous users? [Y/n] <-- y
Disallow root login remotely? [Y/n] <-- y
Reload privilege tables now? [Y/n] <-- y

Beállítjuk a phpmyadmin használatához a megfelelő azonosítási módot:

echo "update mysql.user set plugin = 'mysql_native_password' where user='root';" | mysql -u root

Majd az előbb beállított jelszót megadjuk a rendszer karbantartási feladatai számára:

nano /etc/mysql/debian.cnf
# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host = localhost
user = root
password = a_root_felhasználó_jelszava
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = root
password = a_root_felhasználó_jelszava
socket = /var/run/mysqld/mysqld.sock
basedir = /usr

Végül pedig indítsuk újra a szolgáltatást a változtatások életbe léptetéséhez:

service mysql restart

Az amavisd-new, spamassassin és clamav telepítése

A vírusok és a kéretlen levelek kiszűréséhez telepítsük az alábbi csomagokat:

apt-get -y install amavisd-new spamassassin clamav clamav-daemon unzip bzip2 arj nomarch lzop cabextract apt-listchanges libnet-ldap-perl libauthen-sasl-perl clamav-docs daemon libio-string-perl libio-socket-ssl-perl libnet-ident-perl zip libnet-dns-perl libdbd-mysql-perl postgrey

Az ISPConfig használata esetén nincs szükség arra, hogy a spamassassin külön fusson:

service spamassassin stop
update-rc.d -f spamassassin remove

Indítsuk el a clamavot (ha egy hibaüzenet jelenik meg a parancs futtatásakor, azzal most nem kell foglalkoznunk):

freshclam
service clamav-daemon start

Az e-mailek DKIM-aláírásának biztosításához alkalmaznunk kell egy patchet:

cd /tmp
wget https://git.ispconfig.org/ispconfig/ispconfig3/raw/stable-3.1/helper_scripts/ubuntu-amavisd-new-2.11.patch
cd /usr/sbin
cp -pf amavisd-new amavisd-new_bak
patch < /tmp/ubuntu-amavisd-new-2.11.patch

Az apache, php, phpmyadmin, fcgi, suexec, pear és mcrypt telepítése

A weboldalak kiszolgálásához telepítsük az alábbi csomagokat:

apt-get -y install apache2 apache2-doc apache2-utils libapache2-mod-php php7.2 php7.2-common php7.2-gd php7.2-mysql php7.2-imap phpmyadmin php7.2-cli php7.2-cgi libapache2-mod-fcgid apache2-suexec-pristine php-pear mcrypt  imagemagick libruby libapache2-mod-python php7.2-curl php7.2-intl php7.2-pspell php7.2-recode php7.2-sqlite3 php7.2-tidy php7.2-xmlrpc php7.2-xsl memcached php-memcache php-imagick php-gettext php7.2-zip php7.2-mbstring php-soap php7.2-soap
Web server to reconfigure automatically: <-- apache2 
Configure database for phpmyadmin with dbconfig-common? <-- Yes
MySQL application password for phpmyadmin: <-- Enter billentyű lenyomása szöveg bevitele nélkül

Ezt követően engedélyezzük a szükséges modulokat:

a2enmod suexec rewrite ssl actions include cgi

Majd pedig bebiztosítjuk a kiszolgálót a HTTPOXY-támadásokkal szemben:

nano /etc/apache2/conf-available/httpoxy.conf

Ennek új tartalma ez lesz:

<IfModule mod_headers.c>
    RequestHeader unset Proxy early
</IfModule>

MEGJEGYZÉS

Ez egy viszonylag régi támadástípus, amelyet 2016 közepén fedeztek fel, és a legnagyobb veszélyt a CGI-környezetekben folytatott PHP-s kódfuttatásra jelenti, ám mivel LTS rendszert használunk, így érdemes duplán bebiztosítani magunkat. (További információ: https://httpoxy.org/.)

Majd engedélyezzük a szabályzatot:

a2enconf httpoxy

És ezt követően újraindítjuk a szolgáltatást:

service apache2 restart

A php-apcu telepítése (opcionális)

A PHP-oldalak kiszolgálásának gyorsításához telepítsük az alábbi csomagokat:

apt-get -y install php7.2-opcache php-apcu

Ezt követően újraindítjuk az apache2 szolgáltatást:

service apache2 restart

A php-fpm telepítése

A legtöbb PHP-oldal esetén érdemes a PHP-FPM-et választani, mivel ezt lehet a legjobban optimalizálni a teljesítmény szempontjából Ehhez a következő parancsokat kell futtatnunk:

apt-get -y install php7.2-fpm
a2enmod actions proxy_fcgi alias

MEGJEGYZÉS

A rendszer alapértelmezett verziója a 7.2-es, ami kissé elavultnak számít manapság, viszont mivel LTS rendszert használunk, ezen nem érdemes meglepődni. Amennyiben szeretnénk több verzió (pl.: 7.3, 7.4) futtatását is elérhetővé tenni a rendszeren, erre is lehetőségünk nyílik, de ennek módját egy másik bejegyzésben részletezzük.

Ezt követően újraindítjuk az apache2 szolgáltatást:

service apache2 restart

A hhvm telepítése (opcionális)

A Facebook által létrehozott HipHop Virtual Machine segít felgyorsítani a PHP-kódok futását. A telepítése a következő paranccsal történik:

apt-get -y install hhvm

A mod_evasive telepítése (opcionális)

A mod_evasive segít megakadályozni a szolgáltatásmegtagadásos támadásokat (DoS, DDoS) és a vég nélküli jelszókitalálásos próbálkozásokat, ugyanis korlátozza, hogy egy felhasználó egy adott időintervallumon belül hány oldalt kérhet le. Önmagában nem nyújt elegendő védelmet, azonban tökéletes kiegészítése a fail2ban működésének, mivel az főként csak a hitelesítésre összpontosít.

A telepítése a következő paranccsal történik:

apt-get -y install libapache2-mod-evasive

Ha esetleg rákérdez a telepítő bármire, akkor az alapértelmezett beállítást kell elfogadni. A következő paranccsal lehet ellenőrizni a sikeres telepítését:

apachectl -M | grep evasive

Erre egy ehhez hasonló választ kapunk:

 evasive20_module (shared)

Alapértelmezés szerint a konfiguráció nincs élesen üzembe helyezve, ezért most ezt kell módosítanunk:

nano /etc/apache2/mods-enabled/evasive.conf

Éles üzemben használt szervereken az alábbi értékek használata a javasolt:

<IfModule mod_evasive20.c>
    DOSHashTableSize    3097
    DOSPageCount        2
    DOSSiteCount        50
    DOSPageInterval     1
    DOSSiteInterval     1
    DOSBlockingPeriod   10

    DOSEmailNotify      root@mail.sajatdomain.hu
    DOSSystemCommand    "su - someuser -c '/sbin/... %s ...'"
    DOSLogDir           "/var/log/mod_evasive"
</IfModule>

MEGJEGYZÉS

Ebből a leggyakrabban finomhangolt érték a DOSPageCount, amely azt jelöli, hogy egy ügyfél IP-címéről másodpercenként hány oldallekérés érkezhet. Ezt érdemes lehet 30-ra növelni olyan oldalak esetén, amelyeknél programozott módon kell egy-egy oldalt lekérni, akár másodpercenként többször is. Az adott oldalnál az IPSConfig Apache Directives mezőjébe a következőt kell beírni:

# Increase the DOSPageCount to prevent 403 errors
    <IfModule mod_evasive20.c>
        DOSPageCount        30
    </IfModule>

Értelemszerűen a fenti példában lévő root@mail.sajatdomain.hu címet egy saját használatú e-mail-címre kell lecserélni. Ezt követően még létre kell hoznunk a naplózáshoz szükséges mappát, megfelelő jogosultságot kell adnunk annak, majd újra kell indítanunk az apache szolgáltatást:

mkdir /var/log/mod_evasive
chown -R www-data:www-data /var/log/mod_evasive
systemctl restart apache2

A phpmyadmin jelszavas védelme

Bármilyen hihetetlen is, de a phpmyadmin alapértelmezett konfigurációban csak egy olyan jelszavas mezőt tesz elérhetővé, amellyel magához a MySQL szolgáltatáshoz lehet csatlakozni. Ez nem túl biztonságos megoldás, hiszen bárki elkezdhet próbálkozni a jelszavakkal. Szerencsére nem kell túl sok erőfeszítést tennünk ahhoz, hogy az Apache segítségével egy olyan jelszavas bejelentkezést hozzunk létre még ezt megelőzően, amelynél a sikertelen próbálkozásokat már a fail2ban kezeli, így a megadott számú téves próbálkozás után le is tiltja a próbálkozó szellemű támadót.

Ehhez első körben módosítanunk kell az alábbi konfigurációs fájlt, és engedélyeznünk kell a beállítások .htaccess általi módosítását (AllowOverride All):

nano /etc/apache2/conf-available/phpmyadmin.conf
# phpMyAdmin default Apache configuration

Alias /phpmyadmin /usr/share/phpmyadmin

<Directory /usr/share/phpmyadmin>
    Options SymLinksIfOwnerMatch
    DirectoryIndex index.php
    AllowOverride All
[...]

Ezt követően létrehozzuk a bejelentkezést megkövetelő fájl:

nano /usr/share/phpmyadmin/.htaccess

És beleírjuk az alábbi tartalmat:

AuthType Basic
AuthName "Restricted Files"
AuthUserFile /etc/phpmyadmin/.htpasswd
Require valid-user

Majd létrehozunk egy phpmyadmin nevű felhasználót a belépéshez:

htpasswd -c /etc/phpmyadmin/.htpasswd phpmyadmin

Ha további felhasználókat szeretnénk hozzáadni ehhez a fájlhoz, akkor az alábbi parancsot kell használnunk:

htpasswd /etc/phpmyadmin/.htpasswd felhasznalonev

A felhasznalonev helyére az adott felhasználó nevét írjuk. Végül pedig indítsuk újra a szolgáltatást a változtatások életbe léptetéséhez:

systemctl restart apache2

A Let's Encrypt telepítése

Napjaink webhelyei szinte kizárólag HTTPS-kapcsolaton keresztül érhetők el, és az olyan oldalak esetén, amelyeknél ez a feltétel nem teljesül, a böngésző biztonsági értesítést jelenít meg, és egyben nem is tanácsolja annak felkeresését. Régen az ehhez szükséges tanúsítványok csak fizetős verzióban voltak elérhetők (jó drágán), az önaláírt tanúsítványokat pedig szintén nem részesítik előnyben a böngészők. Szerencsére manapság már elérhető a Let's Encrypt, amely ugyan nem veheti fel a versenyt a komolyabb tanúsítványokkal, az alapfunkciókat tökéletesen ellátja, és minden böngésző biztonságosként fogja feltüntetni a nálunk tárolt webhelyeket. És ami a legfontosabb, teszi mindezt teljesen ingyenesen és automatikusan.

Így telepíthetjük:

apt-get -y install certbot

A pureftpd és quota telepítése

A szerverhez engedélyezhetünk FTP-kapcsolatot (és SSH-kapcsolatot is, de utóbbi használatát nehezebb lesz egyes felhasználóinknak elmagyarázni), és természetesen lehetőségünk nyílik arra, hogy elejét vegyük felhasználóink korlátlan terjeszkedésének, azaz mindenkinek beállíthatunk egy kvótát a webes, adatbázisban tárolt és levelezési tartalmak tárhelyhasználatára vonatkozóan.

Elsőként is telepítsük a szükséges csomagokat:

apt-get -y install pure-ftpd-common pure-ftpd-mysql quota quotatool

Ezt követően ellenőrizzük, hogy standalone módban fut-e a démon, és a felhasználókat bezárja-e a saját könyvtárukba:

nano /etc/default/pure-ftpd-common
[...]
STANDALONE_OR_INETD=standalone
[...]
VIRTUALCHROOT=true
[...]

Mivel a pureftpd alapesetben titkosítatlan kapcsolatokat is engedélyez, itt az ideje, hogy konfiguráljuk hozzá a TLS-kapcsolatokat és létrehozzunk egy (önaláírt) tanúsítványt, mivel nem szeretnénk, hogy a jelszavak sima szövegként utazgassanak az interneten:

echo 1 > /etc/pure-ftpd/conf/TLS
mkdir -p /etc/ssl/private/
openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem
Country Name (2 letter code) [AU]: <-- HU
State or Province Name (full name) [Some-State]:<-- Budapest (vagy bármely más megye, ékezetek nélkül)
Locality Name (eg, city) []:<-- Budapest (vagy bármely más város, ékezetek nélkül)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:<-- Vállalat vagy szervezet neve
Organizational Unit Name (eg, section) []:<-- Részleg neve (pl.: informatikai részleg)
Common Name (eg, YOUR name) []:<-- A rendszer teljesen minősített tartományneve (pl.: mail.sajatdomain.hu)
Email Address []:<-- A webmester vagy a rendszergazda e-mail-címe
chmod 600 /etc/ssl/private/pure-ftpd.pem

Majd indítsuk újra a szolgáltatást:

service pure-ftpd-mysql restart

Ezt követően a kvótarendszer aktiválásához módosítanunk kell a következő fájlt:

nano /etc/fstab

Minden rendszernél más lehet az egyes csatolt fájlrendszerek elnevezése, mindenesetre nekünk a root fájlrendszert kell megkeresnünk, amit a sima perjel ("/") jelöl, és ehhez kell hozzáadnunk a megfelelő plusz paramétereket.

Néhány példa erre:

ext4 fájlrendszer esetén: (,usrjquota=quota.user,grpjquota=quota.group,jqfmt=vfsv0)

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/mapper/server1--vg-root / ext4 errors=remount-ro,usrjquota=quota.user,grpjquota=quota.group,jqfmt=vfsv0 0 1
/dev/mapper/server1--vg-swap_1 none swap sw 0 0
/dev/fd0 /media/floppy0 auto rw,user,noauto,exec,utf8 0 0

Vagy ext4 és UUID használata esetén: (,usrjquota=quota.user,grpjquota=quota.group,jqfmt=vfsv0)

UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX / ext4 defaults,usrjquota=quota.user,grpjquota=quota.group,jqfmt=vfsv0 0 0
UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX /boot ext4 defaults 0 0
/swap.img       none    swap    sw      0       0

xfs fájlrendszer esetén: (,uquota,gquota)

proc            /proc   proc    defaults        0 0
UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX / xfs defaults,uquota,gquota 1 1
UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX none swap sw 0 0

Ezt követően a módosítások életbe léptetéséhez a következők parancsok kiadására van szükség:

mount -o remount /
quotacheck -avugm
quotaon -avug

FIGYELEM!
xfs fájlrendszer esetén további lépésekre van szükség, ugyanis a kernelben is engedélyezni kell (rootflags=uquota,gquota) a kvótát. Ennek lépéseit lásd alább:

nano /etc/default/grub
[...]
GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8 net.ifnames=0 rootflags=uquota,gquota"
[...]
grub-mkconfig -o /boot/grub/grub.cfg

A végén pedig újra is kell indítanunk a rendszert a változtatások életbe léptetéséhez, hiszen a kernelt paramétereztük fel a rootflags=uquota,gquota attribútumokkal, így azt is újra be kell tölteni:

reboot

A bind telepítése

A DNS-rendszerünket és -kéréseinket kiszolgáló szolgáltatás a manapság iparági szabványnak tekinthető bind lesz, amelynek kísérőjeként egy véletlenszám-generátort is telepítünk. Ennek lépései:

apt-get -y install bind9 dnsutils haveged
systemctl enable haveged
systemctl start haveged

A vlogger, webalizer és awstats telepítése

A nálunk elhelyezett egyes webhelyekhez statisztikákat is elérhetővé tehetünk, amelyek segítségével jobban nyomon követhető a forgalom, illetve a látogatók statisztikái:

apt-get -y install vlogger webalizer awstats geoip-database libclass-dbi-mysql-perl
nano /etc/cron.d/awstats

Majd itt az összes sort megjegyzésbe kell tenni:

#MAILTO=root

#*/10 * * * * www-data [ -x /usr/share/awstats/tools/update.sh ] && /usr/share/awstats/tools/update.sh

# Generate static reports:
#10 03 * * * www-data [ -x /usr/share/awstats/tools/buildstatic.sh ] && /usr/share/awstats/tools/buildstatic.sh

A jailkit telepítése

A jailkit segítségével lehet a saját könyvtárukra korlátozni az SSH-val bejelentkező felhasználókat:

apt-get -y install build-essential autoconf automake1.11 libtool flex bison debhelper binutils
cd /tmp 
wget http://olivier.sessink.nl/jailkit/jailkit-2.19.tar.gz
tar xvfz jailkit-2.19.tar.gz
cd jailkit-2.19
echo 5 > debian/compat

Az így beszerzett forrás buildeléséhez a következő parancsot kell kiadnunk:

./debian/rules binary

Végül pedig telepíthetjük a kész csomagot:

cd ..
dpkg -i jailkit_2.19-1_*.deb
rm -rf jailkit-2.19*

A fail2ban és ufw telepítése

A fail2ban abban segít minket, hogy az egyes szolgáltatások használatakor korlátozza az azonosítási kísérletek számát, így a rosszindulatú támadók nem tudnak egy-egy szolgáltatásnál végtelen alkalommal próbálkozni, amíg ki nem találják a helyes jelszót.

apt-get -y install fail2ban
nano /etc/fail2ban/jail.local

(ez egy újonnan létrehozott fáj, így az alábbi teljes tartalmat bele kell másolni)

[pure-ftpd]
enabled  = true
port     = ftp
filter   = pure-ftpd
logpath  = /var/log/syslog
maxretry = 3

[dovecot]
enabled = true
filter = dovecot
action = iptables-multiport[name=dovecot-pop3imap, port="pop3,pop3s,imap,imaps", protocol=tcp]
logpath = /var/log/mail.log
maxretry = 5

[postfix]
enabled  = true
port     = smtp
filter   = postfix
logpath  = /var/log/mail.log
maxretry = 3

[apache]
enabled  = true
port     = http,https
filter   = apache-auth
# logpath  = /var/log/apache*/*error.log
logpath  = /var/log/ispconfig/httpd/*/error.log
findtime = 3600
maxretry = 3
bantime  = 86400

[roundcube]
enabled  = true
port     = http,https
filter   = roundcube
logpath  = /var/log/roundcube/userlogins
maxretry = 5
service fail2ban restart

Az ufw egy alapszintű tűzfal, amely kompatibilis az ISPConfiggal, így annak webes felületén lehet konfigurálni a megnyitni kívánt portokat. Mivel nem túl kifinomult, így általában nem szoktuk használni, hanem saját tűzfalszabályokat szoktunk alkalmazni az adott környezetnek megfelelően, viszont ha valaki csak egy egyszerű környezetben szeretné biztonságosabbá tenni a rendszerét, annak az ufw által nyújtott lehetőségek (az egyes szolgáltatások portjainak engedélyezése vagy letiltása) is elegendőek lehetnek. Akárhogyan is, telepíteni azért érdemes, mert a működése a webes felületről teljes mértékben irányítható (és ki is kapcsolható).

apt-get install ufw

A roundcube webmail telepítése

Levelezésünket ugyan teljes mértékben kezelni tudjuk a különböző levelezőkliensekből, mégis egyes felhasználók előnyben részesítik néha a webes kezelőfelület használatát. Arról nem is beszélve, hogy a spamszűrést és egyéb, a levelezéssel kapcsolatos beállítási lehetőséget csak a webmailen keresztül tudjuk elérhetővé tenni a számukra (ezzel egy külön cikkben foglalkozunk). Ehhez a roundcube-ot hívjuk segítségül:

apt-get -y install roundcube roundcube-core roundcube-mysql roundcube-plugins javascript-common libjs-jquery-mousewheel php-net-sieve tinymce
Configure database for roundcube with dbconfig-common? <-- Yes
MySQL application password for roundcube: <-- Enter billentyű szöveg beírása nélkül
nano /etc/apache2/conf-enabled/roundcube.conf

Itt engedélyeznünk kell a roundcube aliasait (az egyiknél csak a megjegyzést kell eltávolítani, a másikat újonnan kell beírni), illetve engedélyezni kell a .php kiterjesztést is.

# Those aliases do not work properly with several hosts on your apache server
# Uncomment them to use it or adapt them to your configuration
    Alias /roundcube /var/lib/roundcube
    Alias /webmail /var/lib/roundcube

<Directory /var/lib/roundcube/>
  AddType application/x-httpd-php .php
  Options +FollowSymLinks
  # This is needed to parse /var/lib/roundcube/.htaccess. See its
  # content before setting AllowOverride to None.
  AllowOverride All
[...]

Majd újraindítjuk a szolgáltatást:

service apache2 restart

Végül pedig csak a helyi gép levelezéséhez engedélyezzük a csatlakozást:

nano /etc/roundcube/config.inc.php
[...]
$config['default_host'] = 'localhost';
[...]

Az ISPconfig telepítése

A legújabb verzió a következő parancsokkal telepíthető:

cd /tmp 
wget -O ispconfig.tar.gz https://git.ispconfig.org/ispconfig/ispconfig3/repository/archive.tar.gz?ref=stable-3.1
tar xfz ispconfig.tar.gz
cd ispconfig3*/install/
php -q install.php

A telepítő gyakorlatilag minden szolgáltatást konfigurál nekünk, csupán néhány kérdésre kell választ adnunk.

FONTOS!
Az alábbiakban a főkiszolgáló (master) beállításait tüntetjük fel. Többkiszolgálós környezetben a többi szerver telepítésénél más beállításokat kell kiválasztani!

--------------------------------------------------------------------------------

>> Initial configuration
Operating System: Ubuntu 18.04 (Bionic Beaver)
Following will be a few questions for primary configuration so be careful.
Default values are in [brackets] and can be accepted with <enter>.
Tap in "quit" (without the quotes) to stop the installer.

Select language (en,de) [en]: <-- Enter billentyű lenyomása szöveg bevitele nélkül
Installation mode (standard,expert) [standard]: <-- Enter billentyű lenyomása szöveg bevitele nélkül
Full qualified hostname (FQDN) of the server, eg server1.domain.tld [mail.sajatdomain.hu]: <-- Enter billentyű lenyomása szöveg bevitele nélkül
MySQL server hostname [localhost]: <-- Enter billentyű lenyomása szöveg bevitele nélkül
MySQL server port [3306]: <-- Enter billentyű lenyomása szöveg bevitele nélkül
MySQL root username [root]: <-- Enter billentyű lenyomása szöveg bevitele nélkül
MySQL root password []: <-- A MySQL-nél megadott rootjelszó
MySQL database to create [dbispconfig]: <-- Enter billentyű lenyomása szöveg bevitele nélkül
MySQL charset [utf8]: <-- Enter billentyű lenyomása szöveg bevitele nélkül
Configuring Postgrey
Configuring Postfix
Generating a 4096 bit RSA private key
.......................................................................++
........................................................................................................................................++
writing new private key to 'smtpd.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]: <-- HU
State or Province Name (full name) [Some-State]: <-- Budapest (vagy bármely más megye, ékezetek nélkül)
Locality Name (eg, city) []: <-- Budapest (vagy bármely más város, ékezetek nélkül)
Organization Name (eg, company) [Internet Widgits Pty Ltd]: <-- Vállalat vagy szervezet neve
Organizational Unit Name (eg, section) []: <-- Részleg neve (pl.: informatikai részleg)
Common Name (e.g. server FQDN or YOUR name) []: <-- A rendszer teljesen minősített tartományneve (pl.: mail.sajatdomain.hu)
Email Address []: <-- A webmester vagy a rendszergazda e-mail-címe
Configuring Mailman
Configuring Dovecot
Configuring Spamassassin
Configuring Amavisd
Configuring Getmail
Configuring BIND
Configuring Jailkit
Configuring Pureftpd
Configuring Apache
Configuring vlogger
Configuring Metronome XMPP Server
writing new private key to 'localhost.key'
-----
Country Name (2 letter code) [AU]: <-- HU
Locality Name (eg, city) []: <-- Budapest (vagy bármely más város, ékezetek nélkül)
Organization Name (eg, company) [Internet Widgits Pty Ltd]: <-- Vállalat vagy szervezet neve
Organizational Unit Name (eg, section) []: <-- Részleg neve (pl.: informatikai részleg)
Common Name (e.g. server FQDN or YOUR name) [server1.canomi.com]: <-- A rendszer teljesen minősített tartományneve (pl.: mail.sajatdomain.hu)
Email Address []: <-- A webmester vagy a rendszergazda e-mail-címe
Configuring Ubuntu Firewall
Configuring Fail2ban
[INFO] service OpenVZ not detected
Configuring Apps vhost
Installing ISPConfig
ISPConfig Port [8080]: <-- Enter billentyű lenyomása szöveg bevitele nélkül
Admin password [admin]: <-- Enter billentyű lenyomása szöveg bevitele nélkül (a jelszót a webes felületen érdemes módosítani, az első bejelentkezés után)
Do you want a secure (SSL) connection to the ISPConfig web interface (y,n) [y]: <-- Enter billentyű lenyomása szöveg bevitele nélkül
Generating RSA private key, 4096 bit long modulus
.......................++
................................................................................................................................++
e is 65537 (0x10001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]: <-- HU
State or Province Name (full name) [Some-State]: <-- Budapest (vagy bármely más megye, ékezetek nélkül)
Locality Name (eg, city) []: <-- Budapest (vagy bármely más város, ékezetek nélkül)
Organization Name (eg, company) [Internet Widgits Pty Ltd]: <-- Vállalat vagy szervezet neve
Organizational Unit Name (eg, section) []: <-- Részleg neve (pl.: informatikai részleg)
Common Name (e.g. server FQDN or YOUR name) []: <-- A rendszer teljesen minősített tartományneve (pl.: mail.sajatdomain.hu)
Email Address []: <-- A webmester vagy rendszergazda e-mail-címe
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: <-- Enter billentyű lenyomása szöveg bevitele nélkül
An optional company name []: <-- Enter billentyű lenyomása szöveg bevitele nélkül
writing RSA key

Configuring DBServer
Installing ISPConfig crontab
no crontab for root
no crontab for getmail
Detect IP addresses
Restarting services ...
Installation completed.

Ezt követően pedig a 8080-as porton máris be tudunk jelentkezni az IPSConfigba. A felhasználónév és a jelszó azonos (admin), ám a jelszót az első bejelentkezés után erősen javasolt megváltoztatni!

https://mail.sajatdomain.hu:8080

E-mailes értesítés az SSH-bejelentkezésekről

Egy nyilvános szerver esetén érdemes minden óvintézkedést megtenni annak érdekében, hogy minden furcsa eseményről értesüljünk. A parancssori (SSH-) bejelentkezés egy kiemelten kritikus pontja a rendszerünknek, még akkor is, ha a korábbi lépéseket követve mindenkit bezártunk a saját könyvtárába. Az események nyomon követését segíti, ha e-mailes értesítést kapunk az SSH-s bejelentkezésekről. Ehhez először is hozzuk létre a figyelést végző szkriptet:

nano /usr/sbin/user-monitor.pl
#!/usr/bin/perl
# user_monitor.pl v0.4 :: keep track on who's logged in
# Written by Stephan Schmieder - http://www.unix-geek.info, 2003
# Usage: ./user-monitor.pl&

use strict;
use warnings;
use diagnostics;
use Net::SMTP;

#configuration
my $server =`uname -a|cut -d" " -f2`;
my $smtp_server ='localhost';
my $mail_to     ='root@mail.sajatdomain.hu';
my $mail_from   ='root@' . $server;
my $subject     ="$server :: User login monitor";
#configuration

my @old_users=split(/\n/, qx/who/);
while(sleep(60))
{
        my @users=split(/\n/, qx/who/);
        if(@users ne @old_users)
        {
                my $smtp = Net::SMTP->new($smtp_server);
                die "Couldn't connect to server" unless $smtp;
                $smtp->mail( $mail_from );
                $smtp->to( $mail_to );
                $smtp->data();
                $smtp->datasend("Subject: $subject\n\n");
                foreach my $user (@users)
                {
                        $smtp->datasend("$user\n");
                }
                $smtp->dataend();
                $smtp->quit();
        }
        @old_users=@users;
}

A root@mail.sajatdomain.hu helyére azt az e-mail-címet írjuk, ahová az értesítéseket kérjük.

FONTOS!
A szkript a rendszer saját postfix szolgáltatását használja a kimenő levelekhez, és elég kevés információt tesz bele a levélbe, ezért könnyen lehet, hogy az olyan nagyobb rendszerek, mint a gmail, levélszemétként észlelik az így küldött üzeneteket. Érdemes engedélyezési listára (whitelist) tenni a feladót, de a fenti szkriptet át is lehet írni igény szerint (akár egy külső SMTP-szolgáltatás, például a Postmark használatára).

Ezután módosítjuk a futtatási engedélyeket:

chmod 755 /usr/sbin/user-monitor.pl

Ahhoz, hogy a szkript minden rendszerindításkor elinduljon a háttérben, felvesszük a crontab bejegyzései közé a következő sor beszúrásával:

nano /etc/crontab
@reboot root    /usr/sbin/./user-monitor.pl&

Most pedig elindítjuk kézzel:

/usr/sbin/./user-monitor.pl&

A sikeres indítást követően meg kell jelennie a futó folyamatok listájában:

ps aux | grep monitor.pl
root      1026  0.0  0.2  59548 11380 ?        S    Aug09   0:22 /usr/bin/perl /usr/sbin/./user-monitor.pl

Összegzés

A fenti lépéseket követve egy biztonságos, éles üzemben is használható LAMP-kiszolgálót kapunk, amely ráadásul egy webes kezelőfelületen keresztül menedzselhető. Akár késznek is nyilváníthatjuk, ha az alapfunkciókon felül különösebb igényeink nincsenek, de alapul is szolgálhat a további testreszabásokhoz. 

Chilly
Chilly

Chilly 1997 óta foglalkozik webhelyek üzemeltetésével és programozással, valamint különböző kütyük kipróbálásával, és azóta folyamatosan nyomon követi a technikai újításokat. Elsődlegesen Linux-rendszerekkel dolgozik, de az évek során rengeteg tapasztalatra tett szert a Windows-gépek üzemeltetése terén is, hobbiszinten pedig az utóbbi időben egyre több időt tölt a Raspberry Pi módosítgatásával, illetve otthoni automatizált és biztonságtechnikai rendszerek kiépítésével.
Mesterfokon beszél angolul, és műszaki szakfordítói vizsgával rendelkezik. Korábban sokáig újságíróként dolgozott nyomtatott és online magazinoknál.