Come posso scoprire quale utente ha effettuato l'accesso come utente root?


6

Abbiamo un paio di server gestiti da un grande gruppo di amministratori. Di solito si collegano come utenti del servizio (per esempio hudson ) e quindi passare a root fare qualche piccola correzione Ciò significa che spesso non è possibile mappare una modifica apportata a una persona.

Qualcuno ha uno script per Unix / Linux che può dirmi quale utente ha effettuato il login come root? Gli accessi possono provenire da tutti i computer sulla LAN locale. Accesso remoto dall'esterno della LAN come root non è possibile; gli amministratori devono prima accedere con un utente LAN e possono quindi promuoversi da soli (tutti usano SSH).

Quello che vorrei è uno script che segua gli accessi remoti (nella LAN locale) e stampi il nome utente per un certo tempo. Si può presumere che lo script possa accedere tramite ssh a qualsiasi computer sulla LAN locale come root senza richiedere una password.

Background: ho uno script che salva le copie di backup di tutti i file modificati da root. Il problema è scoprire chi ha davvero apportato il cambiamento.

La sicurezza non è un problema; questo non è quello di trovare hacker che potrebbero aver pulito wtmp, è per scoprire chi ha fatto un errore a dare un feedback.

[MODIFICARE] Alcuni suggerimenti: il comando last aiuta:

> last -t 20101029174200 root
root     pts/26       :0.0             Wed Oct 20 15:36 - 15:03  (23:27)    

wtmp begins Fri Oct  1 16:34:36 2010

Così root è stato registrato via pts/26. Chi altro si è seduto su quel pseudo TTY?

> last -t 20101029174200 pts/26
adigulla pts/26       :0               Mon Oct 25 09:45   still logged in   
adigulla pts/26       :0               Fri Oct 22 14:00 - 17:29  (03:29)    
adigulla pts/26       :0               Thu Oct 21 15:04 - 16:05  (01:01)    
root     pts/26       :0.0             Wed Oct 20 15:36 - 15:03  (23:27)    
adigulla pts/26       :0.0             Fri Oct 15 15:57 - 15:57  (00:00)    

wtmp begins Fri Oct  1 16:34:36 2010

Hmm ... devo essere io. Quindi posso seguire le modifiche dell'utente sul computer locale. Se accedo a una macchina remota:

$ last -1 hudson 
hudson   pts/0        192.168.0.51     Fri Oct 29 17:52   still logged in   

Quindi ottengo il PTY e l'indirizzo IP dal quale provengo. Come posso effettuare la connessione dall'output di last per hudson per l'utente su 192.168.0.51?

[EDIT2] Si prega di notare che di solito cambiamo utente con sshno sudo o su. Ciò consente il single sign on ed evita di dover comunicare ad admin qualsiasi password. Se vogliamo concedere / revocare l'accesso a qualcosa, semplicemente aggiungiamo / rimuoviamo la chiave pubblica dall'account del servizio. So anche che ssh registra su syslog ma i messaggi non mi dicono quale utente è passato a root:

sshd[7460]: Accepted publickey for root from ::1 port 36689 ssh2

3
Questo è perché dovresti preferire sudo (o un elevatore di privilegi simile) per consentire gli accessi di root.
dmckee

Sudo risolve solo la prima metà del mio problema.
Aaron Digulla

Allora qual è la seconda metà del problema?
Arjan

Arjan: chi era l'utente sul computer client? (ad esempio prima di accedere come "hudson" tramite ssh sul server e quindi diventare root)
Aaron Digulla

Risposte:


3

Penso che il modo migliore per dare un feedback agli amministratori che erroneamente hanno effettuato il login come root è quello di disabilitare gli accessi di root pur consentendo su su e sudo. In alternativa, il file .profile di root visualizza un messaggio di feedback appropriato e, facoltativamente, esce.

Se qualcuno diverso da un amministratore accede erroneamente come root, è necessario almeno modificare la password di root :-)


OK, hai rivisto la domanda per chiarire che cosa vuoi ottenere. È necessario ridurre al minimo il numero di servizi che consentono gli accessi e assicurarsi che tutti registrino un accesso riuscito. SSH registra gli accessi riusciti tramite syslog.

Se hai diverse persone che accedono come "hudson", devi fermarlo. Dovrebbe essere un criterio del sito che ammette ogni accesso utilizzando un ID utente univoco.

È necessario assicurarsi che la rotazione del file di registro sia regolata in modo da poter cercare i registri più vecchi per il periodo necessario.

Si potrebbe certamente avere uno script pianificato da cron che effettua il greps degli accessi giornalieri da syslog e che controlla anche i timestamp nei file di configurazione critici.

Inoltre ci sono molti strumenti per monitorare le modifiche ai file di configurazione. Molti sistemi Unix hanno un sottosistema di controllo che può essere abilitato e che potrebbe anche aiutare.

Personalmente, sospetto che il modo migliore per fornire un feedback in caso di errore non sia la caccia a qualcuno per incolpare ma a spiegare il problema all'intero gruppo, spiegare perché il cambiamento è stato un errore e sollecitare idee per prevenire errori .


A meno che non stiano usando su o sudo per passare alla root dalla loro shell di login, tutto quello che devi fare è l'host remoto (se hanno fatto il login come root) o che hanno effettuato il login come root dalla console.
Ian C.

1
@RedGrittyBrick: Non è questo il punto. Ci sono aziende con 10-20 amministratori sys. Se uno di loro commette un errore e questo viene scoperto tre settimane dopo, come pensi di dare un feedback?
Aaron Digulla

@ Aaron: Ahh stai parlando di errori generali di sysadmin, non solo l'errore di accedere come root. Errori che rimangono sconosciuti fino a quando nessuno può ricordare di aver commesso l'errore? Ad ogni modo disabiliterei tutti i login di root e renderò un criterio per usare sudo. Modificherei la password di root e la sigillerei in una busta nel wall-safe del CIO. Hai un sistema di gestione delle modifiche formale?
RedGrittyBrick

Sudo risolve solo il problema localmente: so che l'utente "hudson" ha fatto il cambiamento ma hudson è solo un servizio, non un vero utente.
Aaron Digulla

Quindi il tuo servizio "hudson" non è responsabile della registrazione che ha invocato la modifica?
RedGrittyBrick

3

dovresti essere in grado di determinare chi sta diventando root analizzando /var/log/auth.log.

per esempio, se faccio il root per il mio box, viene inserita una riga come questa /var/log/auth.log:

Oct 29 20:10:33 localhost su: pam_unix(su:session): session opened for user root by (uid=1000)

ora guardando dentro /etc/passwd, vediamo:

brad:x:1000:100:brad clawsie,,,:/home/brad:/bin/zsh

che ci consente di correlare uid 1000 con un nome. scrivere uno script perl per fare questo dovrebbe essere molto semplice, ti stai semplicemente unendo al uid across /var/log/auth.log e /etc/passwd in un certo intervallo di tempo, vale a dire il mtime per il file che stai investigando.

naturalmente se qualcuno su per root e semplicemente esegue il touch comando sul file che stai ricercando, imposteranno il suo mtime e crederai erroneamente che sono loro a modificare il file.

se dovessi raccomandare una buona pratica per evitare i tuoi problemi in primo luogo, sarebbe per memorizzare tutti script, crons, file di configurazione ... qualunque cosa come file in un sistema di controllo versione che deve essere modificato da un utente reale, quindi applicato al sistema live con una sorta di strumento di distribuzione (make, apt, qualunque). se la gente continua a rompere le cose, è necessario che le modifiche siano state firmate da uno sviluppatore più esperto prima della distribuzione.

i tuoi backup potrebbero non aiutarti se non riesci a fare una copia al momento giusto ... un sistema di controllo della versione ti consente di ripristinare tutte le modifiche che desideri.

ogni volta che i file sui sistemi di produzione live sono stati modificati da root, questo è un grosso problema. non posso dire nella tua domanda se Hudson è una persona reale sul tuo sistema o un utente sintetico per un servizio (ad esempio il servizio hudson). se si tratta di un utente sintetico, vorrei chiedere perché questo uid ottiene una shell di login "reale" a tutti.


+1 Il nostro primo tentativo è stato quello di mettere i file di configurazione direttamente sotto controllo di versione (ad esempio, si poteva fare "svn up / ci" in /etc ) ma ciò significava che tutti i cambiamenti erano fatti da root. +1 per l'idea di copiare i file di configurazione in un posto diverso in modo che gli utenti possano modificarli sul proprio computer e distribuirli.
Aaron Digulla

1

Rinomina su su log_su quindi metti la chiamata su su (ora la sua log_su) all'interno di un wrapper chiamato su

#!/usr/bin/env bash
$SU_LOG=<path to log file>
echo "User: $USER running su at $(date)" >> $SU_LOG
log_su

1

Ho creato un piccolo programma che, una volta usato, ti dirà quale utente ha effettuato il login come root se ha usato sudo su, sudo bash, o sudo -i. Sappi solo che lo sto aggiornando un po 'ultimamente perché ho aggiunto piccole cose qua e là per renderlo migliore e più efficiente. Ma se sei interessato a usarlo, visita questo link: https://github.com/StrangeRanger/monitor/tree/master/RLSpy . C'è un file README.md che spiega lo scopo del programma e le sue caratteristiche / guasti. Sappi solo che lo script ti informerà solo degli utenti che hanno effettuato il login in root negli ultimi 7 giorni.


0

Entrambi i comandi su e sudo possono essere parametrizzati per conservare i registri.

Supponendo che (1) andare al root non sia un'azione frequente e che (2) di solito non più di un amministratore diventi root allo stesso tempo, e dato un time stamp di modifica dei file, lo script può semplicemente cercare nel su / sudo registra per individuare l'amministratore che era root in quel momento.

Se stai usando ssh, allora puoi farlo generare una chiave di autenticazione per ogni amministratore e farglielo usare durante l'accesso, piuttosto che tramite il meccanismo della password.

Come descritto in Come posso ottenere il commento della chiave ssh autorizzata_keys corrente , è possibile utilizzare il campo di commento nel file di chiavi per identificare la persona che ha effettuato l'accesso.

Il resto è lo stesso: utilizzare il time stamp di modifica del file contro auth.log per identificare la presunta sessione ssh che ha modificato quel file.


Tutti usiamo ssh per cambiare utente perché questo consente il single sign on.
Aaron Digulla

Ho aggiunto alcune idee per ssh.
harrymc

0

Linux contiene un sistema di controllo avanzato, che si può impostare per tracciare tutte le modifiche a file specifici.

A partire dal Comprensione di Linux Audit Vedo che può essere impostato per tenere traccia degli accessi SSH oltre alle modifiche ai file, quindi potrebbe essere una possibile soluzione al tuo problema.


Approccio interessante ma probabilmente troppo complesso per la nostra configurazione.
Aaron Digulla

Dall'articolo ho avuto l'impressione che sia abbastanza semplice da usare. Vedere cyberciti.biz/tips/... .
harrymc

Il link nella tua risposta è morto ora. Questo è il motivo per cui pubblichi sempre la parte più importante di qualunque cosa tu stia collegando alla tua risposta.
Blacklight Shining

0

Si prega di notare che di solito cambiamo utente con ssh, non sudo o su.   Ciò consente il single sign on ed evita di doverlo dire agli amministratori   Le password.

Questo sembra piuttosto ridicolo. Sei disposto a tollerare l'utilizzo delle risorse di ssh-ing in localhost (buffer di rete, allocazioni di tty, crittografia e decifratura inutili, ecc.), Invece di configurare semplicemente il tuo sudo non chiedere password ?

gandalf     ALL = NOPASSWD: ALL

Se vogliamo concedere / revocare l'accesso a qualcosa, semplicemente aggiungiamo / rimuoviamo   la chiave pubblica dall'account del servizio.

Si potrebbe anche rimuovere la voce corrispondente da /etc/sudoers anziché.

So anche che ssh registra su syslog ma i messaggi non mi dicono quale utente è passato   radicare

Puoi anche controllare il ~/.history (o ~/.bash_history ) di tutti gli amministratori per le invocazioni ssh attorno agli orari registrati da sshd. Questo è abbastanza facile per un nogoodnick moderatamente determinato per sfuggire, ovviamente, ma così è nulla per una persona con accesso root.

Tuttavia, l'uso di sudo correttamente configurato è un'opzione molto migliore. Anche le versioni moderne supportano /etc/sudoers.d/, quindi puoi rilasciare / rimuovere (piccoli) file nella sottodirectory invece di modificare il singolo (grande) /etc/sudoers.


Quando ho scritto questo, sudo non era molto comune Oggi, direi sudo è bello se si amministrano solo una singola macchina e / o se si deve eseguire solo un singolo comando. Ma nel mio caso, il 90% delle volte, ho bisogno di fare lavori a distanza. Così io ssh e poi dovrei sudo. Se passi continuamente da locale a remoto e devi eseguire molti comandi, preferisco comunque ssh (o un modo per fare tutto).
Aaron Digulla

In realtà, preferirei "questo utente può eseguire questo comando con i permessi di root" comando / strumento (quindi le tue azioni sarebbero comunque registrate sotto il tuo utente). Non voglio diventare root, Ho solo bisogno dei suoi permessi. Tipo di "puoi fare tutto ciò che vuoi ma whoami ancora ritorna digulla.
Aaron Digulla

Sì, questa è esattamente la semantica, offerte sudo - a livello locale. Gli accessi remoti direttamente come root sono una cattiva idea e dovrebbero essere scoraggiati. Le persone che necessitano e sono affidabili con accesso root devono accedere come se stessi ed eseguire qualcosa di simile exec sudo tcsh. Meglio ancora è mordere il proiettile e impostare Kerberos - quindi è possibile delegare le autorizzazioni con ksu.
Mikhail T.

Hm: - / Mi chiedo quali sono le implicazioni per la sicurezza quando creiamo decine di account utente sui nostri numerosi server. Sembra uno dei dilemmi di sicurezza: Comfort vs. sicurezza. Se io uso .authorized_keys, Ho un singolo file (con un formato molto semplice) ma non riesco a scoprire chi ha collegato. sshsudo sembra interessante ma mi chiedo come sshpass fa la sua magia
Aaron Digulla

Per le reti di grandi dimensioni con una grande base di utenti (e quindi spesso mutevole), l'unica vera soluzione è Kerberos. Puoi scegliere l'implementazione MIT originale, o Heimdal, o Active Directory - e possono interagire, quindi scegli ciò che si integra meglio con la tua collezione di sistemi operativi, ma non c'è nulla di così completo e sicuro. Ci vuole un certo sforzo per impostare e imparare (e insegnare al personale) - come fa qualsiasi sistema. Ma otterrai la soluzione giusta ...
Mikhail T.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.