"普通許可權管理詳細說明" 一,特殊許可權:SUID,SGID,STICKY 1,SUID 預設情況下,用戶發起的進程的屬主是其發起者,因此,進程以發起者的身份去訪問別的資源。 SUID的作用:用戶執行某個程式文件時,如果此程式文件擁有SUID許可權,則此進程的屬主不是其發起者,而是這個程式文件的屬主。 ...
一,特殊許可權:SUID,SGID,STICKY
1,SUID
預設情況下,用戶發起的進程的屬主是其發起者,因此,進程以發起者的身份去訪問別的資源。
SUID的作用:用戶執行某個程式文件時,如果此程式文件擁有SUID許可權,則此進程的屬主不是其發起者,而是這個程式文件的屬主。
SUID許可權的風險很大!
管理文件的SUID許可權:
chmod u+|-s FILE...
展示位置:屬主的執行許可權位。
- 原來屬主有執行許可權:顯示為小寫的s。
- 原來屬主沒有執行許可權:顯示為大寫的S。
例子:非root用戶是無法使用/bin/cat命令查看/etc/shadow文件的內容的。
拷貝/bin/cat到/home/ys/bin下,給/home/ys/bin/cat加上SUID後,就可以使用/home/ys/bin/cat命令,查看/etc/shadow文件的內容了。
# ll /etc/shadow ----------. 1 root root 1674 Dec 24 17:19 /etc/shadow # su - ys $ cat /etc/shadow cat: /etc/shadow: Permission denied # ll /bin/cat -rwxr-xr-x. 1 root root 54160 Oct 31 2018 /bin/cat # cp /bin/cat /home/ys/bin/ # ll /home/ys/bin/ -rwxr-xr-x. 1 root root 54160 Dec 24 18:17 cat # su - ys $ /home/ys/bin/cat /etc/shadow /home/ys/bin/cat: /etc/shadow: Permission denied $ sudo chmod u+s /home/ys/bin/cat $ ll /home/ys/bin/cat -rwsr-xr-x. 1 root root 54160 Dec 24 18:17 /home/ys/bin/cat $ /home/ys/bin/cat /etc/shadow > /dev/null $ echo $? 0
由於沒有個用戶都可以修改自己的密碼,所以程式/bin/passwd就必須有SUID許可權。因為修改密碼要修改/etc/passwd文件,這個文件只有root用戶才有寫許可權。所以普通用戶運行/bin/passwd,就必須用root的身份運行,才能夠修改/etc/passwd文件。
$ ll /bin/passwd -rwsr-xr-x. 1 root root 27832 Jun 10 2014 /bin/passwd $ ll /etc/passwd -rw-r--r--. 1 root root 2643 Dec 23 21:38 /etc/passwd
2, SGID
用戶fedora和gentoo都在組mageedu里。目錄/tmp/test的屬組是mageedu。
讓fedora用戶在目錄/tmp/test下創建文件a.fedora,a.fedora文件的屬組是用戶fedora的基本組,也就是fedora。
讓gentoo用戶在目錄/tmp/test下創建文件a.gentoo,a.gentoo文件的屬組是用戶gentoo的基本組,也就是gentoo。
有個需求,希望同一組的用戶,在某個目錄下創建的文件,組裡的成員都有許可權修改。上面的2個用戶雖然都在組mageedu里,但是創建文件時,預設的屬組是用戶的基本組,有沒有一個辦法,讓創建文件的屬組自動是此目錄的屬組呢?SGID就登場了!
SGID用途:設置在目錄的屬組上。效果是,在此目錄下創建的文件的屬組,是此目錄的屬組,而不是用戶的基本組了
# ll -d /tmp/test drwxrwxr-x. 2 ys mageedu 6 Dec 24 19:16 /tmp/test # id fedora uid=1005(fedora) gid=1005(fedora) groups=1005(fedora),5000(mageedu) # id gentoo uid=1004(gentoo) gid=1004(gentoo) groups=1004(gentoo),1001(za1),5000(mageedu) # su - fedora Last login: Thu Dec 19 21:35:48 CST 2019 on pts/2 $ cd /tmp/test $ touch a.fedora $ ll -rw-rw-r--. 1 fedora fedora 0 Dec 24 19:24 a.fedora # su - gentoo Last login: Tue Dec 24 17:19:49 CST 2019 on pts/2 $ cd /tmp/test $ touch a.gentoo $ ll -rw-rw-r--. 1 fedora fedora 0 Dec 24 19:24 a.fedora -rw-rw-r--. 1 gentoo gentoo 0 Dec 24 19:33 a.gentoo # chmod g+s /tmp/test # ll -d /tmp/test drwxrwsr-x. 2 ys mageedu 38 Dec 24 19:33 /tmp/test # su - fedora Last login: Tue Dec 24 19:23:49 CST 2019 on pts/1 $ cd /tmp/test $ touch b.fedora $ ll -rw-rw-r--. 1 fedora fedora 0 Dec 24 19:24 a.fedora -rw-rw-r--. 1 gentoo gentoo 0 Dec 24 19:33 a.gentoo -rw-rw-r--. 1 fedora mageedu 0 Dec 24 19:35 b.fedora # su - gentoo Last login: Tue Dec 24 19:33:15 CST 2019 on pts/1 $ cd /tmp/test $ touch b.gentoo $ ll -rw-rw-r--. 1 fedora fedora 0 Dec 24 19:24 a.fedora -rw-rw-r--. 1 gentoo gentoo 0 Dec 24 19:33 a.gentoo -rw-rw-r--. 1 fedora mageedu 0 Dec 24 19:35 b.fedora -rw-rw-r--. 1 gentoo mageedu 0 Dec 24 19:35 b.gentoo # su - ys Last login: Tue Dec 24 19:14:42 CST 2019 from 10.247.236.90 on pts/1 $ cd /tmp/test $ touch a.ys $ ll -rw-rw-r--. 1 fedora fedora 0 Dec 24 19:24 a.fedora -rw-rw-r--. 1 gentoo gentoo 0 Dec 24 19:33 a.gentoo -rw-rw-r--. 1 ys mageedu 0 Dec 24 19:38 a.ys -rw-rw-r--. 1 fedora mageedu 0 Dec 24 19:35 b.fedora -rw-rw-r--. 1 gentoo mageedu 0 Dec 24 19:35 b.gentoo [ys@localhost test]$ id ys uid=1000(ys) gid=1000(ys) groups=1000(ys),10(wheel)
管理文件的GUID許可權:
chmod g+|-s FILE...
展示位置:屬組的執行許可權位。
- 原來屬主有執行許可權:顯示為小寫的s。
- 原來屬主沒有執行許可權:顯示為大寫的S。
3,Sticky
如果某個用戶擁有對某個目錄的寫許可權,則他可以刪除這個目錄里的任何文件,也就是可以刪除此目錄里別的用戶創建的文件。
有個需求,不希望自己創建的文件被別的用戶刪除掉。Sticky登場了!
Sticky用途:設置在目錄的other上。效果是,在此目錄下文件,只有是自己創建的才可以刪除。
$ ls -ld /tmp/test drwxrwsr-x. 2 ys mageedu 70 Dec 24 19:59 /tmp/test $ pwd /tmp/test $ ll -rw-rw-r--. 1 fedora fedora 0 Dec 24 19:24 a.fedora -rw-rw-r--. 1 ys mageedu 4 Dec 24 19:50 a.ys -rw-rw-r--. 1 fedora mageedu 4 Dec 24 19:51 b.fedora -rw-rw-r--. 1 gentoo mageedu 4 Dec 24 19:50 b.gentoo -rw-rw-r--. 1 fedora mageedu 0 Dec 24 19:51 c.fedora -rw-rw-r--. 1 gentoo mageedu 0 Dec 24 19:51 c.gentoo [fedora@localhost test]$ whoami fedora [fedora@localhost test]$ rm a.ys [fedora@localhost test]$ rm b.gentoo [fedora@localhost test]$ ll -rw-rw-r--. 1 fedora fedora 0 Dec 24 19:24 a.fedora -rw-rw-r--. 1 fedora mageedu 4 Dec 24 19:51 b.fedora -rw-rw-r--. 1 fedora mageedu 0 Dec 24 19:51 c.fedora -rw-rw-r--. 1 gentoo mageedu 0 Dec 24 19:51 c.gentoo 用戶fedora可以刪除別的用戶創建的文件。 修改此目錄的Sticky # chmod o+t /tmp/test # ll -d /tmp/test drwxrwsr-t. 2 ys mageedu 70 Dec 24 19:59 /tmp/test # su - gentoo Last login: Tue Dec 24 19:50:46 CST 2019 on pts/1 $ cd /tmp/test $ ll -rw-rw-r--. 1 fedora fedora 0 Dec 24 19:24 a.fedora -rw-rw-r--. 1 fedora mageedu 4 Dec 24 19:51 b.fedora -rw-rw-r--. 1 fedora mageedu 0 Dec 24 19:51 c.fedora -rw-rw-r--. 1 gentoo mageedu 0 Dec 24 19:51 c.gentoo $ rm a.fedora rm: remove write-protected regular empty file ‘a.fedora’? y rm: cannot remove ‘a.fedora’: Operation not permitted $ rm c.gentoo $ ll -rw-rw-r--. 1 fedora fedora 0 Dec 24 19:24 a.fedora -rw-rw-r--. 1 fedora mageedu 4 Dec 24 19:51 b.fedora -rw-rw-r--. 1 fedora mageedu 0 Dec 24 19:51 c.fedora 修改sticky後,就不能刪除別的用戶創建的文件了,只可以刪除自己創建的文件。
系統上/tmp和/var/tmp目錄,預設都有sticky許可權。
管理文件的GUID許可權:
chmod o+|-t FILE...
展示位置:other的執行許可權位。
- 原來屬主有執行許可權:顯示為小寫的t。
- 原來屬主沒有執行許可權:顯示為大寫的T。
四,管理特殊許可權的另一種方法:
suid | sgid | sticy | 八進位許可權 |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 |
0 | 1 | 0 | 2 |
0 | 1 | 1 | 3 |
1 | 0 | 0 | 4 |
1 | 0 | 1 | 5 |
1 | 1 | 0 | 6 |
1 | 1 | 1 | 7 |
又組成了一組,類似rwx的許可權位。
所以,可在預設的3位八進位數字的左側再加一位八進位數字,來表示各種組合。
chmod 1777 FILE...
chmod 4777 FILE...
...
二,文件訪問許可權列表(file access control list)
文件除了有user,group,other的許可權控制外,還有一個更靈活的許可權控制機制。
可以針對某個文件,讓特定的某些用戶,或組訪問。
這個功能就叫facl
1,查看文件的額外訪問許可權:getfacl files
下麵的/tmp/test/a.fedora沒有額外的許可權控制,所以別的用戶無法修改此文件。
$ ll a.fedora
-rw-rw-r--. 1 fedora fedora 0 Dec 24 19:24 a.fedora
$ getfacl /tmp/test/a.fedora
getfacl: Removing leading '/' from absolute path names
# file: tmp/test/a.fedora
# owner: fedora
# group: fedora
user::rw-
group::rw-
other::r--
2,給文件添加額外的許可權控制:setfacl -m user/group:user/group:xxx files
給/tmp/test/a.fedora添加額外的許可權控制。賦予用戶ys可以修改此文件的許可權。
賦予許可權後再other的可執行許可權位的後面多了個加號。
$ whoami
fedora
$ setfacl -m user:ys:rw a.fedora
$ getfacl a.fedora
# file: a.fedora
# owner: fedora
# group: fedora
user::rw-
user:ys:rw-
group::rw-
mask::rw-
other::r--
$ ll
-rw-rw-r--+ 1 fedora fedora 0 Dec 24 19:24 a.fedora
$ whoami
ys
$ echo 111 >> a.fedora
$ cat a.fedora
111
給/tmp/test/a.fedora添加額外的許可權控制。賦予組mageedu可以修改此文件的許可權。
$ whoami
fedora
$ setfacl -m group:mageedu:rw a.fedora
$ getfacl a.fedora
# file: a.fedora
# owner: fedora
# group: fedora
user::rw-
user:ys:rw-
group::rw-
group:mageedu:rw-
mask::rw-
other::r--
$ id gentoo
uid=1004(gentoo) gid=1004(gentoo) groups=1004(gentoo),1001(za1),5000(mageedu)
$ whoami
gentoo
$ cd /tmp/test
$ ll
-rw-rw-r--+ 1 fedora fedora 4 Dec 24 22:10 a.fedora
$ echo 44444 >> a.fedora
$ cat a.fedora
111
44444
3,刪除文件的額外許可權控制:setfacl -x user/group files
$ getfacl a.fedora
# file: a.fedora
# owner: fedora
# group: fedora
user::rw-
user:ys:rw-
group::rw-
group:mageedu:rw-
mask::rw-
other::r--
$ setfacl -x user:ys a.fedora
$ getfacl a.fedora
# file: a.fedora
# owner: fedora
# group: fedora
user::rw-
group::rw-
group:mageedu:rw-
mask::rw-
other::r--
$ setfacl -x group:mageedu a.fedora
$ getfacl a.fedora
# file: a.fedora
# owner: fedora
# group: fedora
user::rw-
group::rw-
mask::rw-
other::r--
4,Linux的許可權判斷邏輯:
首先判斷啟動進程的用戶是否和file的user相同?
- 相同:使用第一組rwx
- 不相同:判斷啟動進程的用戶是否在file的額外可訪問用戶的列表裡面?
- 在額外可訪問用戶的列表裡面:使用額外可訪問用戶的rwx
- 不在額外可訪問用戶的列表裡面:判斷啟動進程的用戶是否在file的group裡面?
- 在group裡面:使用第二組rwx
- 不在group裡面:判斷啟動進程的用戶是否在file的額外可訪問組的列表裡面?
- 在額外可訪問組裡面:使用額外可訪問組的rwx
- 不在額外可訪問組裡面:使用第三組rwx
如果某個文件的other許可權是可寫的,但是額外許可權是不可寫的,則也是不可寫的。
驗證:
$ ll -rw-rw-rw-. 1 fedora mageedu 4 Dec 24 19:51 b.fedora $ su - ys Last login: Tue Dec 24 22:10:28 CST 2019 on pts/2 $ cd /tmp/test $ echo "im ys" > b.fedora $ cat b.fedora im ys $ setfacl -m user:ys:--- b.fedora $ getfacl b.fedora # file: b.fedora # owner: fedora # group: mageedu user::rw- user:ys:--- group::rw- mask::rw- other::rw- $ ll -rw-rw-rw-+ 1 fedora mageedu 6 Dec 24 22:37 b.fedora $ su - ys Last login: Tue Dec 24 22:36:43 CST 2019 on pts/2 $ cd /tmp/test $ echo 3232 >> b.fedora -bash: b.fedora: Permission denied