Quando vuoi concedere l'accesso amministrativo ad alcuni dei tuoi utenti controllando e controllando cosa fanno sui tuoi sistemi, usi sudo
. Tuttavia, anche con sudo
, ci sono alcuni problemi invisibili:pensa solo a fornire l'accesso alla shell. sudo
recenti rilascia funzionalità aggiuntive 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 della 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 è successo su un terminale, anche nella versione 1.8. Tuttavia, il sistema memorizzava queste registrazioni localmente ed erano facili da eliminare, specialmente quelle in cui le registrazioni erano più utili:le sessioni di Shell. La versione 1.9.0 ha aggiunto la raccolta centralizzata delle registrazioni della sessione, quindi le registrazioni non possono essere eliminate dall'utente locale e le versioni recenti hanno aggiunto i relay, rendendo la raccolta ancora più solida.
Se conosci solo le basi di sudo
o utilizzato solo la versione 1.8 in precedenza, consiglio di leggere il mio articolo precedente.
1. Registrazione in formato JSON
La prima nuova funzionalità che voglio introdurre è la registrazione in formato JSON. Sono un fanatico della registrazione (ho iniziato a lavorare su syslog-ng
progetto dodici anni fa), e questa funzionalità è la prima introdotta dal mio articolo su Opensource.com. Quando abilitato, sudo
registra molte più informazioni e lo fa in un modo più semplice da analizzare.
syslog
tradizionale messaggi di sudo
sono brevi e contengono solo la quantità minima di informazioni necessarie. Ciò è dovuto ai vincoli del vecchio syslog
implementazioni:i messaggi di dimensioni superiori a 1k sono stati eliminati o troncati:
Jan 28 13:56:27 localhost.localdomain sudo[10419]: czanik : TTY=pts/0 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash
syslog
più recente le implementazioni possono gestire messaggi di dimensioni molto maggiori. syslog-ng
accetta messaggi di registro fino a 64k di dimensione per impostazione predefinita (ma ovviamente può essere più piccolo o più grande, a seconda della configurazione effettiva).
Lo stesso evento contiene molte più informazioni se si accede in formato JSON. 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 registro in formato JSON in sudoers
file:
Defaults log_format=json
Puoi saperne di più su come lavorare con i messaggi di registro in formato JSON da sudo
dal mio blog syslog-ng.
2. Raccolta dei registri centralmente utilizzando sudo_logsrvd
Un'altra funzionalità relativa alla registrazione nella 1.9.4 sta raccogliendo tutti i sudo
registra i messaggi (inclusi gli errori) utilizzando sudo_logsrvd
. In precedenza, il sistema registrava sessioni riuscite solo quando sudo_logsrvd
effettivamente fatto una registrazione. La registrazione viene ancora eseguita tramite syslog
per impostazione predefinita alla fine.
Perché questo è importante? Prima di tutto, puoi raccogliere qualsiasi cosa relativa a 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 i sudo
- eventi correlati, come sudo
può rifiutarsi di eseguire comandi se sudo_logsrvd
è inaccessibile.
Puoi abilitare la registrazione su sudo_logsrvd
con la seguente impostazione in sudoers
file (ovviamente sostituisci l'indirizzo IP):
Defaults log_servers=172.16.167.150
Se desideri messaggi di registro in formato JSON, hai bisogno della seguente impostazione in [eventlog]
sezione del sudo_logsrvd
configurazione:
log_format = json
Altrimenti, sudo_logsrvd
usa il tradizionale sudo
formato log con una semplice modifica:include anche informazioni sull'host da cui proviene il log:
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
Altro sugli amministratori di sistema
- Abilita blog Sysadmin
- The Automated Enterprise:una guida alla gestione dell'IT con l'automazione
- eBook:Ansible Automation per SysAdmins
- Racconti dal campo:una guida per l'amministratore di sistema all'automazione IT
- eBook:una guida a Kubernetes per SRE e amministratori di sistema
- Ultimi articoli sull'amministratore di sistema
3. Relè
Quando originariamente hanno introdotto sudo_logsrvd
(versione 1.9.0) per la raccolta centralizzata delle registrazioni della sessione, i client potevano solo inviare le registrazioni direttamente. La versione 1.9.7 ha introdotto il concetto di relè. Con i relay, 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
si rifiuta di eseguire quando non può inviare registrazioni, quindi i relay possono assicurarsi che tu possa usare 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 alla centrale sudo_logsrvd
, devi solo consentire il passaggio.
Infine, ti consente di raccogliere le registrazioni delle sessioni da reti senza accesso diretto a Internet, come le reti private AWS, dove puoi installare sudo_logsrvd
in modalità di inoltro sull'host gateway.
Quando usi i relè, configura il sudo
client e la centrale sudo_logsrvd
rimane lo stesso. Sull'host di inoltro, aggiungi la seguente riga a [relay]
sezione di sudo_logsrvd.conf
:
relay_host = 172.16.167.161
Se è noto che la connessione di rete verso il server centrale è problematica, puoi configurare l'inoltro per memorizzare le registrazioni prima di inoltrarle:
store_first = true
4. Sottocomandi di registrazione
Hai mai voluto sapere cosa succede all'interno di una sessione di shell avviata tramite sudo
? Sì, le registrazioni delle sessioni ci sono, 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 per avere 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 sparo 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 dozzine di righe per risparmiare spazio, ma puoi ancora vedere che ho avviato una shell e i comandi eseguiti da bash_profile
sono disponibili anche nei log.
Puoi abilitare i sottocomandi di registrazione in sudoers
file utilizzando la seguente impostazione:
Defaults log_subcmds
Nel tradizionale sudo
logs, puoi vedere da sudo
ID processo che questi registri provengono dallo stesso sudo
sessione. Se attivi la registrazione in formato JSON, come mostrato in precedenza, sudo
registra molte più informazioni nei registri, facilitandone l'analisi.
5. Sottocomandi di intercettazione
La registrazione dei sottocomandi rimuove 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 impedire loro di eseguire un comando specifico. L'intercettazione è l'ideale in questi casi. Ci sono, ovviamente, alcune limitazioni, come non puoi limitare i comandi integrati delle shell.
Diciamo il who
il comando è pericoloso. Puoi abilitare l'intercettazione in due passaggi:il primo lo abilita, il secondo lo configura. In questo caso, il mio utente non è autorizzato a eseguire who
:
Defaults intercept
czanik ALL = (ALL) ALL, !/usr/bin/who
Ecco cosa succede quando avvio una sessione di shell di root tramite sudo
e prova 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, significa anche che non puoi 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 ls
comando 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
Qual è il prossimo passo?
Spero che la lettura del mio articolo ti faccia venire voglia di provare queste nuove funzionalità da solo. Puoi installare l'ultimo sudo
su molte distribuzioni Linux e varianti UNIX dal tuo gestore di pacchetti, oppure usa un programma di installazione binario disponibile sul sito Web di Sudo.
Questo articolo fornisce solo una panoramica delle nuove possibilità. Se vuoi saperne di più su queste funzionalità, visita il sito Web, che ospita pagine di manuale, e anche il blog Sudo.