[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]

185. Filtri di accesso standard

Il primo punto su cui intervenire per affrontare i problemi di sicurezza di un sistema, è quello del filtro di accesso. Questo compito è svolto fondamentalmente da Login, che può essere configurato in modo differente a seconda dell'organizzazione della propria distribuzione GNU/Linux.

185.1 Configurazione di Login

Il programma che si occupa di controllare chi accede attraverso una console o un terminale al sistema, ovvero Login, potrebbe offrire qualche strumento minimo di configurazione per controllare gli accessi. In generale, se è presente il file /etc/nologin, questo impedisce l'accesso, e il file /etc/securetty stabilisce da quali terminali può accedere l'utente root.

Alcuni tipi di Login permettono di controllare l'accesso degli utenti comuni attraverso la configurazione del file /etc/usertty; altri potrebbero utilizzare la configurazione di /etc/login.access. Qui viene mostrato come si potrebbero utilizzare questi file, quando il programma Login che si ha a disposizione ne prevede l'uso.

Per sapere esattamente come è organizzato il proprio Login, è indispensabile leggere la sua pagina di manuale, login(1), tenendo conto però, che questa potrebbe anche non essere aggiornata.

185.1.1 /etc/usertty

Attraverso il file /etc/usertty è possibile limitare l'accesso degli utenti. Solitamente non viene utilizzato, e la sua mancanza consente a tutti gli utenti del sistema di accedere da dove vogliono, quando vogliono, a parte la restrizione che riguarda l'utente root in base alla configurazione del file /etc/securetty.

In linea di massima, se il programma Login è stato compilato in modo da utilizzarlo, il file /etc/usertty permette di definire l'origine e la fascia oraria attraverso cui ogni utente può accedere.

Il file /etc/usertty può contenere commenti, introdotti dal simbolo # e terminati dalla fine della riga; può contenere righe bianche o vuote, che vengono ignorate. Per il resto, le direttive che può contenere sono raggruppate in tre sezioni possibili, denominate: CLASSES, GROUPS e USERS.

CLASSES | GROUPS | USERS
<elemento>	<origine>...
...

Ognuna della tre sezioni inizia con la parola chiave che la identifica, scritta con tutti i caratteri maiuscoli, come si vede dallo schema sintattico. Le righe seguenti, fino all'indicazione della sezione successiva, rappresentano la definizione di elementi della sezione a cui si abbinano delle origini. In pratica,

<elemento> <origine>...

serve a definire il nome di un elemento riferito alla sezione a cui appartiene, il quale consente l'accesso dalle origini indicate. Tra il nome e l'elenco di origini si possono utilizzare uno o più spazi orizzontali (comprese le tabulazioni); l'elenco dei nomi è separato a sua volta attraverso altri spazi orizzontali.

Un'origine, nel senso degli schemi sintattici mostrati, rappresenta un terminale o un nodo espressi in qualche modo, da cui l'utente, che appartiene in qualche modo a quell'elemento, può accedere. L'origine può contenere anche l'indicazione di una fascia oraria in cui è consentito l'accesso.

La cosa migliore, per cominciare, è mostrare un esempio in cui appare l'uso di tutte le sezioni.

CLASSES
classe_console		tty1 tty2 tty3 tty4 tty5 tty6
classe_locali		@localhost
classe_rete_locale	@.brot.dg @192.168.1.0/255.255.255.0

GROUPS
studenti		classe_rete_locale tty1
prof			classe_console utenti_locali utenti_rete_locale

USERS
tizio			tty1 tty2 tty3
caio			tty4 tty5 tty6
*			classe_rete_locale

L'esempio mostra la sequenza normale nell'indicazione delle sezioni. La prima, CLASSES, permette di definire delle classi, ovvero dei nomi che possono essere richiamati nelle altre sezioni. A fianco di ogni nome di classe viene riportato l'elenco delle origini a cui queste fanno riferimento. Intuitivamente, si intende che la classe utenti_console rappresenta gli accessi provenienti da una qualunque console virtuale, da /dev/tty1 a /dev/tty6; nello stesso modo si può comprendere che la classe classe_rete_locale rappresenta tutti gli accessi provenienti da nodi appartenenti al dominio brot.dg o alla sottorete 192.168.1.*.

La sezione GROUPS permette di definire dei gruppi, secondo quanto riportato nel file /etc/group, e di abbinare agli utenti relativi la possibilità di accedere attraverso origini determinate. Nell'esempio, gli utenti del gruppo studenti possono accedere dagli accessi definiti dalla classe classe_rete_locale, e anche dalla prima console (/dev/tty1).

La sezione USERS permette di definire l'accesso dei singoli utenti. Per esempio, l'utente tizio può accedere solo dalle prime tre console virtuali.

In generale, se un utente ricade all'interno della definizione di un elemento della sezione GROUPS e anche in uno della sezione USERS, le sue possibilità di accesso sono date dall'unione delle due.

All'interno della sezione USERS può apparire un elemento speciale, l'asterisco (*), che rappresenta qualsiasi utente. Seguendo l'esempio, oltre agli accessi concessi esplicitamente, si fa in modo che ogni utente possa accedere da qualunque nodo della rete locale.

A parte la comprensione intuitiva, le origini possono essere espresse in modi differenti, secondo uno degli schemi seguenti.

<classe>

<dispositivo-di-terminale>

@.<dominio>

@<numero-IPv4>/<maschera>

@localhost

Quanto mostrato rappresenta solo una prima approssimazione, e in ogni caso, un'origine può essere espressa da:

  1. il nome di una classe definita precedentemente;

  2. il nome del file di dispositivo del terminale corrispondente, togliendo il percorso /dev/;

  3. un nome di dominio che rappresenta tutti i nodi che gli appartengono;

  4. l'indirizzo di una sottorete, composto dal numero IPv4 e dalla maschera relativa;

  5. la sigla @localhost che rappresenta un accesso proveniente dallo stesso sistema locale.

Tuttavia, l'origine può contenere anche l'indicazione di una fascia oraria in cui quella tale origine fisica (o logica) può avere accesso. Naturalmente, questo vale per tutti i casi visti, escluso le classi, che in realtà servono per definire un gruppo di origini complete.

Una fascia oraria viene indicata davanti a un'origine di quelle elencate fino a questo punto, e la si distingue perché è racchiusa tra parentesi quadre. La fascia oraria può contenere l'indicazione di uno o più giorni della settimana, e di uno o più intervalli orari. La fascia oraria è composta quindi da un elenco di elementi, separati da due punti verticali (:). Si osservi l'esempio seguente:

[mon:tue:wed:thu:fri:8-17:20]

L'esempio rappresenta una fascia oraria corrispondente all'intervallo dalle 8.00 alle 17.59 e dalle 20.00 alle 20.59, di tutti i giorni dal lunedì al venerdì. Intuitivamente si comprende che esiste un'approssimazione obbligata di un'ora per gli intervalli orari, e che non è possibile indicare informazioni sui giorni diversi da un ambito strettamente settimanale.

Una fascia oraria di questo tipo deve contenere almeno un'indicazione di un intervallo orario.

Per un esempio più completo, si osservi il pezzo seguente del file /etc/usertty che rappresenta una sezione USERS. L'utente tizio può accedere dalla prima console virtuale solo il sabato e la domenica dalle 8.00 alle 22.59, e poi, anche dalle origini specificate dalla classe classe_rete_locale, dato che ciò è concesso indistintamente per tutti gli utenti.

USERS
tizio			[sat:sun:8-22]tty1
caio			tty4 tty5 tty6
*			classe_rete_locale

185.1.2 /etc/login.access

Il file /etc/login.access svolge funzioni simili a /etc/usertty. Il suo scopo è quello di definire chi può o non può accedere al sistema, in base all'origine da cui tenta di accedere. A differenza di /etc/usertty, non è possibile definire delle fasce orarie; ma per questo viene in aiuto il file di configurazione /etc/porttime.

Il file /etc/login.access può contenere commenti, preceduti dal simbolo #, righe bianche e righe vuote, e tutte queste righe vengono ignorate. Le direttive del file sono record composti da tre campi separati attraverso il simbolo di due punti (:). Si osservi lo schema sintattico seguente:

<permesso>:<elenco-utenti>:<origini>

Il primo campo può contenere solo i simboli + e -, che indicano rispettivamente la concessione o il rifiuto all'accesso.

+|-:<elenco-utenti>:<origini>

Le direttive vengono lette sequenzialmente nel momento in cui un utente tenta di accedere, e la prima a cui corrisponde l'utente stesso, è quella che viene applicata. Se nessuna direttiva corrisponde, l'accesso viene concesso.

L'elenco degli utenti, è un elenco spaziato di nomi di utente o di gruppo. In generale, viene cercata prima la corrispondenza con il nome dell'utente, e solo dopo si prova con il gruppo. Tuttavia, la corrispondenza con il gruppo avviene solo se l'utente in questione è aggregato esplicitamente al gruppo stesso. Questo significa che se l'utente tizio è abbinato al gruppo lavoro, ma nel file /etc/group questo non è indicato, l'utente in questione non verrà riconosciuto come appartenente a tale gruppo.

Nel secondo campo può apparire anche le parole chiave ALL che in pratica è un jolly che rappresenta tutti gli utenti.

Nel terzo campo si indicano le origini da cui potrebbero provenire i tentativi di accesso; anche in questo caso si tratta di un elenco spaziato. Può trattarsi di:

Nel terzo campo possono apparire anche le parole chiave ALL e LOCAL, che indicano rispettivamente tutte le origini, oppure solo le origini locali (ovvero qualunque stringa che non contenga un punto).

Viene mostrato un esempio descritto attraverso i suoi commenti:

# L'utente root può accedere solo da origini locali.
+:root:LOCAL

# Gli utenti tizio, caio e semproni possono accedere dalle prime
# sei console virtuali, dal nodo locale, e anche da roggen.brot.dg.
+:tizio caio semproni:tty1 tty2 tty3 tty4 tty5 tty6
+:tizio caio semproni:localhost roggen.brot.dg

# Tutte le altre combinazioni di accesso non sono consentite.
-:ALL:ALL

185.1.3 /etc/porttime

Il file di configurazione /etc/porttime completa le funzionalità di /etc/login.access. Il suo utilizzo effettivo dipende da Login, e probabilmente dalla configurazione attraverso /etc/login.defs, descritto nel capitolo 37.

Il file /etc/porttime permette di definire delle combinazioni tra i terminali di accesso e i tempi in cui gli utenti possono accedere. Il file può contenere commenti, preceduti dal simbolo #, righe bianche e righe vuote, e tutte queste righe vengono ignorate. Le direttive del file sono record composti da tre campi separati attraverso il simbolo di due punti (:). Si osservi lo schema sintattico seguente:

<terminale>[, <terminale>]...:<utente>[, <utente>]...:<periodo>[, <periodo>]...

I tre campi consentono l'indicazione di elenchi di elementi, separati attraverso una virgola. Il primo campo rappresenta il nome di uno o più terminali, così come sono identificati dai file di dispositivo (senza il percorso); in particolare, per indicare tutti i terminali, si può usare l'asterisco. Il secondo campo è un elenco di utenti a cui si vuole applicare la direttiva, e anche in questo caso si può usare l'asterisco per indicarli tutti. Il terzo campo indica i periodi di accesso, attraverso una stringa un po' articolata:

<sigle-giorni-settimana><ora-inizio>-<ora-fine>

I giorni della settimana si esprimono attraverso sigle particolari, come si vede nella tabella 185.1; e se necessario si possono unire più sigle assieme.

Sigla Significato
Al Tutti i giorni della settimana.
Wk I giorni dal lunedì al venerdì.
Mo Il lunedì.
Tu Il martedì.
We Il mercoledì.
Th Il giovedì.
Fr Il venerdì.
Sa Il sabato.
Su La domenica.

Tabella 185.1: Elenco delle sigle utilizzabili per identificare i giorni della settimana.

Gli orari si indicano con stringhe di quattro cifre numeriche, dove la prima coppia di cifre rappresenta l'ora e la seconda i minuti. Per esempio,

*:tizio,caio:Wk1630-2400

consente l'accesso da parte degli utenti tizio e caio tutti i giorni dal lunedì al venerdì dalle ore 16:30 alla mezzanotte. L'esempio seguente, invece, consente solo all'utente root di accedere attraverso /dev/console, escludendo tutti gli altri utenti:

console:root:Al0000-2400
console:*:

La prima direttiva per la quale si ottenga corrispondenza tra i primi due campi e l'utente che tenta di accedere, è quella che si applica. Se nel seguito ci fossero direttive più permissive, queste non verrebbero applicate.

L'esempio seguente esclude l'accesso di tutti gli utenti, incluso l'utente root, perché la seconda direttiva non viene presa in considerazione:

*:*:
*:*:Al0000-2400

Infine, l'esempio seguente consente l'accesso all'utente tizio solo nei giorni di lunedì e martedì:

*:tizio:MoTu0000-2400

Per come è stato descritto, questo file di configurazione permette soltanto di impedire gli accessi al di fuori degli orari stabiliti. Per imporre che siano rispettati i tempi, occorre il demone logoutd, descritto nella pagina di manuale logoutd(8), il cui scopo è di sorvegliare in tal senso, imponendo la chiusura delle connessioni quando queste superano gli orari previsti.

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

Appunti Linux 1999.09.21 --- Copyright © 1997-1999 Daniele Giacomini --  daniele @ pluto.linux.it


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]