Ricerca nel sito web

5 nuove funzionalità sudo che gli amministratori di sistema devono conoscere nel 2022


Le recenti versioni di sudo hanno aggiunto nuove funzionalità che ti consentono di osservare e controllare aree problematiche precedentemente nascoste.

Quando vuoi concedere l'accesso amministrativo ad alcuni dei tuoi utenti mentre controlli e controlli cosa fanno sui tuoi sistemi, usi sudo. Tuttavia, anche con sudo, ci sono alcuni problemi invisibili: basti pensare a concedere l'accesso alla shell. I recenti rilasci di sudo hanno aggiunto funzionalità che ti consentono di vedere questi problemi e persino di controllarli. Ad esempio, puoi attivare messaggi di registro più dettagliati e più facili da elaborare e registrare ogni comando eseguito in una sessione di shell.

Alcune di queste funzionalità sono nuove di zecca. Alcuni di essi si basano su funzionalità introdotte nella versione 1.9.0 o anche precedenti. Ad esempio, sudo potrebbe registrare tutto ciò che accade su un terminale, anche nella versione 1.8. Tuttavia, il sistema memorizzava queste registrazioni localmente ed erano facili da eliminare, soprattutto quelle in cui le registrazioni erano più utili: le sessioni Shell. La versione 1.9.0 ha aggiunto la raccolta di registrazioni della sessione centrale, quindi le registrazioni non possono essere cancellate dall'utente locale, e le versioni recenti hanno aggiunto relè, rendendo la raccolta ancora più solida.

Se conosci solo le basi di sudo o hai utilizzato solo la versione 1.8 in precedenza, ti consiglio di leggere il mio articolo precedente.

1. Registrazione in formato JSON

La prima nuova funzionalità che desidero introdurre è la registrazione in formato JSON. Sono un fanatico del logging (ho iniziato a lavorare sul progetto syslog-ng dodici anni fa), e questa funzionalità è la prima introdotta dopo il mio articolo su Opensource.com. Quando abilitato, sudo registra molte più informazioni e lo fa in un modo più semplice da analizzare.

I tradizionali messaggi syslog di sudo sono brevi e contengono solo la quantità minima di informazioni necessarie. Ciò è dovuto ai vincoli delle vecchie implementazioni syslog: i messaggi di dimensioni superiori a 1k venivano scartati o troncati:

Jan 28 13:56:27 localhost.localdomain sudo[10419]: czanik : TTY=pts/0 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash

Le implementazioni syslog più recenti possono gestire dimensioni dei messaggi molto più grandi. syslog-ng accetta per impostazione predefinita messaggi di log fino a 64k di dimensione (ma ovviamente può essere più piccolo o più grande, a seconda della configurazione effettiva).

Lo stesso evento contiene molte più informazioni se registrato in formato JSON. Di più non significa più difficile da gestire: i messaggi in formato JSON sono più facili da analizzare da molte applicazioni software di gestione dei log. Ecco un esempio:

Jan 28 13:58:20 localhost.localdomain sudo[10518]: @cee:{"sudo":{"accept":{"uuid":"616bc9efcf-b239-469d-60ee-deb5af8ce6","server_time":{"seconds":1643374700,"nanoseconds":222446715,"iso8601":"20220128125820Z","localtime":"Jan 28 13:58:20"},"submit_time":{"seconds":1643374700,"nanoseconds":209935349,"iso8601":"20220128125820Z","localtime":"Jan 28 13:58:20"},"submituser":"czanik","command":"/bin/bash","runuser":"root","runcwd":"/home/czanik","ttyname":"/dev/pts/0","submithost":"localhost.localdomain","submitcwd":"/home/czanik","runuid":0,"columns":118,"lines":60,"runargv":["/bin/bash"],"runenv":["LANG=en_US.UTF-8","HOSTNAME=localhost.localdomain","SHELL=/bin/bash","TERM=xterm-256color","PATH=/home/czanik/.local/bin:/home/czanik/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin","MAIL=/var/mail/root","LOGNAME=root","USER=root","HOME=/root","SUDO_COMMAND=/bin/bash","SUDO_USER=czanik","SUDO_UID=1000","SUDO_GID=1000"]}}}

Puoi abilitare i messaggi di log in formato JSON nel file sudoers:

Defaults log_format=json

Puoi scoprire di più su come lavorare con i messaggi di log in formato JSON da sudo nel mio blog syslog-ng.

2. Raccolta dei log centralmente utilizzando sudo_logsrvd

Un'altra funzionalità relativa alla registrazione nella versione 1.9.4 è la raccolta di tutti i messaggi di registro sudo (inclusi gli errori) utilizzando sudo_logsrvd. In precedenza, il sistema registrava solo le sessioni riuscite quando sudo_logsrvd effettuava effettivamente una registrazione. Alla fine, la registrazione viene comunque eseguita tramite syslog per impostazione predefinita.

Perché questo è importante? Prima di tutto, puoi raccogliere tutto ciò che riguarda sudo in un unico posto: sia le registrazioni della sessione che tutti i messaggi di registro corrispondenti. In secondo luogo, può anche garantire la corretta registrazione di tutti gli eventi relativi a sudo, poiché sudo può rifiutarsi di eseguire i comandi se sudo_logsrvd è inaccessibile.

Puoi abilitare la registrazione su sudo_logsrvd con la seguente impostazione nel file sudoers (ovviamente, sostituisci l'indirizzo IP):

Defaults log_servers=172.16.167.150

Se desideri messaggi di log in formato JSON, hai bisogno della seguente impostazione nella sezione [eventlog] della configurazione sudo_logsrvd:

log_format = json

Altrimenti, sudo_logsrvd utilizza il tradizionale formato di registro sudo con una semplice modifica: include anche informazioni sull'host da cui proviene il registro:

Nov 18 12:40:16 centos8splunk.localdomain sudo[21028]:   czanik : 3 incorrect password attempts ; HOST=centos7sudo.localdomain ; TTY=pts/0 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash
Nov 18 12:40:23 centos8splunk.localdomain sudo[21028]:   czanik : HOST=centos7sudo.localdomain ; TTY=pts/0 ; PWD=/home/czanik ; USER=root ; TSID=00000A ; COMMAND=/bin/bash
Nov 18 12:40:30 centos8splunk.localdomain sudo[21028]:   czanik : command rejected by I/O plugin ; HOST=centos7sudo.localdomain ; TTY=pts/0 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash

3. Relè

Quando originariamente introdussero sudo_logsrvd (versione 1.9.0) per la raccolta delle registrazioni della sessione centrale, i client potevano solo inviare direttamente le registrazioni. La versione 1.9.7 ha introdotto il concetto di relè. Con i relè, invece di inviare direttamente le registrazioni, puoi inviare le registrazioni a più livelli di host intermedi, che strutturano la tua rete.

Perché questo è importante? Innanzitutto, i relè consentono di raccogliere le registrazioni delle sessioni anche se l'host centrale non è disponibile a causa di problemi di rete o manutenzione. Per impostazione predefinita, sudo rifiuta di essere eseguito quando non può inviare registrazioni, quindi i relè possono garantire che tu possa utilizzare sudo 24 ore su 24.

In secondo luogo, ti consente anche di avere controlli più severi sulla tua rete: invece di aprire il firewall per tutti gli host al sudo_logsrvd centrale, devi solo consentire il passaggio del tuo relè.

Infine, ti consente di raccogliere registrazioni di sessioni da reti senza accesso diretto a Internet, come le reti private AWS, dove puoi installare sudo_logsrvd in modalità relè sull'host gateway.

Quando usi i relè, la configurazione dei client sudo e del sudo_logsrvd centrale rimane la stessa. Sull'host di inoltro, aggiungi la seguente riga alla sezione [relay] di sudo_logsrvd.conf:

relay_host = 172.16.167.161

Se la connessione di rete verso il server centrale risulta problematica, è possibile configurare il relè per archiviare le registrazioni prima di inoltrarle:

store_first = true

4. Sottocomandi di registrazione

Hai mai desiderato sapere cosa succede all'interno di una sessione di shell avviata tramite sudo? Sì, ci sono le registrazioni delle sessioni, ma guardare ore di registrazioni solo per vedere un paio di comandi eseguiti è noioso e un'enorme perdita di tempo. Fortunatamente, la versione 1.9.8 ha introdotto i sottocomandi di registrazione. Ora è sufficiente controllare regolarmente i messaggi di registro e guardare le registrazioni solo quando si verifica qualcosa di sospetto.

Non hai nemmeno bisogno di una regola per consentire l'accesso alla shell, basta accedere a un editor. La maggior parte degli editor può eseguire comandi esterni. Il mio editor preferito è JOE, e questo è ciò che puoi vedere quando lo avvio tramite sudo:

Aug 30 13:03:00 czplaptop sudo[10150]:   czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/joe

Niente di interessante, solo un editor, anche se creo una shell ed elimino alcuni file e partizioni da quella shell. Ora vediamo cosa succede quando abiliti i sottocomandi di registrazione:

Aug 30 13:13:14 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/joe
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/sh -c /bin/bash
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/readlink /proc/10889/exe
[...]
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/sed -r s@/*:|([^\\]):@\1\n@g;H;x;s@/\n@\n@
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/tty
Aug 30 13:13:42 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/id
Aug 30 13:13:56 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/ls -A -N --color=none -T 0 /usr/share/syslog-ng/include/scl/

Ho omesso decine di righe per risparmiare spazio, ma puoi comunque vedere che ho avviato una shell e che i comandi eseguiti da bash_profile sono disponibili anche nei log.

Puoi abilitare i sottocomandi di registrazione nel file sudoers utilizzando la seguente impostazione:

Defaults log_subcmds

Nei tradizionali log sudo, puoi vedere dall'id del processo sudo che questi log provengono dalla stessa sessione sudo. Se attivi la registrazione in formato JSON, come mostrato in precedenza, sudo registra molte più informazioni nei log, rendendone più semplice l'analisi.

5. Intercettare i sottocomandi

I sottocomandi di registrazione rimuovono la maggior parte delle aree problematiche nascoste da sudo, ma ci sono situazioni in cui non vuoi solo guardare cosa sta succedendo ma anche controllare il flusso degli eventi. Ad esempio, devi concedere l'accesso alla shell a un utente ma vuoi comunque impedirgli di eseguire un comando specifico. L'intercettazione è l'ideale in questi casi. Ci sono, ovviamente, alcune limitazioni, ad esempio non puoi limitare i comandi incorporati delle shell.

Diciamo che il comando who è pericoloso. Puoi abilitare l'intercettazione in due passaggi: il primo la abilita, il secondo la configura. In questo caso, al mio utente non è consentito eseguire who:

Defaults intercept
czanik ALL = (ALL) ALL, !/usr/bin/who

Ecco cosa succede quando avvio una sessione della shell root tramite sudo e provo a eseguire who:

$ sudo -s
# who
Sorry, user czanik is not allowed to execute '/usr/bin/who' as root on czplaptop.
bash: /usr/bin/who: Permission denied

Puoi facilmente disabilitare del tutto le shell in esecuzione:

Defaults intercept
Cmnd_Alias SHELLS=/usr/bin/bash, /usr/bin/sh, /usr/bin/csh
czanik ALL = (ALL) ALL, !SHELLS

Tuttavia, ciò significa anche che non è possibile avviare sessioni di shell tramite sudo. Non solo, ma non puoi nemmeno eseguire comandi esterni dagli editor. Questo è ciò che accade quando provo ad avviare il comando ls da vi:

$ sudo vi /etc/issue
Sorry, user czanik is not allowed to execute '/bin/bash -c /bin/ls' as root on czplaptop.
Cannot execute shell /bin/bash
Press ENTER or type command to continue

Cosa c'è dopo?

Spero che la lettura del mio articolo ti faccia venir voglia di provare tu stesso queste nuove funzionalità. Puoi installare l'ultimo sudo su molte distribuzioni Linux e varianti UNIX dal tuo gestore pacchetti oppure utilizzare un programma di installazione binario disponibile sul sito web Sudo.

Questo articolo fornisce solo una panoramica delle nuove possibilità. Se desideri saperne di più su queste funzionalità, visita il sito Web, che ospita pagine di manuale e anche il blog Sudo.

Articoli correlati: