table of contents
access(2) | System Calls Manual | access(2) |
NAAM¶
access, faccessat, faccessat2 - controleer gebruikers rechten voor een bestand.
BIBLIOTHEEK¶
Standard C bibliotheek (libc, -lc)
SAMENVATTING¶
#include <unistd.h>
int access(const char *padnaam, int toestand);
#include <fcntl.h> /* Definitie van AT_* constanten */ #include <unistd.h>
int faccessat(int mapbi, const char *padnaam, int toestand, int vlaggen);
/* Maar zie C library/kernel verschillen, hieronder */
#include <fcntl.h> /* Definitie van AT_* constanten */ #include <sys/syscall.h> /*Definitie van SYS_* constanten */ #include <unistd.h>
int syscall(SYS_faccessat2, int mapbi, const char *pathname, int toestand, int vlaggen);
faccessat():
Vanaf glibc 2.10:
_POSIX_C_SOURCE >= 200809L
Voor glibc 2.10:
_ATFILE_SOURCE
BESCHRIJVING¶
access() controleert of het aanroepende proces het bestand padnaam mag benaderen. Als padnaam een symbolische koppeling is, dan wordt deze zelf gebruikt.
De toestand specificeert welke toegangscontroles moeten gedaan worden, en is ofwel de waarde van F_OK, ofwel een masker bestaande uit een bitgewijze OF van een of meer van R_OK, W_OK, en X_OK. F_OK controleert op het bestaan van het bestand. R_OK, W_OK, en X_OK controleert of het bestand bestaat en respectievelijk lees, schrijf en uitvoer permissies toe staat.
De controle wordt gedaan gebruik makend van de echte UID en GID van het aanroepende proces, in plaats van de effectieve ID´s zoals gedaan tijdens het uitvoeren van een operatie (b.v. open(2)) op het bestand. Op dezelfde manier, voor de systeembeheerder, de controle gebruikt een verzameling van toegestane mogelijkheden in plaats van een verzameling van effectieve mogelijkheden; en voor niet-systeembeheerders gebruikt de controle een lege verzameling van mogelijkheden.
Dit maakt het mogelijk dat set-user-ID programma´s en gerechtigde programma´s om makkelijk de autoriteit van aanroepende gebruikers te bepalen. Met andere woorden , access() beantwoord de "kan ik het bestand lezen/schrijven/uitvoeren" vraag niet. Het beantwoord een lichtelijk andere vraag: "(aannemende dat ik een setuid binaire ben) mag de gebruiker die mij aanriep dit bestand lezen/schrijven/uitvoeren?", dit geeft set-user-ID programma´s de mogelijkheid om te voorkomen dat kwaadaardige gebruikers bestanden lezen die ze niet zouden moeten kunnen lezen.
Als het aanroepende proces gerechtigd is (m.a.w. zijn effectieve UID is nul), dan zal een X_OK controle succesvol zijn voor een regulier bestand als het uitvoer-recht is ingeschakeld voor een van de bestandsbits: eigenaar, groep of ander.
faccessat()¶
De faccessat() systeem aanroep werkt op precies dezelfde wijze als access(), behalve voor de hier beschreven verschillen.
Als het pad gegeven in padnaam relatief is, dan wordt deze geïnterpreteerd als relatieve aan de map aangewezen door de bestandsbeschrijving mapbi (in plaats van relatief aan de huidige werkmap van het aanroepende proces, zoals gedaan door access() voor een relatieve padnaam).
Als padnaam relatief is en mapbi heeft de speciale waarde AT_FDCWD, dan wordt padnaam geïnterpreteerd als relatief aan de huidige werkmap van het aanroepende proces (zoals access()).
Als padnaam absoluut is, dan wordt mapbi genegeerd.
vlaggen wordt gemaakt door OF´en van een of meer van de volgendewaarden:
- AT_EACCESS
- Voer toegangscontrole uit gebruikmakend van de effectieve gebruiker en groeps ID´s. Standaard gebruikt faccessat() echte ID´s (zoals access()).
- AT_EMPTY_PATH (vanaf Linux 5.8)
- Als padnaam een lege tekenreeks is, verwerk dan het bestand aangewezen door dirfd (die kan zijn verkregen door het gebruik van de open(2) O_PATH vlag). In dit geval kan dirfd verwijzen naar elk type bestand, niet alleen een map. Als dirfd gelijk is aan AT_FDCWD, dan werkt de aanroep op de huidige werkmap. Deze vlag is Linux-specifiek; definieer _GNU_SOURCE om zijn definitie te verkrijgen.
- AT_SYMLINK_NOFOLLOW
- Als padnaam een symbolische koppeling is, volg deze niet: in plaats daarvan, retourneer informatie over de koppeling zelf.
Zie openat(2) voor een uitleg over de noodzaak van faccessat().
faccessat2()¶
De hierboven gegeven beschrijving van faccessat() komt overeen met POSIX.1 en met de implementatie voorzien in glibc. Hoewel de glibc implementatie een imperfecte emulatie (zie BUGS) was die struikelde over het feit dat de onbewerkte Linux faccessat() systeem aanroep geen vlaggen argument heeft. Om te voorzien in een juiste implementatie, voegde Linux 5.8 de faccessat2() systeem aanroep toe, die het vlaggen argument ondersteund en een juiste implementatie van de faccessat() mogelijk maakt.
EIND WAARDE¶
Bij succes (alle gevraagde permissies toegestaan, of toestand is F_OK en het bestand bestaat), nul wordt teruggegeven. Bij een fout (minstens een gevraagd bit in toestand voor een permissie werd geweigerd, of toestand is F_OK en het bestand bestaat niet, of een andere fout trad op), -1 wordt terug gegeven, en errno wordt gezet om de fout aan te duiden.
FOUTEN¶
- EACCES
- De gevraagde toegang tot het bestand zou geweigerd worden, of zoek toestemming werd geweigerd in een van de mappen in padnaam. Zie ook path_resolution(7).
- EBADF
- (faccessat()) padnaam is relatief maar mapbi is noch AT_FDCWD (faccessat()) noch een geldige bestandsbeschrijving.
- EFAULT
- padnaam wijst buiten de voor u toegankelijke adresruimte.
- EINVAL
- toestand werd ongeldig opgegeven.
- EINVAL
- (faccessat()) Ongeldige vlag opgegeven in vlaggen.
- EIO
- Een Invoer/Uitvoer fout trad op.
- ELOOP
- Teveel symbolische koppelingen werden tegengekomen bij het vaststellen van padnaam.
- ENAMETOOLONG
- padnaam is te lang.
- ENOENT
- Een map-deel van padnaam zou toegankelijk geweest zijn maar bestaat niet of was een zwevende symbolische koppeling.
- ENOMEM
- Onvoldoende kernelgeheugen voorhanden.
- ENOTDIR
- Een onderdeel gebruikt als map in padnaam is in feite geen map.
- ENOTDIR
- (faccessat()) padnaam is relatief en mapbi is een bestand beschrijving die wijst naar een bestand in plaats van een map.
- EPERM
- Schrijf toestemming werd gevraagd voor een bestand op een alleen-lezen bestandssysteem. Zie ook ioctl_iflags(2).
- EROFS
- Schrijf toestemming werd gevraagd voor een bestand op een alleen-lezen bestandsysteem.
- ETXTBSY
- Schrijf toegang werd gevraagd aan een uitvoerbaar bestand dat wordt uitgevoerd.
VERSIES¶
Als het aanroepende proces gepaste rechten heeft (m.a.w. systeembeheerder), staat POSIX.1-2001 een implementatie toe om succes te melden voor een X_OK controle zelfs als géén van de uitvoer-recht bits zijn gezet. Linux doet dit niet.
C library/kernel verschillen¶
De onbewerkte faccessat() systeem aanroep gebruikt alleen de eerste drie argumenten. De AT_EACCESS en AT_SYMLINK_NOFOLLOW vlaggen zijn daadwerkelijk geïmplementeerd. in de glibc omwikkel functie voor faccessat(). Als een van deze vlaggen werd opgegeven, dan gebruikt de omwikkel functie fstatat(2) om de toegangsrechten te bepalen.
Glibc-opmerkingen¶
Op oudere kernels waar faccessat() niet beschikbaar is (en indien de AT_EACCESS en AT_SYMLINK_NOFOLLOW vlaggen werden niet opgegeven, valt de glibc omwikkel functie terug op het gebruik van access(). Als padnaam een relatieve padnaam is, dan construeert glibc een padnaam gebaseerd op de symbolische koppeling in /proc/self/fd die overeenkomt met het mapbi argument.
VOLDOET AAN¶
- access()
- faccessat()
- POSIX.1-2008.
- faccessat2()
- Linux.
GESCHIEDENIS¶
- access()
- SVr4, 4.3BSD, POSIX.1-2001.
- faccessat()
- Linux 2.6.16, glibc 2.4.
- faccessat2()
- Linux 5.8.
OPMERKINGEN¶
Waarschuwing: Deze aanroepen gebruiken om te controleren of een gebruiker is gerechtigd om, bij voorbeeld, een bestand te openen alvorens het echt te doen door open(2) te gebruiken, creëert een veiligheidslek, omdat de gebruiker het korte tijdinterval tussen de controle en het openen van het bestand kan gebruiken om het te manipuleren. Om deze reden moet het gebruik van deze systeem aanroep worden vermeden. (In het hier beschreven voorbeeld, is een veiliger alternatie om tijdelijk het effectieve gebruikers ID te veranderen naar het echte ID en dan open(2) aan te roepen.)
access() volgt symbolische koppelingen altijd. Als u de rechten van een symbolische koppeling zelf wilt controleren, gebruik dan faccessat() met de vlag AT_SYMLINK_NOFOLLOW.
Deze aanroepen geven een fout terug zodra een van de toegang typen in toestand wordt geweigerd, zelfs als een van de andere typen in toestand wordt toegestaan.
Een bestand is alleen toegankelijk als de rechten in elk van de mappen in het pad voorvoegsel van padnaam zoeken toestaat (m.a.w. uitvoer) recht heeft. Als enige map niet toegankelijk is dan zal de access() aanroep falen, onafhankelijk van de rechten van het bestand zelf.
Alleen toegangs bits worden gecontroleerd, niet het bestandstype of inhoud. Daarom, als de map als schrijfbaar werd bevonden, betekent dit dat hoogstwaarschijnlijk bestanden in deze map kunnen worden aangemaakt, en niet dat de map als een bestand kan worden geschreven. Vergelijkbaar, kan een DOS bestand gevonden worden als "uitvoerbaar", maar de execve(2) aanroep zal falen.
Deze aanroepen kunnen niet correct werken op een NFSv2 bestandssysteem met UID-mapping ingeschakeld, omdat UID-mapping op de server plaats vind en onzichtbaar is vanaf de client, die de rechten controleert, (NFS versie 3 en hoger voeren de controle op de server uit.) Vergelijkbare problemen kunnen optreden op FUSE koppeling.
BUGS¶
Omdat de Linux kernel´ faccessat() systeem aanroep het vlaggen argument niet ondersteund, emuleert glibc´s faccessat() omwikkel functie, voorzien in glibc 2.32 en eerder, de vereiste functionaliteit gebruik makende van een combinatie van de faccessat() systeem aanroep en fstatat(2). Hoewel deze emulatie ACL´s niet in in aanmerking neemt. Vanaf glibc 2.33, vermijd de omwikkel functie deze bug door gebruik te maken van de faccessat2() systeem aanroep waar het in wordt voorzien de de onderliggende kernel.
In Linux 2.4 (en eerder) is iets vreemds in het behandelen van X_OK testen voor de systeembeheerder. Wanneer alle categorieën van uitvoer-rechten zijn uitgeschakeld voor een niet-map bestand, dan is de enige access() test die -1 retourneert is wanneer toestand werd gespecificeerd als alleen X_OK; indien R_OK of W_OK ook werden gespecificeerd in toestand, dan retourneert access() een 0 voor zulke bestanden. Vroegere Linux 2.6 kernels (tot en met Linux 2.6.3) gedroegen zich op dezelfde manier als Linux 2.4.
In Linux voor 2.6.20, ignoreerden deze aanroepen het effect van de MS_NOEXEC vlag als deze was gebruikt om te mount(2)´en het onderliggende bestandssysteem. Vanaf kernel 2.6.20 wordt de MS_NOEXEC vlag gehonoreerd.
ZIE OOK¶
chmod(2), chown(2), open(2), setgid(2), setuid(2), stat(2), euidaccess(3), credentials(7), path_resolution(7), symlink(7)
VERTALING¶
De Nederlandse vertaling van deze handleiding is geschreven door Mario Blättermann <mario.blaettermann@gmail.com> en Luc Castermans <luc.castermans@gmail.com>
Deze vertaling is vrije documentatie; lees de GNU General Public License Version 3 of later over de Copyright-voorwaarden. Er is geen AANSPRAKELIJKHEID.
Indien U fouten in de vertaling van deze handleiding zou vinden, stuur een e-mail naar debian-l10n-dutch@lists.debian.org.
2 mei 2024 | Linux man-pages (unreleased) |