Braindamage of the POSIX Ext. ACL

A standard unix permissionok sok esetben túl kevesek, ez oké. Kellene jobb. Itt lépnek színre a droidok, amikor megírják a POSIX Extended ACL-eket definiáló IEEE 1003.1e draft-ot (withdrawn!). Az elképzelés önmagában még nem is lenne teljes katasztrófa, de valamelyik "igazán haladó szellemiségű" lamer okosan kitalálta, hogy a group permission-ök mostantól a mask permission-öket írják le (ami tartalmazza az összes, egyes usereknek kiosztott permissiont).


Szemléltetés (FreeBSD 6):


$ chmod 700 test
$ ls -ld test
drwx
------ 2 gabucino users 512 Jan 19 09:01 test
$ setfacl -m u:clamav:rx test
$ ls -ld test
drwx
r-x---+ 2 gabucino users 512 Jan 19 09:04 test
$ setfacl -m u:ldap:w test
$ ls -ld test
drwx
rwx---+ 2 gabucino users 512 Jan 19 09:06 test
$ getfacl test
#file:test
#owner:1001
#group:1001
user::rwx
user:clamav:
r-x
user:ldap:
-w-
group::
---
mask::rwx
other::---


At this point we are owned badly. Miért? Mert bullshit van a group permissionökben. Jelenleg két, egymásnak ellentmondó információ van eltárolva a kérdéses file-ről (dir, actually): a standard ACL szerint a tulajdonos csoport összes tagjának read, write, exec engedélyei vannak, míg az extended ACL szerint ezek közül egyik sincs meg! Nagyon sok olyan program van ami nem fogad el group/world readable fileokat (pl scponlyc, maildrop), ezeken az eseteken segítene az extended ACL, de hála a katasztrofális implementációnak, a helyet egy cseppet sem javult, csak a breakage lett több.

Semmi gond, van a setfacl-nek egy ilyen opciója:

-n Do not recalculate the permissions associated with the ACL mask entry.

Na, tegyünk akkor keresztbe a szar szabványnak (FreeBSD 6):


$ rmdir test
$ mkdir test
$ chmod 700 test
$ setfacl -n -m u:ldap:rx test
setfacl: warning: no mask entry
setfacl: acl_set_file() failed for test: Invalid argument


Failed attempt. Az -n opció nem használható, ha még nincs mask entry. Mivel ezt a szabvány megköveteli, a stuff inkább kiszáll. Természetesen Linuxon ezt is sikerült újabb faszsággal tetézni, ott ugyanis ugyanez a parancs el sem száll, épp csak nem csinál semmit. Way to go, fasza implementáció ez is.

Nade mi van akkor, ha már van egy üres mask entry (tehát standard ACL = extended ACL), és utána probálom ugyanezt az opciót? Akkor már jó a group permission, éljen!


$ ls -ld test
dr-x
------+ 2 gabucino users 512 Jan 19 09:20 test


Csakhogy a hozzáadott ACL sem él.


$ getfacl test
#file:test
#owner:1001
#group:1001
user::r-x
user:ldap:r-x
# effective: ---
group::---
mask::---
other::---


Fussatok. Ja, és a slusszpoén, OSX-en úgy működik ahogy az értelmesen gondolkodó ember számára (az unix applikációkról nem is beszélve) elvárható:


$ mkdir test
$ chmod 700 test
$ chmod +a "clamav allow write" test
$ ls -led test
drwx
------ + 2 gabucino Gabucino 68 Jan 19 09:30 test
0: user:clamav
allow add_file


És hogy ez miért van? Nos azért mert az Apple nem a POSIX szabványt (valójában nem is az, mert mint már írtam, nem fogadták el) választotta (még jó, hiszen fundamentally broken), hanem az NFSv4 ACL szabványt. Az IBM AIX rendszerében is ez található meg, a többi viszont mind szar.