Wat betekent drwxr-xr-x in Linux permissies?
Leer de betekenis van drwxr-xr-x en de omzetting naar 755. Ontdek waarom de x-bit essentieel is voor mappen en waarom u chmod 777 moet vermijden voor een veilig systeem.
Wat drwxr-xr-x betekent
drwxr-xr-x beschrijft een map die de eigenaar kan wijzigen, en die elke andere gebruiker kan lezen en openen zonder iets te wijzigen. In octale notatie is deze modus 755. Linux toont deze tien tekens aan het begin van elke regel in de uitvoer van ls -l, en ze betekenen altijd hetzelfde in dezelfde volgorde. Het leren van één reeks is dus voldoende om ze allemaal te begrijpen.
Eén regel is belangrijker dan de rest, omdat deze bepaalt of uw eigen tests betrouwbare resultaten opleveren. De root-gebruiker negeert permissiebits. De kernel verleent root de CAP_DAC_OVERRIDE-capaciteit (discretionary access control override), waardoor root bestanden opent waarvan de modus dit verbiedt. Elk voorbeeld op deze pagina slaagt voor root, ongeacht wat de bits aangeven. Log in als een normale gebruiker wanneer u wilt zien hoe de regels in de praktijk werken.
De tien tekens, één voor één
Maak een map en een bestand aan om te inspecteren. Niets in dit voorbeeld heeft invloed op zaken buiten de nieuwe map.
mkdir -p ~/permdemo/inner
printf 'hello\n' > ~/permdemo/inner/notes.txt
ls -ld ~/permdemo ~/permdemo/inner ~/permdemo/inner/notes.txtBij de gebruikelijke standaard umask van 022 beginnen de twee regels voor de map met drwxr-xr-x en begint de regel voor het bestand met -rw-r--r--.
Teken 1 is het bestandstype, geen permissie. d is een map. - is een regulier bestand. l is een symbolische link. c en b zijn character en block device nodes. s is een socket en p is een named pipe. Dit staat buiten de octale waarde, wat de reden is dat drwxr-xr-x 755 wordt in plaats van iets dat begint met een d.
De negen tekens daarna vormen drie groepen van drie, en hun volgorde verandert nooit.
- Tekens 2 tot 4 vormen de owner-triade, de bits die gelden voor de gebruiker die eigenaar is van het bestand.
- Tekens 5 tot 7 vormen de group-triade, de bits die gelden voor de groep van het bestand.
- Tekens 8 tot 10 vormen de other-triade, de bits die gelden voor alle overige gebruikers.
Binnen een triade zijn de posities altijd r, dan w, dan x, en een streepje betekent dat de bit uitgeschakeld is. De letters veranderen nooit van positie. r-x is lezen zonder schrijven. -w- is schrijven zonder lezen, wat toegestaan maar zeldzaam is.
Dus drwxr-xr-x wordt als volgt gesplitst: d voor de map, dan rwx voor de eigenaar, dan r-x voor de groep, dan r-x voor de overigen.
Sommige systemen tonen een elfde teken. Een afsluitende punt, drwxr-xr-x., betekent dat het bestand een SELinux (security enhanced Linux) context bevat, wat standaard wordt getoond door SELinux-distributies zoals Fedora en Rocky. Een afsluitend plusteken, drwxr-xr-x+, betekent dat het bestand een POSIX ACL (access control list) bevat, een extra set regels bovenop deze negen bits. Lees deze extra regels met getfacl <path>.
r, w en x hebben verschillende functies bij een directory
Dit is de eerste regel die beginners verkeerd begrijpen. De letters zijn hetzelfde voor een bestand en voor een directory. De rechten die ze verlenen zijn echter verschillend.
rop een bestand leest de inhoud.rop een directory toont de namen die erin staan, wat nodig is voor een standaardls.wop een bestand wijzigt de inhoud.wop een directory voegt items toe of verwijdert deze. Het verwijderen van een bestand is een wijziging aan de directory; de schrijfrechten op de directory bepalen dit, terwijl de modus van het bestand zelf hier geen invloed op heeft.xop een bestand voert het uit als programma.xop een directory maakt het mogelijk om erdoorheen te navigeren (traversal), wat betekent dat de kernel een naam in die directory kan opzoeken tijdens het resolven van een pad.
Navigatie is het onderdeel dat mensen vaak verrast. x op een directory voert niets uit. Het openen van /srv/site/index.html vereist x op /, vervolgens x op /srv, daarna x op /srv/site en ten slotte r op het bestand zelf. Als één directory in die keten geen x voor u heeft, stopt het opzoekproces daar. De aanroeper krijgt de melding Permission denied voor het gehele pad, zelfs als het bestand aan het einde voor iedereen leesbaar is. namei -l /srv/site/index.html toont elke stap van de keten met de bijbehorende modus en eigenaar, zodat u kunt zien welke schakel het proces blokkeert.
Een directory met r maar zonder x is een vreemde tussenstatus die het herkennen waard is. Een normale gebruiker kan de namen in de directory zien, omdat dit is wat r toestaat, maar kan geen metadata van de items opvragen. Daarom vult ls -l de kolommen voor grootte en modus met vraagtekens en toont voor elk item ls: cannot access ...: Permission denied.
De letters omzetten naar 755
Elke triade is een getal van drie bits. r is 4, w is 2, x is 1. Tel de actieve bits bij elkaar op.
rwxis 4 + 2 + 1 = 7rw-is 4 + 2 = 6r-xis 4 + 1 = 5r--is 4---is 0
drwxr-xr-x is daarom 7 voor de eigenaar, 5 voor de groep en 5 voor anderen: 755. -rw-r--r-- is 6, 4, 4: 644. drwxrwxr-x is 7, 7, 5: 775, wat 755 is met schrijfrechten toegevoegd voor de groep. U hoeft nooit handmatig tekens te tellen, omdat stat beide vormen tegelijkertijd toont.
stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt%A is de lettervorm, %a is de octale vorm, en %U en %G benoemen de eigenaar en de eigenaarsgroep.
De permissiereeksen waar vaak naar gezocht wordt
Dit zijn de modi die u op een echte server tegenkomt, inclusief de octale waarde en de context waarin ze voorkomen.
-rw-r--r--is 644. Gewone bestanden die een service alleen leest, zoals een configuratiebestand of een HTML-pagina.-rw-------is 600. Geheimen: een SSH private key, of het.env-bestand van een applicatie.-rw-rw-r--is 664. Een bestand in een map die door een groep wordt gedeeld, waarbij teamleden schrijfrechten nodig hebben.-rwxr-xr-xis 755. Scripts en binaries, zoals/usr/local/bin/backup.shen het grootste deel van/usr/bin.-rwx------is 700. Een privescript dat alleen door de eigenaar mag worden uitgevoerd.drwxr-xr-xis 755. Vrijwel elke systeemmappenstructuur en de document root van een website.drwx------is 700.~/.ssh, en home-mappen op een beveiligd systeem.drwxrwxr-xis 775. Een map waar de groep van de eigenaar in mag schrijven.drwxrwsr-xis 2775. Hetzelfde, plus de setgid-bit, zodat nieuwe bestanden in de map de groep van de map overerven.drwxrwxrwtis 1777./tmp. De afsluitendetis de sticky bit, waardoor een gebruiker alleen zijn eigen bestanden kan verwijderen.-rwsr-xr-xis 4755. Een setuid-binary die wordt uitgevoerd als de eigenaar, zoals/usr/bin/passwden/usr/bin/sudo.-rw-rw-rw-is 666, endrwxrwxrwxis 777. Wereldwijd schrijfbaar; op een server is dit bijna altijd een fout.lrwxrwxrwxis wat elke symbolische link toont. Linux negeert de modusbits op een link en controleert in plaats daarvan het doel, dus deze reeks heeft geen enkele betekenis.
Welke triade is op u van toepassing
Dit is de tweede regel die beginners verkeerd begrijpen. De kernel kiest precies één triade en stopt daar.
Als uw gebruikers-ID overeenkomt met de eigenaar van het bestand, krijgt u de eigenaar-triade en worden de groeps- en overige bits nooit geraadpleegd. Als dit niet het geval is en de groep van het bestand een van uw groepen is, krijgt u de groeps-triade. Anders krijgt u de overige-triade.
Hieruit volgen twee zaken. De eigenaar-triade is van toepassing, zelfs als deze het meest restrictief is. Een bestand met modus 0466, weergegeven als -r--rw-rw-, geeft de eigenaar alleen leesrechten terwijl iedereen anders mag schrijven, omdat de controle op de eigenaar als eerste overeenkwam en er daarna niets meer werd gelezen. Dit is toegestaan en het verwarrend voor iedereen die dit voor het eerst tegenkomt.
De groeps-triade wordt vervolgens gekozen door de groep van het bestand, niet door de lijst met groepen waar u lid van bent. ls -l toont twee namen op elke regel: de eigenaar en vervolgens de groep. Alleen die tweede groep heeft zeggenschap over dat bestand. Lid zijn van twintig groepen helpt alleen als het bestand een van die groepen draagt.
id
stat -c '%U %G %A %n' ~/permdemo/inner/notes.txtid toont uw gebruiker en elke groep waar u lid van bent. stat toont de eigenaar en groep van het bestand. Vergelijk de twee en u weet welke triade de kernel voor u zal gebruiken.
Dit is de reden waarom een gedeelde map meestal een groep en de setgid-bit krijgt. sudo chmod 2775 /srv/shared wordt weergegeven als drwxrwsr-x, en bestanden die daarin worden aangemaakt, erven vervolgens de groep van de map in plaats van de persoonlijke groep van de maker, terwijl nieuwe submappen ook de setgid-bit krijgen. Setgid stelt de groep in, niet de modus. Met de standaard umask van 022 krijgt een nieuw bestand binnenin nog steeds 644, waardoor teamleden het kunnen lezen maar niet kunnen schrijven. Voor groepsschrijfrechten is een umask van 002 vereist voor iedereen die daar werkt, of een standaard ACL op de map, die de umask vervangt voor bestanden die daarin worden aangemaakt. Elke service een eigen account geven is de andere helft van dit verhaal, en dit wordt behandeld in één Linux-gebruiker per service op een VPS.
umask bepaalt de modus van elk nieuw bestand
Een nieuw bestand neemt de modus niet over van u. Het krijgt de modus van het programma dat het aanmaakt, minus de bits die uw umask verwijdert. De umask is een masker van bits die moeten worden verwijderd; een grotere umask resulteert dus in meer afgeschermde bestanden.
De meeste distributies leveren 022. Een programma dat een regulier bestand aanmaakt, vraagt doorgaans om 0666. Een programma dat een map aanmaakt, vraagt meestal om 0777. De umask verwijdert 022 van beide verzoeken, waardoor u 644 krijgt voor bestanden en 755 voor mappen. Dat is precies het paar dat u overal op een nieuwe VPS ziet.
umask
umask -S
touch ~/permdemo/new.txt && mkdir -p ~/permdemo/newdir
ls -ld ~/permdemo/new.txt ~/permdemo/newdirumask -S toont dezelfde waarde als letters, wat makkelijker leesbaar is dan 0022. Stel umask 027 in via ~/.profile voor een striktere standaard: 640 voor bestanden en 750 voor mappen, zodat uw groep uw werk kan lezen en niemand anders dat kan. Deze resultaten gaan uit van de gebruikelijke 0666- en 0777-verzoeken.
Twee beperkingen zijn van belang. De umask kan alleen bits verwijderen, nooit toevoegen. Een bestand dat wordt aangevraagd als 0666, wat touch doet, is nooit uitvoerbaar, ongeacht wat u instelt. Een programma dat alleen toegang voor de eigenaar vraagt, behoudt die beperking: mktemp maakt bestanden aan met 600 en mappen met 700, ongeacht of de umask 022 of 027 is. Een systemd-service leest bovendien nooit uw shell-profiel; stel de waarde daarom in het unit-bestand in.
[Service]
UMask=0027Eén situatie negeert de umask volledig. Wanneer de bovenliggende map een standaard-ACL heeft, wordt de umask genegeerd en worden de permissiebits van het nieuwe bestand bepaald door de overgeërfde ACL.
Waarom webbestanden 644 en webmappen 755 zijn
Een webserver draait onder een eigen account, www-data op Debian en Ubuntu, nginx op Rocky en Alma. Dat proces moet bestanden kunnen lezen die het serveert en door de bovenliggende mappen kunnen navigeren. Het heeft geen reden om deze te wijzigen, en een statische site mag dit nooit toestaan.
644 op een bestand geeft schrijfrechten aan de eigenaar en leesrechten aan iedereen, zodat de deploy-gebruiker kan publiceren en de webgebruiker kan serveren. 755 op een map geeft schrijfrechten aan de eigenaar en navigatierechten aan iedereen, zodat de webgebruiker door het pad kan lopen zonder iets te kunnen toevoegen of verwijderen. Een bug in de applicatie kan dan de pagina's die het serveert niet overschrijven.
De navigatieregel is hier cruciaal. Als de site zich in /home/deploy/site bevindt, /home/deploy de modus 750 heeft en de webgebruiker niet in de groep van de map zit, kan de webgebruiker de thuismap helemaal niet betreden. Het verzoek eindigt dan als HTTP 403 met een regel zoals deze in /var/log/nginx/error.log:
open() "/home/deploy/site/index.html" failed (13: Permission denied), client: 203.0.113.5Die 13 is EACCES, de weigering van rechten door de kernel. Er is niets mis met het netwerk: de poort luistert en het verzoek is aangekomen. Dit maakt het verwarrend wanneer u nog leert hoe luisterende poorten werken op Linux. Voer namei -l /home/deploy/site/index.html uit en lees de keten af naar beneden voor de eerste map zonder x voor 'other'.
Een map waar de applicatie naar schrijft, zoals een uploadpad, is de uitzondering. Verleen dat via eigenaarschap in plaats van met een ruimere modus: sudo chown -R www-data:www-data /srv/site/uploads en laat de modus op 755 staan. Beperk schrijftoegang tot de enige map die dit nodig heeft.
chmod, zonder de hele boomstructuur plat te slaan
chmod kent twee vormen. Octaal stelt alle negen bits tegelijk in: chmod 644 notes.txt. Symbolisch wijzigt alleen wat u opgeeft en laat de rest ongemoeid: chmod u+x deploy.sh voegt uitvoerrechten toe voor de eigenaar, en chmod go-w notes.txt verwijdert schrijfrechten voor de groep en anderen.
Recursie is waar boomstructuren beschadigd raken. chmod -R 755 . markeert elk afbeeldingsbestand en elk configuratiebestand als uitvoerbaar, omdat chmod geen onderscheid kan maken tussen een script en een JPEG. Gebruik in plaats daarvan de hoofdletter X.
chmod -R u=rwX,go=rX ~/permdemo
stat -c '%a %n' ~/permdemo ~/permdemo/inner/notes.txtDe hoofdletter X past uitvoerrechten toe op mappen, en op bestanden die al ergens een uitvoerbit hadden. Mappen krijgen de modus 755, gewone bestanden 644, en scripts die al uitvoerbaar waren, blijven dat. Wanneer een bestand al een modus heeft die u vertrouwt, kopieert chmod --reference=good.sh other.sh deze naar andere bestanden.
De meldingen die u ziet wanneer een bit onjuist is
bash: ./deploy.sh: Permission denied betekent dat het script niet beschikt over het x-bit in de triad die op u van toepassing is, of dat een map in het pad niet beschikt over het x-bit. chmod u+x deploy.sh verhelpt het eerste geval.
bash: ./deploy.sh: cannot execute: required file not found is een ander type fout met een verwarrende naam. Het x-bit is in orde, maar de interpreter die op de eerste regel staat, ontbreekt. De gebruikelijke oorzaak zijn Windows-regeleinden, waardoor de kernel zoekt naar een interpreter genaamd /bin/bash\r. Herstel dit met sed -i 's/\r$//' deploy.sh.
Permissions 0644 for '/home/deploy/.ssh/id_ed25519' are too open. is afkomstig van de SSH-client, die weigert een private key te gebruiken die door andere accounts gelezen kan worden. De key vereist 600 en ~/.ssh vereist 700. Het volledige beheer van keys staat in het beheren van SSH-keys en hun bestandsrechten.
Authentication refused: bad ownership or modes for directory /home/deploy/.ssh verschijnt in de journal van de server wanneer een homedirectory of de bijbehorende .ssh door de groep beschrijfbaar is. De sshd-instelling StrictModes wijst de key af, wat aan de kant van de client oogt als een onverwachte wachtwoordprompt zonder verdere uitleg.
sudo: /etc/sudoers is world writable, gevolgd door sudo: no valid sudoers sources found, quitting, betekent dat sudo de modus van zijn eigen configuratie heeft gecontroleerd en weigert uit te voeren. Dat bestand moet 0440 zijn en mag nooit door iedereen beschrijfbaar zijn. Dit is het klassieke gevolg van een breed recursief chmod-commando, en het kan tegelijkertijd optreden met de bovenstaande sshd-melding, waardoor de console van de provider de enige overgebleven toegangsweg is.
Waarom 777 geen oplossing is
777 geeft schrijfrechten aan elk account op de machine en aan elk proces dat onder een van die accounts draait. Een server voert services uit onder hun eigen gebruikers, waardoor "iedereen" op een VPS veel meer omvat dan op een laptop. Een service die wordt gecompromitteerd, kan schrijven op elke locatie die 777 toestaat.
Onder een web root is de schade direct. Een voor iedereen beschrijfbare map die de server ook serveert, betekent dat een kwetsbaarheid in een bestandsupload een manier wordt om een script te plaatsen en dit vervolgens op te vragen.
777 is bijna altijd het verkeerde antwoord op een vraag over eigenaarschap. Het symptoom is "de app kan niet naar deze map schrijven". De oorzaak is dat de map aan de verkeerde gebruiker toebehoort. sudo chown -R appuser:appuser /srv/app/storage met modus 755 lost dit op: de applicatie kan daar schrijven, en elk ander account kan de map nog steeds inzien en betreden, maar er niet in schrijven. Het aanmaken van die accounts voordat er iets wordt uitgerold, hoort bij de eerste tien minuten op een nieuwe VPS.
Schrijfrechten voor iedereen zijn legitiem op één bekende plek, /tmp, en dat wordt geschreven als drwxrwxrwt. De toevoeging t is de sticky bit: de map is voor iedereen beschrijfbaar, maar een gebruiker mag alleen bestanden verwijderen waarvan hij de eigenaar is. Zonder die bit zou elk account de tijdelijke bestanden van een ander account kunnen verwijderen.
Lees een modus voordat u deze wijzigt
Deze commando's lezen alleen de status en zijn daarom veilig om overal uit te voeren.
id
umask
stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt
namei -l ~/permdemo/inner/notes.txt
find ~/permdemo -perm -0002find <path> -perm -0002 geeft een lijst van alles onder een pad waarvan de 'world write'-bit is ingesteld. Dit is de snelste manier om een systeem te controleren nadat iemand reparaties heeft uitgevoerd met chmod 777.
Om te controleren of een specifiek service-account een map kan openen, voert u de controle uit als dat account. sudo -u www-data test -x /srv/site && echo yes || echo no geeft yes weer wanneer die gebruiker toegang heeft tot de map, en no wanneer dit niet het geval is. De controle uitvoeren als root bewijst niets, omdat root de controle overslaat en het antwoord altijd yes is.
FAQ
Wat betekent drwxr-xr-x in Linux?
Het is een map, aangegeven door de leidende d, met modus 755. De eigenaar-triade is rwx, dus de eigenaar heeft alle rechten op de map. De groep-triade is r-x en de overige-triade is r-x, wat betekent dat iedereen de inhoud kan bekijken en door de map kan navigeren, terwijl alleen de eigenaar bestanden kan toevoegen of verwijderen. Controleer elk pad met stat -c '%A %a %U %G %n' <path>, dat de lettervorm en de octale vorm naast elkaar weergeeft.
Waarom hebben webbestanden 644 en webmappen 755?
De webserver draait onder een ander account, www-data op Ubuntu. Deze heeft leesrechten nodig voor de bestanden die worden geserveerd en moet door elke bovenliggende map kunnen navigeren; schrijfbevoegdheid is niet nodig. 644 geeft de eigenaar schrijfrechten en anderen leesrechten. 755 geeft de eigenaar schrijfrechten en anderen het recht om door de map te navigeren. Een map waar de applicatie daadwerkelijk in moet schrijven, moet met chown worden overgedragen aan de gebruiker van die applicatie, in plaats van de rechten voor iedereen te verruimen.
Betekent de x-bit dat ik een map kan uitvoeren?
Nee. Bij een map betekent x navigeren, wat het recht is om een naam binnen de map op te lossen terwijl de kernel een pad doorloopt. cd heeft dit nodig, evenals elke opening van een bestand daaronder. Elke map in het pad heeft x nodig; een bestand met modus 644 is dus onbereikbaar als een bovenliggende map voor u geen x heeft. namei -l /path/to/file toont de modus van elke map in de keten, wat aangeeft waar de zoekopdracht stopt.
Is chmod 777 ooit de juiste oplossing?
Vrijwel nooit op een server. Het verleent schrijfrechten aan elk account op de machine, inclusief de accounts waaronder services draaien, waardoor een gecompromitteerde service het bestand kan overschrijven. Wanneer een applicatie niet in een map kan schrijven, is het werkelijke probleem meestal het eigenaarschap: sudo chown -R appuser:appuser /srv/app/storage met modus 755 geeft de applicatie schrijftoegang, terwijl andere accounts de map nog steeds kunnen lezen maar er niet in kunnen schrijven. De bekende uitzondering is /tmp op 1777; dit werkt alleen omdat de sticky bit voorkomt dat gebruikers elkaars bestanden verwijderen.
Waarom toont ls een punt of een plus na de rechten?
Dat elfde teken beschrijft regels die verder gaan dan de negen rechtenbits. Een punt, zoals in drwxr-xr-x., betekent dat er een SELinux-beveiligingscontext is gekoppeld, wat gebruikelijk is op Fedora en Rocky. Een plus, zoals in drwxr-xr-x+, betekent dat er een POSIX ACL (access control list) is ingesteld, waardoor bepaalde gebruikers of groepen rechten hebben die niet in de drie triaden worden getoond. Voer getfacl <path> uit om die extra vermeldingen weer te geven.