Inleiding
Privilegescheiding is een van de fundamentele beveiligingsparadigma’s die geïmplementeerd zijn in Linux en Unix-achtige besturingssystemen. Gewone gebruikers werken met beperkte rechten om de reikwijdte van hun invloed te beperken tot hun eigen omgeving, en niet het bredere besturingssysteem.
A special user, called root, has super-user privileges. This is an administrative account without the restrictions that are present on normal users. Users can execute commands with super-user or root privileges in a number of different ways.
In dit artikel zullen we bespreken hoe je op een correcte en veilige manier root-rechten kunt verkrijgen, met een speciale focus op 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 handleiding gaat ervan uit dat je al de initiële serverconfiguratie hebt voltooid die hier wordt besproken. Log in op je server als een gewone, niet-root-gebruiker en ga hieronder verder.sudoers
-bestand. Als je gewoon sudo
-rechten aan een gebruiker wilt toevoegen, bekijk dan onze snelle start tutorials voor
Opmerking: In deze tutorial gaan we diep in op privilege escalation en het sudoers
bestand. Als je alleen sudo
rechten wilt toevoegen aan een gebruiker, bekijk dan onze Hoe een nieuwe gebruiker te maken met sudo-rechten snelstart-tutorials voor Ubuntu en CentOS.
Hoe wortelrechten te verkrijgen
Er zijn drie basismethoden om root rechten te verkrijgen, die variëren in hun mate van verfijning.
Inloggen als Root
De eenvoudigste en meest directe methode om root rechten te verkrijgen is om rechtstreeks in te loggen op uw server als de root gebruiker.
Als u inlogt op een lokale machine (of gebruikmaakt van een out-of-band consolefunctie op een virtuele server), voert u root
in als uw gebruikersnaam bij de aanmeldprompt en voert u het root wachtwoord in wanneer u daarom wordt gevraagd.
Als je inlogt via SSH, geef de root gebruiker op vóór het IP-adres of de domeinnaam in je SSH-verbindingstekenreeks:
Als je geen SSH-sleutels hebt ingesteld voor de root gebruiker, voer het root wachtwoord in wanneer je hierom wordt gevraagd.
Gebruik van su
om Root te worden
Rechtstreeks inloggen als root wordt meestal niet aanbevolen, omdat het gemakkelijk is om het systeem te gebruiken voor niet-beheertaken, wat gevaarlijk is.
De volgende manier om supergebruikersrechten te verkrijgen stelt je in staat om op elk gewenst moment de root gebruiker te worden, zoals dat nodig is.
Dit kunnen we doen door de su
opdracht aan te roepen, wat staat voor “vervang gebruiker”. Om root rechten te verkrijgen, typ:
Je wordt gevraagd om het wachtwoord van de root gebruiker, waarna je wordt geplaatst in een root shell-sessie.
Als je klaar bent met de taken die root rechten vereisen, keer terug naar je normale shell door te typen:
Gebruik van sudo
om Opdrachten als Root uit te Voeren
De laatste manier om root rechten te verkrijgen die we zullen bespreken, is met de sudo
opdracht.
De sudo
opdracht stelt je in staat om afzonderlijke opdrachten uit te voeren met root rechten, zonder de noodzaak om een nieuwe shell te starten. Het wordt zo uitgevoerd:
In tegenstelling tot su
, vraagt de sudo
opdracht het wachtwoord van de huidige gebruiker, niet het root wachtwoord.
Vanwege de beveiligingsimplicaties, wordt sudo
toegang niet standaard verleend aan gebruikers en moet deze worden ingesteld voordat het correct functioneert. Bekijk onze Hoe een nieuwe Sudo-enabled Gebruiker te creëren snelstartgidsen voor Ubuntu en CentOS om te leren hoe u een sudo
-enabled gebruiker kunt instellen.
In de volgende sectie zullen we ingaan op de manier waarop de sudo
configuratie in meer detail kan worden aangepast.
Wat is Visudo?
De sudo
opdracht wordt geconfigureerd via een bestand gelegen op /etc/sudoers
.
Waarschuwing: Editeer dit bestand nooit met een normale teksteditor! Gebruik altijd de visudo
opdracht in plaats daarvan!
Omdat onjuiste syntaxis in het /etc/sudoers
bestand ervoor kan zorgen dat je over een kapotgeslagen systeem beschikt waar het onmogelijk is om verhoogde privileges te verkrijgen, is het belangrijk om de visudo
opdracht te gebruiken om het bestand te bewerken.
De visudo
opdracht opent een teksteditor zoals gewoonlijk, maar het valideert de syntaxis van het bestand bij het opslaan. Dit voorkomt configuratiefouten die sudo
operaties kunnen blokkeren, wat misschien je enige manier is om root privileges te verkrijgen.
Traditioneel opent visudo
het /etc/sudoers
bestand met de vi
teksteditor. Ubuntu heeft echter visudo
geconfigureerd om de nano
teksteditor te gebruiken.
Als je dit terug wil veranderen naar vi
, voer dan de volgende opdracht uit:
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 mode
Press <enter> to keep the current choice[*], or type selection number:
Selecteer het nummer dat overeenkomt met de keuze die je wilt maken.
Op CentOS kun je deze waarde wijzigen door de volgende regel aan je ~/.bashrc
toe te voegen:
Bron het bestand om de wijzigingen door te voeren:
Nadat je visudo
hebt geconfigureerd, voer de opdracht uit om toegang te krijgen tot het /etc/sudoers
bestand:
Hoe de Sudoers File Aan Te Passen
Je krijgt het /etc/sudoers
bestand in je geselecteerde teksteditor aangeboden.
I have copied and pasted the file from Ubuntu 20.04, with comments removed. The CentOS /etc/sudoers
file has many more lines, some of which we will not discuss in this guide.
Defaults env_reset
Defaults mail_badpass
Defaults 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 wat deze regels doen.
Standaardregels
De eerste regel, Defaults env_reset
, reset de terminalomgeving om eventuele gebruikersvariabelen te verwijderen. Dit is een veiligheidsmaatregel om eventueel schadelijke omgevingsvariabelen uit de sudo
sessie te verwijderen.
De tweede regel, Defaults mail_badpass
, vertelt het systeem om kennisgevingen van slechte sudo
wachtwoordpogingen te sturen naar de geconfigureerde mailto
gebruiker. Standaard is dit het root account.
De derde regel, die begint met Defaults secure_path=...
, specificeert de PATH
(de plaatsen in het bestandssysteem waar het besturingssysteem naar applicaties zal zoeken) die wordt gebruikt voor sudo
operaties. Dit voorkomt het gebruik van schadelijke gebruikerspaden.
Gebruikersrechtenregels
De vierde regel, die de root gebruiker’s sudo
rechten dicteert, 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 is (root). -
root ALL=(ALL:ALL) ALL
De eerste “ALL” geeft aan dat deze regel van toepassing is op alle hosts. -
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 van toepassing zijn op alle commando’s.
Dit betekent dat onze root gebruiker elk commando kan uitvoeren met sudo
, zolang ze maar hun wachtwoord opgeven.
Groepsbevoegdheidsregels
De volgende twee regels lijken op de gebruikersbevoegdheidsregels, maar ze specificeren sudo
regels voor groepen.
Namen die beginnen met een %
geven groepsnamen aan.
Hier zien we dat de admin groep elke opdracht kan uitvoeren als elke gebruiker op elke host. Evenzo heeft de sudo groep dezelfde bevoegdheden, maar kan deze ook uitvoeren als elke groep.
Ingesloten /etc/sudoers.d Regel
De laatste regel ziet er misschien als een opmerking uit bij eerste aanblik:
. . .
#includedir /etc/sudoers.d
Het doet inderdaad beginnen met een #
, wat meestal een opmerking aangeeft. Deze regel geeft echter aan dat bestanden binnen de /etc/sudoers.d
directory ook worden gelezen en toegepast.
Bestanden binnen die directory volgen dezelfde regels als het /etc/sudoers
bestand zelf. Elk bestand dat niet eindigt op ~
en dat geen .
bevat, zal worden gelezen en toegevoegd aan de sudo
configuratie.
Dit is voornamelijk bedoeld voor toepassingen om sudo
rechten te wijzigen tijdens de installatie. Alle gerelateerde regels in één bestand in de /etc/sudoers.d
directory plaatsen kan het gemakkelijk maken om te zien welke rechten zijn gekoppeld aan welke accounts en om referenties gemakkelijk te ongedaan te maken zonder direct te proberen het /etc/sudoers
bestand te manipuleren.
Net als bij het /etc/sudoers
bestand zelf, moet u altijd bestanden binnen de /etc/sudoers.d
directory bewerken met visudo
. De syntaxis voor het bewerken van deze bestanden zou zijn:
Hoe een gebruiker sudo-rechten te geven
De meest voorkomende bewerking die gebruikers willen uitvoeren bij het beheren van sudo
machtigingen is het verlenen van een nieuwe gebruiker algemene sudo
toegang. Dit is handig als u een account volledige administratieve toegang tot het systeem wilt geven.
De gemakkelijkste manier om dit te doen op een systeem dat is ingesteld met een algemene doeladministratiegroep, zoals het Ubuntu-systeem in deze gids, is eigenlijk om de gebruiker in kwestie toe te voegen aan die groep.
Bijvoorbeeld, op Ubuntu 20.04 heeft de sudo
groep volledige beheerdersrechten. We kunnen een gebruiker dezelfde rechten geven door ze toe te voegen aan de groep op deze manier:
Het gpasswd
commando kan ook worden gebruikt:
Dit zal allemaal hetzelfde resultaat opleveren.
Op CentOS is dit meestal de wheel
groep in plaats van de sudo
groep:
Of, met behulp van gpasswd
:
Op CentOS, als het toevoegen van de gebruiker aan de groep niet onmiddellijk werkt, moet u misschien het /etc/sudoers
bestand bewerken om de groepsnaam te ongemakkelijken:
. . .
%wheel ALL=(ALL) ALL
. . .
Hoe u aangepaste regels kunt instellen
Nu we bekend zijn geraakt met de algemene syntaxis van het bestand, laten we enkele nieuwe regels maken.
Hoe u aliassen kunt maken
Het sudoers
bestand kan gemakkelijker georganiseerd worden door dingen te groeperen met verschillende soorten “aliassen”.
Bijvoorbeeld, we kunnen drie verschillende groepen van gebruikers maken, met overlappende leden:
. . .
User_Alias GROUPONE = abby, brent, carl
User_Alias GROUPTWO = brent, doris, eric,
User_Alias GROUPTHREE = doris, felicia, grant
. . .
Groepsnamen moeten beginnen met een hoofdletter. 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 specificeren om als uit te voeren, zoals hierboven, kiest sudo
standaard de root gebruiker.
We kunnen leden van GROUPTHREE
toestaan om de machine uit te schakelen en opnieuw op te starten door een “commando-alias” te maken en die te gebruiken in een regel voor GROUPTHREE
:
. . .
Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE ALL = POWER
. . .
We creëren een opdrachtalias genaamd POWER
die opdrachten bevat om de machine uit te schakelen en opnieuw op te starten. We staan vervolgens leden van GROUPTHREE
toe om deze opdrachten uit te voeren.
We kunnen ook “Run as” aliassen maken, die het gedeelte van de regel kunnen vervangen dat specificeert welke gebruiker de opdracht uitvoert als:
. . .
Runas_Alias WEB = www-data, apache
GROUPONE ALL = (WEB) ALL
. . .
Dit staat iedereen die lid is van GROUPONE
toe om opdrachten uit te voeren als de www-data
gebruiker of de apache
gebruiker.
Hou er echter rekening mee dat latere regels eerdere regels zullen negeren wanneer er een conflict is tussen de twee.
Hoe om Regels Af te Sluiten
Er zijn verschillende manieren waarop u meer controle kunt krijgen over hoe sudo
reageert op een oproep.
De updatedb
opdracht die geassocieerd is met de mlocate
pakket is relatief onschuldig op een enkelsysteem. Als we gebruikers willen toestaan om deze uit te voeren met root rechten zonder een wachtwoord in te typen, kunnen we een regel zoals deze maken:
. . .
GROUPONE ALL = NOPASSWD: /usr/bin/updatedb
. . .
NOPASSWD
is een “tag” die betekent dat er geen wachtwoord wordt gevraagd. Het heeft een metgezelcommando genaamd PASSWD
, wat de standaardgedrag is. Een tag is relevant voor de rest van de regel, tenzij later door zijn “tweeling” tag wordt afgezwakt.
Bijvoorbeeld, we kunnen een regel zoals deze hebben:
. . .
GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
. . .
Nog een nuttige tag is NOEXEC
, die kan worden gebruikt om sommige gevaarlijke gedrag in bepaalde programma’s te voorkomen.
Bijvoorbeeld, sommige programma’s, zoals less
, kunnen andere commando’s starten door dit in te typen vanuit hun interface:
!command_to_run
Dit voert in feite elke opdracht uit die de gebruiker het geeft met dezelfde rechten die less
onder bezig is, wat behoorlijk gevaarlijk kan zijn.
Om dit te beperken, kunnen we een regel zoals deze gebruiken:
. . .
username ALL = NOEXEC: /usr/bin/less
. . .
Miscellaneous Information
Er zijn nog een paar stukjes informatie die nuttig kunnen zijn bij het omgaan met sudo
.
Als je een gebruiker of groep hebt aangegeven om “te draaien als” in het configuratiebestand, kun je commando’s uitvoeren als die gebruikers door het gebruik van de -u
en -g
vlaggen, respectievelijk:
Voor gemak zal sudo
standaard je authenticatiedetails voor een bepaalde hoeveelheid tijd in één terminal opslaan. Dit betekent dat je je wachtwoord niet opnieuw hoeft in te typen totdat de timer afloopt.
Voor beveiligingsdoeleinden, als je deze timer wilt wissen als je klaar bent met het uitvoeren van beheerdersopdrachten, kun je uitvoeren:
Als je daarentegen de sudo
opdracht wilt “primeren” zodat je later niet wordt gevraagd, of om je sudo
lease te vernieuwen, kun je altijd typen:
Je wordt gevraagd om je wachtwoord in te voeren, dat in de cache wordt opgeslagen voor latere gebruiken van sudo
totdat de tijdspanne van sudo
verloopt.
Als je gewoon benieuwd bent welke soort rechten zijn gedefinieerd voor je gebruikersnaam, kun je typen:
Dit zal alle regels in het /etc/sudoers
bestand weergeven die van toepassing zijn op je gebruiker. Dit geeft je een goed idee van wat je wel of niet met sudo
zult mogen doen als elke gebruiker.
Er zijn vele momenten waarop je een opdracht uitvoert en deze faalt omdat je vergeten bent om deze te voorafgaan met sudo
. Om niet de opdracht opnieuw moeten typen, kun je gebruik maken van een bash functionaliteit die betekent “herhaal de laatste opdracht”:
De dubbele uitroepteken zal de laatste opdracht herhalen. We hebben deze voorafgegaan door sudo
om snel de onbevoegde opdracht te veranderen in een bevoegde opdracht.
Voor een beetje plezier, kun je de volgende regel toevoegen aan je /etc/sudoers
bestand met visudo
:
. . .
Defaults insults
. . .
Dit zal sudo
veroorzaken om een grappige belediging terug te geven wanneer een gebruiker een incorrect wachtwoord invoert voor sudo
. We kunnen sudo -k
gebruiken om het vorige in de cache opgeslagen sudo
wachtwoord te wissen om het uit te proberen:
Output[sudo] password for demo: # enter an incorrect password here to see the results
Your mind just hasn't been the same since the electro-shock, has it?
[sudo] password for demo:
My mind is going. I can feel it.
Conclusie
Je zou nu een basisbegrip moeten hebben van hoe te lezen en het sudoers
bestand aan te passen, en een begrip van de verschillende methoden die je kunt gebruiken om root rechten te verkrijgen.
Onthoud, supergebruikersrechten worden niet zomaar aan reguliere gebruikers gegeven, en dat is niet voor niets. Het is essentieel dat je begrijpt wat elke opdracht doet die je uitvoert met root-rechten. Neem de verantwoordelijkheid niet licht op. Leer de beste manier om deze gereedschappen te gebruiken voor jouw gebruikssituatie, en beperk de functionaliteit die niet nodig is.
Source:
https://www.digitalocean.com/community/tutorials/how-to-edit-the-sudoers-file