Domanda

Sembra che ci sia il supporto per capacità a grana fine nel kernel di Linux, che permette la concessione di privilegi di un processo di fare cose come, per esempio, l'apertura socket grezzi o sollevando priorità filo senza concedere privilegi root processo.

Tuttavia quello che mi piacerebbe sapere se c'è un modo per concedere per utente capacità. Cioè, permettono non-root e di processi non-SUID di acquisire quelle capacità.

È stato utile?

Soluzione

C'è limits.conf, è possibile limitare alcune risorse per un utente o un gruppo attraverso di esso.

man limits.conf

Altri suggerimenti

Può sorta di essere fatto con libcap - fornisce un pam_cap.so modulo PAM. Tuttavia non è molto che semplice:)

Ogni processo ha tre pacchetti di funzioni:

  • efficaci (i cappucci che questo processo è in realtà)
  • ammesse (i tappi che questo processo può eventualmente avere - un superset di effettiva)
  • ereditabili (i tappi che questo processo può passare ad un processo figlio)

Ogni file ha gli stessi pacchetti di funzioni. Quando un nuovo binario è exec () 'd, le capacità del processo di cambiamento in base alle seguenti regole, dove:

  • PI / PP sono iniziali / capacità consentiti ereditabili del processo
  • pi '/ PP' / PE' sono del processo di nuovo Ereditabile / Permesso / capacità efficaci
  • fi / FP / FE sono ereditabili / Permesso / capacità efficaci
  • del file
  • e rappresenta intersezione
  • | rappresenta l'unione

    pI' = pI
    pP' = fP | (pI & fI)
    pE' = fE & pP'

(semplificato da http://www.friedhoff.org/posixfilecaps.html )

Nella maggior parte degli scenari, pe' è l'unico risultato ci sta a cuore. I programmi che sono collegati contro libcap possono chiamare setcap () per cambiare i loro berretti efficaci (a patto che i tappi hanno una richiesta sono nel set consentito), ma la stragrande maggioranza dei programmi non toccare in modo esplicito i loro berretti quindi dobbiamo organizzare il tappo per essere efficace post-exec ().

Avere un esempio concreto aiuterà la comprensione qui ... mi sono stufo di dover 'do' per eseguire OpenVPN, così ho voluto concedere me stesso la capacità CAP_NET_ADMIN per consentire l'impostazione di percorsi e così via.

Guardando l'ultima regola (pE' = fE & pP') è chiaro che per avere CAP_NET_ADMIN nel set effettivo del processo, CAP_NET_ADMIN deve in file 's set efficace. Quindi, il sistema di capacità non ci permette di dire semplicemente "concessione CAP_NET_ADMIN a sqweek utente" - le funzionalità del programma sono sempre importanti

.

Essere nel set effettiva del file non è sufficiente, però, il tappo deve anche essere in nuovo set consentito del processo. Vediamo che regola: pP' = fP | (pI & fI). Quindi ci sono due modi in cui possiamo ottenere il tappo in pP', o aggiungiamo CAP_NET_ADMIN al set consentito del file, o lo aggiungiamo al set Ereditabile del file e assicurarsi che sia nel set Ereditabile del processo.

Se aggiungiamo alla serie consentito del file, quindi le capacità iniziali del processo diventano irrilevanti - OpenVPN otterrà CAP_NET_ADMIN ogni volta che viene eseguito, indipendentemente da chi lo esegue. Questo è simile a setuid, ma fornisce un approccio più a grana fine. Eppure, non è una granularità per utente, in modo da permette di guardare l'altra opzione.

Si noti la prima regola, pI' = pI. capacità ereditabili del processo non sono influenzati da exec (). Ciò significa, tutti abbiamo bisogno è un unico programma di libcap consapevoli per impostare CAP_NET_ADMIN come un tappo Ereditabili, ed ogni processo generato da ci sarà anche avere CAP_NET_ADMIN ereditabili. Questo è il ruolo che il modulo PAM gioca -. Si modifica il set Ereditabili durante il login, che viene poi ereditato per tutti i processi che degli utenti

Per riassumere:

  1. Installa libcap
  2. Configurare il modulo pam_cap (aggiungere il cap_net_admin sqweek linea per /etc/security/capability.conf. Se il file non esisteva in precedenza, aggiungere un altro none * linea per un default ragionevole.
  3. Attiva il modulo PAM durante il login (aggiungi auth required pam_cap.so a /etc/pam.d/login). Assicurati di testare i dati di accesso in un terminale separato prima di uscire quando si effettua PAM cambia in modo da non chiudersi fuori!
  4. Aggiungi CAP_NET_ADMIN ai set efficaci ed ereditabili per openvpn (setcap cap_net_admin+ie /usr/sbin/openvpn)
  5. openvpn chiama ip per modificare la tabella di instradamento e simili, così che ha bisogno lo stesso trattamento (setcap cap_net_admin+ie /sbin/ip)

Si noti che /etc/pam.d/login disciplina solo gli account di accesso locali - si potrebbe desiderare di dare ad es. /etc/pam.d/sshd trattamento simile. Inoltre, tutte le funzionalità si aggiungono via setcap sarà spazzato via quando il gestore di pacchetti installa una nuova versione del file binario di destinazione in modo dovrete ri-aggiungere.

Sì, è possibile utilizzare setcap per specificare un insieme capacità di un eseguibile, che può garantire capacità specifiche quando quella eseguibile viene eseguito.

capacità (7) pagina man:

  

Funzionalità File   Dal kernel 2.6.24,   il kernel supporta associando   capacità fissa con un eseguibile   file usando setcap (8). Il file   pacchetti di funzioni sono memorizzati in un   attributo esteso (cfr setxattr (2))   chiamato security.capability. scrivendo a   questo attributo esteso richiede   capacità CAP_SETFCAP. Il file   capacità fissa, unitamente   i pacchetti di funzioni del filo,   determinare le funzionalità di un filo   dopo un execve (2).


Il modo per garantire le capacità per utente (o anche per gruppo) sarebbe con un modulo PAM. di risposta sqweek mostra come fare questo usando pam_cap.

Non ho confermato, ma penso che questo aspetto della SELinux può essere la risposta:

http://www.lurking-grue.org/writingselinuxpolicyHOWTO.html# userpol5.1

Dai un'occhiata alla CapOver -. Che dovrebbe fare quello che vuoi

Nota:. Non ho usato questo come non è (ancora?) Stato portato su l'API del kernel 2.6.30ish

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top