Le funzionalità consentono la valutazione di alcuni importanti privilegi di sistema in un thread separato diverso dal processo corrente. In questo modo, non è necessario eseguire un programma come root per accedere a determinate parti del sistema.

Come soluzione derivante dalle esigenze, la sezione 25 di POSIX.1e riguarda questo problema. Lo sviluppo dei privilegi definiti in quella sezione e altro è stato completato con il rilascio del kernel Linux versione 2.6.26. Ecco tutto ciò che devi sapere sulle funzionalità del kernel Linux.

Comprensione della logica dell'API delle capacità

Il controllo delle autorizzazioni nei sistemi basati su Unix consiste in due passaggi:

  • Se l'attuale proprietario (ID utente effettivo, EUID) dell'applicazione in esecuzione è zero, il sistema non verifica l'autorizzazione
  • Se il valore EUID è diverso da zero, il sistema esegue il processo di controllo in linea con le autorizzazioni dell'utente effettivo e del gruppo della relativa applicazione

Alcune applicazioni devono avere privilegi più ampi (SUID, SGIT bit) durante l'esecuzione. Come l'esempio più tipico, puoi pensare

instagram viewer
l'applicazione passwd. Con questo, gli utenti in un sistema possono modificare le proprie password. Tuttavia, per scrivere al /etc/shadow file, dove vengono conservate le password crittografate, è necessario lavorare con i diritti utente root (es. ID utente = 0).

Per risolvere questo problema, l'applicazione passwd ha un bit SUID. Qualunque utente esegua questa applicazione, il proprietario attivo (EUID) sarà sempre root:

ls -l /usr/bin/passwd

# Produzione
-rwsr-xr-x. 1 radice radice 32552 23 luglio 2021 /usr/bin/passwd

La possibilità di eseguire applicazioni SUID nel tradizionale modello di autenticazione Unix sembra aver risolto il problema. Tuttavia, gli errori critici nelle applicazioni con bit SUID aprono la porta all'esecuzione di codici indesiderati per gli utenti con piena autorità nel sistema. Un'applicazione ideale dovrebbe essere in grado di funzionare senza la necessità di diritti di utente root, se possibile.

Il problema non si esaurisce solo con il bit SUID. È inoltre necessario disporre dei diritti di utente root quando si desidera ascoltare su a porta TCP o UDP privilegiata meno di 1024 su sistemi basati su Unix. Ad esempio, per poter ascoltare la porta TCP 80 di un server Web, è necessario eseguire l'applicazione come utente root.

Nel corso degli anni, si è compreso quanto sia devastante eseguire software che forniscono servizi all'ambiente di rete con un account utente completamente autorizzato. Come soluzione provvisoria, è stato adottato che solo una certa e più piccola parte del programma rimane in ascolto sulla porta privilegiata come root, e quindi cambia l'ID utente attivo in un altro utente per i processi successivi (ad esempio, l'utente nessuno con diritti limitati).

Questo sistema, che è stato utilizzato per anni, ha funzionato bene con la sua semplicità ed è ancora utilizzato in modo efficiente. Tuttavia, al giorno d'oggi, è possibile ottenere alcune funzionalità aggiuntive, specifiche per l'applicazione, tramite l'API delle funzionalità Linux, senza la necessità di diritti di root, a parte quanto sopra menzionato sistema.

Il modello di capacità di Linux, spiegato!

È possibile trovare l'implementazione più completa delle funzionalità API nel kernel Linux. Le moderne distribuzioni Linux cercano anche di utilizzare il più possibile questo nuovo modello a livello di sistema.

Ad esempio, affinché l'applicazione ping funzioni, deve essere in grado di aprire i socket RAW, generalmente riservati solo agli utenti root. Nelle vecchie distribuzioni Linux, il problema è dare il bit SUID all'applicazione in modo che gli utenti normali possano usarlo. In queste versioni, quando si rimuove il bit SUID dall'applicazione e si tenta di eseguire l'applicazione come utente normale, viene visualizzato il seguente errore:

ping 8.8.8.8

# Produzione
ping: icmp open socket: Operazione non consentita

Mentre nelle moderne distribuzioni Linux, l'applicazione ping probabilmente non ha il bit SUID:

ls -l /bin/ping 

# Produzione
-rwxr-xr-x. 1 radice radice 95232 25 luglio 2021 /bin/ping

Tuttavia, puoi eseguire correttamente l'applicazione come utente normale. Il meccanismo che lo rende possibile è che l'applicazione ping ha l'abilità speciale CAP_NET_RAW.

Puoi apprendere le funzionalità aggiuntive dell'applicazione con il getcap comando come segue:

sudo getcap /bin/ping

# Produzione
/bin/ping cap_net_raw=ep

Se il comando getcap restituisce una risposta vuota, puoi impostare manualmente questo valore con:

sudo setcap cap_net_raw+ep /bin/ping

Il modello di capacità di processo

Nell'implementazione di Linux, le capacità di ciascun processo sono raggruppate in tre titoli:

Capacità Dichiarazione
consentito In questo cluster è presente un elenco di funzionalità aggiuntive consentite per il processo pertinente. Concedere l'autorizzazione non significa che possa essere utilizzato attivamente in quel momento. È possibile includere le autorizzazioni qui nel set di capacità effettivo con un'azione aggiuntiva.
efficace Mostra l'elenco delle capacità attualmente attive del processo correlato. Con le funzioni ausiliarie che regolano il sistema delle abilità è possibile rinunciare o riguadagnare una competenza. In ogni caso, però, questo può essere fatto solo tra quelli già autorizzati nel gruppo consentito.
ereditabile Quando un'applicazione avvia un nuovo processo, il processo appena avviato visualizza l'elenco delle funzionalità che erediterà dall'elenco consentito.

L'elenco delle capacità consentite, effettive ed ereditabili per i processi in esecuzione in qualsiasi momento viene visualizzato come maschera di bit sulle righe CapPrm, CapEff, e CapInh nel file /proc//status. Inoltre, il CapBnd line contiene la maschera di bit utilizzata nell'operazione di controllo dei limiti di capacità.

Ad esempio, prova a leggere i valori della tua applicazione shell in esecuzione da /proc/self/status file:

gatto /proc/se stesso/stato | grep Cap

# Produzione
CapInh: 00000000000000000
CapPrm: 00000000000000000
CapEff: 00000000000000000
CapBnd: 000001ffffffffff
CapAmb: 00000000000000000

Il modello di capacità dei file in Linux

Il funzionamento del sistema di capacità per i file dipende dal prerequisito che queste proprietà possano essere archiviate nel livello del file system virtuale (VFS). Simile al modello di processo, le capacità per i file rientrano in tre titoli:

1. Consentito

Il sistema determina le capacità consentite del processo quando l'eseguibile corrispondente viene eseguito in questo cluster.

2. Efficace

A differenza del modello di capacità del processo, questa intestazione memorizza solo un bit: attivo o inattivo. Se il bit è attivo, le capacità definite nell'elenco dei permessi del file sono automaticamente trasferito all'elenco delle capacità effettive del processo pertinente quando questo file viene eseguito e un processo lo è creato. Se il bit non è attivo, non viene eseguito il trasferimento automatico delle capacità consentite dal file al processo in esecuzione.

Tuttavia, se il codice della relativa applicazione è integrato con il sistema di capacità, può attivare i permessi nell'insieme consentito del file con chiamate di sistema. Lo scopo principale di questo comportamento è garantire che le vecchie applicazioni che non includono funzionalità specifiche del sistema codice, lo sviluppo a livello di codice software può funzionare con il sistema di capacità senza la necessità di alcun codice sorgente i cambiamenti.

Potresti pensare che le applicazioni scritte meglio utilizzeranno le funzionalità solo quando necessario. Se il bit è attivo, tutte le funzionalità nell'elenco consentito diventano attive all'avvio dell'applicazione.

3. Ereditabile

Come nel modello di processo, il file rilevante viene eseguito e si verifica un processo. Se un'altra applicazione viene eseguita successivamente all'interno del processo, viene inclusa nell'elenco consentito del nuovo processo. Per riassumere, indica un elenco di capacità da ereditare.

Il ruolo delle capacità in un sistema Linux

Quando esegui un determinato processo come utente normale, non hai alcun privilegio. Di conseguenza, è possibile accedere solo alle partizioni che il sistema consente agli utenti normali. Il motivo principale alla base di ciò è rafforzare la sicurezza del sistema e implementare tali misure.

Consentire a tutti gli utenti di accedere a tutte le risorse può creare una grave vulnerabilità di sicurezza. Sarà molto facile per le persone che utilizzano il sistema per scopi dannosi sfruttare le vulnerabilità del sistema. Le funzionalità di Linux sono utili in tali questioni. Puoi facilmente rafforzare la sicurezza delle tue applicazioni con le funzionalità API basate sul kernel.

Le capacità di Linux sono solo uno dei problemi che devono essere presi in considerazione per eseguire metodi molto potenti come dividere l'utente root autorizzazioni, assegnando varie autorizzazioni a utenti non privilegiati e prendendo varie precauzioni sulle porte aperte nei servizi Internet con Server Linux.

Migliora la sicurezza del tuo server Linux con questi 7 passaggi di rafforzamento

Leggi Avanti

CondividereTwittaCondividereE-mail

Argomenti correlati

  • Linux
  • Programmazione
  • kernel Linux
  • Sistema operativo

Circa l'autore

Fatih Kuçükkarakurt (8 articoli pubblicati)

Un ingegnere e sviluppatore di software che è un fan della matematica e della tecnologia. Gli sono sempre piaciuti i computer, la matematica e la fisica. Ha sviluppato progetti di motori di gioco, machine learning, reti neurali artificiali e librerie di algebra lineare. Inoltre continua a lavorare su machine learning e matrici lineari.

Altro da Fatih Küçükkarakurt

Iscriviti alla nostra Newsletter

Iscriviti alla nostra newsletter per suggerimenti tecnici, recensioni, ebook gratuiti e offerte esclusive!

Clicca qui per iscriverti