Linux bestandsmogelijkheden beheren

Traditioneel is een Linux proces ofwel bevoorrecht (draaiend als root) of ongeprivilegieerd. Bevoorrechte processen zijn niet onderhevig aan kernel toestemmingscontroles, en hebben dus volledige macht over een systeem. Een vermogen is een afzonderlijk en onafhankelijk voorrecht dat door een proces kan worden gebruikt om bepaalde toestemmingscontroles te omzeilen. Mogelijkheden werden voor het eerst ingevoerd in Linux 2.2, en in latere versies werden er nog enkele aan toegevoegd. Ze worden meestal ingesteld op uitvoerbare bestanden en worden automatisch aan het proces toegekend wanneer een bestand met een mogelijkheid wordt uitgevoerd. Mogelijkheden verdelen in wezen de macht van de root gebruiker in afzonderlijke privileges, wat de veiligheid verhoogt door de toegang te beperken die een aanvaller zou krijgen door een dienst uit te buiten of te misbruiken.

Deze gids zal enkele veelgebruikte mogelijkheden introduceren en demonstreren hoe ze bekeken en gewijzigd kunnen worden.

Veelgebruikte Mogelijkheden

De Linux kernel implementeert een veelheid aan mogelijkheden. Enkele ervan zijn:

  • CAP_SYS_ADMIN: Staat een grote verscheidenheid aan bewerkingen toe. Deze mogelijkheid moet vermeden worden ten gunste van meer specifieke mogelijkheden.
  • CAP_CHOWN: Breng wijzigingen aan in het Gebruikers-ID en Groep-ID van bestanden
  • CAP_DAC_READ_SEARCH: Omzeil controles voor het lezen van bestanden, en het lezen/uitvoeren van mappen. Een programma met deze mogelijkheid kan gebruikt worden om elk bestand op het systeem te lezen.
  • CAP_DAC_OVERRIDE: Overschrijf DAC (Discretionary Access Control), d.w.z. omzeil lees/schrijf/uitvoer toestemmingscontroles. Deze mogelijkheid geeft een uitvoerbaar programma de mogelijkheid om elk bestand op het bestandssysteem te openen en te wijzigen.
  • CAP_NET_BIND_SERVICE: Staat het binden aan poortnummers lager dan 1024 toe.
  • CAP_KILL: Omzeil toestemmingscontroles voor het zenden van signalen naar processen, zoals SIGHUP en SIGKILL.
  • CAP_SYS_NICE: Wijzig o.a. de aardigheidswaarde en de planningsprioriteit van processen.
  • CAP_SYS_RESOURCE: Maakt het mogelijk verschillende beperkingen op systeembronnen te overschrijven, zoals schijfquota’s, CPU tijdslimieten, enz.

De volledige lijst is te vinden in de capabilities(7) manual pagina.

Aan bestanden kunnen mogelijkheden worden toegekend in 3 verschillende sets: toegestaan, overerfbaar, en effectief. Draden hebben 2 extra sets: omringend en begrenzend. Elke set kan nul of meer mogelijkheden bevatten, met uitzondering van de effectieve set voor bestanden, die eigenlijk uit één bit bestaat. Deze sets bepalen complex kernel gedrag dat buiten het bereik van deze gids valt. Bij het toekennen van mogelijkheden aan bestanden, zullen we in de meeste gevallen de toegestane en effectieve sets gebruiken.

OPMERKING: SELinux kan interfereren met mogelijkheden. Op systemen met SELinux in enforcing mode kan het processen verhinderen hun mogelijkheden te benutten.

Vereiste gereedschappen

Er bestaan twee verschillende pakketten voor capaciteitenbeheer: libcap en libcap-ng. De laatste is ontworpen om gemakkelijker te zijn dan de eerste. Beide worden in deze gids behandeld.

libcap biedt getcap en setcap voor het bekijken en instellen van bestandsmogelijkheden, terwijl libcap-ng beide functies samenbrengt in één gereedschap, filecap.

libcap

Installatie

Op Debian, Ubuntu en andere op Debian gebaseerde distributies kunnen de libcap programma’s geïnstalleerd worden met:

apt update
apt install libcap2-bin

Om te installeren op CentOS, gebruik je het volgende commando:

yum install libcap

Om op Fedora te installeren, gebruik je het volgende commando:

dnf install libcap

Om op Arch te installeren, gebruik je het volgende commando:

pacman -Sy libcap

Gebruik

getcap toont eenvoudig de mogelijkheden die aan een bestand zijn toegekend, als die er zijn. Gebruik de volgende syntaxis:

getcap /path/to/binary

Bijvoorbeeld:

using getcap

Getcap kan ook recursief zoeken met de -r vlag. Bijvoorbeeld:

using getcap recursively

OPMERKING: 2>/dev/null wordt gebruikt om de uitvoer niet te vervuilen met “Operation not supported” fouten, die optreden wanneer getcap de mogelijkheden van bestanden in /sys, /proc, enz. probeert te krijgen. Deze speciale virtuele bestandssystemen ondersteunen geen mogelijkheden.

Om de bestandsmogelijkheden in te stellen met setcap, gebruik je de volgende syntaxis:

setcap CAP+set filename

Om bijvoorbeeld CAP_CHOWN en CAP_DAC_OVERRIDE aan de toegestane en effectieve sets toe te voegen, gebruik je:

setcap CAP_CHOWN,CAP_DAC_OVERRIDE+ep file1

Om mogelijkheden uit een bestand te verwijderen, gebruik je de -r vlag:

setcap -r filename

Hier zijn nog een paar voorbeelden:

getcap examples

libcap-ng

Installatie

Om te installeren op Debian, Ubuntu en andere op Debian gebaseerde distributies:

apt update
apt install libcap-ng-utils

Om te installeren op CentOS:

yum install libcap-ng-utils

Om te installeren op Fedora:

dnf install libcap-ng-utils

Om te installeren op Arch:

pacman -Sy libcap-ng

Gebruik

  • Het programma filecap verwijst naar mogelijkheden zonder het voorvoegsel “CAP_” (bijvoorbeeld NET_ADMIN in plaats van CAP_NET_ADMIN).
  • filecap werkt niet met relatieve paden, het verwacht het volledige pad wanneer je bestanden of mappen als argumenten doorgeeft.
  • Met filecap kun je geen reeksen mogelijkheden opgeven, het gebruikt altijd toegestaan en effectief bij het instellen van mogelijkheden.

Om de mogelijkheden te zien die aan een bestand zijn toegekend:

filecap /full/path/to/file

Om recursief in een directory te zoeken, gebruik je:

filecap /full/path/to/dir

Om met filecap het hele bestandssysteem te doorzoeken, gebruik je een van de volgende commando’s:

filecap /
filecap -a

Hier zijn een paar voorbeelden van het gebruik van filecap om bestanden en mappen te onderzoeken:

viewing capabilities with filecap

Om een mogelijkheid op een bestand in te stellen, gebruik je de syntaxis:

filecap /full/path/to/file cap_name

Bijvoorbeeld:

filecap /usr/bin/tac dac_override

Om mogelijkheden te verwijderen, gebruik je deze syntaxis:

filecap /full/path/to/file none

Hier zijn een paar voorbeelden van het instellen en verwijderen van mogelijkheden met filecap:

setting and removing capabilities with filecap

Conclusie

Mogelijkheden zijn een krachtige kernel eigenschap met brede beveiligingstoepassingen. Ze moeten waar mogelijk vervangen worden door volledige privileges en root SUID.