Inleiding
Privilege scheiding is een van de fundamentele veiligheidsparadigma’s geïmplementeerd in Linux en Unix-achtige besturingssystemen. Gewone gebruikers werken met beperkte privileges om de reikwijdte van hun invloed te beperken tot hun eigen omgeving, en niet het bredere besturingssysteem.
Een speciale gebruiker, root genaamd, heeft super-user privileges. Dit is een administratieve account zonder de beperkingen die voor normale gebruikers gelden. Gebruikers kunnen op een aantal verschillende manieren opdrachten uitvoeren met super-user of root-privileges.
In dit artikel bespreken we hoe u op een correcte en veilige manier root-privileges kunt verkrijgen, met speciale aandacht voor het bewerken van het /etc/sudoers
-bestand.
We zullen deze stappen uitvoeren op een Ubuntu 20.04 server, maar de meeste moderne Linux distributies zoals Debian en CentOS zouden op een vergelijkbare manier moeten werken.
Deze gids gaat ervan uit dat u de hier besproken initiële server setup al heeft voltooid. Log in op je server als gewone, niet-root gebruiker en ga hieronder verder.
Note: Deze tutorial gaat diep in op privilege escalatie en het sudoers
bestand. Als u alleen sudo
privileges wilt toevoegen aan een gebruiker, bekijk dan onze Hoe maak ik een nieuwe Sudo-geautoriseerde gebruiker snelstart tutorials voor Ubuntu en CentOS.
Hoe verkrijg ik root privileges
Er zijn drie basismanieren om root privileges te verkrijgen, die variëren in hun niveau van geavanceerdheid.
Inloggen als root
De eenvoudigste en meest directe methode om root privileges te verkrijgen is door direct in te loggen op uw server als root gebruiker.
Als u inlogt op een lokale machine (of gebruik maakt van een out-of-band console functie op een virtuele server), voer dan root
in als gebruikersnaam bij de login prompt en voer het root wachtwoord in als daarom wordt gevraagd.
Als u zich aanmeldt via SSH, geeft u de root-gebruiker op vóór het IP-adres of de domeinnaam in uw SSH-verbindingsstring:
- ssh root@server_domain_or_ip
Als u geen SSH-sleutels voor de root-gebruiker hebt ingesteld, geeft u het root-wachtwoord op wanneer daarom wordt gevraagd.
Gebruik su om root te worden
Direct inloggen als root wordt meestal niet aangeraden, omdat het gemakkelijk is om het systeem te gaan gebruiken voor niet-administratieve taken, wat gevaarlijk is.
De volgende manier om super-user privileges te krijgen stelt u in staat om de root gebruiker te worden op elk moment, als u dat nodig heeft.
We kunnen dit doen door het aanroepen van het su
commando, wat staat voor “substitute user”. Om root privileges te krijgen, typt u:
- su
U wordt gevraagd om het wachtwoord van de root gebruiker, waarna u in een root shell sessie terecht komt.
Wanneer je klaar bent met de taken die root privileges vereisen, keer je terug naar je normale shell door te typen:
- exit
Gebruik sudo om commando’s als root uit te voeren
De laatste, manier om root privileges te verkrijgen die we zullen bespreken is met het sudo
commando.
Het sudo
commando staat je toe om eenmalige commando’s uit te voeren met root privileges, zonder de noodzaak om een nieuwe shell te spawnen. Het wordt als volgt uitgevoerd:
- sudo command_to_execute
In tegenstelling tot su
, vraagt het sudo
commando om het wachtwoord van de huidige gebruiker, niet om het root wachtwoord.
Omwille van de veiligheidsimplicaties wordt sudo
toegang niet standaard aan gebruikers verleend, en moet het worden ingesteld voordat het correct functioneert. Bekijk onze Hoe maak ik een nieuwe Sudo-geactiveerde gebruiker snelstart tutorials voor Ubuntu en CentOS om te leren hoe je een sudo
-geactiveerde gebruiker instelt.
In de volgende sectie bespreken we hoe u de sudo
configuratie in meer detail kunt wijzigen.
Wat is Visudo?
Het sudo
commando wordt geconfigureerd via een bestand dat zich bevindt op /etc/sudoers
.
Waarschuwing: Bewerk dit bestand nooit met een normale teksteditor! Gebruik altijd het visudo
commando!
Omdat een onjuiste syntaxis in het /etc/sudoers
bestand je kan opzadelen met een kapot systeem waar het onmogelijk is om verhoogde rechten te krijgen, is het belangrijk om het visudo
commando te gebruiken om het bestand te bewerken.
Het visudo
commando opent een teksteditor zoals normaal, maar het valideert de syntax van het bestand bij het opslaan. Dit voorkomt dat configuratiefouten sudo
handelingen blokkeren, wat uw enige manier kan zijn om root privileges te verkrijgen.
Traditioneel opent visudo
het /etc/sudoers
bestand met de vi
teksteditor. Ubuntu heeft echter visudo
geconfigureerd om in plaats daarvan de nano
teksteditor te gebruiken.
Als u dit terug wilt veranderen in vi
, voer dan het volgende commando uit:
- sudo update-alternatives --config editor
OutputThere are 4 choices for the alternative editor (providing /usr/bin/editor). Selection Path Priority Status------------------------------------------------------------* 0 /bin/nano 40 auto mode 1 /bin/ed -100 manual mode 2 /bin/nano 40 manual mode 3 /usr/bin/vim.basic 30 manual mode 4 /usr/bin/vim.tiny 10 manual modePress <enter> to keep the current choice, or type selection number:
Selecteer het nummer dat overeenkomt met de keuze die u wilt maken.
Op CentOS kunt u deze waarde wijzigen door de volgende regel aan uw ~/.bashrc
toe te voegen:
- export EDITOR=`which name_of_editor`
Source het bestand om de wijzigingen door te voeren:
- . ~/.bashrc
Nadat u visudo
hebt geconfigureerd, voert u het commando uit om toegang te krijgen tot het /etc/sudoers
bestand:
- sudo visudo
Hoe het sudoers bestand te wijzigen
U krijgt het /etc/sudoers
bestand te zien in uw geselecteerde tekst editor.
Ik heb het bestand gekopieerd en geplakt van Ubuntu 18.04, met commentaar verwijderd. Het CentOS /etc/sudoers
bestand heeft veel meer regels, waarvan we sommige niet zullen bespreken in deze gids.
Defaults env_resetDefaults mail_badpassDefaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"root ALL=(ALL:ALL) ALL%admin ALL=(ALL) ALL%sudo ALL=(ALL:ALL) ALL#includedir /etc/sudoers.d
Laten we eens kijken naar wat deze regels doen.
Standaardregels
De eerste regel, “Defaults env_reset”, reset de terminal omgeving om alle gebruikersvariabelen te verwijderen. Dit is een veiligheidsmaatregel om potentieel schadelijke omgevingsvariabelen uit de sudo
sessie te verwijderen.
De tweede regel, Defaults mail_badpass
, vertelt het systeem om meldingen van slechte sudo
wachtwoordpogingen te mailen naar de geconfigureerde mailto
gebruiker. Standaard is dit de root account.
De derde regel, die begint met “Defaults secure_path=…”, specificeert de PATH
(de plaatsen in het bestandssysteem waar het besturingssysteem naar toepassingen zal zoeken) die gebruikt zullen worden voor sudo
operaties. Dit voorkomt dat gebruikerspaden worden gebruikt die schadelijk kunnen zijn.
Gebruikersprivilege regels
De vierde regel, die de sudo
privileges van de root gebruiker voorschrijft, is anders dan de voorgaande regels. Laten we eens kijken wat de verschillende velden betekenen:
-
root ALL=(ALL:ALL) ALL
Het eerste veld geeft de gebruikersnaam aan waarop de regel van toepassing zal zijn (root). -
root ALL=(ALL:ALL) ALL
De eerste “ALL” geeft aan dat deze regel op alle hosts van toepassing is. -
root ALL=(ALL:ALL) ALL
Deze “ALL” geeft aan dat de root-gebruiker commando’s kan uitvoeren als alle gebruikers. -
root ALL=(ALL:ALL) ALL
Deze “ALL” geeft aan dat de root-gebruiker commando’s kan uitvoeren als alle groepen. -
root ALL=(ALL:ALL) ALL
De laatste “ALL” geeft aan dat deze regels voor alle commando’s gelden.
Dit betekent dat onze root-gebruiker elk commando kan uitvoeren met sudo
, zolang hij zijn wachtwoord maar opgeeft.
Groep Privilege regels
De volgende twee regels zijn vergelijkbaar met de privilege regels voor gebruikers, maar ze specificeren sudo
regels voor groepen.
Namen die beginnen met een %
geven groepsnamen aan.
Hier zien we dat de admin groep ieder commando kan uitvoeren als iedere gebruiker op iedere host. Op dezelfde manier heeft de sudo groep dezelfde rechten, maar kan ook als elke groep uitvoeren.
Inclusief /etc/sudoers.d Line
De laatste regel lijkt op het eerste gezicht een commentaar:
. . .#includedir /etc/sudoers.d
Het begint inderdaad met een #
, wat meestal een commentaar aangeeft. Maar deze regel geeft in feite aan dat bestanden in de /etc/sudoers.d
directory ook worden opgezocht en toegepast.
Bestanden in die directory volgen dezelfde regels als het /etc/sudoers
bestand zelf. Elk bestand dat niet eindigt op ~
en waar geen .
in staat, wordt gelezen en toegevoegd aan de sudo
configuratie.
Dit is vooral bedoeld voor toepassingen om sudo
privileges te wijzigen bij installatie. Door alle geassocieerde regels in een enkel bestand in de /etc/sudoers.d
directory te zetten, is het eenvoudig om te zien welke privileges bij welke accounts horen en om credentials eenvoudig om te keren zonder te hoeven proberen het /etc/sudoers
bestand direct te manipuleren.
Zoals met het /etc/sudoers
bestand zelf, moet u bestanden in de /etc/sudoers.d
directory altijd bewerken met visudo
. De syntax voor het bewerken van deze bestanden zou zijn:
- sudo visudo -f /etc/sudoers.d/file_to_edit
Hoe geef je een gebruiker sudo Privileges
De meest voorkomende handeling die gebruikers willen uitvoeren bij het beheren van sudo
permissies is om een nieuwe gebruiker algemene sudo
toegang te geven. Dit is handig als u een account volledige administratieve toegang tot het systeem wilt geven.
De eenvoudigste manier om dit te doen op een systeem dat is opgezet met een algemene beheergroep, zoals het Ubuntu-systeem in deze gids, is eigenlijk om de gebruiker in kwestie aan die groep toe te voegen.
Bijvoorbeeld, op Ubuntu 20.04, de sudo
groep heeft volledige admin-rechten. We kunnen een gebruiker dezelfde privileges geven door hem aan de groep toe te voegen:
- sudo usermod -aG sudo username
Het gpasswd
commando kan ook worden gebruikt:
- sudo gpasswd -a username sudo
Ze bereiken allebei hetzelfde.
Op CentOS is dit meestal de wheel
groep in plaats van de sudo
groep:
- sudo usermod -aG wheel username
Of, met gpasswd
:
- sudo gpasswd -a username wheel
Op CentOS, als het toevoegen van de gebruiker aan de groep niet onmiddellijk werkt, moet u mogelijk het /etc/sudoers
bestand bewerken om de groepsnaam uit te voegen:
- sudo visudo
. . .%wheel ALL=(ALL) ALL. . .
Hoe aangepaste regels instellen
Nu we vertrouwd zijn geraakt met de algemene syntaxis van het bestand, laten we wat nieuwe regels maken.
Hoe Aliassen Maken
Het sudoers
bestand kan eenvoudiger worden georganiseerd door dingen te groeperen met verschillende soorten “aliassen”.
Zo kunnen we bijvoorbeeld drie verschillende groepen gebruikers maken, met overlappend lidmaatschap:
. . .User_Alias GROUPONE = abby, brent, carlUser_Alias GROUPTWO = brent, doris, eric, User_Alias GROUPTHREE = doris, felicia, grant. . .
Groepsnamen moeten met een hoofdletter beginnen. We kunnen dan leden van GROUPTWO
toestaan om de apt
database bij te werken door een regel als deze te maken:
. . .GROUPTWO ALL = /usr/bin/apt-get update. . .
Als we geen gebruiker/groep opgeven om als te draaien, zoals hierboven, sudo
wordt standaard de root gebruiker gebruikt.
We kunnen leden van GROUPTHREE
toestaan om de machine af te sluiten en opnieuw op te starten door een “commando alias” aan te maken en die te gebruiken in een regel voor GROUPTHREE
:
. . .Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restartGROUPTHREE ALL = POWER. . .
We maken een commando alias aan genaamd POWER
die commando’s bevat om de machine uit te schakelen en opnieuw op te starten. Vervolgens staan we de leden van GROUPTHREE
toe om deze commando’s uit te voeren.
We kunnen ook “Uitvoeren als” aliassen maken, die het deel van de regel kunnen vervangen dat de gebruiker specificeert om het commando uit te voeren als:
. . .Runas_Alias WEB = www-data, apacheGROUPONE ALL = (WEB) ALL. . .
Dit staat iedereen toe die lid is van GROUPONE
om commando’s uit te voeren als de www-data
gebruiker of de apache
gebruiker.
Bedenk wel dat latere regels eerdere regels opheffen als er een conflict is tussen de twee.
Hoe regels vast te zetten
Er zijn een aantal manieren waarop je meer controle kunt krijgen over hoe sudo
reageert op een oproep.
Het updatedb
commando dat hoort bij het mlocate
pakket is relatief ongevaarlijk op een single-user systeem. Als we gebruikers willen toestaan om het uit te voeren met root privileges zonder een wachtwoord te hoeven typen, kunnen we een regel als deze maken:
. . .GROUPONE ALL = NOPASSWD: /usr/bin/updatedb. . .
NOPASSWD
is een “tag” die betekent dat er niet om een wachtwoord zal worden gevraagd. Het heeft een begeleidend commando genaamd PASSWD
, wat het standaard gedrag is. Een tag is relevant voor de rest van de regel, tenzij hij wordt overruled door zijn “twin” tag verderop in de regel.
Bijvoorbeeld, we kunnen een regel als deze hebben:
. . .GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill. . .
Een andere nuttige tag is NOEXEC
, die kan worden gebruikt om gevaarlijk gedrag in bepaalde programma’s te voorkomen.
Bijv. sommige programma’s, zoals less
, kunnen andere commando’s spawnen door vanuit hun interface dit in te typen:
!command_to_run
Dit voert in principe ieder commando uit dat de gebruiker het geeft met dezelfde rechten als less
waaronder het draait, en dat kan behoorlijk gevaarlijk zijn.
Om dit te beperken, kunnen we een regel als deze gebruiken:
. . .username ALL = NOEXEC: /usr/bin/less. . .
Diverse informatie
Er zijn nog een paar stukjes informatie die nuttig kunnen zijn bij het omgaan met sudo
.
Als u in het configuratiebestand een gebruiker of groep hebt opgegeven als “run as”, kunt u commando’s als die gebruikers uitvoeren door respectievelijk de -u
en -g
vlaggen te gebruiken:
- sudo -u run_as_user command
- sudo -g run_as_group command
Voor het gemak zal sudo
standaard uw authenticatie details voor een bepaalde tijd opslaan in een terminal. Dit betekent dat u uw wachtwoord niet opnieuw hoeft in te typen totdat die timer is afgelopen.
Voor veiligheidsdoeleinden kunt u deze timer wissen als u klaar bent met het uitvoeren van administratieve opdrachten:
- sudo -k
Als u daarentegen het sudo
commando wilt “prounden” zodat u later niet meer wordt gevraagd, of om uw sudo
lease te verlengen, kunt u altijd typen:
- sudo -v
U wordt om uw wachtwoord gevraagd, dat in het cachegeheugen wordt opgeslagen voor later sudo
gebruik totdat de sudo
termijn afloopt.
Als u zich gewoon afvraagt wat voor privileges er voor uw gebruikersnaam zijn gedefinieerd, kunt u het volgende typen:
- sudo -l
Dit geeft een lijst van alle regels in het /etc/sudoers
bestand die voor uw gebruiker gelden. Dit geeft u een goed idee van wat u wel en niet mag doen met sudo
als een gebruiker.
Er zijn veel momenten waarop u een commando uitvoert en het mislukt omdat u vergat het vooraf te voorzien van sudo
. Om te voorkomen dat u het commando opnieuw moet typen, kunt u gebruik maken van een bash-functionaliteit die “herhaal laatste commando” betekent:
- sudo !!
Het dubbele uitroepteken zal het laatste commando herhalen. We hebben het voorafgegaan door sudo
om snel het commando zonder rechten te veranderen in een geprivilegieerd commando.
Voor de lol kunt u de volgende regel aan uw /etc/sudoers
bestand toevoegen met visudo
:
- sudo visudo
. . .Defaults insults. . .
Dit zal ervoor zorgen dat sudo
een domme belediging teruggeeft wanneer een gebruiker een onjuist wachtwoord intypt voor sudo
. We kunnen sudo -k
gebruiken om het vorige sudo
wachtwoord uit de cache te wissen om het uit te proberen:
- sudo -k
- sudo ls
Output password for demo: # enter an incorrect password here to see the resultsYour mind just hasn't been the same since the electro-shock, has it? password for demo: My mind is going. I can feel it.
Conclusie
U zou nu een basis begrip moeten hebben van hoe u het sudoers
bestand kunt lezen en wijzigen, en een begrip van de verschillende methodes die u kunt gebruiken om root privileges te verkrijgen.
Houd in gedachten dat super-user privileges niet voor niets aan gewone gebruikers worden gegeven. Het is essentieel dat je begrijpt wat elk commando doet dat je met root privileges uitvoert. Neem de verantwoordelijkheid niet te licht op. Leer hoe u deze tools het beste kunt gebruiken voor uw gebruiksdoel, en sluit alle functionaliteit af die niet nodig is.