本文实验基于The Linux Command Line, 2nd Edition,第9章:Permissions中的实验。技术点是umask和setgid
新建2个用户,karen和bill:
sudo useradd bill
sudo useradd karen
系统自动建立了与用户名相同的group:
$ id bill
uid=54322(bill) gid=54332(bill) groups=54332(bill)
$ id karen
uid=54323(karen) gid=54333(karen) groups=54333(karen)
因为她们都属于音乐兴趣组,因此新建组music,并赋予此2用户,作为secondary/supplementary group:
sudo groupadd music
sudo usermod bill -G music
sudo usermod karen -G music
确认加组成功:
$ id bill
uid=54322(bill) gid=54332(bill) groups=54332(bill),54334(music)
$ id karen
uid=54323(karen) gid=54333(karen) groups=54333(karen),54334(music)
创建一个共享工作目录:
sudo mkdir /usr/local/share/Music
由于umask是0022,即000-000-010-010
,因此group和other的w权限被去掉了:
$ umask
0022
$ ls -ld /usr/local/share/Music
drwxr-xr-x. 2 root root 6 Aug 9 02:16 /usr/local/share/Music
由于Music目录是共享目录,因此修改其group权限为music,并增加group的写权限:
$ sudo chown :music /usr/local/share/Music
$ ls -ld /usr/local/share/Music
drwxr-xr-x. 2 root music 6 Aug 9 01:45 /usr/local/share/Music
$ sudo chmod g+w /usr/local/share/Music
$ ls -ld /usr/local/share/Music
drwxrwxr-x. 2 root music 6 Aug 9 01:45 /usr/local/share/Music
到这里,按照原文的说法,应该有2个问题。
- 创建的文件,不能被同组其他成员修改
- 创建的文件,组并非music,而是与用户名相同的组
分别以karen和bill用户登录,并各自在共享目录中生成文件:
$ ls -l /usr/local/share/Music
total 0
-rw-rw-r--. 1 bill bill 0 Aug 9 02:25 bill
-rw-rw-r--. 1 karen karen 0 Aug 9 02:25 karen
我们发现问题1并不存在,原因是用户的umask是0002,而并非原书中的0022:
$ id
uid=54323(karen) gid=54332(karen) groups=54332(karen),54333(music) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
$ umask
0002
那为何karen,bill的umask是0002?原因在/etc/profile文件中:
...
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi
...
第2个问题,可以通过setgid解决:
sudo chmod g+s /usr/local/share/Music
再次分别以karen和bill用户登录,并各自在共享目录中生成文件:
$ ls -lt
total 0
-rw-rw-r--. 1 karen music 0 Aug 9 09:35 karen01
-rw-rw-r--. 1 bill music 0 Aug 9 09:35 bill01
## 上面是setgid之后生成的
## 下面是setgid之前生成的
-rw-rw-r--. 1 bill bill 0 Aug 9 08:48 bill
-rw-rw-r--. 1 karen karen 0 Aug 9 08:47 karen
可以看到,新的文件所属的group变为了目录的group,即music。而非执行操作用户(karen或bill)的group。
概念参看这里:
Setting the setgid permission on a directory causes files and subdirectories created within to inherit its group ownership, rather than the primary group of the file-creating process.
清理:
userdel -r bill
userdel -r karen
groupdel music
rm -fr /usr/local/share/Music
参考
- https://en.wikipedia.org/wiki/Setuid
- Writing setuid or setgid Scripts
- Linux file permissions explained
- An Introduction to Linux Permissions
- Linux directory permissions for different groups
- https://www.pexels.com/