Capitolo 4. Autenticazione e controllo degli accessi

# Capitolo 4. Autenticazione e controllo degli accessi

Quando una persona (o un programma) richiede l'accesso al sistema, l'autenticazione verifica che l'identità sia fidata.

| Avvertimento
Errori di configurazione di PAM possono lasciare l'utente fuori dal proprio sistema. Si deve avere un CD di ripristino a portata di mano o impostare una partizione di avvio alternativa. Per fare il ripristino, avviare il sistema con uno di essi e correggere le cose da lì.

## 4.1. Autenticazione Unix normale

L'autenticazione Unix normale è fornita dal modulo pam_unix(8) sotto PAM (Pluggable Authentication Modules). I suoi 3 importanti file di configurazione, con voci separate da "`:`", sono i seguenti.

Tabella 4.1. I 3 importanti file di configurazione per pam_unix(8)

file | permessi | utente | gruppo | descrizione
--- | --- | --- | --- | ---
`/etc/passwd` | `-rw-r--r--` | `root` | `root` | informazioni sugli account utente (ripulite)
`/etc/shadow` | `-rw-r-----` | `root` | `shadow` | informazioni sicure sugli account utente
`/etc/group` | `-rw-r--r--` | `root` | `root` | informazioni sui gruppi

"`/etc/passwd`" contiene righe come le seguenti.

     ...
    user1:x:1000:1000:User1 Name,,,:/home/user1:/bin/bash
    user2:x:1001:1001:User2 Name,,,:/home/user2:/bin/bash
     ...

Come spiegato in "passwd(5), le voci separate da "`:` in questo file hanno il significato seguente.

- Nome di login

- Voce di specificazione della password

- ID numerico dell'utente

- ID numerico del gruppo

- Nome dell'utente o campo di commento

- Directory home dell'utente

- Voce opzionale per l'interprete di comandi utente

La seconda voce del file "`/etc/passwd`" era usata per la password cifrata. Dopo l'introduzione di "`/etc/shadow`", questa voce è usata per la specificazione della password.

Tabella 4.2. Il contenuto della seconda voce di "`/etc/passwd`"

contenuto | significato
--- | ---
(vuoto) | account senza password
x | la password cifrata è in "`/etc/shadow`"

"`/etc/shadow`" contiene righe come le seguenti.

     ...
    user1:$1$Xop0FYH9$IfxyQwBe9b8tiyIkt2P4F/:13262:0:99999:7:::
    user2:$1$vXGZLVbS$ElyErNf/agUDsm1DehJMS/:13261:0:99999:7:::
     ...

Come spiegato in "shadow(5), le voci separate da "`:` in questo file hanno il significato seguente.

- Nome di login

- Password cifrata (I caratteri "`$1$`" iniziali indicano l'uso della cifratura MD5. "*" indica nessun login.)

- Data dell'ultimo cambiamento di password, espressa come numero di giorni trascorsi dall'1 gennaio 1970

- Numero di giorni che l'utente deve aspettare prima di essere autorizzato a cambiare nuovamente la password

- Numero di giorni trascorsi i quali l'utente dovrà cambiare la propria password

- Numero di giorni di preavviso per avvisare l'utente che la password è in scadenza

- Numero di giorni dopo che una password è scaduta in cui la password viene sempre accettata

- Data di scadenza dell'account, espressa come numero di giorni trascorsi dall'1 gennaio 1970.

- …

"`/etc/group`" contiene righe come le seguenti.

    group1:x:20:user1,user2

Come spiegato in "group(5), le voci separate da "`:` in questo file hanno il significato seguente.

- Nome del gruppo

- Password cifrata (non realmente usato)

- ID numerico del gruppo

- Elenco di nomi utente separati da ","

| Nota
"`/etc/gshadow`" fornisce funzioni simili a "`/etc/shadow`" per "`/etc/group`", ma non è realmente usato.

| Nota
Può essere dinamicamente aggiunta la reale appartenenza di un utente ad un gruppo se viene aggiunta la riga "`auth optional pam_group.so` al file "`/etc/pam.d/common-auth`" e se viene impostata in "`/etc/security/group.conf`". Vedere pam_group(8).

| Nota
Il pacchetto `base-passwd` contiene una lista autorevole di utenti e gruppi: "`/usr/share/doc/base-passwd/users-and-groups.html`".

## 4.2. Gestire le informazioni su account e password

Quelli che seguono sono alcuni comandi degni di nota per gestire le informazioni sugli account

Tabella 4.3. Elenco di comandi per gestire informazioni su account

comando | funzione
--- | ---
`getent passwd nome_utente` | sfoglia le informazioni sull'account di "`nome_utente`"
`getent shadow nome_utente` | sfoglia le informazioni shadow sull'account di "`nome_utente`"
`getent group nome_gruppo` | sfoglia le informazioni sul gruppo "`nome_gruppo`"
`passwd` | gestisce la password per l'account
`passwd -e` | imposta una password usa e getta per l'attivazione dell'account
`chage` | gestisce le informazioni sulla scadenza della password

Può essere necessario avere i privilegi di root per far funzionare alcune di queste funzioni. Vedere crypt(3) per la cifratura di password e dati.

| Nota
Nei sistemi configurati con PAM e NSS, come la macchina Debian salsa Debian, il contenuto dei file locali "`/etc/passwd`", "`/etc/group`" ed "`/etc/shadow`" può non essere attivamente usato dal sistema. I comandi sopra descritti sono validi anche in un ambiente di questo tipo.

## 4.3. Password buone

Quando si crea un account, durante l'installazione del sistema o con il comando passwd(1), si dovrebbe scegliere una buona password che consiste, secondo passwd(1), di un numero di caratteri da almeno 6 a 8, incluso uno o più caratteri da ciascuno dei seguenti insiemi.

- Lettere dell'alfabeto minuscole

- Cifre da 0 a 9

- Segni di punteggiatura

| Avvertimento
Non scegliere parole indovinabili come password. Il nome dell'account, il codice fiscale, il numero di telefono, l'indirizzo, il giorno del compleanno, il nome di membri della propria famiglia o di animali, parole del dizionario, semplici sequenze di caratteri come "12345" o "qwerty", … sono tutte scelte pessime come password.

## 4.4. Creare password cifrate

Ci sono strumenti indipendenti per generare password cifrate con salt.

Tabella 4.4. Elenco di strumenti per generare password

pacchetto | popcon | dimensione | comando | funzione
--- | --- | --- | --- | ---
`whois` | V:23, I:208 | 384 | `mkpasswd` | frontend ricco di funzionalità per la libreria crypt(3)
`openssl` | V:847, I:996 | 2532 | `openssl passwd` | calcola hash di password (OpenSSL). `passwd`(1ssl)

## 4.5. PAM e NSS

I moderni sistemi *nix come il sistema Debian, forniscono all'amministratore di sistema i meccanismi PAM (Pluggable Authentication Modules) e NSS (Name Service Switch) per configurare il sistema. Il ruolo di questi meccanismi può essere riassunto nel modo seguente.

- PAM offre un meccanismo di autenticazione flessibile usato dal software applicativo e comporta pertanto scambio di dati sulle password

- NSS offre un meccanismo di servizio dei nomi flessibile che è usato di frequente dalla libreria standard C per ottenere i nomi di utenti e gruppi per programmi come ls(1) e id(1).

Questi sistemi PAM e NSS devono essere configurati in modo coerente.

I pacchetti degni di nota relativi ai sistemi PAM e NSS sono i seguenti.

Tabella 4.5. Elenco dei pacchetti degni di nota per i sistemi PAM e NSS

pacchetto | popcon | dimensione | descrizione
--- | --- | --- | ---
`libpam-modules` | V:941, I:1000 | 891 | Pluggable Authentication Modules, moduli di autenticazione inseribili (servizio base)
`libpam-ldapd` | V:7, I:14 | 79 | Pluggable Authentication Module, modulo di autenticazione inseribile, che permette interfacce LDAP
`libpam-systemd` | V:738, I:966 | 777 | Pluggable Authentication Module, modulo di autenticazione inseribile, per registrare sessioni utente per `logind`
`libpam-doc` | I:7.1 | 1491 | Pluggable Authentication Modules, moduli di autenticazione inseribili (documentazione in html e testo semplice)
`libc6` | V:940, I:999 | 5355 | Libreria GNU C: librerie condivise che forniscono anche il servizio "Name Service Switch"
`glibc-doc` | I:5.5 | 3836 | Libreria GNU C: pagine man
`glibc-doc-reference` | I:3.3 | 14261 | Libreria GNU C: manuale di riferimento nei formati info, pdf e html (non-free)
`libnss-mdns` | V:271, I:505 | 142 | Modulo NSS per la risoluzione dei nomi DNS Multicast
`libnss-ldapd` | V:8, I:17 | 131 | Modulo NSS per l'uso di LDAP come servizio per i nomi

- La guida per l'amministratore di sistema di Linux-PAM, "The Linux-PAM System Administrators' Guide", in `libpam-doc` è essenziale per imparare la configurazione di PAM.

- La sezione "System Databases and Name Service Switch" in `glibc-doc-reference` è essenziale per imparare la configurazione di NSS.

| Nota
Si può ottenere un elenco più esteso ed aggiornato usando il comando "`aptitude search 'libpam-|libnss-'`". L'acronimo NSS può anche significare "Network Security Service" che è una cosa diversa da "Name Service Switch".

| Nota
PAM è il metodo più basilare per inizializzare le variabili d'ambiente per ciascun programma con valori predefiniti a livello di sistema.

Con systemd, il pacchetto `libpam-systemd` viene installato per gestire il login degli utenti registrando le sessioni utente nella gerarchia dei gruppi di controllo di `systemd` per logind. Vedere systemd-logind(8), logind.conf(5) e pam_systemd(8).

### 4.5.1. File di configurazione letti da PAM e NSS

Quelli che seguono sono alcuni file degni di nota letti da PAM e NSS.

Tabella 4.6. Elenco di file di configurazione letti da PAM e NSS

file di configurazione | funzione
--- | ---
`/etc/pam.d/nome_programma` | imposta la configurazione PAM per il programma "`nome_programma`"; vedere pam(7) e pam.d(5)
`/etc/nsswitch.conf` | imposta la configurazione NSS con la voce per ciascun servizio. Vedere nsswitch.conf(5)
`/etc/nologin` | limita il login utente con il modulo pam_nologin(8)
`/etc/securetty` | limita la tty per l'accesso root con il modulo pam_securetty(8)
`/etc/security/access.conf` | imposta il limite di accesso con il modulo pam_access(8)
`/etc/security/group.conf` | imposta restrizioni basate su gruppi con il modulo pam_group(8)
`/etc/security/pam_env.conf` | imposta le variabili d'ambiente con il modulo pam_env(8)
`/etc/environment` | imposta variabili d'ambiente aggiuntive con il modulo pam_env(8) con l'argomento "`readenv=1`"
`/etc/default/locale` | imposta la localizzazione con il modulo pam_env(8) con l'argomento "`readenv=1 envfile=/etc/default/locale`" (Debian)
`/etc/security/limits.conf` | imposta limitazioni alle risorse (ulimit, core, …) con il modulo pam_limits(8)
`/etc/security/time.conf` | imposta limitazioni temporali con il modulo pam_time(8)
`/etc/systemd/logind.conf` | imposta la configurazione del gestore di login di `systemd` (vedere logind.conf(5) e systemd-logind.service(8))

Le restrizioni sulla scelta delle password sono implementate dai moduli PAM pam_unix(8) e pam_cracklib(8). Possono essere configurati tramite i loro argomenti.

| Suggerimento
I moduli PAM usano il suffisso "`.so`" nei loro nomi file.

### 4.5.2. La moderna gestione centralizzata del sistema

La moderna gestione centralizzata del sistema può essere messa in atto usando il server del Protocollo LDAP (Lightweight Directory Access Protocol) per amministrare molti sistemi *nix e non *nix in rete. L'implementazione open source del protocollo LDAP è il software OpenLDAP.

Il server LDAP fornisce le informazioni sugli account attraverso l'uso di PAM e NSS con i pacchetti per il sistema Debian `libpam-ldapd` e `libnss-ldapd`. Per abilitare ciò sono necessarie diverse azioni. (Non ho mai usato questa configurazione e le informazioni che seguono sono di seconda mano. Tenerlo a mente quando si legge quanto segue.)

- Si configura un server LDAP centralizzato eseguendo un programma come il demone LDAP autonomo slapd(8).

- Si modificano i file di configurazione di PAM nella directory "`/etc/pam.d/`" per usare "`pam_ldap.so`" invece del predefinito "`pam_unix.so`".

- Si modifica la configurazione di NSS nel file "`/etc/nsswitch.conf`" per usare "`ldap`" invece della scelta predefinita ("`compat`" o "`file`").

- Per la sicurezza delle password è necessario far sì che `libpam-ldapd` usi una connessione SSL (o TLS).

- Per assicurare l'integrità dei dati, si può far sì che `libnss-ldapd` usi una connessione SSL (o TLS) a prezzo di un maggiore carico sulla rete LDAP.

- Si dovrebbe eseguire nscd(8) localmente per mettere nella cache ogni risultato di ricerche LDAP in modo da ridurre il traffico di rete LDAP.

See documentations in nsswitch.conf(5), pam.conf(5), ldap.conf(5), and "`/usr/share/doc/libpam-doc/html/`" offered by the `libpam-doc` package and "`info libc 'Name Service Switch'`" offered by the `glibc-doc` package.

In modo simile si possono impostare sistemi centralizzati alternativi con altri metodi.

- Integrazione di utenti e gruppi con il sistema Windows.

  - Accesso ai servizi di dominio Windows con i pacchetti `winbind` e `libpam_winbind`.

  - Vedere winbindd(8) e Integrare reti MS Windows con Samba.

- Integrazione di utenti e gruppi con sistemi simil-Unix datati

  - Accesso a NIS (chiamato in origine YP) o NIS+ con il pacchetto `nis`.

  - Vedere il Linux NIS(YP)/NYS/NIS+ HOWTO.

### 4.5.3. "Perché GNU su non supporta il gruppo wheel"

Questa è la famosa sezione scritta da Richard M. Stallman, alla fine della vecchia pagina "`info su`. Non c'è da preoccuparsi: l'attuale comando `su` in Debian usa PAM, perciò questo può limitare la possibilità di usare `su` verso il gruppo `root` abilitando la riga con "`pam_wheel.so`" in "`/etc/pam.d/su`".

### 4.5.4. Regole più stringenti per le password

L'installazione del pacchetto `libpam-cracklib` permette di imporre regole più stringenti sulle password.

In un sistema GNOME tipico che installa automaticamente `libpam-gnome-keyring`, "`/etc/pam.d/common-password`" è simile a:

    # here are the per-package modules (the "Primary" block)
    password	requisite			pam_cracklib.so retry=3 minlen=8 difok=3
    password	[success=1 default=ignore]	pam_unix.so obscure use_authtok try_first_pass yescrypt
    # here's the fallback if no module succeeds
    password	requisite			pam_deny.so
    # prime the stack with a positive return value if there isn't one already;
    # this avoids us returning an error just because nothing sets a success code
    # since the modules above will each just jump around
    password	required			pam_permit.so
    # and here are more per-package modules (the "Additional" block)
    password	optional	pam_gnome_keyring.so
    # end of pam-auth-update config

## 4.6. Sicurezza dell'autenticazione

| Nota
Le informazioni fornite in questo documento potrebbero non essere sufficienti per le proprie necessità di sicurezza ma dovrebbero essere un buon punto di partenza.

### 4.6.1. Password sicure in Internet

Molti servizi per livello di trasporto popolari comunicano i loro messaggi, compresa l'autenticazione con password, in puro testo. È una pessima idea trasmettere password in puro testo attraverso l'Internet selvaggia dove possono essere intercettate. Si possono eseguire questi servizi attraverso "TLS" (Transport Layer Security, sicurezza del livello di trasporto), o il suo predecessore "SSL" (Secure Sockets Layer, livello per socket sicuri), per rendere sicura tramite cifratura tutta la comunicazione, compresa la password.

Tabella 4.7. Elenco di servizi e porte sicuri e non sicuri

nome del servizio non sicuro | porta | nome del servizio sicuro | porta
--- | --- | --- | ---
www (http) | 80 | https | 443
smtp (posta) | 25 | ssmtp (smtps) | 465
ftp-data | 20 | ftps-data | 989
ftp | 21 | ftps | 990
telnet | 23 | telnets | 992
imap2 | 143 | imaps | 993
pop3 | 110 | pop3s | 995
ldap | 389 | ldaps | 636

La cifratura ha un costo in termini di tempo CPU. Come alternativa leggera per la CPU, si può mantenere la comunicazione in testo semplice, rendendo allo stesso tempo sicura la sola password con un protocollo di autenticazione sicura come "APOP" (Authenticated Post Office Protocol) per POP e "CRAMD-MD5" (Challenge-Response Authentication Mechanism MD5) per SMTP e IMAP. (Per inviare messaggi di posta elettronica via Internet dal proprio programma di posta al proprio server di posta è diventato popolare recentemente l'uso per SMTP della porta 587 invece della porta tradizionale 25, per evitare il blocco da parte del fornitore del servizio Internet della porta 25 autenticandosi allo stesso tempo con CRAM-MD5.)

### 4.6.2. Secure Shell, shell sicura

Il programma Secure Shell (SSH fornisce comunicazioni sicure cifrate tra due host non fidati attraverso una rete non sicura, grazie ad un'autenticazione sicura. Consiste del client OpenSSH, ssh(1) e del demone OpenSSH, sshd(8). SSH può essere usato per fare da tunnel sicuro attraverso Internet per le comunicazioni con protocollo non sicuro come POP ed X, con la funzionalità di inoltro delle porte.

Il client cerca di autenticarsi usando un'autenticazione basata sull'host, su una chiave pubblica, challenge-response o con password. L'uso di un'autenticazione con chiave pubblica permette il login remoto senza password. Vedere Sezione 6.3, «Il server e le utilità per l'accesso remoto (SSH)».

### 4.6.3. Misure aggiuntive di sicurezza per Internet

Anche quando si eseguono servizi sicuri, come server SSH (Secure shell) e PPTP (Point-to-Point Tunneling Protocol), esiste sempre la possibilità di un'intrusione da Internet con attacchi basati sull'indovinare la password usando metodi con forza bruta, ecc. L'uso di una politica di firewall (vedere Sezione 5.7, «Infrastruttura netfilter») insieme agli strumenti di sicurezza elencati in seguito, può migliorare la sicurezza generale.

Tabella 4.8. Elenco di strumenti per fornire misure aggiuntive di sicurezza

pacchetto | popcon | dimensione | descrizione
--- | --- | --- | ---
`knockd` | V:0.7, I:1.7 | 110 | demone, knockd(1), e client, knock(1) piccoli per bussare alle porte
`fail2ban` | V:101, I:111 | 2192 | strumento per interdire IP che causano errori di autenticazione multipli
`libpam-shield` | V:0.05, I:0.06 | 115 | blocca all'esterno gli attacchi remoti che cercano di indovinare le password

### 4.6.4. Rendere sicura la password di root

Per impedire che qualcuno possa accedere alla propria macchina con privilegi di root, è necessario compiere le azioni seguenti.

- Prevent physical access to the system storage device (HDD / SSD / ...)

- Bloccare UEFI/BIOS ed impedire l'avvio da supporti removibili

- Impostare una password per la sessione interattiva di GRUB

- Bloccare il menu di GRUB impedendo i cambiamenti

With physical access to the system storage device, resetting the password is relatively easy with following steps.

1. Move the system storage device to a PC with USB bootable UEFI/BIOS.

2. Boot system with a rescue media (see Sezione 3.2.2, «Linux live rescue system on USB»).

3. Montare la partizione root con accesso in lettura e scrittura

4. Modificare il file "`/etc/passwd`" nella partizione root e rendere la seconda voce per l'account di `root` vuota.

Se si ha l'accesso in modifica alle voci di menu di GRUB (vedere Sezione 3.1.2, «Stadio 2: il bootloader») per `grub-rescue-pc` all'avvio, è ancora più semplice, seguendo i passi seguenti.

1. Avviare il sistema con i parametri del kernel modificati in qualcosa del tipo "`root=/dev/sda6 rw init=/bin/sh`".

2. Modificare il file "`/etc/passwd`" e rendere la seconda voce per l'account di `root` vuota.

3. Riavviare il sistema.

Si può ora accedere alla shell di root del sistema senza password.

| Nota

Una volta ottenuto l'accesso alla shell di root, si ha l'accesso a qualsiasi cosa sul sistema e si può reimpostare qualsiasi password. Inoltre, si possono compromettere le password per tutti gli account utente usando strumenti di violazione delle password con attacchi a forza bruta, come quelli nei pacchetti `john` e `crack` (vedere Sezione 9.5.10, «Verifica della sicurezza e dell'integrità del sistema»). Queste password violate possono portare alla compromissione di altri sistemi.

L'unica soluzione software ragionevole per evitare tutte queste preoccupazioni è l'uso di una partizione root (o partizione "`/etc`") cifrata, usando dm-crypt e initramfs (vedere Sezione 9.9, «Suggerimenti per la cifratura dei dati»). Tuttavia è sempre necessaria la password per avviare il sistema.

## 4.7. Altri controlli sugli accessi

Esistono controlli degli accessi al sistema diversi dall'autenticazione basata su password e dei permessi dei file.

| Nota
Vedere Sezione 9.4.16, «Tasto Alt-SysRq» per limitare la funzionalità SAK (Secure Attention Key) del kernel.

### 4.7.1. ACL (Access Control List, liste di controllo degli accessi)

Le ACL sono un sovrainsieme dei permessi regolari, come spiegato in Sezione 1.2.3, «Permessi del file system».

Si trovano le ACL in funzione negli ambienti desktop moderni. Quando un dispositivo di archiviazione USB formattato viene montato automaticamente, ad esempio come "`/media/penguin/USBSTICK`", un normale utente `penguin` può eseguire:

     $ cd /media/penguin
     $ ls -la
    total 16
    drwxr-x---+ 1 root    root    16 Jan 17 22:55 .
    drwxr-xr-x  1 root    root    28 Sep 17 19:03 ..
    drwxr-xr-x  1 penguin penguin 18 Jan  6 07:05 USBSTICK

"`+`" in the 11th column indicates ACLs are in action. Without ACLs, a normal user `penguin` shouldn't be able to list like this since `penguin` isn't in `root` group. You can see ACLs as:

     $ getfacl .
    # file: .
    # owner: root
    # group: root
    user::rwx
    user:penguin:r-x
    group::---
    mask::r-x
    other::---

Qui:

- "`user::rwx`", "`group::---`", e "`other::---`" corrispondono ai regolari permessi per proprietario, gruppo e altri.

- La ACL "`user:penguin:r-x`" permette a un normale utente `penguin` di avere permessi "`r-x`". Ciò ha permesso a "`ls -la`" di elencare il contenuto della directory.

- La ACL "`mask::r-x`" imposta il limite in alto per i permessi.

Vedere "Liste di controllo degli accessi POSIX in Linux", acl(5), getfacl(1) e setfacl(1) per maggiori informazioni.

### 4.7.2. sudo

sudo(8) è un programma progettato per permettere ad un amministratore di sistema di dare privilegi di root limitati ad utenti, e di registrare l'attività come root. `sudo` richiede solo la password di un utente regolare. Installare il pacchetto `sudo` e attivarlo impostando le opzioni in "`/etc/sudoers`". Vedere esempi di configurazione in "`/usr/share/doc/sudo/examples/sudoers`" e Sezione 1.1.12, «Configurazione di sudo».

Il mio uso di `sudo` per un sistema con un singolo utente (vedere Sezione 1.1.12, «Configurazione di sudo») è mirato a proteggere me stesso dalla mia stupidità. Personalmente condidero l'uso di `sudo` come un'alternativa migliore all'uso costante del sistema dall'account root. Per esempio, il comando seguente cambia il proprietario di "`un_certo_file`" in "`mio_nome`".

    $ sudo chown my_name some_file

Naturalmente se si conosce la password di root (come accade per ogni utente Debian che ha installato il proprio sistema), qualsiasi comando può essere eseguito come utente root da qualsiasi account utente usando "`su -c`".

### 4.7.3. PolicyKit

PolicyKit è un componente del sistema operativo per controllare privilegi a livello di sistema in sistemi operativi simil-Unix.

Le applicazioni GUI più recenti non sono pensate per essere eseguite come processi privilegiati. Per effettuare operazioni amministrative comunicano con processi privilegiati attraverso PolicyKit.

PolicyKit limita tali operazioni agli account utente che appartengono al gruppo `sudo`, in sistemi Debian.

Vedere polkit(8).

### 4.7.4. Limitare l'accesso ad alcuni servizi server

Per la sicurezza del sistema è una buona idea disabilitare il maggior numero di programmi server possibile. Questo aspetto diventa critico per i server di rete. Avere server inutilizzati, attivati direttamente come demoni o attraverso un programma super-server, è considerato un rischio per la sicurezza.

Molti programmi, come sshd(8), usano un controllo degli accessi basato su PAM. Ci sono molti modi per limitare gli accessi ad un qualche servizio server.

- file di configurazione: "`/etc/default/nome_programma`"

- configurazione dell'unità di servizio di systemd per il demone

- PAM (Pluggable Authentication Modules)

- "`/etc/inetd.conf`" per il super-server

- "`/etc/hosts.deny`" e "`/etc/hosts.allow`" per il wrapper TCP, tcpd(8)

- "`/etc/rpc.conf`" per Sun RPC

- "`/etc/at.allow`" e "`/etc/at.deny`" per atd(8)

- "`/etc/cron.allow`" e "`/etc/cron.deny`" per crontab(1)

- il firewall di rete della infrastruttura netfilter

Vedere Sezione 3.6, «Gestione del sistema», Sezione 4.5.1, «File di configurazione letti da PAM e NSS» e Sezione 5.7, «Infrastruttura netfilter».

| Suggerimento
I servizi Sun RPC devono essere attivi per i programmi NFS ed altri programmi basati su RPC.

| Suggerimento
Se si hanno problemi con l'accesso remoto in sistemi Debian recenti, commentare la configurazione responsabile come "`ALL: PARANOID`" in "`/etc/hosts.deny`", se esiste. (Essere però consapevoli dei rischi per la sicurezza che questo tipo di azione comporta.)

### 4.7.5. Funzionalità di sicurezza di Linux

Il kernel Linux si è evoluto e gestisce funzionalità di sicurezza che non sono presenti nelle implementazioni UNIX tradizionali.

Linux gestisce gli attributi estesi che estendono gli attributi UNIX tradizionali (vedere xattr(7)).

Linux divide i privilegi tradizionalmente associati con il superutente in unità distinte, note come capabilities(7), che possono essere abilitate e disabilitate in modo indipendente. Le capabilities sono un attributo per singolo thread a partire dalla versione 2.2 del kernel.

L'infrastruttura Linux Security Module (LSM) fornisce un meccanismo per vari controlli di sicurezza in modo che nuove estensioni del kernel si aggancino ad essi. Per esempio:

- AppArmor

- Security-Enhanced Linux (SELinux)

- Smack (Simplified Mandatory Access Control Kernel)

- Tomoyo Linux

Dato che queste estensioni possono restringere il modello dei privilegi in modo più stringente delle politiche del normale modello di sicurezza in stile Unix, anche i poteri di root possono essere ristretti. È consigliato leggere la documentazione dell'infrastruttura Linux Security Module (LSM) su kernel.org.

Gli spazi dei nomi Linux creano un involucro (wrap) per una risorsa di sistema globale come astrazione che fa sembrare ai processi all'interno dello spazio dei nomi di avere una propria istanza isolata della risorsa globale. Le modifiche alla risorsa globale sono visibile agli altri processi che sono membri dello spazio dei nomi, ma sono invisibili agli altri processi. A partire dalla versione 5.6 del kernel, ci sono 8 tipi di spazi dei nomi (vedere namespaces(7), unshare(1), nsenter(1)).

In Debian 11 Bullseye (2021) Debian usa la gerarchia cgroup unificata (alias cgroups-v2).

Esempi di uso di spazi dei nomi con cgroups per isolare i loro processi e permettere il controllo delle risorse sono:

- Systemd. Vedere Sezione 3.3.1, «Init systemd».

- Ambiente sandbox. Vedere Sezione 7.7, «Sandbox».

- Contenitori Linux come Docker, LXC. Vedere Sezione 9.11, «Sistema virtualizzato».

Queste funzionalità non possono essere realizzate con Sezione 4.1, «Autenticazione Unix normale». Questi argomenti avanzati sono per lo più al di fuori di questo documento introduttivo.

Capitolo 3. Inizializzazione del sistema |  | Capitolo 5. Impostazione della rete