Usa in modo sicuro find con sudo


10

Su un server Linux, devo rimuovere i privilegi di root da un gruppo di utenti. Ma quegli utenti hanno motivi legittimi per poter usare l'utilità "trova" per cercare file in base a nomi di file, date di modifica e altri metadati.

Sul server, i nomi dei file non sono sensibili, ma il contenuto del file potrebbe esserlo.

Vorrei usare sudo per consentire agli utenti di cercare file ovunque sul server. L'utilità "trova" è ottima, ma consente tutti i tipi di effetti collaterali, come l'uso di "-exec" per generare comandi arbitrari.

Posso mettermi findal lavoro con le mie restrizioni?


14
In genere non si desidera che i risultati della ricerca per i modelli di nome file contengano file a cui non è effettivamente possibile accedere. A tal proposito, il tuo requisito è un po 'strano.
HBruijn,

2
Nessuno ti costringe a impegnarti nella domanda. Penso che uno degli scopi di Server Fault sia quello di fungere da forum per situazioni strane.
Troels Arvin,

2
Server Fault non è un forum e i tentativi di psicologia inversa non cambiano la validità dell'osservazione di HBruijn (che, ne sono certo, è stata posta nel tentativo di aiutarti).
Razze di leggerezza in orbita

Risposte:


19

Che dire di individuare ?

individuare legge uno o più database preparati da updatedb (8) e scrive i nomi dei file corrispondenti ad almeno uno dei PATTERN sullo standard output, uno per riga. Se --regex non è specificato, i PATTERN possono contenere caratteri globbing. Se qualche PATTERN non contiene caratteri globbing, individuare si comporta come se il pattern fosse PATTERN .

Per impostazione predefinita, individuare non controlla se esistono ancora file trovati nel database. individuare non può mai segnalare i file creati dopo l'ultimo aggiornamento del database pertinente.

O forse slocate :

Secure Locate fornisce un modo sicuro per indicizzare e cercare rapidamente i file sul tuo sistema. Utilizza la codifica incrementale proprio come GNU individuare per comprimere il suo database per velocizzare la ricerca, ma memorizzerà anche le autorizzazioni e la proprietà dei file in modo che gli utenti non vedano i file a cui non hanno accesso.

Questa pagina di manuale documenta la versione GNU di slocate. slocate Consente agli utenti del sistema di cercare interi file system senza visualizzare file non autorizzati.


Buona idea. Non so perché non ci abbia pensato. Ma temo che il parametro "-d" possa in qualche modo essere utilizzato per leggere in file arbitrari, se le regole sudo consentono all'utente di eseguire qualsiasi comando "individuare"?
Troels Arvin,

2
@TroelsArvin: locatenon è necessario sudo; solo il suo updatedblavoro richiede privilegi speciali. Pertanto i tuoi utenti non dovrebbero mai essere in esecuzione o essere in grado di eseguire sudo locate.
jwodder,

1
@jwodder: su un server RHEL 7: supponiamo che l'utente non abbia accesso a / data / foo. In / data / foo, c'è un file "somefile.csv". Ora, quando esegui "individuare somefile.csv", l'output di "individuare" non include /data/foo/somefile.csv - a meno che l'utente non esegua "individuare" tramite sudo. (L'uso dell'argomento "--nofollow" non aiuta.)
Troels Arvin,

1
@TroelsArvin ma il -dflag imposta solo il percorso del database? Forse ti ho frainteso.
Lenniey,

21

Secondo man 7 capabilities

   CAP_DAC_READ_SEARCH
          * Bypass file read permission checks and directory read and execute permission checks;
          * Invoke open_by_handle_at(2).

Questo ha funzionato per me. (le righe che iniziano con '#' sono root, quelle con '$' non sono root) in questo caso l'utente non root è nel wheelgruppo.

# cp /usr/bin/find /usr/bin/sudofind
# chmod 710 /usr/bin/sudofind
# chown root:wheel /usr/bin/sudofind
# setcap cap_dac_read_search+ep /usr/bin/sudofind
# exit
$ find /root 
find: ‘/root’: Permission denied
$ sudofind /root
/root /root 
/root/Testbed 
...
... 
$ sudofind /root -exec cat {} \;
cat: /root: Permission denied 
cat: /root/Testbed: Permission denied
$ sudofind /root -printf "%u %g %m %c %p\n"
root root 644 Mon Apr 20 09:20:48.0457518493 2015 /root
root root 755 Fri Dec  4 02:34:03.0016294644 2015 /root/Testbed
...
...
$ # Capability inheritance test..
$ sudofind /root -exec /bin/sleep 10 \; &
[1] 17017
$ getpcaps $(pgrep find)
Capabilities for `17017': = cap_dac_read_search+ep
$ getpcaps $(pgrep sleep)
Capabilities for `17019': =

Dato ciò che la capacità garantisce, si adatta esattamente a ciò che vuoi. Non ho verificato esaustivamente se findha una funzione che ti consente di leggere byte all'interno dei file, ma cose ovvie come LD_PRELOADe gli attacchi shim della libreria non dovrebbero funzionare a causa della natura dei controlli setuid in Linux e i bit di funzionalità non ottengono ereditato dai processi secondari (a differenza del setuid grezzo), quindi questo è un altro vantaggio.

Tieni presente che ciò che vuoi fare solleva possibili problemi di privacy in merito alla creazione o all'accesso temporanei dei file e il programma potrebbe essere utilizzato come base per montare un tentativo di escalation di privilegi / condizioni di gara (rispetto ai programmi che creano nomi di file noti ma non eseguire controlli di sicurezza corretti).

Inoltre, alcune applicazioni scritte male possono fare affidamento sui metadati dei file o sulla struttura ad albero come mezzo per trasmettere significato o nascondere i dati. Ciò potrebbe causare il rilascio di informazioni riservate o rivelare documenti privilegiati di cui non si è altrimenti a conoscenza (la sicurezza attraverso l'oscurità lo so, ma questa è una cosa che i venditori di sorgenti chiuse in particolare piace purtroppo fare).

Pertanto, abbi cura di te e diffidare di farlo e capire che c'è ancora rischio associato a questo anche se le cose ovvie non funzionano.

Oh, e sarei interessato a vedere se qualcuno ha una prova dell'attacco concettuale che utilizza questo meccanismo come base per l'escalation dei privilegi nei commenti!


5
Questo in effetti sembra abbastanza interessante!
Sven

Come questo? Bene, niente PoC, ma comunque interessante: forums.grsecurity.net/…
Lenniey,

Mi piace questa idea, ma ha un significativo svantaggio: sudofind è ora un binario che non fa parte di alcun pacchetto software (ad esempio RPM) sul sistema. Quindi, se la distribuzione invia una patch per "trova", sudofind non verrà aggiornato.
Troels Arvin,

2
@TroelsArvin Non è necessariamente una brutta cosa. Se stai aggiungendo funzionalità simil-setuid a un'utilità esistente che non è stata progettata per tali funzionalità, non vorrai alcun aggiornamento all'utilità sottostante prima di verificare che l'utilità aggiornata possa essere utilizzata in modo sicuro con il tuo non standard funzionalità. Immagina in questo caso se un aggiornamento dovesse dare findla possibilità di eseguire direttamente un codice fornito dall'utente, simile a quello che awkpuò fare.
Andrew Henle,

4
Il problema più grande che posso vedere con questo è che le directory scrivibili dal mondo che si trovano sotto le directory non ricercabili possono improvvisamente essere scritte.
Tavian Barnes,

2

Darei agli utenti le autorizzazioni adeguate.

Per impostazione predefinita, se lo è umask 022, le directory vengono create in modo che tutti possano elencare e stat i file in esse contenuti. In caso contrario, è possibile modificare manualmente l'autorizzazione della directory in modo che sia bit a bit o delle sue vecchie autorizzazioni e 0555:

chmod +0555 foo

E se quegli utenti non hanno i permessi di esecuzione su tutti i genitori di quella directory (ad esempio, la home directory di un altro utente), probabilmente significa che dovresti mettere la prima directory da qualche altra parte.

Se si desidera consentire solo ad alcuni utenti di leggere ed eseguire quella directory, è possibile modificarne la modalità 0750, inserirli in un gruppo e modificare il proprietario del gruppo della directory in quel gruppo:

groupadd can_read_foo
chmod 0750 foo
chgrp can_read_foo foo
gpasswd -a alice can_read_foo
gpasswd -a bob can_read_foo
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.