Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
How-To-Secure-A-Linux-Server — Guida passo-passo per l'hardening di un server Linux, che copre la sicurezza SSH, i firewall, il rilevamento delle intrusioni, l'auditing e la configurazione del sistema per ridurre la superficie di attacco e migliorare la difesa. | Kitploit
Strumenti/GitHubGitHub/imthenachoman/how-to-secure-a-linux-server
Scanner di VulnerabilitàAudit di ConfigurazioneSicurezza di ReteAnalisi MalwareAutenticazioneRilevamento IntrusioniApprendimento e FormazioneRisposta agli IncidentiRisorse Curate
Analisi dei Log
GitHubimthenachoman/how-to-secure-a-linux-server

How-To-Secure-A-Linux-Server

Guida passo-passo per l'hardening di un server Linux, che copre la sicurezza SSH, i firewall, il rilevamento delle intrusioni, l'auditing e la configurazione del sistema per ridurre la superficie di attacco e migliorare la difesa.

Vedi Repository
30.3k2.0k233 giorni faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

Come Proteggere un Server Linux

Una guida in evoluzione su come proteggere un server Linux che, si spera, ti insegni anche qualcosa sulla sicurezza e sul perché sia importante.

CC-BY-SA

Indice

  • Introduzione
    • Obiettivo della Guida
    • Perché Proteggere il Tuo Server
    • Perché Un'Altra Guida
    • Altre Guide
    • Da Fare / Da Aggiungere
  • Panoramica della Guida
    • Informazioni Su Questa Guida
    • Il Mio Caso d'Uso
    • Modificare i File di Configurazione - Per i Pigri
    • Contribuire
  • Prima di Iniziare
    • Identifica i Tuoi Principi
    • Scegliere una Distribuzione Linux
    • Installare Linux
    • Requisiti Pre/Post Installazione
    • Altre Note Importanti
    • Utilizzare Playbook Ansible per Proteggere il Tuo Server Linux
Il Server SSH
  • Nota Importante Prima di Apportare Modifiche SSH
  • Chiavi Pubbliche/Private SSH
  • Creare un Gruppo SSH per AllowGroups
  • Proteggere /etc/ssh/sshd_config
  • Rimuovere le Chiavi Diffie-Hellman Corte
  • 2FA/MFA per SSH
  • Le Basi
    • Limitare Chi Può Usare sudo
    • Limitare Chi Può Usare su
    • Eseguire Applicazioni in una Sandbox con FireJail
    • Client NTP
    • Proteggere /proc
    • Obbligare gli Account a Usare Password Sicure
    • Aggiornamenti di Sicurezza Automatici e Avvisi
    • Pool di Entropia Casuale Più Sicuro (WIP)
    • Aggiungere un Sistema di Sicurezza per Login di Panico/Secondario/Falso
  • La Rete
    • Firewall con UFW (Uncomplicated Firewall)
    • Rilevamento e Prevenzione delle Intrusioni iptables con PSAD
    • Rilevamento e Prevenzione delle Intrusioni delle Applicazioni con Fail2Ban
    • Rilevamento e Prevenzione delle Intrusioni delle Applicazioni con CrowdSec
  • L'Auditing
    • Monitoraggio dell'Integrità dei File/Cartelle con AIDE (WIP)
    • Scansione Antivirus con ClamAV (WIP)
    • Rilevamento Rootkit con Rkhunter (WIP)
    • Rilevamento Rootkit con chrootkit (WIP)
    • logwatch - analizzatore e reporter dei log di sistema
    • ss - Visualizzare le Porte Su Cui il Server è in Ascolto
    • Lynis - Audit di Sicurezza Linux
    • OSSEC - Rilevamento di Intrusioni Host
  • La Zona Pericolosa
  • Il Varie
    • MSMTP (Simple Sendmail) con Google
    • Gmail ed Exim4 come MTA con TLS Implicito
    • File di Log iptables Separato
  • Avanzate
    • Contattarmi
    • Link Utili
    • Riconoscimenti
    • Licenza e Copyright
  • (TOC realizzato con nGitHubTOC)

    Introduzione

    Obiettivo della Guida

    Lo scopo di questa guida è insegnarti come proteggere un server Linux.

    Ci sono molte cose che puoi fare per proteggere un server Linux e questa guida tenterà di coprire quante più possibile. Altri argomenti/materiali verranno aggiunti man mano che imparo, o man mano che le persone contribuiscono.

    I playbook Ansible di questa guida sono disponibili su How To Secure A Linux Server With Ansible di moltenbit.

    (Indice)

    Perché Proteggere il Tuo Server

    Presumo che tu stia usando questa guida perché, si spera, hai già capito perché una buona sicurezza è importante. Questo è un argomento pesante di per sé e scomporlo è al di fuori dello scopo di questa guida. Se non conosci la risposta a questa domanda, ti consiglio di fare prima delle ricerche.

    A livello generale, nel momento in cui un dispositivo, come un server, è nel dominio pubblico – cioè visibile al mondo esterno – diventa un bersaglio per cattivi attori. Un dispositivo non protetto è un parco giochi per cattivi attori che vogliono accedere ai tuoi dati o utilizzare il tuo server come un altro nodo per i loro attacchi DDOS su larga scala.

    Ciò che è peggio è che, senza una buona sicurezza, potresti non sapere mai se il tuo server è stato compromesso. Un cattivo attore potrebbe aver ottenuto accesso non autorizzato al tuo server e copiato i tuoi dati senza modificare nulla, quindi non lo sapresti mai. Oppure il tuo server potrebbe aver fatto parte di un attacco DDOS, e non lo sapresti. Guarda molte delle violazioni di dati su larga scala nelle notizie – le aziende spesso non scoprono la fuga di dati o l'intrusione fino a molto tempo dopo che i cattivi attori se ne sono andati.

    Contrariamente alla credenza popolare, i cattivi attori non vogliono sempre modificare qualcosa o bloccarti fuori dai tuoi dati per denaro. A volte vogliono solo i dati sul tuo server per i loro data warehouse (ci sono grandi soldi nei big data) o per utilizzare segretamente il tuo server per i loro scopi nefasti.

    (Indice)

    Perché Un'Altra Guida

    Questa guida può sembrare duplicativa/innecessaria perché ci sono innumerevoli articoli online che ti dicono come proteggere Linux, ma le informazioni sono sparse in diversi articoli, che coprono cose diverse e in modi diversi. Chi ha tempo di scorrere centinaia di articoli?

    Mentre facevo ricerche per la mia build Debian, ho preso appunti. Alla fine mi sono reso conto che, insieme a ciò che già sapevo e a ciò che stavo imparando, avevo gli ingredienti per una guida. Ho pensato di metterla online per sperare di aiutare altri a imparare e risparmiare tempo.

    Non ho mai trovato un'unica guida che copra tutto – questa guida è il mio tentativo.

    Molte delle cose coperte in questa guida possono essere piuttosto basilari/banali, ma la maggior parte di noi non installa Linux ogni giorno, ed è facile dimenticare quelle cose basilari.

    (Indice)

    Altre Guide

    Esistono molte guide fornite da esperti, leader del settore e dalle distribuzioni stesse. Non è pratico, e talvolta contrario al copyright, includere tutto da quelle guide. Ti consiglio di darci un'occhiata prima di iniziare con questa guida.

    • Il Center for Internet Security (CIS) fornisce benchmark che sono esaustivi, fidati a livello industriale e forniscono istruzioni passo-passo per proteggere molte varianti di Linux. Controlla la loro pagina About Us per i dettagli. La mia raccomandazione è di seguire prima questa guida (quella che stai leggendo qui) e POI quella del CIS. In questo modo le loro raccomandazioni avranno la precedenza su qualsiasi cosa in questa guida.
    • Per guide di hardening/sicurezza specifiche per distribuzione, controlla la documentazione della tua distribuzione.
    • https://security.utexas.edu/os-hardening-checklist/linux-7 - Red Hat Enterprise Linux 7 Hardening Checklist
    • https://cloudpro.zone/index.php/2018/01/18/debian-9-3-server-setup-guide-part-1/ - Guida all'installazione del server Debian 9.3
    • https://blog.vigilcode.com/2011/04/ubuntu-server-initial-security-quick-secure-setup-part-i/ - Guida alla sicurezza iniziale del server Ubuntu
    • https://www.tldp.org/LDP/sag/html/index.html
    • https://seifried.org/lasg/
    • https://news.ycombinator.com/item?id=19178964
    • https://wiki.archlinux.org/index.php/Security - molti hanno anche raccomandato questa
    • https://securecompliance.co/linux-server-hardening-checklist/

    (Indice)

    Da Fare / Da Aggiungere

    • Jail personalizzate per Fail2ban
    • MAC (Controllo Accesso Obbligatorio) e Moduli di Sicurezza Linux (LSM)
      • https://wiki.archlinux.org/index.php/security#Mandatory_access_control
      • Security-Enhanced Linux / SELinux
        • https://en.wikipedia.org/wiki/Security-Enhanced_Linux
        • https://linuxtechlab.com/beginners-guide-to-selinux/
        • https://linuxtechlab.com/replicate-selinux-policies-among-linux-machines/
        • https://teamignition.us/how-to-stop-being-a-scrub-and-learn-to-use-selinux.html
      • AppArmor
        • https://wiki.archlinux.org/index.php/AppArmor
        • https://security.stackexchange.com/questions/29378/comparison-between-apparmor-and-selinux
        • http://www.insanitybit.com/2012/06/01/why-i-like-apparmor-more-than-selinux-5/
    • crittografia del disco
    • Rkhunter e chrootkit
      • http://www.chkrootkit.org/
      • http://rkhunter.sourceforge.net/
      • https://www.cyberciti.biz/faq/howto-check-linux-rootkist-with-detectors-software/
      • https://www.tecmint.com/install-rootkit-hunter-scan-for-rootkits-backdoors-in-linux/
    • invio/backup dei log - https://news.ycombinator.com/item?id=19178681
    • CIS-CAT - https://learn.cisecurity.org/cis-cat-landing-page
    • debsums - https://blog.sleeplessbeastie.eu/2015/03/02/how-to-verify-installed-packages/

    (Indice)

    Panoramica della Guida

    Informazioni Su Questa Guida

    Questa guida...

    • ...è un lavoro in corso.
    • ...è focalizzata su server Linux domestici. Tutti i concetti/raccomandazioni qui si applicano anche ad ambienti più grandi/professionali, ma quei casi d'uso richiedono configurazioni più avanzate e specializzate che esulano dallo scopo di questa guida.
    • ...non ti insegna Linux, come installare Linux o come usarlo. Dai un'occhiata a https://linuxjourney.com/ se sei nuovo a Linux.
    • ...è pensata per essere agnostica rispetto alla distribuzione Linux.
    • ...non ti insegna tutto ciò che devi sapere sulla sicurezza né approfondisce tutti gli aspetti della sicurezza del sistema/server. Ad esempio, la sicurezza fisica è fuori dallo scopo di questa guida.
    • ...non parla di come funzionano i programmi/strumenti, né approfondisce i loro meandri. La maggior parte dei programmi/strumenti a cui fa riferimento questa guida sono molto potenti e altamente configurabili. L'obiettivo è coprire lo stretto indispensabile – abbastanza per stuzzicare il tuo appetito e renderti abbastanza affamato da voler approfondire.
    • ...mira a rendere le cose facili fornendo codice che puoi copiare e incollare. Potresti dover modificare i comandi prima di incollarli, quindi tieni a portata di mano il tuo editor di testo preferito.
    • ...è organizzata in un ordine che ha senso logico per me – ad esempio, proteggere SSH prima di installare un firewall. Come tale, questa guida è pensata per essere seguita nell'ordine in cui è presentata, ma non è necessario farlo. Fai solo attenzione se fai le cose in un ordine diverso – alcune sezioni richiedono che sezioni precedenti siano completate.

    (Indice)

    Il Mio Caso d'Uso

    Ci sono molti tipi di server e diversi casi d'uso. Anche se voglio che questa guida sia il più generica possibile, ci saranno alcune cose che potrebbero non applicarsi a tutti/gli altri casi d'uso. Usa il tuo buon senso quando segui questa guida.

    Per aiutare a mettere in contesto molti degli argomenti trattati in questa guida, il mio caso d'uso/configurazione è:

    • Un computer di classe desktop...
    • Con una singola scheda di rete...
    • Collegato a un router di livello consumer...
    • Che ottiene un IP WAN dinamico fornito dall'ISP...
    • Con WAN+LAN su IPV4...
    • E LAN che utilizza NAT...
    • A cui voglio poter accedere tramite SSH da remoto da computer sconosciuti e posizioni sconosciute (ad esempio, la casa di un amico).

    (Indice)

    Modificare i File di Configurazione - Per i Pigri

    Sono molto pigro e non mi piace modificare i file a mano se non necessario. Inoltre presuppongo che tutti gli altri siano come me. :)

    Quindi, quando e dove possibile, ho fornito snippet di codice per fare rapidamente ciò che è necessario, come aggiungere o cambiare una riga in un file di configurazione.

    Gli snippet di codice utilizzano comandi di base come echo, cat, sed, awk e grep. Come funzionano gli snippet di codice, ad esempio cosa fa ciascun comando/parte, è al di fuori dello scopo di questa guida – le pagine man sono tue amiche.

    Nota: Gli snippet di codice non convalidano/verificano che la modifica sia stata effettivamente applicata – ad esempio, se la riga è stata effettivamente aggiunta o modificata. Lascerò la parte di verifica nelle tue capaci mani. I passaggi in questa guida includono comunque il backup di tutti i file che verranno modificati.

    Non tutte le modifiche possono essere automatizzate con snippet di codice. Quelle modifiche necessitano di una buona, vecchia, modifica manuale. Ad esempio, non puoi semplicemente aggiungere una riga a un file di tipo INI. Usa il tuo editor di testo Linux preferito.

    (Indice)

    Contribuire

    Volevo pubblicare questa guida su GitHub per rendere facile la collaborazione. Più persone contribuiscono, migliore e più completa diventerà questa guida.

    Per contribuire puoi fare un fork e inviare una pull request o inviare una nuova issue.

    (Indice)

    Prima di Iniziare

    Identifica i Tuoi Principi

    Prima di iniziare vorrai identificare quali sono i tuoi Principi. Qual è il tuo modello di minaccia? Alcune cose a cui pensare:

    • Perché vuoi proteggere il tuo server?
    • Quanta sicurezza vuoi o non vuoi?
    • Quanta comodità sei disposto a compromettere per la sicurezza e viceversa?
    • Quali sono le minacce contro cui vuoi proteggerti? Quali sono i dettagli specifici della tua situazione? Ad esempio:
      • L'accesso fisico al tuo server/rete è un possibile vettore di attacco?
      • Aprirai porte sul tuo router per poter accedere al tuo server da fuori casa?
      • Ospiterai una condivisione file sul tuo server che verrà montata su un computer desktop? Qual è la possibilità che il computer desktop venga infettato e, a sua volta, infetti il server?
    • Hai un mezzo di recupero se la tua implementazione di sicurezza ti blocca fuori dal tuo stesso server? Ad esempio, hai disabilitato l'accesso root o protetto GRUB con password.

    Questi sono solo alcune cose a cui pensare. Prima di iniziare a proteggere il tuo server vorrai capire contro cosa stai cercando di proteggerti e perché, in modo da sapere cosa devi fare.

    (Indice)

    Scegliere una Distribuzione Linux

    Questa guida è pensata per essere agnostica rispetto alla distribuzione, in modo che gli utenti possano usare qualsiasi distribuzione vogliano. Detto questo, ci sono alcune cose da tenere a mente:

    Vuoi una distribuzione che...

    • ...sia stabile. A meno che tu non ami fare debug di problemi alle 2 del mattino, non vuoi che un aggiornamento non presidiato, o un aggiornamento manuale del pacchetto/sistema, renda il tuo server inoperativo. Ma questo significa anche che va bene non eseguire il software più recente, all'avanguardia.
    • ...rimanga aggiornata con le patch di sicurezza. Puoi proteggere tutto sul tuo server, ma se il sistema operativo principale o le applicazioni che esegui hanno vulnerabilità note, non sarai mai al sicuro.
    • ...ti sia familiare. Se non conosci Linux, ti consiglio di giocarci un po' prima di provare a proteggerlo. Dovresti sentirti a tuo agio e conoscere la strada, ad esempio come installare software, dove sono i file di configurazione, ecc...
    • ...sia ben supportata. Anche l'amministratore più esperto ha bisogno di aiuto ogni tanto. Avere un posto dove andare per chiedere aiuto ti salverà la sanità mentale.

    (Indice)

    Installare Linux

    Installare Linux è al di fuori dello scopo di questa guida perché ogni distribuzione lo fa in modo diverso e le istruzioni di installazione sono solitamente ben documentate. Se hai bisogno di aiuto, inizia con la documentazione della tua distribuzione. Indipendentemente dalla distribuzione, il processo generale di solito è:

    1. scaricare l'ISO
    2. masterizzarlo/copiarlo/trasferirlo sul tuo supporto di installazione (ad esempio un CD o una chiavetta USB)
    3. avviare il server dal supporto di installazione
    4. seguire le indicazioni per installare

    Ove applicabile, usa l'opzione di installazione esperto per avere un controllo più stretto su ciò che è in esecuzione sul tuo server. Installa solo ciò di cui hai assolutamente bisogno. Personalmente, non installo nient'altro oltre a SSH. Inoltre, spunta l'opzione di crittografia del disco.

    (Indice)

    Requisiti Pre/Post Installazione

    • Se stai aprendo porte sul tuo router per poter accedere al tuo server dall'esterno, disabilita il port forwarding finché il sistema non è attivo e protetto.
    • A meno che tu non stia facendo tutto fisicamente collegato al tuo server, avrai bisogno di accesso remoto, quindi assicurati che SSH funzioni.
    • Mantieni il sistema aggiornato (ad esempio sudo apt update && sudo apt upgrade sui sistemi basati su Debian).
    • Assicurati di eseguire tutte le attività specifiche per la tua configurazione come:
      • Configurare la rete
      • Configurare i punti di mount in /etc/fstab
      • Creare gli account utente iniziali
      • Installare il software di base che desideri come man
      • Ecc...
    • Il tuo server dovrà essere in grado di inviare e-mail in modo da ricevere importanti avvisi di sicurezza. Se non stai configurando un server di posta, consulta Gmail ed Exim4 come MTA con TLS Implicito.
    • Ti consiglierei anche di leggere i CIS Benchmarks prima di iniziare con questa guida, solo per assimilare/capire cosa hanno da dire. La mia raccomandazione è di seguire prima questa guida (quella che stai leggendo qui) e POI quella del CIS. In questo modo le loro raccomandazioni avranno la precedenza su qualsiasi cosa in questa guida.

    (Indice)

    Altre Note Importanti

    • Questa guida è scritta e testata su Debian. La maggior parte delle cose di seguito dovrebbe funzionare su altre distribuzioni. Se trovi qualcosa che non funziona, per favore contattami. La cosa principale che differenzia ogni distribuzione sarà il suo sistema di gestione dei pacchetti. Dato che uso Debian, fornirò i comandi apt appropriati che dovrebbero funzionare su tutte le distribuzioni basate su Debian. Se qualcuno è disposto a fornire i rispettivi comandi per altre distribuzioni, li aggiungerò.
    • Anche i percorsi dei file e le impostazioni possono differire leggermente – controlla la documentazione della tua distribuzione se hai problemi.
    • Leggi l'intera guida prima di iniziare. Il tuo caso d'uso e/o i tuoi principi potrebbero richiedere di non fare qualcosa o di cambiare l'ordine.
    • Non copiare e incollare ciecamente senza capire cosa stai incollando. Alcuni comandi dovranno essere modificati per le tue esigenze prima di funzionare – ad esempio i nomi utente.

    (Indice)

    Utilizzare Playbook Ansible per Proteggere il Tuo Server Linux

    I playbook Ansible di questa guida sono disponibili su How To Secure A Linux Server With Ansible.Assicurati di modificare le variabili in base alle tue esigenze e di leggere tutti i task in anticipo per confermare che non rompano il tuo sistema. Dopo aver eseguito i playbook, assicurati che tutte le impostazioni siano configurate secondo le tue esigenze!

    1. Installa Ansible
    2. git clone How To Secure A Linux Server With Ansible
    3. Crea SSH-Public/Private-Keys ``` ssh-keygen -t ed25519
    root@kitploit:~
    5. Modifica tutte le variabili in *group_vars/variables.yml* secondo le tue esigenze.
    6. Abilita l'accesso SSH come root prima di eseguire i playbook:  ```
    nano /etc/ssh/sshd_config
    [...]
    PermitRootLogin yes
    [...]
    
    1. Consigliato: configurare un indirizzo IP statico sul tuo sistema.
    2. Aggiungi l'indirizzo IP del tuo sistema a hosts.yml.

     

    Esegui il playbook dei requisiti usando la password di root specificata durante l'installazione del server:

    root@kitploit:~
    ansible-playbook --inventory hosts.yml --ask-pass requirements-playbook.yml
    

     

    Esegui il playbook principale con la password del nuovo utente specificata nel file variables.yml:

    root@kitploit:~
    ansible-playbook --inventory hosts.yml --ask-pass main-playbook.yml
    

     

    Se devi eseguire i playbook più volte, ricorda di utilizzare la chiave SSH e la nuova porta SSH:

    root@kitploit:~
    ansible-playbook --inventory hosts.yml -e ansible_ssh_port=SSH_PORT --key-file /PATH/TO/SSH/KEY main-playbook.yml
    

    (Table of Contents)

    Il Server SSH

    Nota Importante Prima di Apportare Modifiche SSH

    Si consiglia vivamente di tenere aperta una seconda finestra del terminale verso il tuo server prima di apportare e applicare modifiche alla configurazione SSH. In questo modo, se ti blocchi fuori dalla prima sessione del terminale, hai ancora una sessione connessa per risolvere il problema.

    Grazie a Sonnenbrand per questa idea.

    Chiavi Pubbliche/Private SSH

    Perché

    Usare chiavi pubbliche/private SSH è più sicuro che usare una password. Rende anche più facile e veloce connettersi al nostro server perché non devi inserire una password.

    Come Funziona

    Controlla i riferimenti qui sotto per maggiori dettagli, ma, a livello generale, le chiavi pubbliche/private funzionano utilizzando una coppia di chiavi per verificare l'identità.

    1. Una chiave, la chiave pubblica, può solo crittografare dati, non decrittografarli
    2. L'altra chiave, la chiave privata, può decrittografare i dati

    Per SSH, una chiave pubblica e privata viene creata sul client. Devi mantenere entrambe le chiavi al sicuro, specialmente la chiave privata. Anche se la chiave pubblica è destinata a essere pubblica, è saggio assicurarsi che nessuna delle due chiavi cada in mani sbagliate.

    Quando ti connetti a un server SSH, SSH cercherà una chiave pubblica che corrisponda al client da cui ti stai connettendo nel file ~/.ssh/authorized_keys sul server a cui ti stai connettendo. Nota che il file si trova nella home directory dell'ID con cui stai cercando di connetterti. Quindi, dopo aver creato la chiave pubblica, devi aggiungerla a ~/.ssh/authorized_keys. Un approccio è copiarla su una chiavetta USB e trasferirla fisicamente al server. Un altro approccio è usare ssh-copy-id per trasferire e aggiungere la chiave pubblica.

    Dopo che le chiavi sono state create e la chiave pubblica è stata aggiunta a ~/.ssh/authorized_keys sul server, SSH utilizza le chiavi pubbliche e private per verificare l'identità e quindi stabilire una connessione sicura. Come viene verificata l'identità è un processo complicato, ma Digital Ocean ha un'ottima spiegazione di come funziona. A livello generale, l'identità viene verificata dal server che crittografa un messaggio di sfida con la chiave pubblica, quindi lo invia al client. Se il client non riesce a decrittografare il messaggio di sfida con la chiave privata, l'identità non può essere verificata e la connessione non verrà stabilita.

    Sono considerate più sicure perché hai bisogno della chiave privata per stabilire una connessione SSH. Se imposti PasswordAuthentication no in /etc/ssh/sshd_config, allora SSH non ti permetterà di connetterti senza la chiave privata.

    Puoi anche impostare una passphrase per le chiavi, che ti richiederebbe di inserire la passphrase della chiave quando ti connetti usando chiavi pubbliche/private. Tieni presente che fare questo significa che non puoi usare la chiave per l'automazione perché non avrai modo di inviare la passphrase nei tuoi script. ssh-agent è un programma fornito in molte distribuzioni Linux (e di solito già in esecuzione) che ti permette di mantenere la tua chiave privata non crittografata in memoria per una durata configurabile. Basta eseguire ssh-add e ti verrà richiesta la passphrase. Non ti verrà più richiesta la passphrase finché non sarà trascorsa la durata configurabile.

    Useremo chiavi Ed25519 che, secondo https://linux-audit.com/:

    Utilizza uno schema di firma a curva ellittica, che offre una sicurezza migliore di ECDSA e DSA. Allo stesso tempo, ha anche buone prestazioni.

    Obiettivi

    • Chiavi SSH Ed25519 pubbliche/private:
      • chiave privata sul tuo client
      • chiave pubblica sul tuo server

    Note

    • Dovrai eseguire questo passaggio per ogni computer e account da/per cui ti connetterai al tuo server.

    Riferimenti

    • https://www.ssh.com/ssh/public-key-authentication
    • https://help.ubuntu.com/community/SSH/OpenSSH/Keys
    • https://linux-audit.com/using-ed25519-openssh-keys-instead-of-dsa-rsa-ecdsa/
    • https://www.digitalocean.com/community/tutorials/understanding-the-ssh-encryption-and-connection-process
    • https://wiki.archlinux.org/index.php/SSH_Keys
    • https://www.ssh.com/ssh/copy-id
    • man ssh-keygen
    • man ssh-copy-id
    • man ssh-add

    Passi

    1. Dal computer che utilizzerai per connetterti al tuo server, il client, non il server stesso, crea una chiave Ed25519 con ssh-keygen:

      root@kitploit:~
      ssh-keygen -t ed25519
      
      root@kitploit:~
      Generating public/private ed25519 key pair.
      Enter file in which to save the key (/home/user/.ssh/id_ed25519):
      Created directory '/home/user/.ssh'.
      Enter passphrase (empty for no passphrase):
      Enter same passphrase again:
      Your identification has been saved in /home/user/.ssh/id_ed25519.
      Your public key has been saved in /home/user/.ssh/id_ed25519.pub.
      The key fingerprint is:
      SHA256:F44D4dr2zoHqgj0i2iVIHQ32uk/Lx4P+raayEAQjlcs user@client
      The key's randomart image is:
      +--[ED25519 256]--+
      |xxxx  x          |
      |o.o +. .         |
      | o o oo   .      |
      |. E oo . o .     |
      | o o. o S o      |
      |... .. o o       |
      |.+....+ o        |
      |+.=++o.B..       |
      |+..=**=o=.       |
      +----[SHA256]-----+
      

      Nota: Se imposti una passphrase, dovrai inserirla ogni volta che ti connetti al tuo server usando questa chiave, a meno che tu non stia usando ssh-agent.

    2. Ora devi aggiungere la chiave pubblica ~/.ssh/id_ed25519.pub dal tuo client al file ~/.ssh/authorized_keys sul tuo server. Poiché presumibilmente siamo ancora a casa sulla LAN, probabilmente siamo al sicuro da attacchi MIM, quindi useremo ssh-copy-id per trasferire e aggiungere la chiave pubblica:

      root@kitploit:~
      ssh-copy-id user@server
      
      root@kitploit:~
      /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/id_ed25519.pub"
      The authenticity of host 'host (192.168.1.96)' can't be established.
      ECDSA key fingerprint is SHA256:QaDQb/X0XyVlogh87sDXE7MR8YIK7ko4wS5hXjRySJE.
      Are you sure you want to continue connecting (yes/no)? yes
      /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
      /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
      user@host's password:
      
      Number of key(s) added: 1
      
      Now try logging into the machine, with:   "ssh 'user@host'"
      and check to make sure that only the key(s) you wanted were added.
      

    Ora sarebbe un buon momento per eseguire tutte le attività specifiche della tua configurazione.

    (Table of Contents)

    Creare un Gruppo SSH per AllowGroups

    Perché

    Per rendere facile controllare chi può connettersi via SSH al server. Utilizzando un gruppo, possiamo aggiungere/rimuovere rapidamente account dal gruppo per consentire o negare rapidamente l'accesso SSH al server.

    Come Funziona

    Useremo l'opzione AllowGroups nel file di configurazione di SSH /etc/ssh/sshd_config per dire al server SSH di consentire solo agli utenti che sono membri di un certo gruppo UNIX di connettersi via SSH. Chiunque non sia nel gruppo non potrà connettersi via SSH.

    Obiettivi

    • un gruppo UNIX che useremo in Secure /etc/ssh/sshd_config per limitare chi può connettersi via SSH al server

    Note

    • Questo è un passaggio propedeutico per supportare l'impostazione AllowGroup impostata in Secure /etc/ssh/sshd_config.

    Riferimenti

    • man groupadd
    • man usermod

    Passi

    1. Crea un gruppo:

      root@kitploit:~
      sudo groupadd sshusers
      
    2. Aggiungi account al gruppo:

      root@kitploit:~
      sudo usermod -a -G sshusers user1
      sudo usermod -a -G sshusers user2
      sudo usermod -a -G sshusers ...
      

      Dovrai farlo per ogni account sul tuo server che necessita di accesso SSH.

    (Table of Contents)

    Secure /etc/ssh/sshd_config

    Perché

    SSH è una porta d'accesso al tuo server. Questo è particolarmente vero se stai aprendo porte sul tuo router per poter accedere via SSH al tuo server dall'esterno della tua rete domestica. Se non è adeguatamente protetto, un malintenzionato potrebbe usarlo per ottenere accesso non autorizzato al tuo sistema.

    Come Funziona

    /etc/ssh/sshd_config è il file di configurazione predefinito utilizzato dal server SSH. Useremo questo file per impostare le opzioni che il server SSH deve utilizzare.

    Obiettivi

    • una configurazione SSH sicura

    Note

    • Assicurati di aver completato prima Creare un Gruppo SSH per AllowGroups.

    Riferimenti

    • Linee guida OpenSSH di Mozilla per OpenSSH 6.7+ su https://infosec.mozilla.org/guidelines/openssh#modern-openssh-67
    • https://linux-audit.com/audit-and-harden-your-ssh-configuration/
    • https://www.ssh.com/ssh/sshd_config/
    • https://www.techbrown.com/harden-ssh-secure-linux-vps-server/ (rotto; prova http://web.archive.org/web/20200413100933/https://www.techbrown.com/harden-ssh-secure-linux-vps-server/)
    • https://serverfault.com/questions/660160/openssh-difference-between-internal-sftp-and-sftp-server/660325
    • man sshd_config
    • Grazie a than0s per come trovare impostazioni duplicate.

    Passi

    1. Fai una copia di backup del file di configurazione del server OpenSSH /etc/ssh/sshd_config e rimuovi i commenti per renderlo più facile da leggere:

      root@kitploit:~
      sudo cp --archive /etc/ssh/sshd_config /etc/ssh/sshd_config-COPY-$(date +"%Y%m%d%H%M%S")
      sudo sed -i -r -e '/^#|^$/ d' /etc/ssh/sshd_config
      
    2. Modifica /etc/ssh/sshd_config quindi trova e modifica o aggiungi queste impostazioni che dovrebbero essere applicate indipendentemente dalla tua configurazione/setup:

      Nota: SSH non gradisce impostazioni duplicate contraddittorie. Ad esempio, se hai ChallengeResponseAuthentication no e poi ChallengeResponseAuthentication yes, SSH rispetterà la prima e ignorerà la seconda. Il tuo file /etc/ssh/sshd_config potrebbe già contenere alcune delle impostazioni/righe seguenti. Per evitare problemi, dovrai esaminare manualmente il tuo file /etc/ssh/sshd_config e risolvere eventuali impostazioni duplicate contraddittorie.

      Nota: Se stai eseguendo OpenSSH 9.1 o successivo, decommenta la riga RequiredRSASize 3072 nella configurazione seguente. Questo impone una dimensione minima della chiave RSA di 3072 bit e rifiuterà chiavi RSA più piccole durante l'autenticazione. Questo riguarda solo le chiavi RSA. Se usi chiavi ED25519 o ECDSA, non sei interessato. Puoi controllare il tipo e la dimensione della tua chiave con ssh-keygen -l -f ~/.ssh/id_rsa. Nelle versioni precedenti di OpenSSH, lascia la riga commentata poiché impedirebbe l'avvio di sshd.

      root@kitploit:~
      ########################################################################################################
      # start settings from https://infosec.mozilla.org/guidelines/openssh#modern-openssh-67 as of 2019-01-01
      ########################################################################################################
      
      # Supported HostKey algorithms by order of preference.
      HostKey /etc/ssh/ssh_host_ed25519_key
      HostKey /etc/ssh/ssh_host_rsa_key
      HostKey /etc/ssh/ssh_host_ecdsa_key
      
      KexAlgorithms [email protected],ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
      
      Ciphers [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr
      
      MACs [email protected],[email protected],hmac-sha2-512,hmac-sha2-256,[email protected]
      
      # LogLevel VERBOSE logs user's key fingerprint on login. Needed to have a clear audit track of which key was using to log in.
      LogLevel VERBOSE
      
      # Use kernel sandbox mechanisms where possible in unprivileged processes
      # Systrace on OpenBSD, Seccomp on Linux, seatbelt on MacOSX/Darwin, rlimit elsewhere.
      # Note: This setting is deprecated in OpenSSH 7.5 (https://www.openssh.com/txt/release-7.5)
      # UsePrivilegeSeparation sandbox
      
      ########################################################################################################
      # end settings from https://infosec.mozilla.org/guidelines/openssh#modern-openssh-67 as of 2019-01-01
      ########################################################################################################
      
      # don't let users set environment variables
      PermitUserEnvironment no
      
      # Log sftp level file access (read/write/etc.) that would not be easily logged otherwise.
      Subsystem sftp  internal-sftp -f AUTHPRIV -l INFO
      
      # disable X11 forwarding as X11 is very insecure
      # you really shouldn't be running X on a server anyway
      X11Forwarding no
      
      # disable port forwarding
      AllowTcpForwarding no
      AllowStreamLocalForwarding no
      GatewayPorts no
      PermitTunnel no
      
      # don't allow login if the account has an empty password
      PermitEmptyPasswords no
      
      # ignore .rhosts and .shosts
      IgnoreRhosts yes
      
      # verify hostname matches IP
      UseDNS yes
      
      Compression no
      
      # TCP keepalive is spoofable (runs outside the encrypted channel)
      # Use ClientAlive instead (runs inside the encrypted channel)
      TCPKeepAlive no
      
      AllowAgentForwarding no
      PermitRootLogin no
      
      # don't allow .rhosts or /etc/hosts.equiv
      HostbasedAuthentication no
      
      # OpenSSH 9.1 and later
      # Enforce a minimum RSA key size of 3072 bits
      # https://www.keylength.com/en/compare/
      # RequiredRSASize 3072
      
      # https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/115
      HashKnownHosts yes
      
    3. Poi trova e modifica o aggiungi queste impostazioni e imposta i valori secondo i tuoi requisiti:

    4. Assicurati che non ci siano impostazioni duplicate che si contraddicono a vicenda. Il comando seguente non dovrebbe produrre alcun output.

      root@kitploit:~
      awk 'NF && $1!~/^(#|HostKey)/{print $1}' /etc/ssh/sshd_config | sort | uniq -c | grep -v ' 1 '
      
    5. Riavvia ssh:

      root@kitploit:~
      sudo service sshd restart
      
    6. Puoi verificare che le configurazioni abbiano funzionato con sshd -T e controllare l'output:

      root@kitploit:~
      sudo sshd -T
      
      root@kitploit:~
      port 22
      addressfamily any
      listenaddress [::]:22
      listenaddress 0.0.0.0:22
      usepam yes
      logingracetime 30
      x11displayoffset 10
      maxauthtries 2
      maxsessions 2
      clientaliveinterval 15
      clientalivecountmax 3
      streamlocalbindmask 0177
      permitrootlogin no
      ignorerhosts yes
      ignoreuserknownhosts no
      hostbasedauthentication no
      ...
      subsystem sftp internal-sftp -f AUTHPRIV -l INFO
      maxstartups 2:30:2
      permittunnel no
      ipqos lowdelay throughput
      rekeylimit 0 0
      permitopen any
      

    (Table of Contents)

    Rimuovere le Chiavi Diffie-Hellman Corte

    Perché

    Secondo le linee guida OpenSSH di Mozilla per OpenSSH 6.7+, "tutti i moduli Diffie-Hellman in uso dovrebbero essere lunghi almeno 3072 bit".

    L'algoritmo Diffie-Hellman è utilizzato da SSH per stabilire una connessione sicura. Più grande è il modulo (dimensione della chiave), più forte è la crittografia.

    Obiettivi

    • rimuovere tutte le chiavi Diffie-Hellman che sono più corte di 3072 bit

    Riferimenti

    • Linee guida OpenSSH di Mozilla per OpenSSH 6.7+ su https://infosec.mozilla.org/guidelines/openssh#modern-openssh-67
    • https://infosec.mozilla.org/guidelines/key_management
    • man moduli

    Passi

    1. Fai una copia di backup del file dei moduli di SSH /etc/ssh/moduli:

      root@kitploit:~
      sudo cp --archive /etc/ssh/moduli /etc/ssh/moduli-COPY-$(date +"%Y%m%d%H%M%S")
      
    2. Rimuovi i moduli corti:

      root@kitploit:~
      sudo awk '$5 >= 3071' /etc/ssh/moduli | sudo tee /etc/ssh/moduli.tmp
      sudo mv /etc/ssh/moduli.tmp /etc/ssh/moduli
      

    (Table of Contents)

    2FA/MFA per SSH

    Perché

    Anche se SSH è un buon guardiano di sicurezza per le tue porte e finestre, è comunque una porta visibile che i malintenzionati possono vedere e tentare di forzare con attacchi di forza bruta. Fail2ban monitorerà questi tentativi di forza bruta, ma non si è mai troppo sicuri. Richiedere due fattori aggiunge un ulteriore livello di sicurezza.

    L'uso dell'Autenticazione a Due Fattori (2FA) / Autenticazione Multi-Fattore (MFA) richiede che chiunque entri abbia due chiavi per accedere, il che rende più difficile per i malintenzionati. Le due chiavi sono:

    1. La loro password
    2. Un token di 6 cifre che cambia ogni 30 secondi

    Senza entrambe le chiavi, non potranno entrare.

    Perché No

    Molte persone potrebbero trovare l'esperienza scomoda o fastidiosa. Inoltre, l'accesso al tuo sistema dipende dall'applicazione autenticatore associata che genera il codice.

    Come Funziona

    Su Linux, PAM è responsabile dell'autenticazione. Ci sono quattro compiti di PAM di cui puoi leggere su https://en.wikipedia.org/wiki/Linux_PAM. Questa sezione parla del compito di autenticazione.

    Quando accedi a un server, sia direttamente dalla console che tramite SSH, la porta attraverso cui sei entrato invierà la richiesta al compito di autenticazione di PAM e PAM chiederà e verificherà la tua password. Puoi personalizzare le regole che ciascuna porta utilizza. Ad esempio, potresti avere un insieme di regole quando accedi direttamente dalla console e un altro insieme di regole quando accedi tramite SSH.

    Questa sezione modificherà le regole di autenticazione per quando si accede tramite SSH per richiedere sia una password che un codice di 6 cifre.Utilizzeremo il modulo PAM di Google, libpam-google-authenticator, per creare e verificare una chiave TOTP. https://fastmail.blog/2016/07/22/how-totp-authenticator-apps-work/ e https://jemurai.com/2018/10/11/how-it-works-totp-based-mfa/ contengono ottime spiegazioni su come funziona TOTP.

    Quello che faremo è istruire la configurazione PAM SSH del server affinché chieda all'utente la propria password e poi il proprio token numerico. PAM verificherà quindi la password dell'utente e, se corretta, inoltrerà la richiesta di autenticazione a libpam-google-authenticator, che chiederà e verificherà il token di 6 cifre. Se, e solo se, tutto è a posto, l'autenticazione avrà successo e l'utente potrà accedere.

    Obiettivi

    • 2FA/MFA abilitato per tutte le connessioni SSH

    Note

    • Prima di procedere, dovresti avere un'idea di come funziona 2FA/MFA e avrai bisogno di un'app di autenticazione sul tuo telefono per continuare.
    • Utilizzeremo google-authenticator-libpam.
    • Con la configurazione sottostante, un utente dovrà inserire il codice 2FA/MFA solo se sta accedendo con la propria password, ma non se sta usando chiavi pubbliche/private SSH. Consulta la documentazione per modificare questo comportamento in base alle tue esigenze.

    Riferimenti

    • https://github.com/google/google-authenticator-libpam
    • https://en.wikipedia.org/wiki/Linux_PAM
    • https://en.wikipedia.org/wiki/Time-based_One-time_Password_algorithm
    • https://fastmail.blog/2016/07/22/how-totp-authenticator-apps-work/
    • https://jemurai.com/2018/10/11/how-it-works-totp-based-mfa/

    Passi

    1. Installa libpam-google-authenticator.

      Su sistemi basati su Debian:

      root@kitploit:~
      sudo apt install libpam-google-authenticator
      
    2. Assicurati di aver effettuato l'accesso con l'ID per cui vuoi abilitare 2FA/MFA ed esegui google-authenticator per creare i dati del token necessari:

      root@kitploit:~
      google-authenticator
      
      root@kitploit:~
      Do you want authentication tokens to be time-based (y/n) y
      https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/user@host%3Fsecret%3DR4ZWX34FQKZROVX7AGLJ64684Y%26issuer%3Dhost
      
      ...
      
      Your new secret key is: R3NVX3FFQKZROVX7AGLJUGGESY
      Your verification code is 751419
      Your emergency scratch codes are:
        12345678
        90123456
        78901234
        56789012
        34567890
      
      Do you want me to update your "/home/user/.google_authenticator" file (y/n) y
      
      Do you want to disallow multiple uses of the same authentication
      token? This restricts you to one login about every 30s, but it increases
      your chances to notice or even prevent man-in-the-middle attacks (y/n) Do you want to disallow multiple uses of the same authentication
      token? This restricts you to one login about every 30s, but it increases
      your chances to notice or even prevent man-in-the-middle attacks (y/n) y
      
      By default, tokens are good for 30 seconds. In order to compensate for
      possible time-skew between the client and the server, we allow an extra
      token before and after the current time. If you experience problems with
      poor time synchronization, you can increase the window from its default
      size of +-1min (window size of 3) to about +-4min (window size of
      17 acceptable tokens).
      Do you want to do so? (y/n) y
      
      If the computer that you are logging into isn't hardened against brute-force
      login attempts, you can enable rate-limiting for the authentication module.
      By default, this limits attackers to no more than 3 login attempts every 30s.
      Do you want to enable rate-limiting (y/n) y
      

      Nota: questo non va eseguito come root.

      Seleziona l'opzione predefinita (y nella maggior parte dei casi) per tutte le domande e ricordati di salvare i codici di emergenza.

    3. Esegui un backup del file di configurazione PAM di SSH /etc/pam.d/sshd:

      root@kitploit:~
      sudo cp --archive /etc/pam.d/sshd /etc/pam.d/sshd-COPY-$(date +"%Y%m%d%H%M%S")
      
    4. Ora dobbiamo abilitarlo come metodo di autenticazione per SSH aggiungendo questa riga a /etc/pam.d/sshd:

      root@kitploit:~
      auth       required     pam_google_authenticator.so nullok
      

      Nota: Controlla qui per sapere cosa significa nullok.

      Per i pigri:

      root@kitploit:~
      echo -e "\nauth       required     pam_google_authenticator.so nullok         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/pam.d/sshd
      
    5. Dì a SSH di utilizzarlo aggiungendo o modificando questa riga in /etc/ssh/sshd_config:

      root@kitploit:~
      ChallengeResponseAuthentication yes
      

      Per i pigri:

      root@kitploit:~
      sudo sed -i -r -e "s/^(challengeresponseauthentication .*)$/# \1         # commented by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/I" /etc/ssh/sshd_config
      echo -e "\nChallengeResponseAuthentication yes         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/ssh/sshd_config
      
    6. Riavvia ssh:

      root@kitploit:~
      sudo service sshd restart
      

    (Indice dei contenuti)

    Le basi

    Limitare chi può usare sudo

    Perché

    sudo consente agli account di eseguire comandi come altri account, incluso root. Vogliamo assicurarci che solo gli account che desideriamo possano usare sudo.

    Obiettivi

    • privilegi sudo limitati a coloro che appartengono a un gruppo da noi specificato

    Note

    • La tua installazione potrebbe aver già fatto questo, o potrebbe già avere un gruppo speciale destinato a questo scopo, quindi controlla prima.
      • Debian crea il gruppo sudo. Per visualizzare gli utenti che fanno parte di questo gruppo (quindi con privilegi sudo):

        root@kitploit:~
        cat /etc/group | grep "sudo"
        
      • RedHat crea il gruppo wheel

    • Vedi https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/39 per una nota su alcune distribuzioni che fanno sì che sudo non richieda una password. Grazie a sbrl per la condivisione.

    Passi

    1. Crea un gruppo:

      root@kitploit:~
      sudo groupadd sudousers
      
    2. Aggiungi account al gruppo:

      root@kitploit:~
      sudo usermod -a -G sudousers user1
      sudo usermod -a -G sudousers user2
      sudo usermod -a -G sudousers  ...
      

      Dovrai farlo per ogni account sul tuo server che necessita di privilegi sudo.

    3. Esegui un backup del file di configurazione di sudo /etc/sudoers:

      root@kitploit:~
      sudo cp --archive /etc/sudoers /etc/sudoers-COPY-$(date +"%Y%m%d%H%M%S")
      
    4. Modifica il file di configurazione di sudo /etc/sudoers:

      root@kitploit:~
      sudo visudo
      
    5. Dì a sudo di consentire solo agli utenti nel gruppo sudousers di usare sudo aggiungendo questa riga se non è già presente:

      root@kitploit:~
      %sudousers   ALL=(ALL:ALL) ALL
      

    (Indice dei contenuti)

    Limitare chi può usare su

    Perché

    anche su consente agli account di eseguire comandi come altri account, incluso root. Vogliamo assicurarci che solo gli account che desideriamo possano usare su.

    Obiettivi

    • privilegi su limitati a coloro che appartengono a un gruppo da noi specificato

    Riferimenti

    • Grazie a olavim per aver condiviso questa idea

    Passi

    1. Crea un gruppo:

      root@kitploit:~
      sudo groupadd suusers
      
    2. Aggiungi account al gruppo:

      root@kitploit:~
      sudo usermod -a -G suusers user1
      sudo usermod -a -G suusers user2
      sudo usermod -a -G suusers  ...
      

      Dovrai farlo per ogni account sul tuo server che necessita di privilegi sudo.

    3. Fai in modo che solo gli utenti in questo gruppo possano eseguire /bin/su:

      root@kitploit:~
      sudo dpkg-statoverride --update --add root suusers 4750 /bin/su
      

    (Indice dei contenuti)

    Eseguire applicazioni in una sandbox con FireJail

    Perché

    È assolutamente meglio, per molte applicazioni, eseguirle in una sandbox.

    I browser (ancora di più quelli Closed Source) e i Client di posta elettronica sono altamente consigliati.

    Obiettivi

    • confinare le applicazioni in una gabbia (pochi elenchi sicuri) e bloccare l'accesso al resto del sistema

    Riferimenti

    • Grazie a FireJail

    Passi

    1. Installa il software:

      root@kitploit:~
      sudo apt install firejail firejail-profiles
      

      Nota: per Debian 10 Stable, è consigliato il backport ufficiale:

      root@kitploit:~
      sudo apt install -t buster-backports firejail firejail-profiles
      
    2. Consenti a un'applicazione (installata in /usr/bin o /bin) di essere eseguita solo in una sandbox (vedi alcuni esempi qui sotto):

      root@kitploit:~
      sudo ln -s /usr/bin/firejail /usr/local/bin/google-chrome-stable
      sudo ln -s /usr/bin/firejail /usr/local/bin/firefox
      sudo ln -s /usr/bin/firejail /usr/local/bin/chromium
      sudo ln -s /usr/bin/firejail /usr/local/bin/evolution
      sudo ln -s /usr/bin/firejail /usr/local/bin/thunderbird
      
    3. Esegui l'applicazione come al solito (tramite terminale o launcher) e verifica se è in esecuzione in una gabbia:

      root@kitploit:~
      firejail --list
      
    4. Consenti a un'app in sandbox di essere eseguita di nuovo come prima (esempio: firefox)

      root@kitploit:~
      sudo rm /usr/local/bin/firefox
      

    (Indice dei contenuti)

    Client NTP

    Perché

    Molti protocolli di sicurezza sfruttano l'ora. Se l'ora del tuo sistema non è corretta, potrebbe avere impatti negativi sul tuo server. Un client NTP può risolvere questo problema mantenendo l'ora del sistema sincronizzata con i server NTP globali

    Come funziona

    NTP sta per Network Time Protocol. Nel contesto di questa guida, un client NTP sul server viene utilizzato per aggiornare l'ora del server con l'ora ufficiale prelevata dai server ufficiali. Visita https://www.pool.ntp.org/en/ per tutti i server NTP pubblici.

    Nota: A partire da Debian 13 (Trixie), il pacchetto ntp classico è stato rimosso. Eseguire sudo apt install ntp fallirà con "Package ntp has no installation candidate". Dal momento che questa guida utilizza NTP solo come client (per sincronizzare l'orologio del server), l'approccio raccomandato su Debian 13+ è usare systemd-timesyncd, che è già preinstallato e non richiede pacchetti aggiuntivi. Vedi i passi per Debian 13+ qui sotto.

    Obiettivi

    • Client NTP installato e che mantiene l'ora del server sincronizzata

    Riferimenti

    • https://cloudpro.zone/index.php/2018/01/27/debian-9-3-server-setup-guide-part-4/
    • https://en.wikipedia.org/wiki/Network_Time_Protocol
    • https://www.pool.ntp.org/en/
    • https://serverfault.com/questions/957302/securing-hardening-ntp-client-on-linux-servers-config-file/957450#957450
    • https://tf.nist.gov/tf-cgi/servers.cgi

    Passi

    Debian 13 (Trixie) e successivi: systemd-timesyncd

    systemd-timesyncd è un client SNTP leggero già incluso in Debian. A differenza del demone ntpd completo, non ascolta su alcuna porta, il che lo rende una superficie di attacco più ridotta. Ai fini di questa guida - mantenere l'orologio del server sincronizzato - è tutto ciò di cui hai bisogno.

    1. Abilita la sincronizzazione NTP:

      root@kitploit:~
      sudo timedatectl set-ntp true
      
    2. Verifica che funzioni:

      root@kitploit:~
      timedatectl status
      

      Dovresti vedere NTP service: active e System clock synchronized: yes nell'output.

    3. Configura i server NTP attendibili. Esegui un backup del file di configurazione e poi modificalo:

      root@kitploit:~
      sudo cp --archive /etc/systemd/timesyncd.conf /etc/systemd/timesyncd.conf-COPY-$(date +"%Y%m%d%H%M%S")
      

      Modifica /etc/systemd/timesyncd.conf e decommenta/imposta la sezione [Time]:

      root@kitploit:~
      [Time]
      NTP=pool.ntp.org
      FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org
      

      Per i pigri:

      root@kitploit:~
      sudo sed -i -r -e "s/^#?NTP=.*$/NTP=pool.ntp.org         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/systemd/timesyncd.conf
      sudo sed -i -r -e "s/^#?FallbackNTP=.*$/FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/systemd/timesyncd.conf
      
    4. Riavvia il servizio per applicare le modifiche:

      root@kitploit:~
      sudo systemctl restart systemd-timesyncd
      
    5. Controlla lo stato della sincronizzazione:

      root@kitploit:~
      timedatectl timesync-status
      
      root@kitploit:~
             Server: 108.61.56.35 (pool.ntp.org)
      Poll interval: 32s (min: 32s; max: 34min 8s)
               Leap: normal
            Version: 4
            Stratum: 2
          Reference: C342F10A
          Precision: 1us (2^0)
       Root distance: 24.054ms (max: 5s)
             Offset: +2.156ms
              Delay: 48.567ms
             Jitter: 1.452ms
       Packet count: 3
      
    Debian 12 (Bookworm) e precedenti: pacchetto ntp

    Nota: Questi passi si applicano solo a Debian 12 e precedenti. Su Debian 13+, il pacchetto ntp non è più disponibile -- usa invece i passi per systemd-timesyncd qui sopra.

    1. Installa ntp.

      Su sistemi basati su Debian:

      root@kitploit:~
      sudo apt install ntp
      
    2. Esegui un backup del file di configurazione del client NTP /etc/ntp.conf:

      root@kitploit:~
      sudo cp --archive /etc/ntp.conf /etc/ntp.conf-COPY-$(date +"%Y%m%d%H%M%S")
      
    3. La configurazione predefinita, almeno su Debian, è già abbastanza sicura. L'unica cosa di cui vogliamo assicurarci è di utilizzare la direttiva pool e non direttive server. La direttiva pool consente al client NTP di smettere di usare un server se non risponde o fornisce un'ora errata. Fallo commentando tutte le direttive server e aggiungendo quanto segue a /etc/ntp.conf.

      root@kitploit:~
      pool pool.ntp.org iburst
      

      Per i pigri:

      root@kitploit:~
      sudo sed -i -r -e "s/^((server|pool).*)/# \1         # commented by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/ntp.conf
      echo -e "\npool pool.ntp.org iburst         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/ntp.conf
      

      Esempio /etc/ntp.conf:

      root@kitploit:~
      driftfile /var/lib/ntp/ntp.drift
      statistics loopstats peerstats clockstats
      filegen loopstats file loopstats type day enable
      filegen peerstats file peerstats type day enable
      filegen clockstats file clockstats type day enable
      restrict -4 default kod notrap nomodify nopeer noquery limited
      restrict -6 default kod notrap nomodify nopeer noquery limited
      restrict 127.0.0.1
      restrict ::1
      restrict source notrap nomodify noquery
      pool pool.ntp.org iburst         # added by user on 2019-03-09 @ 10:23:35
      
    4. Riavvia ntp:

      root@kitploit:~
      sudo service ntp restart
      
    5. Controlla lo stato del servizio ntp:

      root@kitploit:~
      sudo systemctl status ntp
      
      root@kitploit:~
      ● ntp.service - LSB: Start NTP daemon
         Loaded: loaded (/etc/init.d/ntp; generated; vendor preset: enabled)
         Active: active (running) since Sat 2019-03-09 15:19:46 EST; 4s ago
           Docs: man:systemd-sysv-generator(8)
        Process: 1016 ExecStop=/etc/init.d/ntp stop (code=exited, status=0/SUCCESS)
        Process: 1028 ExecStart=/etc/init.d/ntp start (code=exited, status=0/SUCCESS)
          Tasks: 2 (limit: 4915)
         CGroup: /system.slice/ntp.service
                 └─1038 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 108:113
      
      Mar 09 15:19:46 host ntpd[1038]: Listen and drop on 0 v6wildcard [::]:123
      Mar 09 15:19:46 host ntpd[1038]: Listen and drop on 1 v4wildcard 0.0.0.0:123
      Mar 09 15:19:46 host ntpd[1038]: Listen normally on 2 lo 127.0.0.1:123
      Mar 09 15:19:46 host ntpd[1038]: Listen normally on 3 enp0s3 10.10.20.96:123
      Mar 09 15:19:46 host ntpd[1038]: Listen normally on 4 lo [::1]:123
      Mar 09 15:19:46 host ntpd[1038]: Listen normally on 5 enp0s3 [fe80::a00:27ff:feb6:ed8e%2]:123
      Mar 09 15:19:46 host ntpd[1038]: Listening on routing socket on fd #22 for interface updates
      Mar 09 15:19:47 host ntpd[1038]: Soliciting pool server 108.61.56.35
      Mar 09 15:19:48 host ntpd[1038]: Soliciting pool server 69.89.207.199
      Mar 09 15:19:49 host ntpd[1038]: Soliciting pool server 45.79.111.114
      
    6. Controlla lo stato di ntp:

      root@kitploit:~
      sudo ntpq -p
      
      root@kitploit:~
           remote           refid      st t when poll reach   delay   offset  jitter
      ==============================================================================
       pool.ntp.org    .POOL.          16 p    -   64    0    0.000    0.000   0.000
      *lithium.constan 198.30.92.2      2 u    -   64    1   19.900    4.894   3.951
       ntp2.wiktel.com 212.215.1.157    2 u    2   64    1   48.061   -0.431   0.104
      

    (Indice dei contenuti)

    Proteggere /proc

    Perché

    Per citare https://linux-audit.com/linux-system-hardening-adding-hidepid-to-proc/:

    Quando si guarda in /proc si scoprono molti file e directory. Molti di essi sono solo numeri, che rappresentano le informazioni su un particolare ID di processo (PID). Per impostazione predefinita, i sistemi Linux sono configurati per consentire a tutti gli utenti locali di vedere tutte queste informazioni. Ciò include le informazioni sui processi di altri utenti. Potrebbe includere dettagli sensibili che potresti non voler condividere con altri utenti. Applicando alcune modifiche alla configurazione del filesystem, possiamo cambiare questo comportamento e migliorare la sicurezza del sistema.

    Nota: Questo potrebbe rompersi su alcuni sistemi systemd. Vedi https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/37 per maggiori informazioni. Grazie a nlgranger per la condivisione.

    Obiettivi

    • /proc montato con hidepid=2 in modo che gli utenti possano vedere solo le informazioni sui propri processi

    Riferimenti

    • https://linux-audit.com/linux-system-hardening-adding-hidepid-to-proc/
    • https://likegeeks.com/secure-linux-server-hardening-best-practices/#Hardening-proc-Directory
    • https://www.cyberciti.biz/faq/linux-hide-processes-from-other-users/

    Passi

    1. Esegui un backup di /etc/fstab:

      root@kitploit:~
      sudo cp --archive /etc/fstab /etc/fstab-COPY-$(date +"%Y%m%d%H%M%S")
      
    2. Aggiungi questa riga a /etc/fstab per montare /proc con hidepid=2:

      root@kitploit:~
      proc     /proc     proc     defaults,hidepid=2     0     0
      

      Per i pigri:

      root@kitploit:~
      echo -e "\nproc     /proc     proc     defaults,hidepid=2     0     0         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/fstab
      
    3. Riavvia il sistema:

      root@kitploit:~
      sudo reboot now
      

      Nota: In alternativa, puoi rimontare /proc senza riavviare con sudo mount -o remount,hidepid=2 /proc

    (Indice dei contenuti)

    Obbligare gli account a utilizzare password sicure

    Perché

    Per impostazione predefinita, gli account possono usare qualsiasi password desiderino, anche quelle deboli. pwquality/pam_pwquality risolve questa lacuna di sicurezza fornendo "un modo per configurare i requisiti di qualità predefiniti per le password di sistema" e verificando "la loro robustezza rispetto a un dizionario di sistema e a un insieme di regole per identificare scelte scadenti."

    Come funziona

    Su Linux, PAM è responsabile dell'autenticazione. Ci sono quattro compiti di PAM che puoi leggere su https://en.wikipedia.org/wiki/Linux_PAM. Questa sezione parla del compito della password.Quando è necessario impostare o modificare una password di un account, il task delle password di PAM gestisce la richiesta. In questa sezione diremo al task delle password di PAM di passare la nuova password richiesta a libpam-pwquality per assicurarsi che soddisfi i nostri requisiti. Se i requisiti sono soddisfatti, la password viene utilizzata/impostata; altrimenti, viene restituito un errore e l'utente viene informato.

    Obiettivi

    • password robuste imposte

    Passi

    1. Installare libpam-pwquality.

      Su sistemi basati su Debian:

      root@kitploit:~
      sudo apt install libpam-pwquality
      
    2. Fare un backup del file di configurazione delle password di PAM /etc/pam.d/common-password:

      root@kitploit:~
      sudo cp --archive /etc/pam.d/common-password /etc/pam.d/common-password-COPY-$(date +"%Y%m%d%H%M%S")
      
    3. Dire a PAM di usare libpam-pwquality per imporre password robuste modificando il file /etc/pam.d/common-password e cambiare la riga che inizia così:

      root@kitploit:~
      password        requisite                       pam_pwquality.so
      

      a questa:

      root@kitploit:~
      password        requisite                       pam_pwquality.so retry=3 minlen=10 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 maxrepeat=3 gecoschec
      

      Le opzioni sopra sono:

      • retry=3 = richiedere all'utente 3 volte prima di restituire un errore.
      • minlen=10 = la lunghezza minima della password, tenendo conto di eventuali crediti (o debiti) da questi:
        • dcredit=-1 = deve avere almeno una cifra
        • ucredit=-1 = deve avere almeno una lettera maiuscola
        • lcredit=-1 = deve avere almeno una lettera minuscola
        • ocredit=-1 = deve avere almeno un carattere non alfanumerico
      • difok=3 = almeno 3 caratteri della nuova password non devono essere presenti nella vecchia password
      • maxrepeat=3 = consentire un massimo di 3 caratteri ripetuti
      • gecoschec = non consentire password con il nome dell'account

      Per i pigri:

      root@kitploit:~
      sudo sed -i -r -e "s/^(password\s+requisite\s+pam_pwquality.so)(.*)$/# \1\2         # commented by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")\n\1 retry=3 minlen=10 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 maxrepeat=3 gecoschec         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/pam.d/common-password
      

    (Indice dei contenuti)

    Aggiornamenti di Sicurezza Automatici e Avvisi

    Perché

    È importante mantenere un server aggiornato con le ultime patch e aggiornamenti di sicurezza critici. Altrimenti si è a rischio di vulnerabilità di sicurezza note che malintenzionati potrebbero sfruttare per ottenere accesso non autorizzato al server.

    A meno che non si preveda di controllare il server ogni giorno, si vorrà un modo per aggiornare automaticamente il sistema e/o ricevere email sugli aggiornamenti disponibili.

    Non si vogliono fare tutti gli aggiornamenti perché con ogni aggiornamento c'è il rischio di rompere qualcosa. È importante fare gli aggiornamenti critici, ma tutto il resto può aspettare fino a quando non si ha tempo per farlo manualmente.

    Perché no

    Aggiornamenti automatici e non presidiati potrebbero rompere il sistema e potresti non essere vicino al server per ripararlo. Questo sarebbe particolarmente problematico se rompesse l'accesso SSH.

    Note

    • Ogni distribuzione gestisce pacchetti e aggiornamenti in modo diverso. Finora ho solo passaggi per sistemi basati su Debian.
    • Il tuo server avrà bisogno di un modo per inviare email affinché questo funzioni

    Obiettivi

    • Aggiornamenti automatici e non presidiati delle patch di sicurezza critiche
    • Email automatiche per gli aggiornamenti in sospeso rimanenti

    Sistemi Basati su Debian

    Come Funziona

    Su sistemi basati su Debian puoi usare:

    • unattended-upgrades per eseguire automaticamente gli aggiornamenti di sistema desiderati (es. aggiornamenti di sicurezza critici)
    • apt-listchanges per ottenere dettagli sulle modifiche dei pacchetti prima che vengano installati/aggiornati
    • apticron per ricevere email per gli aggiornamenti di pacchetti in sospeso

    Utilizzeremo unattended-upgrades per applicare patch di sicurezza critiche. Possiamo anche applicare aggiornamenti stabili poiché sono già stati testati approfonditamente dalla comunità Debian.

    Riferimenti
    • https://wiki.debian.org/UnattendedUpgrades
    • https://debian-handbook.info/browse/stable/sect.regular-upgrades.html
    • https://blog.sleeplessbeastie.eu/2015/01/02/how-to-perform-unattended-upgrades/
    • https://www.vultr.com/docs/how-to-set-up-unattended-upgrades-on-debian-9-stretch
    • https://github.com/mvo5/unattended-upgrades
    • https://wiki.debian.org/UnattendedUpgrades#apt-listchanges
    • https://www.cyberciti.biz/faq/apt-get-apticron-send-email-upgrades-available/
    • https://www.unixmen.com/how-to-get-email-notifications-for-new-updates-on-debianubuntu/
    • /etc/apt/apt.conf.d/50unattended-upgrades
    Passi
    1. Installare unattended-upgrades, apt-listchanges e apticron:

      root@kitploit:~
      sudo apt install unattended-upgrades apt-listchanges apticron
      
    2. Ora dobbiamo configurare unattended-upgrades per applicare automaticamente gli aggiornamenti. Questo viene solitamente fatto modificando i file /etc/apt/apt.conf.d/20auto-upgrades e /etc/apt/apt.conf.d/50unattended-upgrades creati dai pacchetti. Tuttavia, poiché questi file potrebbero essere sovrascritti in un futuro aggiornamento, creeremo invece un nuovo file. Crea il file /etc/apt/apt.conf.d/51myunattended-upgrades e aggiungi questo:

      root@kitploit:~
      // Enable the update/upgrade script (0=disable)
      APT::Periodic::Enable "1";
      
      // Do "apt-get update" automatically every n-days (0=disable)
      APT::Periodic::Update-Package-Lists "1";
      
      // Do "apt-get upgrade --download-only" every n-days (0=disable)
      APT::Periodic::Download-Upgradeable-Packages "1";
      
      // Do "apt-get autoclean" every n-days (0=disable)
      APT::Periodic::AutocleanInterval "7";
      
      // Send report mail to root
      //     0:  no report             (or null string)
      //     1:  progress report       (actually any string)
      //     2:  + command outputs     (remove -qq, remove 2>/dev/null, add -d)
      //     3:  + trace on    APT::Periodic::Verbose "2";
      APT::Periodic::Unattended-Upgrade "1";
      
      // Automatically upgrade packages from these
      Unattended-Upgrade::Origins-Pattern {
            "o=Debian,a=stable";
            "o=Debian,a=stable-updates";
            "origin=Debian,codename=${distro_codename},label=Debian-Security";
      };
      
      // You can specify your own packages to NOT automatically upgrade here
      Unattended-Upgrade::Package-Blacklist {
      };
      
      // Run dpkg --force-confold --configure -a if a unclean dpkg state is detected to true to ensure that updates get installed even when the system got interrupted during a previous run
      Unattended-Upgrade::AutoFixInterruptedDpkg "true";
      
      //Perform the upgrade when the machine is running because we wont be shutting our server down often
      Unattended-Upgrade::InstallOnShutdown "false";
      
      // Send an email to this address with information about the packages upgraded.
      Unattended-Upgrade::Mail "root";
      
      // Always send an e-mail
      Unattended-Upgrade::MailOnlyOnError "false";
      
      // Remove all unused dependencies after the upgrade has finished
      Unattended-Upgrade::Remove-Unused-Dependencies "true";
      
      // Remove any new unused dependencies after the upgrade has finished
      Unattended-Upgrade::Remove-New-Unused-Dependencies "true";
      
      // Automatically reboot WITHOUT CONFIRMATION if the file /var/run/reboot-required is found after the upgrade.
      Unattended-Upgrade::Automatic-Reboot "true";
      
      // Automatically reboot even if users are logged in.
      Unattended-Upgrade::Automatic-Reboot-WithUsers "true";
      

      Note:

      • Controlla /usr/lib/apt/apt.systemd.daily per dettagli sulle opzioni APT::Periodic
      • Controlla https://github.com/mvo5/unattended-upgrades per dettagli sulle opzioni Unattended-Upgrade
    3. Eseguire una simulazione (dry-run) di unattended-upgrades per assicurarsi che il file di configurazione sia corretto:

      root@kitploit:~
      sudo unattended-upgrade -d --dry-run
      

      Se tutto è a posto, puoi lasciarlo eseguire quando è programmato o forzare un'esecuzione con unattended-upgrade -d.

    4. Configurare apt-listchanges a proprio piacimento:

      root@kitploit:~
      sudo dpkg-reconfigure apt-listchanges
      
    5. Per apticron, le impostazioni predefinite sono sufficienti, ma puoi controllarle in /etc/apticron/apticron.conf se vuoi cambiarle. Ad esempio, la mia configurazione è così:

      root@kitploit:~
      EMAIL="root"
      NOTIFY_NO_UPDATES="1"
      

    (Indice dei contenuti)

    Pool di Entropia Casuale Più Sicuro (WIP)

    Perché

    WIP

    Come Funziona

    WIP

    Obiettivi

    WIP

    Riferimenti

    • Ringraziamenti a branneman per questa idea come presentata in issue #33.
    • https://hackaday.com/2017/11/02/what-is-entropy-and-how-do-i-get-more-of-it/
    • https://www.2uo.de/myths-about-urandom
    • https://www.gnu.org/software/hurd/user/tlecarrour/rng-tools.html
    • https://wiki.archlinux.org/index.php/Rng-tools
    • https://www.howtoforge.com/helping-the-random-number-generator-to-gain-enough-entropy-with-rng-tools-debian-lenny
    • https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security_guide/sect-security_guide-encryption-using_the_random_number_generator

    Passi

    1. Installare rng-tools.

      Su sistemi basati su Debian:

      root@kitploit:~
      sudo apt-get install rng-tools
      
    2. Ora dobbiamo impostare il dispositivo hardware utilizzato per generare numeri casuali aggiungendo questo a /etc/default/rng-tools:

      root@kitploit:~
      HRNGDEVICE=/dev/urandom
      

      Per i pigri:

      root@kitploit:~
      echo "HRNGDEVICE=/dev/urandom" | sudo tee -a /etc/default/rng-tools
      
    3. Riavviare il servizio:

      root@kitploit:~
      sudo systemctl stop rng-tools.service
      sudo systemctl start rng-tools.service
      
    4. Testare la casualità:

      • https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security_guide/sect-security_guide-encryption-using_the_random_number_generator
      • https://wiki.archlinux.org/index.php/Rng-tools

    (Indice dei contenuti)

    Aggiungere un Sistema di Sicurezza per Login con Password di Panico/Secondaria/Falsa

    Perché

    Un buon strumento per aggiungere sicurezza extra alla password, contro attacchi fisici (di persona) metodi di riscatto/rapina/aggressione.

    Come Funziona

    pamduress aggiungerà all'utente X una password secondaria (password di panico). Quando questa password corrisponde, verrà eseguito uno script (questo script farà ciò che vuoi che l'utente faccia quando accede con QUESTA password di panico).

    Esempio pratico e reale: "Un rapinatore invade una casa e ruba il server (contenente backup aziendali IMPORTANTI, ricordi di vita e blablabla). Non esiste alcuna crittografia del disco/avvio. Il rapinatore avvia il server nella sua 'zona sicura' e inizia un attacco di forza bruta. Ha craccato la password locale via SSH con l'utente sudoer 'admin' con successo, sì una password debole, non quella forte/primaria. Avvia una sessione SSH/fisica con quella password craccata debole/di panico con l'utente sudoer 'admin'. Inizia a sentire che il server sembra troppo occupato in meno di 2 minuti fino a bloccarsi.. 'ma che diamine!? riavviamo e continuiamo a rubare info..'.. mi dispiace amico. tutti i dati e il sistema sono stati distrutti.". Conclusione: il rapinatore ha craccato la password fittizia/di panico/secondaria, e con questa password uno script associato cancellerà tutti i file, la configurazione, il sistema, l'avvio e poi inizierà a caricare RAM e CPU per forzare il rapinatore a riavviare il sistema.

    Obiettivi

    Impedire a una persona malintenzionata di accedere alle informazioni del server quando ottiene una password con la forza (aggressione, pistola, riscatto, ...). Ovviamente questo è utile in altre situazioni.

    Riferimenti

    • Ringraziamenti a nuvious per questo strumento
    • Ringraziamenti a hellresistor per questo Lazy-Tool-Script

    Passi

    1. Eseguire questo (Lazy-Tool-Script di hellresistor). ```` bash #!/bin/bash myownscript(){ #######################################################

    ***** EDIT THIS SCRIPT TO YOUR PROPOSES *****#

    cat > "$ScriptFile" <<-EOF #!/bin/bash sudo rm -rf /home

    FINISHED OWN SCRIPT

    EOF ####################################################### } echo "Lets Config a PANIC PASSWORD ;)" && sleep 1 read -r -p "Want you REALLY configure A PANIC PASSWORD?? Write [ OK ] : " PAMDUR if [[ "$PAMDUR" = "OK" ]]; then echo "Lets Config a PANIC USER, PASSWORD and SCRIPT ;)" && sleep 1 while [ -z "$PANICUSR" ] do read -r -p "WRITE a Panic User to your pam-duress user [ root ]: " PANICUSR PANICUSR=${PANICUSR:=root} done if [ -z "$ScriptLoc" ]; then read -r -p "SET Script Directory with FULL PATH [ /root/.duress ]: " ScriptLoc ScriptLoc=${ScriptLoc:=/root/.duress} ScriptFile="$ScriptLoc/PanicScript.sh" fi else echo "NOT Use PAM DURESS aKa Panic Password!!! Bye" exit 1 fi

    sudo apt install -y git build-essential libpam0g-dev libssl-dev

    cd "$HOME" || exit 1 git clone https://github.com/nuvious/pam-duress.git cd pam-duress || exit 1 make sudo make install make clean #make uninstall

    mkdir -p $ScriptLoc sudo mkdir -p /etc/duress.d myownscript duress_sign $ScriptFile chmod -R 500 $ScriptLoc chmod 400 $ScriptLoc/*.sha256 chown -R $PANICUSR $ScriptLoc

    sudo cp --preserve /etc/pam.d/common-auth /etc/pam.d/common-auth.bck

    echo " auth [success=2 default=ignore] pam_unix.so nullok_secure auth [success=1 default=ignore] pam_duress.so auth requisite pam_deny.so auth required pam_permit.so " | sudo tee /etc/pam.d/common-auth

    read -r -p "Press Key to Finish PAM DURESS Script!" exit 0

    root@kitploit:~
    ([Table of Contents](#table-of-contents))
    
    ## La Rete
    
    ### Firewall con UFW (Uncomplicated Firewall)
    
    #### Perché
    
    Chiamatemi paranoico, e non siete obbligati a essere d'accordo, ma voglio negare tutto il traffico in entrata e in uscita dal mio server tranne quello che autorizzo esplicitamente. Perché il mio server dovrebbe inviare traffico in uscita di cui non sono a conoscenza? E perché il traffico esterno dovrebbe tentare di accedere al mio server se non so chi o cosa sia? Quando si parla di buona sicurezza, la mia opinione è di rifiutare/negare per impostazione predefinita e permettere per eccezione.
    
    Ovviamente, se non siete d'accordo, va benissimo e potete configurare UFW secondo le vostre esigenze.
    
    In ogni caso, assicurarsi che solo il traffico che autorizziamo esplicitamente sia compito di un firewall.
    
    #### Come Funziona
    
    Il kernel Linux fornisce capacità per monitorare e controllare il traffico di rete. Queste capacità sono esposte all'utente finale tramite utilità firewall. Su Linux, il firewall più comune è [iptables](https://en.wikipedia.org/wiki/Iptables). Tuttavia, iptables è piuttosto complicato e confusionario (IMHO). È qui che entra in gioco UFW. Pensa a UFW come a un front-end per iptables. Semplifica il processo di gestione delle regole iptables che dicono al kernel Linux cosa fare con il traffico di rete.
    
    **UFW** funziona permettendoti di configurare regole che:
    
    - **consentono** o **negano**
    - traffico **in entrata** o **in uscita**
    - **verso** o **da** porte
    
    Puoi creare regole specificando esplicitamente le porte o con configurazioni applicative che specificano le porte.
    
    #### Obiettivi
    
    - tutto il traffico di rete, in entrata e in uscita, bloccato tranne quelli che autorizziamo esplicitamente
    
    #### Note
    
    - Man mano che installi altri programmi, dovrai abilitare le porte/applicazioni necessarie.
    
    #### Riferimenti
    
    - https://launchpad.net/ufw
    
    #### Passaggi
    
    1. Installa ufw.
    
       Su sistemi basati su Debian:
    
       ``` bash
       sudo apt install ufw
       ```
    
    1. Nega tutto il traffico in uscita:
    
       ``` bash
       sudo ufw default deny outgoing comment 'deny all outgoing traffic'
       ```
    
       > ```
       > Default outgoing policy changed to 'deny'
       > (be sure to update your rules accordingly)
       > ```
    
       Se non siete paranoici come me e non volete negare tutto il traffico in uscita, potete invece consentirlo:
    
       ``` bash
       sudo ufw default allow outgoing comment 'allow all outgoing traffic'
       ```
    
    1. Nega tutto il traffico in entrata:
    
       ``` bash
       sudo ufw default deny incoming comment 'deny all incoming traffic'
       ```
    
    1. Ovviamente vogliamo connessioni SSH in entrata. Usare limit invece di allow negherà automaticamente le connessioni da un indirizzo IP se tenta di avviare 6 o più connessioni entro una finestra di 30 secondi:
    
       ``` bash
       sudo ufw limit in ssh comment 'allow SSH connections in'
       ```
    
       > ```
       > Rules updated
       > Rules updated (v6)
       > ```
    
    1. Consenti traffico aggiuntivo secondo le tue esigenze. Alcuni casi d'uso comuni:
    
       ``` bash
       # allow traffic out to port 53 -- DNS
       sudo ufw allow out 53 comment 'allow DNS calls out'
       
       # allow traffic out to port 123 -- NTP
       sudo ufw allow out 123 comment 'allow NTP out'
    
       # allow traffic out for HTTP, HTTPS, or FTP
       # apt might needs these depending on which sources you're using
       sudo ufw allow out http comment 'allow HTTP traffic out'
       sudo ufw allow out https comment 'allow HTTPS traffic out'
       sudo ufw allow out ftp comment 'allow FTP traffic out'
    
       # allow whois
       sudo ufw allow out whois comment 'allow whois'
       
       # allow mails for status notifications -- choose port according to your provider
       sudo ufw allow out 25 comment 'allow SMTP out'
       sudo ufw allow out 587 comment 'allow SMTP out'
    
       # allow traffic out to port 68 -- the DHCP client
       # you only need this if you're using DHCP
       sudo ufw allow out 67 comment 'allow the DHCP client to update'
       sudo ufw allow out 68 comment 'allow the DHCP client to update'
       ```
       
       **Nota**: Dovrai consentire HTTP/HTTPS per installare pacchetti e molte altre cose.
    
    1. Avvia ufw:
    
       ``` bash
       sudo ufw enable
       ```
    
       > ```
       > Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
       > Firewall is active and enabled on system startup
       > ```
    
    1. Se vuoi vedere lo stato:
    
       ``` bash
       sudo ufw status
       ```
    
       > ```
       > Status: active
       > 
       > To                         Action      From
       > --                         ------      ----
       > 22/tcp                     LIMIT       Anywhere                   # allow SSH connections in
       > 22/tcp (v6)                LIMIT       Anywhere (v6)              # allow SSH connections in
       > 
       > 53                         ALLOW OUT   Anywhere                   # allow DNS calls out
       > 123                        ALLOW OUT   Anywhere                   # allow NTP out
       > 80/tcp                     ALLOW OUT   Anywhere                   # allow HTTP traffic out
       > 443/tcp                    ALLOW OUT   Anywhere                   # allow HTTPS traffic out
       > 21/tcp                     ALLOW OUT   Anywhere                   # allow FTP traffic out
       > Mail submission            ALLOW OUT   Anywhere                   # allow mail out
       > 43/tcp                     ALLOW OUT   Anywhere                   # allow whois
       > 53 (v6)                    ALLOW OUT   Anywhere (v6)              # allow DNS calls out
       > 123 (v6)                   ALLOW OUT   Anywhere (v6)              # allow NTP out
       > 80/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow HTTP traffic out
       > 443/tcp (v6)               ALLOW OUT   Anywhere (v6)              # allow HTTPS traffic out
       > 21/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow FTP traffic out
       > Mail submission (v6)       ALLOW OUT   Anywhere (v6)              # allow mail out
       > 43/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow whois
       > ```
    
       oppure
    
       ``` bash
       sudo ufw status verbose
       ```
    
       > ```
       > Status: active
       > Logging: on (low)
       > Default: deny (incoming), deny (outgoing), disabled (routed)
       > New profiles: skip
       > 
       > To                         Action      From
       > --                         ------      ----
       > 22/tcp                     LIMIT IN    Anywhere                   # allow SSH connections in
       > 22/tcp (v6)                LIMIT IN    Anywhere (v6)              # allow SSH connections in
       > 
       > 53                         ALLOW OUT   Anywhere                   # allow DNS calls out
       > 123                        ALLOW OUT   Anywhere                   # allow NTP out
       > 80/tcp                     ALLOW OUT   Anywhere                   # allow HTTP traffic out
       > 443/tcp                    ALLOW OUT   Anywhere                   # allow HTTPS traffic out
       > 21/tcp                     ALLOW OUT   Anywhere                   # allow FTP traffic out
       > 587/tcp (Mail submission)  ALLOW OUT   Anywhere                   # allow mail out
       > 43/tcp                     ALLOW OUT   Anywhere                   # allow whois
       > 53 (v6)                    ALLOW OUT   Anywhere (v6)              # allow DNS calls out
       > 123 (v6)                   ALLOW OUT   Anywhere (v6)              # allow NTP out
       > 80/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow HTTP traffic out
       > 443/tcp (v6)               ALLOW OUT   Anywhere (v6)              # allow HTTPS traffic out
       > 21/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow FTP traffic out
       > 587/tcp (Mail submission (v6)) ALLOW OUT   Anywhere (v6)              # allow mail out
       > 43/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow whois
       > ```
    
    7. Se hai bisogno di eliminare una regola
       
       ``` bash
       sudo ufw status numbered
       [...]
       sudo ufw delete 3 #line number of the rule you want to delete
       ```
    
    #### Applicazioni Predefinite
    
    ufw include alcune applicazioni predefinite. Puoi vederle con:``` bash
    sudo ufw app list
    ```
    > ```
    > Available applications:
    >   AIM
    >   Bonjour
    >   CIFS
    >   DNS
    >   Deluge
    >   IMAP
    >   IMAPS
    >   IPP
    >   KTorrent
    >   Kerberos Admin
    >   Kerberos Full
    >   Kerberos KDC
    >   Kerberos Password
    >   LDAP
    >   LDAPS
    >   LPD
    >   MSN
    >   MSN SSL
    >   Mail submission
    >   NFS
    >   OpenSSH
    >   POP3
    >   POP3S
    >   PeopleNearby
    >   SMTP
    >   SSH
    >   Socks
    >   Telnet
    >   Transmission
    >   Transparent Proxy
    >   VNC
    >   WWW
    >   WWW Cache
    >   WWW Full
    >   WWW Secure
    >   XMPP
    >   Yahoo
    >   qBittorrent
    >   svnserve
    > ```
    
    Per ottenere dettagli sull'app, come quali porte include, digita:``` bash
    sudo ufw app info [app name]
    ```
    > ``` bash
    > sudo ufw app info DNS
    > ```
    > 
    > ```
    > Profile: DNS
    > Title: Internet Domain Name Server
    > Description: Internet Domain Name Server
    > 
    > Port:
    >   53
    > ```
    
    #### Applicazione Personalizzata
    
    Se non vuoi creare regole fornendo esplicitamente il numero o i numeri di porta, puoi creare le tue configurazioni di applicazione. Per farlo, crea un file in `/etc/ufw/applications.d`.
    
    Ad esempio, ecco cosa useresti per [Plex](https://support.plex.tv/articles/201543147-what-network-ports-do-i-need-to-allow-through-my-firewall/):``` bash
    cat /etc/ufw/applications.d/plexmediaserver
    ```
    > ```
    > [PlexMediaServer]
    > title=Plex Media Server
    > description=This opens up PlexMediaServer for http (32400), upnp, and autodiscovery.
    > ports=32469/tcp|32413/udp|1900/udp|32400/tcp|32412/udp|32410/udp|32414/udp|32400/udp
    > ```
    
    Quindi puoi abilitarlo come qualsiasi altra app:```bash
    sudo ufw allow plexmediaserver
    ```
    ([Table of Contents](#table-of-contents))
    
    ### Rilevamento e Prevenzione delle Intrusioni iptables con PSAD
    
    #### Perché
    
    Anche se hai un firewall per proteggere le tue porte, è possibile tentare di forzare l'ingresso in una qualsiasi delle porte sorvegliate. Vogliamo monitorare tutta l'attività di rete per rilevare potenziali tentativi di intrusione, come tentativi ripetuti di entrare, e bloccarli.
    
    #### Come Funziona
    
    Non posso spiegarlo meglio di quanto abbia fatto l'utente [FINESEC](https://serverfault.com/users/143961/finesec) da https://serverfault.com/ a: https://serverfault.com/a/447604/289829.
    
    > Fail2BAN esamina i file di log di varie applicazioni come Apache, SSH o FTP e banna automaticamente gli IP che mostrano segni malintenzionati come tentativi di accesso automatizzati. PSAD, d'altra parte, esamina i messaggi di log di iptables e ip6tables (tipicamente /var/log/messages) per rilevare e opzionalmente bloccare scansioni e altri tipi di traffico sospetto come tentativi di DDoS o di fingerprinting del sistema operativo. È possibile utilizzare entrambi i programmi contemporaneamente perché operano a livelli diversi.
    
    E, dato che stiamo già usando [UFW](#ufw-uncomplicated-firewall), seguiremo le fantastiche istruzioni di [netson](https://gist.github.com/netson) su https://gist.github.com/netson/c45b2dc4e835761fbccc per far funzionare PSAD con UFW.
    
    #### Riferimenti
    
    - http://www.cipherdyne.org/psad/
    - http://www.cipherdyne.org/psad/docs/config.html
    - https://www.thefanclub.co.za/how-to/how-install-psad-intrusion-detection-ubuntu-1204-lts-server
    - https://serverfault.com/a/447604/289829
    - https://serverfault.com/a/770424/289829
    - https://gist.github.com/netson/c45b2dc4e835761fbccc
    - Grazie a [moltenbit](https://github.com/moltenbit) per aver segnalato il problema ([#61](https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/61)) con `psadwatchd`.
    
    #### Passaggi
    
    1. Installa psad.
    
       Su sistemi basati su Debian:
    
       ``` bash
       sudo apt install psad
       ```
    
    1. Esegui un backup del file di configurazione di psad `/etc/psad/psad.conf`:
    
       ``` bash
       sudo cp --archive /etc/psad/psad.conf /etc/psad/psad.conf-COPY-$(date +"%Y%m%d%H%M%S")
       ```
    
    1. Rivedi e aggiorna le opzioni di configurazione in `/etc/psad/psad.conf`. Presta particolare attenzione a queste:
    
      |Impostazione|Impostato su
      |--|--|
      |[`EMAIL_ADDRESSES`](http://www.cipherdyne.org/psad/docs/config.html#EMAIL_ADDRESSES)|il tuo indirizzo(i) email|
      |`HOSTNAME`|il nome host del tuo server|
      |`EXPECT_TCP_OPTIONS`|`EXPECT_TCP_OPTIONS Y;`|
      |`ENABLE_PSADWATCHD`|`ENABLE_PSADWATCHD Y;`|
      |[`ENABLE_AUTO_IDS`](http://www.cipherdyne.org/psad/docs/config.html#ENABLE_AUTO_IDS)|`ENABLE_AUTO_IDS Y;`|
      |`ENABLE_AUTO_IDS_EMAILS`|`ENABLE_AUTO_IDS_EMAILS Y;`|
    
      Controlla il file di configurazione e la documentazione di psad su http://www.cipherdyne.org/psad/docs/config.html per maggiori dettagli.
    
    1. <a name="psad_step4"></a>Ora dobbiamo apportare alcune modifiche a ufw in modo che funzioni con psad istruendo ufw a registrare tutto il traffico in modo che psad possa analizzarlo. Fallo modificando **due file** e aggiungendo queste righe **alla fine ma prima della riga COMMIT**.
    
       Esegui i backup:
    
       ``` bash
       sudo cp --archive /etc/ufw/before.rules /etc/ufw/before.rules-COPY-$(date +"%Y%m%d%H%M%S")
       sudo cp --archive /etc/ufw/before6.rules /etc/ufw/before6.rules-COPY-$(date +"%Y%m%d%H%M%S")
       ```
    
       Modifica i file:
    
       - `/etc/ufw/before.rules`
       - `/etc/ufw/before6.rules`
    
       E aggiungi questo **alla fine ma prima della riga COMMIT**:
    
       ```
       # log all traffic so psad can analyze
       -A INPUT -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
       -A FORWARD -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
       ```
    
       **Nota**: Stiamo aggiungendo un prefisso di log a tutti i log di iptables. Ne avremo bisogno per [separare i log di iptables in un file separato](#separate-iptables-log-file).
    
       Ad esempio:
    
       > ```
       > ...
       > 
       > # log all traffic so psad can analyze
       > -A INPUT -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
       > -A FORWARD -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
       > 
       > # don't delete the 'COMMIT' line or these rules won't be processed
       > COMMIT
       > ```
    
    1. Ora dobbiamo ricaricare/riavviare ufw e psad affinché le modifiche abbiano effetto:
    
       ``` bash
       sudo ufw reload
    
       sudo psad -R
       sudo psad --sig-update
       sudo psad -H
       ```
    
    1. Analizza le regole iptables per errori:
    
       ``` bash
       sudo psad --fw-analyze
       ```
    
       > ```
       > [+] Parsing INPUT chain rules.
       > [+] Parsing INPUT chain rules.
       > [+] Firewall config looks good.
       > [+] Completed check of firewall ruleset.
       > [+] Results in /var/log/psad/fw_check
       > [+] Exiting.
       > ```
    
       **Nota**: In caso di problemi riceverai un'email con l'errore.
    
    1. Controlla lo stato di psad:
    
       ``` bash
       sudo psad --Status
       ```
    
       > ```
       > [-] psad: pid file /var/run/psad/psadwatchd.pid does not exist for psadwatchd on vm
       > [+] psad_fw_read (pid: 3444)  %CPU: 0.0  %MEM: 2.2
       >     Running since: Sat Feb 16 01:03:09 2019
       > 
       > [+] psad (pid: 3435)  %CPU: 0.2  %MEM: 2.7
       >     Running since: Sat Feb 16 01:03:09 2019
       >     Command line arguments: [none specified]
       >     Alert email address(es): root@localhost
       > 
       > [+] Version: psad v2.4.3
       > 
       > [+] Top 50 signature matches:
       >         [NONE]
       > 
       > [+] Top 25 attackers:
       >         [NONE]
       > 
       > [+] Top 20 scanned ports:
       >         [NONE]
       > 
       > [+] iptables log prefix counters:
       >         [NONE]
       > 
       >     Total protocol packet counters:
       > 
       > [+] IP Status Detail:
       >         [NONE]
       > 
       >     Total scan sources: 0
       >     Total scan destinations: 0
       > 
       > [+] These results are available in: /var/log/psad/status.out
       > ```
    
    ([Table of Contents](#table-of-contents))
    
    ### Rilevamento e Prevenzione delle Intrusioni delle Applicazioni con Fail2Ban
    
    #### Perché
    
    UFW dice al tuo server quali porte chiudere in modo che nessuno possa vederle e quali porte permettere agli utenti autorizzati. PSAD monitora l'attività di rete per rilevare e prevenire potenziali intrusioni - tentativi ripetuti di entrare. Ma che dire delle applicazioni/servizi in esecuzione sul tuo server, come SSH e Apache, per i quali il firewall è configurato per consentire l'accesso? Anche se l'accesso è consentito, non significa che tutti i tentativi di accesso siano validi e innocui. E se qualcuno tentasse di forzare l'ingresso in un'app web in esecuzione sul tuo server? È qui che entra in gioco Fail2ban.
    
    #### Come Funziona
    
    Fail2ban monitora i log delle tue applicazioni (come SSH e Apache) per rilevare e prevenire potenziali intrusioni. Monitorerà il traffico di rete/log e preverrà intrusioni bloccando attività sospette (ad esempio, più tentativi di connessione falliti consecutivi in un breve periodo di tempo).
    
    #### Obiettivi
    
    - monitoraggio della rete per attività sospette con divieto automatico degli IP offensivi.
    
    #### Note
    
    - Al momento, l'unica cosa in esecuzione su questo server è SSH, quindi vorremo che Fail2ban monitori SSH e banni se necessario.
    - Man mano che installi altri programmi, dovrai creare/configurare le jail appropriate e abilitarle.
    
    #### Riferimenti
    
    - https://www.fail2ban.org/
    - https://blog.vigilcode.com/2011/05/ufw-with-fail2ban-quick-secure-setup-part-ii/
    - https://dodwell.us/security/ufw-fail2ban-portscan.html
    - https://www.howtoforge.com/community/threads/fail2ban-and-ufw-on-debian.77261/
    
    #### Passaggi
    
    1. Installa fail2ban.
    
       Su sistemi basati su Debian:
    
       ``` bash
       sudo apt install fail2ban
       ```
    
    1. Non vogliamo modificare `/etc/fail2ban/fail2ban.conf` o `/etc/fail2ban/jail.conf` perché un futuro aggiornamento potrebbe sovrascriverli, quindi creeremo invece una copia locale. Crea il file `/etc/fail2ban/jail.local` e aggiungi questo, dopo aver sostituito `[LAN SEGMENT]` e `[your email]` con i valori appropriati:
    
       ```
       [DEFAULT]
       # the IP address range we want to ignore
       ignoreip = 127.0.0.1/8 [LAN SEGMENT]
    
       # who to send e-mail to
       destemail = [your e-mail]
    
       # who is the email from
       sender = [your e-mail]
    
       # since we're using exim4 to send emails
       mta = mail
    
       # get email alerts
       action = %(action_mwl)s
       ```
    
       **Nota**: Il tuo server dovrà essere in grado di inviare email in modo che Fail2ban possa informarti di attività sospette e quando ha bannato un IP.
    
    1. Dobbiamo creare una jail per SSH che dica a fail2ban di esaminare i log di SSH e usare ufw per bannare/sbannare gli IP secondo necessità. Crea una jail per SSH creando il file `/etc/fail2ban/jail.d/ssh.local` e aggiungendo questo:
    
       ```
       [sshd]
       enabled = true
       banaction = ufw
       port = ssh
       filter = sshd
       logpath = %(sshd_log)s
       maxretry = 5
       ```
    
       [For the lazy](#editing-configuration-files---for-the-lazy):
    
       ``` bash
       cat << EOF | sudo tee /etc/fail2ban/jail.d/ssh.local
       [sshd]
       enabled = true
       banaction = ufw
       port = ssh
       filter = sshd
       logpath = %(sshd_log)s
       maxretry = 5
       EOF
       ```
    
    1. In quanto sopra diciamo a fail2ban di usare ufw come `banaction`. Fail2ban viene fornito con un file di configurazione delle azioni per ufw. Puoi vederlo in `/etc/fail2ban/action.d/ufw.conf`
    
    1. Abilita fail2ban:
    
       ``` bash
       sudo fail2ban-client start
       sudo fail2ban-client reload
       sudo fail2ban-client add sshd # Questo potrebbe fallire su alcuni sistemi se la jail sshd è stata aggiunta per impostazione predefinita
       ```
    
    1. Per controllare lo stato:
    
       ``` bash
       sudo fail2ban-client status
       ```
    
       > ```
       > Status
       > |- Number of jail:      1
       > `- Jail list:   sshd
       > ```
    
       ``` bash
       sudo fail2ban-client status sshd
       ```
    
       > ```
       > Status for the jail: sshd
       > |- Filter
       > |  |- Currently failed: 0
       > |  |- Total failed:     0
       > |  `- File list:        /var/log/auth.log
       > `- Actions
       >    |- Currently banned: 0
       >    |- Total banned:     0
       >    `- Banned IP list:
       > ```
    
    #### Jail Personalizzate
    
    Non ho ancora avuto bisogno di creare una jail personalizzata. Quando lo farò, e capirò come, aggiornerò questa guida. Oppure, se sai come fare, per favore aiuta a [contribuire](#contributing).
    
    #### Sbannare un IP
    
    Per sbannare un IP usa questo comando:``` bash
    fail2ban-client set [jail] unbanip [IP]
    ```
    `[jail]` è il nome della jail che contiene l'IP bannato e `[IP]` è l'indirizzo IP che si desidera sbloccare. Ad esempio, per sbloccare `192.168.1.100` da SSH si farebbe:``` bash
    fail2ban-client set sshd unbanip 192.168.1.100
    ```
    ([Table of Contents](#table-of-contents))
    
    ### Rilevamento e Prevenzione delle Intrusioni Applicative con CrowdSec
    
    #### Perché
    
    UFW dice al tuo server quali porte chiudere in modo che nessuno possa vederle, e quali porte permettere agli utenti autorizzati. PSAD monitora l'attività di rete per rilevare e prevenire potenziali intrusioni: tentativi ripetuti di accesso.
    
    CrowdSec è simile a Fail2Ban in quanto monitora i log delle tue applicazioni (come SSH e Apache) per rilevare e prevenire potenziali intrusioni. Tuttavia, CrowdSec è accoppiato a una comunità che condivide intelligence sulle minacce con CrowdSec per poi distribuire una Community Blocklist a tutti gli utenti.
    
    #### Come Funziona
    
    CrowdSec monitora i log delle tue applicazioni (come SSH e Apache) per rilevare e prevenire potenziali intrusioni. Monitorerà il traffico di rete/log e preverrà le intrusioni bloccando attività sospette (ad esempio, più tentativi di connessione falliti consecutivi in un breve lasso di tempo). Una volta rilevato un IP dannoso, verrà aggiunto alla tua lista di decisioni locale e le informazioni sulla minaccia vengono condivise con CrowdSec per aggiornare la Community Blocklist sugli indirizzi IP dannosi. Una volta che un indirizzo IP raggiunge una certa soglia di attività dannosa, verrà automaticamente propagato a tutti gli altri utenti di CrowdSec per essere bloccato in modo proattivo.
    
    #### Obiettivi
    
    - monitoraggio della rete per attività sospette con ban automatico degli IP offensivi
    
    #### Note
    
    - Al momento, l'unica cosa in esecuzione su questo server è SSH, quindi vogliamo che CrowdSec monitori SSH e banni se necessario.
    - Mentre installi altri programmi, dovrai installare raccolte aggiuntive e configurare le acquisizioni appropriate.
    
    #### Riferimenti
    
    - https://www.crowdsec.net/
    - [Leggi come CrowdSec cura la Community Blocklist](https://www.crowdsec.net/our-data)
    - [Leggi quali intelligence sulle minacce viene condivisa con CrowdSec](https://docs.crowdsec.net/docs/next/central_api/intro#signal-meta-data)
    - https://docs.crowdsec.net/
    
    #### Passi
    
    1. Installa CrowdSec Security Engine. (IDS)
    
       Su qualsiasi distribuzione Linux (inclusi sistemi basati su Debian)
       
       Installa il repository CrowdSec:
       ``` bash
       curl -s https://install.crowdsec.net | sudo sh
       ```
    
       Installa CrowdSec Security Engine:
       ``` bash
       sudo apt install crowdsec
       ```
    
    > [!TIP]
    > se `curl | sh` non fa per te, puoi trovare metodi di installazione aggiuntivi [qui](https://docs.crowdsec.net/u/getting_started/installation/linux).
    
    Per impostazione predefinita, mentre CrowdSec installa il Security Engine rileverà automaticamente le tue applicazioni installate e installerà i parser e gli scenari appropriati per esse. Poiché sappiamo che la maggior parte dei server Linux esegue SSH già pronto, CrowdSec lo configurerà automaticamente per te.
    
    2. Installa un Componente di Remediation. (IPS)
    
       CrowdSec di per sé è un motore di rilevamento, poiché nelle infrastrutture moderne potresti avere un firewall o WAF a monte, CrowdSec non bloccherà gli indirizzi IP da solo. Puoi installare un Componente di Remediation per bloccare gli indirizzi IP rilevati da CrowdSec.
       ```bash
       sudo apt install crowdsec-firewall-bouncer-iptables
       ```
    
    > [!TIP]
    > Se la tua installazione di UFW non utilizza `iptables` come backend, puoi in alternativa installare `crowdsec-firewall-bouncer-nftables`. Non c'è differenza nei binari installati, solo il file di configurazione è diverso.
    
    Per impostazione predefinita, mentre il Componente di Remediation si installa, configurerà automaticamente le impostazioni necessarie per funzionare con il Security Engine se distribuito sullo stesso host (e se il security engine non è in un ambiente container).
    
    3. Verifica che il rilevamento e la remediation funzionino come previsto:
    
       Il pacchetto CrowdSec include uno strumento CLI per verificare lo stato del Security Engine e del Componente di Remediation.
    
       ```bash
       sudo cscli metrics
       ```
    
       ```bash
       Acquisition Metrics:
       ╭────────────────────────┬────────────┬──────────────┬────────────────┬────────────────────────┬───────────────────╮
       │ Source                 │ Lines read │ Lines parsed │ Lines unparsed │ Lines poured to bucket │ Lines whitelisted │
       ├────────────────────────┼────────────┼──────────────┼────────────────┼────────────────────────┼───────────────────┤
       │ file:/var/log/auth.log │ 5          │ 4            │ 1              │ 10                     │ -                 │
       │ file:/var/log/syslog   │ 30         │ -            │ 30             │ -                      │ -                 │
       ╰────────────────────────┴────────────┴──────────────┴────────────────┴────────────────────────┴───────────────────╯
    
       Local API Decisions:
       ╭────────────────────────────────────────────┬────────┬────────┬───────╮
       │ Reason                                     │ Origin │ Action │ Count │
       ├────────────────────────────────────────────┼────────┼────────┼───────┤
       │ crowdsecurity/http-backdoors-attempts      │ CAPI   │ ban    │ 73    │
       │ crowdsecurity/http-bad-user-agent          │ CAPI   │ ban    │ 4836  │
       │ crowdsecurity/http-path-traversal-probing  │ CAPI   │ ban    │ 87    │
       │ crowdsecurity/http-probing                 │ CAPI   │ ban    │ 2010  │
       │ crowdsecurity/thinkphp-cve-2018-20062      │ CAPI   │ ban    │ 88    │
       │ crowdsecurity/CVE-2019-18935               │ CAPI   │ ban    │ 7     │
       │ crowdsecurity/CVE-2023-49103               │ CAPI   │ ban    │ 5     │
       │ crowdsecurity/http-admin-interface-probing │ CAPI   │ ban    │ 91    │
       │ ltsich/http-w00tw00t                       │ CAPI   │ ban    │ 3     │
       │ crowdsecurity/apache_log4j2_cve-2021-44228 │ CAPI   │ ban    │ 18    │
       │ crowdsecurity/nginx-req-limit-exceeded     │ CAPI   │ ban    │ 280   │
       │ crowdsecurity/ssh-slow-bf                  │ CAPI   │ ban    │ 3412  │
       │ crowdsecurity/spring4shell_cve-2022-22965  │ CAPI   │ ban    │ 1     │
       │ crowdsecurity/ssh-cve-2024-6387            │ CAPI   │ ban    │ 24    │
       │ crowdsecurity/CVE-2023-22515               │ CAPI   │ ban    │ 2     │
       │ crowdsecurity/http-cve-2021-41773          │ CAPI   │ ban    │ 172   │
       │ crowdsecurity/netgear_rce                  │ CAPI   │ ban    │ 14    │
       │ crowdsecurity/ssh-bf                       │ CAPI   │ ban    │ 2000  │
       │ crowdsecurity/CVE-2022-35914               │ CAPI   │ ban    │ 1     │
       │ crowdsecurity/http-cve-2021-42013          │ CAPI   │ ban    │ 2     │
       │ crowdsecurity/jira_cve-2021-26086          │ CAPI   │ ban    │ 9     │
       │ crowdsecurity/http-sensitive-files         │ CAPI   │ ban    │ 166   │
       │ crowdsecurity/http-wordpress-scan          │ CAPI   │ ban    │ 272   │
       │ crowdsecurity/CVE-2022-26134               │ CAPI   │ ban    │ 5     │
       │ crowdsecurity/http-generic-bf              │ CAPI   │ ban    │ 7     │
       │ crowdsecurity/http-open-proxy              │ CAPI   │ ban    │ 948   │
       │ crowdsecurity/http-crawl-non_statics       │ CAPI   │ ban    │ 339   │
       │ crowdsecurity/http-cve-probing             │ CAPI   │ ban    │ 5     │
       │ crowdsecurity/CVE-2017-9841                │ CAPI   │ ban    │ 117   │
       │ crowdsecurity/CVE-2022-37042               │ CAPI   │ ban    │ 1     │
       │ crowdsecurity/fortinet-cve-2018-13379      │ CAPI   │ ban    │ 5     │
       ╰────────────────────────────────────────────┴────────┴────────┴───────╯
    
       Local API Metrics:
       ╭──────────────────────┬────────┬──────╮
       │ Route                │ Method │ Hits │
       ├──────────────────────┼────────┼──────┤
       │ /v1/alerts           │ GET    │ 2    │
       │ /v1/decisions/stream │ GET    │ 5    │
       │ /v1/usage-metrics    │ POST   │ 2    │
       │ /v1/watchers/login   │ POST   │ 4    │
       ╰──────────────────────┴────────┴──────╯
    
       Local API Bouncers Metrics:
       ╭────────────────────────────────┬──────────────────────┬────────┬──────╮
       │ Bouncer                        │ Route                │ Method │ Hits │
       ├────────────────────────────────┼──────────────────────┼────────┼──────┤
       │ cs-firewall-bouncer-1729025592 │ /v1/decisions/stream │ GET    │ 5    │
       ╰────────────────────────────────┴──────────────────────┴────────┴──────╯
    
       Local API Machines Metrics:
       ╭──────────────────────────────────────────────────┬────────────┬────────┬──────╮
       │ Machine                                          │ Route      │ Method │ Hits │
       ├──────────────────────────────────────────────────┼────────────┼────────┼──────┤
       │ <your_machine_id_will_be_here>                   │ /v1/alerts │ GET    │ 2    │
       ╰──────────────────────────────────────────────────┴────────────┴────────┴──────╯
    
       Parser Metrics:
       ╭─────────────────────────────────┬──────┬────────┬──────────╮
       │ Parsers                         │ Hits │ Parsed │ Unparsed │
       ├─────────────────────────────────┼──────┼────────┼──────────┤
       │ child-crowdsecurity/sshd-logs   │ 41   │ 4      │ 37       │
       │ child-crowdsecurity/syslog-logs │ 35   │ 35     │ -        │
       │ crowdsecurity/dateparse-enrich  │ 4    │ 4      │ -        │
       │ crowdsecurity/sshd-logs         │ 5    │ 4      │ 1        │
       │ crowdsecurity/syslog-logs       │ 35   │ 35     │ -        │
       ╰─────────────────────────────────┴──────┴────────┴──────────╯
    
       Scenario Metrics:
       ╭─────────────────────────────────────┬───────────────┬───────────┬──────────────┬────────┬─────────╮
       │ Scenario                            │ Current Count │ Overflows │ Instantiated │ Poured │ Expired │
       ├─────────────────────────────────────┼───────────────┼───────────┼──────────────┼────────┼─────────┤
       │ crowdsecurity/ssh-bf                │ 1             │ -         │ 1            │ 4      │ -       │
       │ crowdsecurity/ssh-bf_user-enum      │ 1             │ -         │ 1            │ 1      │ -       │
       │ crowdsecurity/ssh-slow-bf           │ 1             │ -         │ 1            │ 4      │ -       │
       │ crowdsecurity/ssh-slow-bf_user-enum │ 1             │ -         │ 1            │ 1      │ -       │
       ╰─────────────────────────────────────┴───────────────┴───────────┴──────────────┴────────┴─────────╯
       ```
    
    L'output sopra può essere scoraggiante, ma è un buon modo per verificare che il Security Engine stia leggendo i log e che il Componente di Remediation stia bloccando gli indirizzi IP. Quindi una rapida suddivisione di ogni sezione:
    
    - **Acquisition Metrics**: Questa sezione mostra i log che il Security Engine sta leggendo e analizzando. Se vedi log nella colonna `Lines unparsed`, significa che il Security Engine non è in grado di analizzare i log. Ciò potrebbe essere dovuto a una configurazione errata o i log non sono nel formato previsto.
    - **Local API Decisions**: Questa sezione mostra le decisioni che il Security Engine ha nel database. Se vedi log nella colonna `Count`, significa che il Security Engine ha rilevato attività dannosa e ha bloccato l'indirizzo IP.
       - Origin: Da dove proviene la decisione. In questo caso, è dall'API Centrale (CAPI).
    - **Local API Metrics**: Questa sezione mostra il numero di chiamate all'API Locale. Questa è l'API che il Security Engine usa per comunicare con il Componente di Remediation.
    - **Local API Bouncers Metrics**: Questa sezione mostra il numero di chiamate all'API Locale da parte del Componente di Remediation.
    - **Local API Machines Metrics**: Questa sezione mostra il numero di chiamate all'API Locale da parte del Security Engine (se esegui più Security Engine in una configurazione centralizzata, puoi vedere più ID qui).
    - **Parser Metrics**: Questa sezione mostra i parser utilizzati dal Security Engine. Se vedi log nella colonna `Unparsed`, significa che il Security Engine non è in grado di analizzare i log. Ciò potrebbe essere dovuto a una configurazione errata o i log non sono nel formato previsto.
    - **Scenario Metrics**: Questa sezione mostra gli scenari utilizzati dal Security Engine. Se vedi log nella colonna `Current Count`, significa che il Security Engine ha rilevato attività dannosa e sta tracciando l'indirizzo IP.
    
    #### Sbannare un IP
    
    Per sbannare un IP usa questo comando:``` bash
    cscli decisions delete --ip [IP]
    ```
    `[IP]` è l'indirizzo IP che si desidera sbloccare. Ad esempio, per sbloccare `192.168.1.100` da SSH si farebbe:``` bash
    cscli decisions delete --ip 192.168.1.100
    ```
    ## Il Controllo (Auditing)
    
    ### Monitoraggio dell'Integrità di File/Cartelle con AIDE (WIP)
    
    #### Perché
    
    WIP
    
    #### Come Funziona
    
    WIP
    
    #### Obiettivi
    
    WIP
    
    #### Riferimenti
    
    - https://aide.github.io/
    - https://www.hiroom2.com/2017/06/09/debian-8-file-integrity-check-with-aide/
    - https://blog.rapid7.com/2017/06/30/how-to-install-and-configure-aide-on-ubuntu-linux/
    - https://www.stephenrlang.com/2016/03/using-aide-for-file-integrity-monitoring-fim-on-ubuntu/
    - https://www.howtoforge.com/how-to-configure-the-aide-advanced-intrusion-detection-environment-file-integrity-scanner-for-your-website
    - https://www.tecmint.com/check-integrity-of-file-and-directory-using-aide-in-linux/
    - https://www.cyberciti.biz/faq/debian-ubuntu-linux-software-integrity-checking-with-aide/
    - https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/83
    
    #### Passi
    
    1. Installa AIDE.
    
       Su sistemi basati su Debian:
       
       ``` bash
       sudo apt install aide aide-common
       ```
       
    1. Fai una copia di backup del file predefinito di AIDE:
    
       ``` bash
       sudo cp -p /etc/default/aide /etc/default/aide-COPY-$(date +"%Y%m%d%H%M%S")
       ```
    
    1. Esamina `/etc/default/aide` e imposta le impostazioni predefinite di AIDE secondo le tue esigenze. Se desideri che AIDE venga eseguito quotidianamente e ti invii un'email, assicurati di impostare `CRON_DAILY_RUN` su `yes`.
    
    1. Fai una copia di backup dei file di configurazione di AIDE:
    
       ``` bash
       sudo cp -pr /etc/aide /etc/aide-COPY-$(date +"%Y%m%d%H%M%S")
       ```
    
    1. Su sistemi basati su Debian:
    
       - I file di configurazione di AIDE si trovano in `/etc/aide/aide.conf.d/`.
       - Dovrai esaminare la documentazione di AIDE e i file di configurazione per impostarli secondo le tue esigenze.
       - Se desideri nuove impostazioni, ad esempio per monitorare una nuova cartella, dovrai aggiungerle a `/etc/aide/aide.conf` o `/etc/aide/aide.conf.d/`.
       - Fai un backup dei file di configurazione originali: `sudo cp -pr /etc/aide /etc/aide-COPY-$(date +"%Y%m%d%H%M%S")`.
    
    1. Crea un nuovo database e installalo.
      
       Su sistemi basati su Debian:
    
       ``` bash
       sudo aideinit
       ```
       
       > ```
       > Running aide --init...
       > Start timestamp: 2019-04-01 21:23:37 -0400 (AIDE 0.16)
       > AIDE initialized database at /var/lib/aide/aide.db.new
       > Verbose level: 6
       > 
       > Number of entries:      25973
       > 
       > ---------------------------------------------------
       > The attributes of the (uncompressed) database(s):
       > ---------------------------------------------------
       > 
       > /var/lib/aide/aide.db.new
       >   RMD160   : moyQ1YskQQbidX+Lusv3g2wf1gQ=
       >   TIGER    : 7WoOgCrXzSpDrlO6I3PyXPj1gRiaMSeo
       >   SHA256   : gVx8Fp7r3800WF2aeXl+/KHCzfGsNi7O
       >              g16VTPpIfYQ=
       >   SHA512   : GYfa0DJwWgMLl4Goo5VFVOhu4BphXCo3
       >              rZnk49PYztwu50XjaAvsVuTjJY5uIYrG
       >              tV+jt3ELvwFzGefq4ZBNMg==
       >   CRC32    : /cusZw==
       >   HAVAL    : E/i5ceF3YTjwenBfyxHEsy9Kzu35VTf7
       >              CPGQSW4tl14=
       >   GOST     : n5Ityzxey9/1jIs7LMc08SULF1sLBFUc
       >              aMv7Oby604A=
       > 
       > 
       > End timestamp: 2019-04-01 21:24:45 -0400 (run time: 1m 8s)
       > ```
    
    1. Verifica che tutto funzioni senza modifiche.
    
       Su sistemi basati su Debian:
    
       ``` bash
       sudo aide.wrapper --check
       ```
       
       > ```
       > Start timestamp: 2019-04-01 21:24:45 -0400 (AIDE 0.16)
       > AIDE found NO differences between database and filesystem. Looks okay!!
       > Verbose level: 6
       > 
       > Number of entries:      25973
       > 
       > ---------------------------------------------------
       > The attributes of the (uncompressed) database(s):
       > ---------------------------------------------------
       > 
       > /var/lib/aide/aide.db
       >   RMD160   : moyQ1YskQQbidX+Lusv3g2wf1gQ=
       >   TIGER    : 7WoOgCrXzSpDrlO6I3PyXPj1gRiaMSeo
       >   SHA256   : gVx8Fp7r3800WF2aeXl+/KHCzfGsNi7O
       >              g16VTPpIfYQ=
       >   SHA512   : GYfa0DJwWgMLl4Goo5VFVOhu4BphXCo3
       >              rZnk49PYztwu50XjaAvsVuTjJY5uIYrG
       >              tV+jt3ELvwFzGefq4ZBNMg==
       >   CRC32    : /cusZw==
       >   HAVAL    : E/i5ceF3YTjwenBfyxHEsy9Kzu35VTf7
       >              CPGQSW4tl14=
       >   GOST     : n5Ityzxey9/1jIs7LMc08SULF1sLBFUc
       >              aMv7Oby604A=
       > 
       > 
       > End timestamp: 2019-04-01 21:26:03 -0400 (run time: 1m 18s)
       > ```
    
    1. Verifica che tutto funzioni dopo aver apportato alcune modifiche.
    
       Su sistemi basati su Debian:
    
       ``` bash
       sudo touch /etc/test.sh
       sudo touch /root/test.sh
       
       sudo aide.wrapper --check
       
       sudo rm /etc/test.sh
       sudo rm /root/test.sh
       
       sudo aideinit -y -f
       ```
       
       > ```
       > Start timestamp: 2019-04-01 21:37:37 -0400 (AIDE 0.16)
       > AIDE found differences between database and filesystem!!
       > Verbose level: 6
       > 
       > Summary:
       >   Total number of entries:      25972
       >   Added entries:                2
       >   Removed entries:              0
       >   Changed entries:              1
       > 
       > ---------------------------------------------------
       > Added entries:
       > ---------------------------------------------------
       > 
       > f++++++++++++++++: /etc/test.sh
       > f++++++++++++++++: /root/test.sh
       > 
       > ---------------------------------------------------
       > Changed entries:
       > ---------------------------------------------------
       > 
       > d =.... mc.. .. .: /root
       > 
       > ---------------------------------------------------
       > Detailed information about changes:
       > ---------------------------------------------------
       > 
       > Directory: /root
       >   Mtime    : 2019-04-01 21:35:07 -0400        | 2019-04-01 21:37:36 -0400
       >   Ctime    : 2019-04-01 21:35:07 -0400        | 2019-04-01 21:37:36 -0400
       > 
       > 
       > ---------------------------------------------------
       > The attributes of the (uncompressed) database(s):
       > ---------------------------------------------------
       > 
       > /var/lib/aide/aide.db
       >   RMD160   : qF9WmKaf2PptjKnhcr9z4ueCPTY=
       >   TIGER    : zMo7MvvYJcq1hzvTQLPMW7ALeFiyEqv+
       >   SHA256   : LSLLVjjV6r8vlSxlbAbbEsPcQUB48SgP
       >              pdVqEn6ZNbQ=
       >   SHA512   : Qc4U7+ZAWCcitapGhJ1IrXCLGCf1IKZl
       >              02KYL1gaZ0Fm4dc7xLqjiquWDMSEbwzW
       >              oz49NCquqGz5jpMIUy7UxA==
       >   CRC32    : z8ChEA==
       >   HAVAL    : YapzS+/cdDwLj3kHJEq8fufLp3DPKZDg
       >              U12KCSkrO7Y=
       >   GOST     : 74sLV4HkTig+GJhokvxZQm7CJD/NR0mG
       >              6jV7zdt5AXQ=
       > 
       > 
       > End timestamp: 2019-04-01 21:38:50 -0400 (run time: 1m 13s)
       > ```
       
    1. Questo è tutto. Se hai impostato `CRON_DAILY_RUN` su `yes` in `/etc/default/aide`, allora cron eseguirà `/etc/cron.daily/aide` ogni giorno e ti invierà l'output via email.
    
    #### Aggiornamento del Database
    
    Ogni volta che apporti modifiche a file/cartelle monitorati da AIDE, dovrai aggiornare il database per catturare tali modifiche. Per farlo su sistemi basati su Debian:``` bash
    sudo aideinit -y -f
    ```
    ([Table of Contents](#table-of-contents))
    
    ### Scansione Antivirus Con ClamAV (WIP)
    
    #### Perché
    
    WIP
    
    #### Come Funziona
    
    - ClamAV è uno scanner di virus
    - ClamAV-Freshclam è un servizio che mantiene aggiornate le definizioni dei virus
    - ClamAV-Daemon mantiene il processo `clamd` in esecuzione per velocizzare le scansioni
    
    #### Obiettivi
    
    WIP
    
    #### Note
    
    - Queste istruzioni **non** spiegano come abilitare il servizio demone di ClamAV per assicurarsi che `clamd` sia sempre in esecuzione. `clamd` è utile solo se stai gestendo un server di posta e non fornisce monitoraggio in tempo reale dei file. Invece, dovresti scansionare i file manualmente o in modo programmato.
    
    #### Riferimenti
    
    - https://www.clamav.net/documents/installation-on-debian-and-ubuntu-linux-distributions
    - https://wiki.debian.org/ClamAV
    - https://www.osradar.com/install-clamav-debian-9-ubuntu-18/
    - https://www.lisenet.com/2014/automate-clamav-to-perform-daily-system-scan-and-send-email-notifications-on-linux/
    - https://www.howtoforge.com/tutorial/configure-clamav-to-scan-and-notify-virus-and-malware/
    - https://serverfault.com/questions/741299/is-there-a-way-to-keep-clamav-updated-on-debian-8
    - https://askubuntu.com/questions/250290/how-do-i-scan-for-viruses-with-clamav
    - https://ngothang.com/how-to-install-clamav-and-configure-daily-scanning-on-centos/
    
    #### Passaggi
    
    1. Installa ClamAV.
    
       Su sistemi basati su Debian:
    
       ``` bash
       sudo apt install clamav clamav-freshclam clamav-daemon
       ```
    
    1. Crea una copia di backup del file di configurazione di `clamav-freshclam` `/etc/clamav/freshclam.conf`:
    
       ``` bash
       sudo cp --archive /etc/clamav/freshclam.conf /etc/clamav/freshclam.conf-COPY-$(date +"%Y%m%d%H%M%S")
       ```
       
    1. Le impostazioni predefinite di `clamav-freshclam` sono probabilmente sufficienti, ma se desideri modificarle, puoi modificare il file `/etc/clamav/freshclam.conf` o utilizzare `dpkg-reconfigure`:
    
       ``` bash
       sudo dpkg-reconfigure clamav-freshclam
       ```
       
       **Nota**: Le impostazioni predefinite aggiornano le definizioni 24 volte al giorno. Per modificare l'intervallo, controlla l'impostazione `Checks` in `/etc/clamav/freshclam.conf` o usa `dpkg-reconfigure`.
    
    1. Avvia il servizio `clamav-freshclam`:
    
       ``` bash
       sudo service clamav-freshclam start
       ```
       
    1. Puoi verificare che `clamav-freshclam` sia in esecuzione:
    
       ``` bash
       sudo service clamav-freshclam status
       ```
       
       > ```
       > ● clamav-freshclam.service - ClamAV virus database updater
       >    Loaded: loaded (/lib/systemd/system/clamav-freshclam.service; enabled; vendor preset: enabled)   Active: active (running) since Sat 2019-03-16 22:57:07 EDT; 2min 13s ago
       >      Docs: man:freshclam(1)
       >            man:freshclam.conf(5)
       >            https://www.clamav.net/documents
       >  Main PID: 1288 (freshclam)
       >    CGroup: /system.slice/clamav-freshclam.service
       >            └─1288 /usr/bin/freshclam -d --foreground=true
       > 
       > Mar 16 22:57:08 host freshclam[1288]: Sat Mar 16 22:57:08 2019 -> ^Local version: 0.100.2 Recommended version: 0.101.1
       > Mar 16 22:57:08 host freshclam[1288]: Sat Mar 16 22:57:08 2019 -> DON'T PANIC! Read https://www.clamav.net/documents/upgrading-clamav
       > Mar 16 22:57:15 host freshclam[1288]: Sat Mar 16 22:57:15 2019 -> Downloading main.cvd [100%]
       > Mar 16 22:57:38 host freshclam[1288]: Sat Mar 16 22:57:38 2019 -> main.cvd updated (version: 58, sigs: 4566249, f-level: 60, builder: sigmgr)
       > Mar 16 22:57:40 host freshclam[1288]: Sat Mar 16 22:57:40 2019 -> Downloading daily.cvd [100%]
       > Mar 16 22:58:13 host freshclam[1288]: Sat Mar 16 22:58:13 2019 -> daily.cvd updated (version: 25390, sigs: 1520006, f-level: 63, builder: raynman)
       > Mar 16 22:58:14 host freshclam[1288]: Sat Mar 16 22:58:14 2019 -> Downloading bytecode.cvd [100%]
       > Mar 16 22:58:16 host freshclam[1288]: Sat Mar 16 22:58:16 2019 -> bytecode.cvd updated (version: 328, sigs: 94, f-level: 63, builder: neo)
       > Mar 16 22:58:24 host freshclam[1288]: Sat Mar 16 22:58:24 2019 -> Database updated (6086349 signatures) from db.local.clamav.net (IP: 104.16.219.84)
       > Mar 16 22:58:24 host freshclam[1288]: Sat Mar 16 22:58:24 2019 -> ^Clamd was NOT notified: Can't connect to clamd through /var/run/clamav/clamd.ctl: No such file or directory
       > ```
       
       **Nota**: Non preoccuparti per quella riga `Local version`. Controlla https://serverfault.com/questions/741299/is-there-a-way-to-keep-clamav-updated-on-debian-8 per maggiori dettagli.
    
    1. Crea una copia di backup del file di configurazione di `clamav-daemon` `/etc/clamav/clamd.conf`:
    
       ``` bash
       sudo cp --archive /etc/clamav/clamd.conf /etc/clamav/clamd.conf-COPY-$(date +"%Y%m%d%H%M%S")
       ```
       
    1. Puoi modificare le impostazioni di `clamav-daemon` modificando il file `/etc/clamav/clamd.conf` o utilizzando `dpkg-reconfigure`:
    
       ``` bash
       sudo dpkg-reconfigure clamav-daemon
       ```
    
    #### Scansione di File/Cartelle
    
    - Per scansionare file/cartelle usa il programma `clamscan`.
    - `clamscan` viene eseguito con l'utente con cui viene lanciato, quindi necessita dei permessi di lettura per i file/cartelle che sta scansionando.
    - Usare `clamscan` come `root` è pericoloso perché se un file è effettivamente un virus, c'è il rischio che possa sfruttare i privilegi di root.
    - Per scansionare un file: `clamscan /path/to/file`.
    - Per scansionare una directory: `clamscan -r /path/to/folder`.
    - Puoi usare l'opzione `-i` per stampare solo i file infetti.
    - Controlla le pagine man di `clamscan` per altre opzioni.
    
    ([Table of Contents](#table-of-contents))
    
    ### Rilevamento Rootkit Con Rkhunter (WIP)
    
    #### Perché
    
    WIP
    
    #### Come Funziona
    
    WIP
    
    #### Obiettivi
    
    WIP
    
    #### Riferimenti
    
    - http://rkhunter.sourceforge.net/
    - https://www.cyberciti.biz/faq/howto-check-linux-rootkist-with-detectors-software/
    - https://www.tecmint.com/install-rootkit-hunter-scan-for-rootkits-backdoors-in-linux/
    
    #### Passaggi
    
    1. Installa Rkhunter.
    
       Su sistemi basati su Debian:
       
       ``` bash
       sudo apt install rkhunter
       ```
    
    1. Crea un backup del file dei valori predefiniti di rkhunter:
    
       ``` bash
       sudo cp -p /etc/default/rkhunter /etc/default/rkhunter-COPY-$(date +"%Y%m%d%H%M%S")
       ```
    
    1. Il file di configurazione di rkhunter è `/etc/rkhunter.conf`. Invece di apportare modifiche ad esso, crea e usa il file `/etc/rkhunter.conf.local`:
    
       ``` bash
       sudo cp -p /etc/rkhunter.conf /etc/rkhunter.conf.local
       ```
       
    1. Esamina il file di configurazione `/etc/rkhunter.conf.local` e impostalo secondo le tue esigenze. Le mie raccomandazioni:
    
       |Impostazione|Nota|
       |--|--|
       |`UPDATE_MIRRORS=1`||
       |`MIRRORS_MODE=0`||
       |`MAIL-ON-WARNING=root`||
       |`COPY_LOG_ON_ERROR=1`|per salvare una copia del log in caso di errore|
       |`PKGMGR=...`|imposta al valore appropriato secondo la documentazione|
       |`PHALANX2_DIRTEST=1`|leggi la documentazione per capire il perché|
       |`WEB_CMD=""`|questo serve per risolvere un problema con il pacchetto Debian che disabilita la capacità di rkhunter di auto-aggiornarsi.|
       |`USE_LOCKING=1`|per prevenire problemi con l'esecuzione multipla di rkhunter|
       |`SHOW_SUMMARY_WARNINGS_NUMBER=1`|per vedere il numero effettivo di avvisi trovati|
    
    1. Vuoi che rkhunter venga eseguito ogni giorno e ti invii per e-mail il risultato. Puoi scrivere il tuo script o controllare https://www.tecmint.com/install-rootkit-hunter-scan-for-rootkits-backdoors-in-linux/ per un esempio di script cron da usare.
      
       Su sistemi basati su Debian, rkhunter viene fornito con script cron. Per abilitarli controlla `/etc/default/rkhunter` o usa `dpkg-reconfigure` e rispondi `Sì` a tutte le domande:
       
       ``` bash
       sudo dpkg-reconfigure rkhunter
       ```
    
    1. Dopo aver terminato tutte le modifiche, assicurati che tutte le impostazioni siano valide:
    
       ``` bash
       sudo rkhunter -C
       ```
    
    1. Aggiorna rkhunter e il suo database:
    
       ``` bash
       sudo rkhunter --versioncheck
       sudo rkhunter --update
       sudo rkhunter --propupd
       ```
    
    1. Se vuoi eseguire una scansione manuale e vedere l'output:
    
       ``` bash
       sudo rkhunter --check
       ```
    
    ([Table of Contents](#table-of-contents))
    
    ### Rilevamento Rootkit Con chkrootkit (WIP)
    
    #### Perché
    
    WIP
    
    #### Come Funziona
    
    WIP
    
    #### Obiettivi
    
    WIP
    
    #### Riferimenti
    
    - http://www.chkrootkit.org/
    

    Read more

    Scarica lo strumento
    ImpostazioneValori validiEsempioDescrizioneNote
    AllowGroupsnome di un gruppo UNIX localeAllowGroups sshusersgruppo a cui consentire l'accesso SSH
    ClientAliveCountMaxnumeroClientAliveCountMax 3numero massimo di messaggi di keepalive del client inviati senza risposta
    ClientAliveIntervalnumero di secondiClientAliveInterval 15timeout in secondi prima di una richiesta di risposta
    ListenAddresselenco separato da spazi di indirizzi locali
    • ListenAddress 0.0.0.0
    • ListenAddress 192.168.1.100
    indirizzi locali su cui sshd deve ascoltareVedi Issue #1 per dettagli importanti.
    LoginGraceTimenumero di secondiLoginGraceTime 30tempo in secondi prima del timeout del login
    MaxAuthTriesnumeroMaxAuthTries 2numero massimo di tentativi di accesso consentiti
    MaxSessionsnumeroMaxSessions 2numero massimo di sessioni aperte
    MaxStartupsnumeroMaxStartups 2numero massimo di sessioni di login
    PasswordAuthenticationyes o noPasswordAuthentication nose l'accesso con password è consentito
    Portqualsiasi numero di porta aperta/disponibilePort 22porta su cui sshd deve ascoltare

    Controlla man sshd_config per maggiori dettagli su cosa significano queste impostazioni.