Oggi ho deciso di cimentarmi nell’installazione di quel obbrobrio modaiolo che è CentOS. Dico così perché è a tutti gli effetti utilizzato da meno del 20% dei webserver ed in generale mi sono convinto che venga scelto più per una questione di moda, che per qualche reale vantaggio rispetto ad Ubuntu/Debian.
Lungi dal voler scatenare una guerra tra distribuzioni, questo resta naturalmente un mio personalissimo parere, corroborato da “qualche” statistica (cioè non toglie, che io stesso, in momenti di malignità, abbia installato CentOS, per il morboso gusto dell’esperimento sulla pelle d’altri).
Comunque sia avventuriamoci in questo mondo e vediamo un po’ di differenze rispetto ad Ubuntu e Debian.
Come al solito utilizziamo VirtualBox e putty, mentre per scaricare la ISO è sufficiente andare sul sito ufficiale.
1. Installazione
Anzitutto ci viene chiesto che cosa intendiamo fare, scegliamo la prima opzione (banalmente premiamo INVIO, oppure I) e proseguiamo.
A questo punto compare una schermata con interfaccia grafica dove scegliere la lingua di installazione.
Scegliamo l’italiano come nella figura seguente e poi proseguiamo.
Selezioniamo Continua e ci troviamo di fronte alla schermata di tutte le impostazioni possibili.
Notiamo come è segnalato un “problema” sulla destinazione dell’installazione, unica cosa che dobbiamo scegliere effettivamente. Tutti gli altri parametri sono preconfigurati nella versione minima predefinita e possiamo lasciarli tali. Clicchiamo quindi su destinazione di installazione.
Scegliamo il nostro disco (nel mio caso quello da 30GB) e lasciamo la configurazione automatica (come avremmo fatto per Ubuntu). Clicchiamo su FATTO.
Adesso è possibile scegliere Avvia installazione.
Mentre prosegue l’installazione, con tanto di banner pubblicitario non richiesto (e questo già la dice lunga su dove ci stiamo avventurando) possiamo configurare la password di root ed eventuali altri utenti. In questo caso creiamo soltanto il nostro utente root dandogli una password. Clicchiamo su password di root.
Se si trattasse di una vera installazione online ci converrebbe, naturalmente, scegliere una buona password. Io ne metto una semplice, che però non sia troppo semplice e venga accettata. Il fatto stesso che il sistema “protesti” all’inserimento di “password” è un altro dei punti che trovo detestabili, visto che ho scelto linux proprio per fare, e sbagliare anche, di testa mia. Ma procediamo. Io ho messo una password un po’ più complessa, anche se si tratta di un esempio.
Quando l’installazione è completata possiamo riavviare il sistema.
Adesso possiamo cominciare a lavorare.
2. Connessione in SSH e configurazione rete
Se avete scelto l’installazione minima prima di potersi collegare in SSH, dopo aver inoltrato le porte su VirtualBox, qualora stesse lavorando sotto NAT come sto facendo io, è necessario avviare il servizio di rete. Per farlo digitiamo:
1 |
dhclient |
Senza questo servizio avviato non ci si può nemmeno collegare a internet.
Apriamo putty (o il nostro client ssh) e colleghiamoci normalmente alla macchina che abbiamo appena installato.
A questo punto impostiamo la rete perché si avvii automaticamente ad ogni riavvio del sistema (altrimenti dovremmo farlo noi a mano). Per poter modificare il file avremo bisogno di un editor di testo, quindi installiamo nano (ce ne sono anche tanti altri):
1 |
yum install nano |
Ci verrà chiesto di confermare l’installazione e sarà sufficiente premere y o s, in base a quello che viene proposto.
Fatto questo identifichiamo la nostra scheda di rete, ifconfig non funziona perché andrebbe installato, quindi digitiamo:
1 |
ip addr |
Nel mio caso vengono mostrate le seguenti due schede:
1 2 3 4 5 6 7 8 9 10 11 12 |
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:39:9e:15 brd ff:ff:ff:ff:ff:ff inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3 valid_lft 83595sec preferred_lft 83595sec inet6 fe80::a00:27ff:fe39:9e15/64 scope link valid_lft forever preferred_lft forever |
Faccio notare che la prima interfaccia di rete è quella locale, chiamata lo, mentre la seconda è la scheda di rete della macchina virtuale (in una configurazione su macchina fisica qui avremmo eth0 probabilmente) chiamata enp0s3.
Da qui possiamo anche vedere che alla scheda di rete è stato assegnato l’indirizzo IP 10.0.2.15 (classica configurazione di VirtualBox).
Quindi andiamo a vedere i file di configurazione di rete e digitiamo:
1 |
ls /etc/sysconfig/network-scripts/ |
Questo ci mostrerà vari file di configurazione, come nella schermata seguente:
Notiamo i primi due file che hanno i nomi ifcfg-enp0s3 e ifcfg-lo. Modifichiamo quindi il file di configurazione della scheda di rete:
1 |
nano /etc/sysconfig/network-scripts/ifcfg-enp0s3 |
Ci dovremmo trovare di fronte a qualcosa di simile a questo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=dhcp DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=enp0s3 UUID=5c133616-0362-451e-adce-a6c5b5a11c90 DEVICE=enp0s3 ONBOOT=no |
Modifichiamo il parametro ONBOOT=no facendolo diventare ONBOOT=yes. Salviamo premendo CTRL+O e riavviamo il computer per accertarci che sia tutto andato bene.
Per riavviare digitiamo:
1 |
reboot now |
Se tutto è andato bene potremo accedere normalmente in SSH.
3. Installazione server LAMP
Adesso è il momento di installare il nostro server LAMP (Linux + Apache + MySQL + PHP). Anzitutto digitiamo:
1 |
yum install httpd |
Una volta completata l’installazione dobbiamo avviare il servizio e configurare il firewall perché sia accessibile.
Quindi per avviare il servizio digitiamo:
1 2 |
systemctl start httpd.service systemctl enable httpd.service |
Mentre per configurare il firewall utilizziamo firewall-cmd digitando:
1 2 3 |
firewall-cmd --permanent --zone=public --add-service=http firewall-cmd --permanent --zone=public --add-service=https firewall-cmd --reload |
Faccio notare che quello che viene configurato sono 2 servizi, ovvero due porte, HTTP 80, HTTPS 443.
Andando all’indirizzo http://192.168.56.1/ (questo è il mio indirizzo della macchina virtuale) possiamo verificare che il server web funzioni correttamente (apparirà una pagina con scritto Testing 123…)
Adesso dobbiamo installare MySQL / MariaDB, MariaDB è l’evoluzione del MySQL, compatibile con quest’ultimo. Nel nostro caso installiamo MariaDB (giusto per variare un po’ sul tema, per il MySQL la procedura è analoga). Quindi digitiamo:
1 |
yum -y install mariadb-server mariadb |
Faccio notare che il flag -y permette di installare tutto senza ulteriori richieste di conferma. In modo analogo a prima digitiamo poi:
1 2 |
systemctl start mariadb.service systemctl enable mariadb.service |
In questo modo abilitiamo ed avviamo il servizio. Adesso però dobbiamo impostare la password dell’utente principale del database, che si chiama sempre root, anche se è diverso dal root di sistema. Oltre a questo vogliamo configurare alcuni parametri di sicurezza. Digitiamo:
1 |
mysql_secure_installation |
Verranno poste le seguenti domande:
- Enter current password for root (enter for none): PREMIAMO INVIO, non c’è nessuna password di root per ora
- Set root password? [Y/n]: Y
- New password: METTIAMO UNA PASSWORD
- Re-enter new password: RIPETIAMO LA SUDDETTA 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
In questo modo abbiamo messo in sicurezza e configurato il nostro database.
Adesso è il turno del PHP. Per assicurarci di scaricare la versione più recente, ovvero il PHP7, aggiorniamo la repository.
1 |
yum -y install centos-release-scl.noarch |
A questo punto digitiamo:
1 |
yum -y install rh-php70 rh-php70-php rh-php70-php-fpm |
Questo installerà il PHP7.0.
A questo punto comincia una piccola avventura degna solo di CentOS. Anzitutto bisogna abilitare il PHP affinché venga eseguito dal motore php-fpm (il PHP è un linguaggio compilato sul momento e può essere eseguito da diversi motori). Per qualche ragione l’installazione con yum non si occupa di questa cosa. Spostiamoci quindi in /etc/httpd/conf.d/ dove andremo a creare un file di configurazione chiamato fpm.conf. Attenzione, nel nome non c’è niente di speciale, poteva anche essere ilmiophp.conf. L’importante è l’estensione *.conf. Digitiamo quindi:
1 2 3 4 |
# PHP scripts setup ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/var/www/html Alias / /var/www/html/ |
In questo modo reindirizziamo le richieste dei documento PHP al server fcgi.
A questo punto dobbiamo avviare il servizio e riavviare Apache, digitando la seguente serie di comandi:
1 2 3 4 |
systemctl enable rh-php70-php-fpm.service systemctl start rh-php70-php-fpm.service systemctl enable httpd systemctl start httpd |
Eventualmente, se avessimo bisogno, possiamo visualizzare lo stato del servizio fpm-php digitando:
1 |
systemctl status rh-php70-php-fpm.service |
A questo punto creiamo la nostra solita pagina PHP di prova in /var/www/html (stesso percorso predefinito di Ubuntu):
1 |
nano /var/www/html/index.php |
Dentro il file incolliamo:
1 2 3 4 5 |
<?php phpinfo(); ?> |
Salviamo premendo come al solito CTRL+O.
Adesso apriamo la nostra pagina web al solito indirizzo di prima http://192.168.56.1/. Quello che vediamo, per la nostra massima felicità, è quanto segue:
Questo dipende dal fatto che abbiamo creato il file index.php come root, e non gli abbiamo assegnato l’utente di Apache. Per farlo anzitutto controlliamo l’utente con cui gira Apache aprendo:
1 |
nano /etc/httpd/conf/httpd.conf |
Scendendo nel file vedremo una voce simile a questa:
1 2 3 4 5 6 7 8 9 10 |
# # If you wish httpd to run as a different user or group, you must run # httpd as root initially and it will switch. # # User/Group: The name (or #number) of the user/group to run httpd as. # It is usually good practice to create a dedicated user and group for # running httpd, as with most system services. # User apache Group apache |
In questo caso (ma è così di solito) il nostro utente è apache ed il gruppo è apache. Quindi modifichiamo i permessi sul file appena creato:
1 |
chown apache:apache /var/www/html/index.php |
A questo punto ricontrolliamo e scopriamo due cose:
1. l’errore si presenta uguale a prima
2. la guida di CentOS stesso fa totalmente schifo. Le istruzioni da incollare dentro ad fpm.conf le ho infatti copiate da qui, quello che però non viene detto è che andrebbe anche configurato index.php come pagina predefinita, altrimenti apache pensa che, non essendoci una index.html, non si possa accedere alla cartella
Quindi digitiamo:
1 |
nano /etc/httpd/conf.d/fpm.conf |
E modifichiamo il file di prima in modo tale che risulti così (ho aggiunto solo l’ultima riga):
1 2 3 4 5 |
# PHP scripts setup ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/var/www/html Alias / /var/www/html/ DirectoryIndex /index.php index.php |
A questo punto riavviamo Apache:
1 |
systemctl restart httpd |
E il risultato che otteniamo collegandoci a http://192.168.56.1/ dovrebbe essere così:
Controllando la pagina web precedente vedremo che non è installata l’estensione per gestiore MySQL/MariaDB. Per farlo è sufficiente digitare:
1 |
yum install rh-php70-php-mysqlnd-7.0.10-2.el7.x86_64 |
Una volta fatto riavviamo il servizio FPM PHP.
1 |
systemctl restart rh-php70-php-fpm.service |
Adesso però verifichiamo se è andato davvero tutto bene collegandoci anche al database. Anzitutto creiamo un nuovo database.
Per farlo accediamo al MySQL/MariaDB che abbiamo installato prima. Digitiamo:
1 |
mysql -u root -p |
Attenzione! La medesima istruzione va digitata anche nel caso che si stia usando MariaDB, come sto facendo io, che vi ricordo è un aggiornamento di MySQL perfettamente retrocompatibile.
Digitiamo la password del database e ci troviamo nella console di gestione di MariaDB, che appare così:
1 |
MariaDB [(none)]> |
Questo significa che non abbiamo selezionato alcun database. Adesso creiamo un database (io lo chiamerò petar):
1 |
CREATE DATABASE petar; |
Proviamo anche a creare un utente chiamato petar e che possa accedere a tale database solamente da localhost (quindi da connessione locale). Per farlo digitiamo:
1 2 |
CREATE USER petar@localhost IDENTIFIED BY 'password123'; GRANT ALL PRIVILEGES ON petar.* TO petar@localhost; |
La password per il nuovo utente sarà password123. Per uscire dalla console del MariaDB digitiamo:
1 |
exit |
Adesso torniamo sul nostro file /var/www/html/index.php di prima e modifichiamolo nella maniera seguente:
1 2 3 4 5 6 7 |
<?php //phpinfo(); echo "Versione PHP: " . phpversion(); mysqli_connect("localhost", "petar", "password123", "petar") or die("Errore database"); ?> |
Se abbiamo fatto tutto bene andando su http://192.168.56.1/ vedremo qualcosa di simile a questo:
In caso che ci sia stato qualche errore (possiamo riprodurlo di proposito sbagliando la password nel suddetto codice php) dovremmo vedere qualcosa di simile:
Accertiamoci anche che, modificando il codice in questo modo:
1 2 3 4 5 |
<?php phpinfo(); echo "Versione PHP: " . phpversion(); mysqli_connect("localhost", "petar2", "password123", "petar") or die("Errore database"); ?> |
Nella suddetta pagina appaia la seguente sezione dedicata al MySQL.
Se per qualunque ragione non dovesse esserci la libreria non è installata correttamente.
4. Configurazione Firewall
A questo punto controlliamo lo stato del firewall. Vediamo anzitutto alcuni comandi utili.
Per accertarci che sia attivo digitiamo:
1 |
firewall-cmd --state |
A questo punto controlliamo lo stato della configurazione digitando:
1 |
firewall-cmd --list-all |
Dovremmo vedere qualcosa di simile a questo:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public (active) target: default icmp-block-inversion: no interfaces: enp0s3 sources: services: ssh dhcpv6-client http https ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: |
Notiamo che l’interfaccia del firewall è su enp0s3 (la nostra unica scheda di rete, su una macchina fisica tipicamente eth0).
I servizi attivi sono invece ssh dhcpv6-client http https. Ricordiamoci che queste ultime due le abbiamo configurate al punto 3 precedente.
Come già detto, quindi, per aggiungere un nuovo servizio al firewall è sufficiente digitare:
1 |
firewall-cmd --permanent --zone=public --add-service=http |
Mentre per rimuoverlo, ad esempio rimuovere il servizio http, basta digitare:
1 |
firewall-cmd --permanent --zone=public --remove-service=http |
In entrambi i casi, affinché le modifiche abbiano successo, è necessario riavviare il firewall:
1 |
firewall-cmd --reload |
Tutto questo è molto bello, ma sinceramente preferisco lavorare con iptables. Ricordiamoci che sia firewalld che iptables sono due software, distinti, che gestiscono il firewall vero che si chiama netfilter. Per verificare che sia installato, dovrebbe esserlo, digitiamo:
1 |
rpm -q iptables |
Il risultato dovrebbe essere qualcosa come: iptables-1.4.21-18.2.el7_4.x86_64
Questo ci indica l’ultima versione installata. Controlliamo quindi, con iptables, qual’è la configurazione attuale.
1 |
iptables -L |
Quello che viene fuori è un casino simile a questo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED ACCEPT all -- anywhere anywhere INPUT_direct all -- anywhere anywhere INPUT_ZONES_SOURCE all -- anywhere anywhere INPUT_ZONES all -- anywhere anywhere DROP all -- anywhere anywhere ctstate INVALID REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED ACCEPT all -- anywhere anywhere FORWARD_direct all -- anywhere anywhere FORWARD_IN_ZONES_SOURCE all -- anywhere anywhere FORWARD_IN_ZONES all -- anywhere anywhere FORWARD_OUT_ZONES_SOURCE all -- anywhere anywhere FORWARD_OUT_ZONES all -- anywhere anywhere DROP all -- anywhere anywhere ctstate INVALID REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination OUTPUT_direct all -- anywhere anywhere Chain FORWARD_IN_ZONES (1 references) target prot opt source destination FWDI_public all -- anywhere anywhere [goto] FWDI_public all -- anywhere anywhere [goto] Chain FORWARD_IN_ZONES_SOURCE (1 references) target prot opt source destination Chain FORWARD_OUT_ZONES (1 references) target prot opt source destination FWDO_public all -- anywhere anywhere [goto] FWDO_public all -- anywhere anywhere [goto] Chain FORWARD_OUT_ZONES_SOURCE (1 references) target prot opt source destination Chain FORWARD_direct (1 references) target prot opt source destination Chain FWDI_public (2 references) target prot opt source destination FWDI_public_log all -- anywhere anywhere FWDI_public_deny all -- anywhere anywhere FWDI_public_allow all -- anywhere anywhere ACCEPT icmp -- anywhere anywhere Chain FWDI_public_allow (1 references) target prot opt source destination Chain FWDI_public_deny (1 references) target prot opt source destination Chain FWDI_public_log (1 references) target prot opt source destination Chain FWDO_public (2 references) target prot opt source destination FWDO_public_log all -- anywhere anywhere FWDO_public_deny all -- anywhere anywhere FWDO_public_allow all -- anywhere anywhere Chain FWDO_public_allow (1 references) target prot opt source destination Chain FWDO_public_deny (1 references) target prot opt source destination Chain FWDO_public_log (1 references) target prot opt source destination Chain INPUT_ZONES (1 references) target prot opt source destination IN_public all -- anywhere anywhere [goto] IN_public all -- anywhere anywhere [goto] Chain INPUT_ZONES_SOURCE (1 references) target prot opt source destination Chain INPUT_direct (1 references) target prot opt source destination Chain IN_public (2 references) target prot opt source destination IN_public_log all -- anywhere anywhere IN_public_deny all -- anywhere anywhere IN_public_allow all -- anywhere anywhere ACCEPT icmp -- anywhere anywhere Chain IN_public_allow (1 references) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ctstate NEW ACCEPT tcp -- anywhere anywhere tcp dpt:https ctstate NEW ACCEPT tcp -- anywhere anywhere tcp dpt:http ctstate NEW Chain IN_public_deny (1 references) target prot opt source destination Chain IN_public_log (1 references) target prot opt source destination Chain OUTPUT_direct (1 references) target prot opt source destination |
Personalmente trovo tragicomico che un’installazione minima di CentOS parta con una simile configurazione di iptables (e soprattutto parta con aperta solamente la porta SSH). Essendo un’installazione minima ci si potrebbe aspettare che il firewall non sia configurato e che tutte le porte siano aperte, per poi dovercene occupare noi.
Per tanto, siccome voglio avere una visione chiara della situazione del firewall, resetto tutto quanto impostando aperte solo le porte per SSH, HTTP e HTTPS. Per farlo mi è sufficiente eseguire il seguente codice da terminale (va bene anche un copia/incolla)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# impostiamo tutto su ACCEPT iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT # cancelliamo tutte le regole e tutte le catene iptables -t nat -F iptables -t mangle -F iptables -F iptables -X # impostazione base utile per LAMP iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # chiudiamo tutti gli altri input e froward iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT |
Per approfondimenti suggerisco: Lavorare con iptables su Ubuntu [per pinguini in erba]
Il risultato di questa purga, digitando iptables -L, dovrebbe essere così:
1 2 3 4 5 6 7 8 9 10 11 12 |
Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:http ACCEPT tcp -- anywhere anywhere tcp dpt:https ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination |
Per salvare la configurazione dobbiamo installare i servizi di iptables digitando:
1 |
yum install iptables-services |
Abilitiamo il servizio digitando:
1 |
systemctl enable iptables |
Già che ci siamo sbarazziamoci di firewalld:
1 2 |
systemctl stop firewalld systemctl mask firewalld |
Riavviamo il servizio iptables (fino ad ora abbiamo usato solo il programma client):
1 |
systemctl restart iptables |
E infine salviamo:
1 |
service iptables save |
A questo punto dovremmo ricevere una conferma di questo tipo:
Per accertarci che tutto sia andato bene possiamo riavviare l’intera macchina con un reboot now e ricontrollare lo stato del firewall digitando iptables -L.
5. Installazione di fail2ban
Come ultima operazione installiamo fail2ban, onde limitare le possibilità di ricevere attacchi sulla porta 22 del protocollo SSH. In questo modo evitiamo che si possano fare numerosi tentativi per scoprire i dati di accesso, bannando via via gli indirizzi IP da cui arrivano gli attacchi.
Per installare fail2ban anzitutto aggiungiamo il pacchetto EPEL Project alla nostra repository.
1 |
sudo yum install epel-release |
Qualora risultasse già installato tanto meglio. Procediamo installando fail2ban:
1 |
yum install fail2ban |
Completata l’installazione abilitiamo fail2ban digitando:
1 |
systemctl enable fail2ban |
Adesso configuriamo il programma. Per farlo possiamo modificare alcuni file. In particolare teniamo presente le seguenti cose:
- /etc/fail2ban/jail.conf questo il primo file di configurazione, è quello predefinito, lo possiamo modificare, ma se vogliamo fare un lavoro pulito ci conviene lasciarlo così com’è
- /etc/fail2ban/jail.d/*.conf, questi sono i file *.conf predefiniti, vengono accorpati al file precedente, sostituendo eventuali parametri equivalenti, anche questi file possono essere lasciati intatti così come sono
- /etc/fail2ban/jail.local questo è il file di configurazione locale, segue ai due file precedenti, e quindi ogni modifica apportata qui dentro potrà sovrascrivere le precedenti
- /etc/fail2ban/jail.d/*.local, infine questa è la cartella nella quale si troveranno i file *.local personalizzati che andranno a sostituire quelli precedenti e verranno accorpati in ordine alfabetico
Quindi anzitutto impostiamo i parametri base per fail2ban modificando il seguente file:
1 |
nano /etc/fail2ban/jail.local |
Il file risulterà vuoto, quindi ci possiamo incollare dentro i seguenti parametri. Questi andranno a sostituire quelli di default.
1 2 3 4 |
[DEFAULT] bantime = 3600 maxretry = 3 banaction = iptables-multiport |
A questo punto creiamo un file per l’SSH digitando:
1 |
nano /etc/fail2ban/jail.d/ssh.local |
Ricordiamoci che i file verranno letti in ordine alfabetico, nel nome del file, a parte l’estensione *.local, non c’è niente di speciale. Si poteva anche chiamare 001-config.local.
1 2 3 4 5 |
[sshd] port = ssh enabled = true maxretry = 3 |
Salviamo e riavviamo fail2ban:
1 |
systemctl restart fail2ban |
Verifichiamo la situazione digitando:
1 |
fail2ban-client status |
Ci dovrebbe comparire qualcosa di simile:
Notiamo che è abilitata una jail per l’sshd. Stessa verifica la possiamo fare su iptables digitando iptables -L e controllando la presenza di una chain per fail2ban.
Per accertarci che tutto vada bene possiamo tentare di accedere in SSH sbagliando password. Inutile dire che una volta bannati dovremo poter accedere direttamente alla macchina per sbannarci.
Per visualizzare gli ip bannati è sufficiente digitare (per la chain f2b-sshd creata fa fail2ban dentro al firewall):
1 |
iptables -L f2b-sshd -v -n |
In questo caso il mio IP è il 10.0.2.2 e possiamo notare che appare tra quelli bannati:
Per rimuoverlo, ovvero sbloccare l’indirizzo ip bannato, basta digitare:
1 |
sudo fail2ban-client set sshd unbanip 10.0.2.2 |
A questo punto possiamo accedere nuovamente mediante SSH.
Adesso abbiamo configurato CentOS per essere pronto ed operativo come server LAMP.
Grazie petar per questo bellissimo articolo
Vorrei chiederTi un approfondimento:
Scriverai anche un articolo sull’ottimizzazione Apache/PHP/mariaDb sempre su CentOS?
Grazie