1. 程式人生 > >linux系統下的權限知識梳理

linux系統下的權限知識梳理

modprobe 文件的特殊權限 commands 都得 boot 處的 特性 bottom rds

下面對linux系統下的有關權限操作命令進行了梳理總結,並配合簡單實例進行說明。

linux中除了常見的讀(r)、寫(w)、執行(x)權限以外,還有其他的一些特殊或隱藏權限,熟練掌握這些權限知識的使用,可以大大提高我們運維工作的效率。


(0)umask是權限碼,默認是022

使用命令"umask"就能查詢出來

文件默認的權限是666,目錄默認的權限是777
新建文件和目錄的權限分別是各自默認權限減去umask權限碼值

即:
新建文件權限,666-022=644
新建目錄權限,777-022=755


(1)chmod,chown,chgrp

chmod 設置數字權限4,2,1,分別對應的是r,w,x,即可讀,可寫,可執行。 對目錄設置權限時,可以加-R遞歸參數
[root@localhost src]# chmod 755 test.txt 
[root@localhost src]# ll test.txt
-rwxr-xr-x. 1 root root 0 Nov 3 16:33 test.txt
[root@localhost src]# chmod 700 test.txt 
[root@localhost src]# ll test.txt
-rwx------. 1 root root 0 Nov 3 16:33 test.txt
[root@localhost src]# chmod 775 -R hello
[root@localhost src]# ll hello
total 4
-rwxrwxr-x. 1 root root 4 Nov 3 17:30 test.txt


chown 設置字符權限,默認表示所屬者權限
chgrp 表示所屬組權限

通常我們可以直接用chown設置所屬者和所屬者

比如給a文件授權所屬者是dengaosky,所屬組是wutao,做法如下:
[root@localhost src]# ll test.txt 
-rwx------. 1 root root 0 Nov 3 16:33 test.txt
[root@localhost src]# chown dengaosky test.txt
[root@localhost src]# ll test.txt 
-rwx------. 1 dengaosky root 0 Nov 3 16:33 test.txt
[root@localhost src]# chgrp dengaosky test.txt
[root@localhost src]# ll test.txt 
-rwx------. 1 dengaosky dengaosky 0 Nov 3 16:33 test.txt

也可以直接使用chown設置
[root@localhost src]# chown dengaosky.dengaosky test.txt [或者chown dengaosky:dengaosky test.txt]
[root@localhost src]# ll test.txt 
-rwx------. 1 dengaosky dengaosky 0 Nov 3 16:33 test.txt

---------------------------------------------------------------------------------------------------
root賬號在普通用戶家目錄下創建的文件,默認該文件的所有者和所屬組權限是root。
1)此普通用戶不能使用echo命令覆蓋和追加文件。
2)但是該用戶對此文件有有直接vim編輯的權限,並且編輯後,文件的所有者和所屬組權限就變成普通用戶的了。
如下:
[root@localhost ~]# cd /home/dengaosky/
[root@localhost dengaosky]# vim test
[root@localhost dengaosky]# cat test 
123456
[root@localhost dengaosky]# ll
total 4
-rw-r--r--. 1 root root 7 Dec 3 10:47 test

[dengaosky@localhost ~]$ echo "dengaosky" >> test
-bash: test: Permission denied
[dengaosky@localhost ~]$ echo "dengaosky" > test
-bash: test: Permission denied
[dengaosky@localhost ~]$ vim test 
[dengaosky@localhost ~]$ ll
total 4
-rw-r--r--. 1 dengaosky dengaosky 15 Dec 3 10:48 test
[dengaosky@localhost ~]$ cat test 
123456
dengaosky


(2)chattr隱藏權限,這個很重要!!!通常用於鎖定文件

有時候你發現用root權限都不能修改某個文件,大部分原因是這個文件曾經使用chattr命令鎖定了。
chattr命令的作用很大,其中一些功能是由Linux內核版本來支持的。
通過chattr命令修改屬性能夠提高系統的安全性,但是它並不適合所有的目錄。

chattr命令不能保護/、/dev、/tmp、/var目錄。
lsattr命令是顯示chattr命令設置的文件屬性。
這兩個命令是用來查看和改變文件、目錄屬性的,與chmod這個命令相比,chmod只是改變文件的讀寫、執行權限,更底層的屬性控制是由chattr來改變的。

chattr在使用時一般常用到兩個參數:i和a
chattr +i 表示只有查看文件權限,其他諸如刪除,修改,更名等權限統統沒有!
chattr +a 表示除了查看文件權限外,還可以echo命令(是echo >>,不能echo >覆蓋)追加文件內容的權限(不能直接vim進行編輯),其他諸如刪除,修改,更名等權限統統沒有!

chattr -i或chattr -a 表示刪除這個參數權限

案例說明1:---針對文件
如下,給文件test.txt文件設置+i權限後,就等於鎖定了這個文件。任何用戶(包括root)都不能操作這個文件了。
[root@localhost src]# touch test.txt
[root@localhost src]# chattr +i test.txt 
[root@localhost src]# lsattr test.txt
----i----------- test.txt
[root@localhost src]# cat test.txt
123
[root@localhost src]# echo "asdfs" > test.txt
-bash: test.txt: Permission denied
[root@localhost src]# rm -f test.txt
rm: cannot remove ‘test.txt’: Operation not permitted

設置+a權限,除了查看之外,就只能echo追加內容(是追加,而不是覆蓋),其他操作都幹不了!
[root@localhost src]# chattr -i test.txt 
[root@localhost src]# chattr +a test.txt 
[root@localhost src]# lsattr test.txt
-----a---------- test.txt
[root@localhost src]# cat test.txt
123
[root@localhost src]# echo "asdfs" > test.txt
-bash: test.txt: Operation not permitted
[root@localhost src]# echo "asdfs" >> test.txt
[root@localhost src]# cat test.txt
123
asdfs
[root@localhost src]# rm -f test.txt
rm: cannot remove ‘test.txt’: Operation not permitted
[root@localhost src]#

可以將系統的賬號信息文件/etc/passwd和密碼文件/etc/shadow使用chattr命令鎖定(+ai),這樣後續就不能添加賬號和修改用戶密碼了。

案例說明2:---針對目錄
"chattr -R +i 目錄名" #只能cd切換到該目錄下,對該目錄下的文件除了查看權限,其他的都不能操作
"chattr -R +a 目錄名" #除了cd切換到該目錄下,對於該目錄下的文件除了查看權限,也只能echo追加內容,其他的也都幹不了

註意一點,刪除權限:
"chattr -ai -R 目錄名" #表示連同目錄下的文件權限都刪除了

[root@localhost src]# mkdir hello
[root@localhost src]# echo "123123" > hello/test.txt
[root@localhost src]# chattr -R +i hello
[root@localhost src]# lsattr -R hello
----i----------- hello/test.txt

由於添加權限的時候加了-R參數,所以這個目錄下的文件也被鎖定了!
[root@localhost src]# rm -rf hello
rm: cannot remove ‘hello/test.txt’: Permission denied
[root@localhost src]# rm -rf hello/test.txt 
rm: cannot remove ‘hello/test.txt’: Permission denied
[root@localhost src]# echo "huhuhu" > hello/test.txt
-bash: hello/test.txt: Permission denied

[root@localhost src]# chattr -R -i hello
[root@localhost src]# chattr -R +a hello
[root@localhost src]# lsattr -R hello
-----a---------- hello/test.txt
[root@localhost src]# rm -rf hello
rm: cannot remove ‘hello/test.txt’: Operation not permitted
[root@localhost src]# rm -rf hello/test.txt 
rm: cannot remove ‘hello/test.txt’: Operation not permitted
[root@localhost src]# echo "asdf" > hello/test.txt
-bash: hello/test.txt: Operation not permitted
[root@localhost src]# echo "asdf" >> hello/test.txt
[root@localhost src]#

註意:
如果chattr針對目錄設置+i權限,不加-R參數時,那麽只針對該目錄有效,目錄下的文件不受約束!
這種情況下:
目錄不能刪除,不能更名。
目錄下的文件也不能刪除,不能更名。文件可以被echo追加、覆蓋內容。vim可以任意修改文件內容。
[root@localhost src]# chattr -R -ai hello
[root@localhost src]# chattr +i hello
[root@localhost src]# lsattr -R hello
---------------- hello/test.txt                    #可以看出不加-R,目錄下的文件沒有連帶權限
[root@localhost src]# rm -rf hello
rm: cannot remove ‘hello/test.txt’: Permission denied
[root@localhost src]# rm -rf hello/test.txt       #由於上一級目錄刪除不了,所以文件也刪除不了
rm: cannot remove ‘hello/test.txt’: Permission denied
[root@localhost src]# echo "123" > hello/test.txt             #可以修改文件內容
[root@localhost src]# echo "123sdf" >> hello/test.txt
[root@localhost src]# vim hello/test.txt                    #vim裏可以任意編輯文件
[root@localhost src]# mv hello hello233
mv: cannot move ‘hello’ to ‘hello233’: Operation not permitted
[root@localhost src]# mv hello/test.txt hello233/haha          #由於上一級目錄被鎖定不能更名,所以目錄下的文件也不能更名
mv: cannot move ‘hello/test.txt’ to ‘hello233/haha’: No such file or directory

如果chattr針對目錄設置+a權限,不加-R參數時,那麽只針對該目錄有效,目錄下的文件不受約束!
這種情況下:
目錄不能刪除,不能更名。
目錄下的文件也不能刪除,不能更名。文件可以被echo追加、覆蓋內容。但是!但是不能使用vim編輯內容。


(3)facl權限,setfacl表示設置權限,getfacl表示查看權限

ACL權限:
Access Control List:訪問控制列表,最初好像是unix裏面為了提供更高級的權限管理而搞出來的,可能是被chmod命令的3個權限控制無法滿足,而被迫搞出來的吧!
主要目的是提供傳統的owner,group,others的read,write,execute權限之外的具體權限設置。
ACL可以針對單一用戶、單一文件或目錄來進行r,w,x的權限控制,對於需要特殊權限的使用狀況有一定幫助。如,某一個文件不讓單一的某個用戶訪問等。

ACL使用兩個命令來對其進行控制
setfacl:設置某個文件/目錄的ACL設置項目
getfacl:取得某個文件/目錄的ACL設置項目

setfacl設置acl控制規則的時候跟的參數:
-m:設置後續acl參數 
-x:刪除後續acl參數 
-b:刪除全部的acl參數
-k:刪除默認的acl參數
-R:遞歸設置acl,包括子目錄
-d:設置默認acl

setfacl操作acl權限的主要命令:
"setfacl -m u:用戶名:權限   文件名"          #通過所屬者方式
"setfacl -m g:用戶組:權限  文件名"                #通過所屬組方式

"setfacl -R -m u:用戶名:權限 目錄名"         #通過所屬者方式  //如果這個目錄被mount掛載或nfs掛載上了,就不支持setfacl權限操作了
"setfacl -R -m g:用戶組:權限 目錄名"               #通過所屬組方式

"setfacl -b 文件名"                #刪除文件上的全部acl權限
"setfacl -x u:用戶名 文件名"             #刪除文件上的這個用戶的acl權限
"setfacl -x g:用戶組 文件名"            #刪除文件上的這個用戶組的acl權限

"setfacl -R -b 目錄名"             #刪除目錄上的全部acl權限
"setfacl -R -x u:用戶名 目錄名"           #刪除目錄上的這個用戶的acl權限
"setfacl -R -x g:用戶組 目錄名"           #刪除目錄上的這個用戶的acl權限

案例說明1:針對文件操作
/usr/local/src下有一個文件test.txt,文件權限是gaogao
[root@localhost src]# pwd
/usr/local/src
[root@localhost src]# ll test.txt 
-rw-r--r--. 1 gaogao gaogao 5 Nov 3 13:19 test.txt
[root@localhost src]# cat test.txt
3457

默認情況下,dengaosky用戶對這個文件是沒有寫權限的。
[root@localhost ~]# su - dengaosky
[dengaosky@localhost ~]$ cd /usr/local/src/
[dengaosky@localhost src]$ ll test.txt 
-rw-rw--r--. 1 gaogao gaogao 14 Nov 3 13:21 test.txt
[dengaosky@localhost src]$ echo "dengaosky123" > test.txt
-bash: test.txt: Permission denied
[dengaosky@localhost src]$

現在使用setfacl命令賦予dengaosky用戶對這個文件具有rwx的操作權限
[root@localhost src]# setfacl -m u:dengaosky:rwx test.txt
[root@localhost src]# getfacl test.txt
# file: test.txt #文件名
# owner: gaogao #文件所屬者
# group: gaogao #文件所屬組
user::rw- #文件所屬者的權限
user:dengaosky:rwx #可以看出,添加了dengaosky用戶對這個文件的rwx權限
group::rw-- #文件所屬組的權限
mask::rwx #文件當前的umask值
other::r-- #其他用戶對這個文件的權限

現在dengaosky用戶可以操作這個文件了(權限設置後,退出來重新登錄dengaosky用戶)
[dengaosky@localhost src]$ echo "dengaosky123" > test.txt
[dengaosky@localhost src]$ cat test.txt
dengaosky123

刪除文件test.txt上所有的acl權限
[root@localhost src]# setfacl -b test.txt
[root@localhost src]# getfacl test.txt
# file: test.txt
# owner: gaogao
# group: gaogao
user::rw-
group::rw--
other::r--

刪除test.txt文件對於dengaosky用戶的acl權限
[root@localhost src]# setfacl -x u:dengaosky test.txt
[root@localhost src]# getfacl test.txt
# file: test.txt
# owner: gaogao
# group: gaogao
user::rw-
group::rw-
mask::rw-
other::r--

[dengaosky@localhost src]$ echo "1234123" > test.txt
-bash: test.txt: Permission denied
[dengaosky@localhost src]$

上面是針對文件所屬者設置的acl權限,也可以針對文件所屬組設置acl權限:
[root@localhost src]# getfacl test.txt
# file: test.txt
# owner: gaogao
# group: gaogao
user::rw-
group::rw-
other::r--

如下設置dengaosky用戶組對這個文件的特殊權限是rwx
[root@localhost src]# setfacl -m g:dengaosky:rwx test.txt 
[root@localhost src]# getfacl test.txt
# file: test.txt
# owner: gaogao
# group: gaogao
user::rw-
group::rw-
group:dengaosky:rwx
mask::rwx
other::r--

那麽dengaosky用戶就可以寫入這個文件
[dengaosky@localhost src]$ echo "sadfasdf" > test.txt

案例說明2:針對目錄操作
[root@localhost src]# ll -d hello
drwxr-xr-x. 2 root root 21 Nov 3 15:41 hello
[root@localhost src]# getfacl hello
# file: hello
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

讓dengaosky用戶對這個hello目錄及其子目錄下的文件都無訪問權限
[root@localhost src]# setfacl -R -m u:dengaosky:r hello
[root@localhost src]# getfacl hello
# file: hello
# owner: root
# group: root
user::rwx
user:dengaosky:r--
group::r-x
mask::r-x
other::r-x

這樣,dengaosky用戶就訪問不了這個hello目錄了
[root@localhost src]# su - dengaosky
Last login: Thu Nov 3 15:42:41 CST 2016 on pts/0
[dengaosky@localhost ~]$ cd /usr/local/src/hello/
-bash: cd: /usr/local/src/hello/: Permission denied

刪除這個hello目錄上所有的acl規則
[root@localhost src]# setfacl -R -b hello
[root@localhost src]# getfacl hello
# file: hello
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

刪除這個hello目錄上的dengaosky這個用戶的acl權限
[root@localhost src]# setfacl -R -x u:dengaosky hello
[root@localhost src]# getfacl hello
# file: hello
# owner: root
# group: root
user::rwx
group::r-x
mask::r-x
other::r-x

上面使用的是針對目錄所屬者的acl權限設置,當然也可以使用目錄所屬組設置acl設置
設置dengaosky用戶組對於目錄hello的acl設置
[root@localhost src]# setfacl -R -m g:dengaosky:r hello

刪除hello目錄上針對dengaosky用戶組的acl權限
[root@localhost src]# setfacl -R -x g:dengaosky: hello

***************************************************************************************************************************
除了上面設置setfacl權限的方法外,要想讓dengaosky用戶對test.txt文件操作寫,還可以將dengaosky用戶添加到這個文件的所屬組內即可
[root@localhost src]# ll test.txt 
-rw-rw-r--. 1 gaogao gaogao 5 Nov 3 13:29 test.txt

默認dengaosky用戶不能寫入這個文件
[dengaosky@localhost src]$ echo "erere" > test.txt 
-bash: test.txt: Permission denied

將dengaosky用戶添加到gaogao用戶組內
[root@localhost src]# gpasswd -a dengaosky gaogao
[root@localhost src]# id dengaosky
uid=1001(dengaosky) gid=1001(dengaosky) groups=1001(dengaosky),1002(gaogao)

這樣,dengaosky用戶就可以寫入這個文件了
[dengaosky@localhost src]$ echo "erere" > test.txt 
[dengaosky@localhost src]$


(4)特殊權限

1)suid:只對二進制程序有效;執行者對於程序需要有x權限;在程序運行過程中,執行者擁有程序擁有者的權限;
suid會在所屬用戶權限本應是x的地方顯示s;
設置suid權限,只需在文件當前數字權限前面加4。這個權限很危險,一般不要亂給!

註意:
除了直接在數字權限前加4設置suid權限外,還可以用下面的方法
chmod u+s filenae                  #設置suid權限
chmod u-s filename               #取消suid權限

案例說明:普通用戶執行passwd命令修改自己的密碼。

首先查看passwd命令的絕對路徑:
[root@localhost ~]# which passwd
/usr/bin/passwd

查看passwd命令權限,發現passwd的擁有者是root,且擁有者權限裏面本應是x的那一列顯示的是s,這說明這個命令具有SUID權限。
同時發現普通用戶沒有w權限,所以按理來說普通用戶是不能執行這個命令的,因為這個命令修改了密碼肯定是要寫文件的。
[root@localhost ~]# ll /usr/bin/passwd 
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd

進一步分析,實際上passwd這個命令會操作/etc/shadow這個文件,因為密碼都是放在這裏,查看密碼文件權限:發現權限是000!
註意:root用戶對所有文件都是有rw權限的,對所有目錄都是有rwx權限的,這意味著普通用戶確實不能獨讀或寫這個文件。
[root@localhost ~]# ll /etc/shadow
----------. 1 root root 1205 Nov 3 10:54 /etc/shadow

不過因為passwd命令具有SUID權限,所以普通用戶執行這個命令時,當系統生成對應的進程後,這個進程就擁有了/usr/bin/passwd文件擁有者root的權限。
[root@localhost ~]# su - dengaosky
Last login: Thu Nov 3 10:53:38 CST 2016 on pts/0
[dengaosky@localhost ~]$ passwd 
Changing password for user dengaosky.
Changing password for dengaosky.
(current) UNIX password: 
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
[dengaosky@localhost ~]$

如果將/usr/bin/passwd文件的suid權限收回,則普通用戶就不能修改自己的密碼了。
[root@localhost ~]# ll /usr/bin/passwd 
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
[root@localhost ~]# chmod 755 /usr/bin/passwd                 [或者chmod u-s /usr/bin/passwd]
[root@localhost ~]# ll /usr/bin/passwd                  
-rwxr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
[root@localhost ~]# su - dengaosky
Last login: Thu Nov 3 11:03:34 CST 2016 on pts/0
[dengaosky@localhost ~]$ passwd 
Changing password for user dengaosky.
Changing password for dengaosky.
(current) UNIX password: 
New password: 
Retype new password: 
passwd: Authentication token manipulation error
[dengaosky@localhost ~]$

[dengaosky@localhost ~]$ passwd 
Changing password for user dengaosky.
Changing password for dengaosky.
(current) UNIX password:

在上面要輸入密碼的時候,按ctrl+z掛起。然後接著輸入pstree -u命令,如下,發現passwd的權限確實是root,而不是dengaosky!

[dengaosky@localhost ~]$ pstree -u
systemd─┬─NetworkManager───2*[{NetworkManager}]
        ├─agetty
        ├─auditd───{auditd}
        ├─crond
        ├─dbus-daemon(dbus)───{dbus-daemon}
        ├─dnsmasq(nobody)───dnsmasq(root)
        ├─epmd(epmd)
        ├─gssproxy───5*[{gssproxy}]
        ├─ipmievd
        ├─irqbalance
        ├─ksmtuned───sleep
        ├─lvmetad
        ├─master─┬─pickup(postfix)
        │        └─qmgr(postfix)
        ├─polkitd(polkitd)───5*[{polkitd}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd─┬─sshd───bash───su───bash(dengaosky)
        │      └─sshd───bash───su───bash(dengaosky)─┬─passwd(root)
        │                                           └─pstree
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tuned───4*[{tuned}]
        └─wpa_supplicant
再看一例:
由於/etc/shadow文件權限是000,也就是說只有root用戶能對它有查看權限。普通用戶都無法查看它的內容。
[root@localhost ~]# ll /etc/shadow
----------. 1 root root 1205 Nov 3 11:11 /etc/shadow
[root@localhost ~]# su - dengaosky
Last login: Thu Nov 3 11:11:10 CST 2016 on pts/1
[dengaosky@localhost ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied

現在只需要給/usr/bin/cat文件賦予suid權限,普通用戶即可有查看/etc/shadow的權限
[root@localhost ~]# which cat
/usr/bin/cat
[root@localhost ~]# ll /usr/bin/cat
-rwxr-xr-x. 1 root root 54048 Nov 20 2015 /usr/bin/cat
[root@localhost ~]# chmod 4755 /usr/bin/cat        [或者chmod u+s /us/bin/cat]
[root@localhost ~]# ll /usr/bin/cat
-rwsr-xr-x. 1 root root 54048 Nov 20 2015 /usr/bin/cat

[root@localhost ~]# su - dengaosky
Last login: Thu Nov 3 11:11:10 CST 2016 on pts/1
[dengaosky@localhost ~]$ cat /etc/shadow
root:$6$MeFkhhGG$4XBmni8ZudmW.Im1ZMRYOAV209Z0iTFH4Xxmonew/qL8x3K/iA1p86LUyFdHmeV5.2fOhU3KsXMPajE5GmGjx1:17093:0:99999:7:::
bin:*:16659:0:99999:7:::
daemon:*:16659:0:99999:7:::
adm:*:16659:0:99999:7:::
.......

2)sgid權限:針對文件的話,sgid只對二進制程序有用;程序執行著要有x權限;執行者在執行過程中會獲得改程序用戶組的權限(相當於臨時加入了程序的用戶組)
sgid會在所屬用戶組權限本應是x的地方顯示s;
設置sgid權限,只需在文件當前數字權限前面加2。

註意:
除了直接在數字權限前加2設置sgid權限外,還可以用下面的方法
chmod g+s filenae             #設置suid權限
chmod g-s filename           #取消suid權限

案例說明:普通用戶使用locate命令(yum install mlocate,之後就會有locate命令)
[root@localhost src]# which locate
/usr/bin/locate
[root@localhost src]# ll /usr/bin/locate
-rwx--s--x. 1 root slocate 40496 Jun 10 2014 /usr/bin/locate

發現/usr/bin/locate文件中用戶組權限中應該出現x的位置顯示的s,表示這個locate命令具有sgid權限,而普通用戶只有x權限而沒有rw權限。

locate這個命令,實際上會去訪問/var/lib/mlocate/mlocate.db這個文件。如下可知:
這個mlocate.db文件對於普通用戶沒有任何權限,所以理論上普通用戶執行locate命令是不行的。
不過因為locate命令有sgid權限,所以運行locate生成進程時,這個進程會得到locate命令的用戶組權限,相當於dengaosky這個用戶被臨時加入了用戶組slocate。
於是就對mlocate.db這個文件有了r權限,可以訪問了!
[root@localhost ~]# ll /var/lib/mlocate/mlocate.db
-rw-r-----. 1 root slocate 4238642 Nov 3 11:51 /var/lib/mlocate/mlocate.db

sgid針對目錄的話:用戶對此目錄有rx權限可以進入目錄,用戶進入此目錄後,有效用戶組會變成該目錄的用戶組;若用戶在此目錄有w權限,則用戶創建的文件用戶組與該目錄用戶組相同。

案例說明:
如果我們團隊想在linux某個目錄(比如/home/project)下協同工作來做一個項目,那麽每個團隊成員都得對這個project目錄下的所有文件具有rwx權限。

做法:
首先新建一個用戶組(比如work),再新建幾個賬號(比如dengaosky、gaogao),每個賬號的用戶組都加入剛才新建的那個用戶組。
然後再把/home/project權限設為770,把這個目錄的用戶組改為work用戶組,接著給這個目錄加入sgid權限。
也就是說在這個目錄下,work組內的任意一個用戶創建的文件,文件用戶組都會是這個目錄的用戶組(即work)。
這樣的話,所有work組內的用戶在/home/project目錄下創建的文件,其他同組用戶都有權限操作。

[root@localhost home]# groupadd work
[root@localhost home]# gpasswd -a gaogao work
Adding user gaogao to group work
[root@localhost home]# usermod -G work dengaosky
[root@localhost home]# id gaogao
uid=1002(gaogao) gid=1002(gaogao) groups=1002(gaogao),1003(work)
[root@localhost home]# id dengaosky
uid=1001(dengaosky) gid=1001(dengaosky) groups=1001(dengaosky),1003(work)

[root@localhost home]# mkdir project
[root@localhost home]# ll -d project
drwxr-xr-x. 2 root root 6 Nov 3 12:03 project
[root@localhost home]# chmod 770 project
[root@localhost home]# ll -d project
drwxrwx---. 2 root root 6 Nov 3 12:03 project
[root@localhost home]# chgrp work project/
[root@localhost home]# ll -d project/
drwxrwx---. 2 root work 6 Nov 3 12:03 project/
[root@localhost home]# chmod g+s /home/project
[root@localhost home]# ll -d project/
drwxrws---. 2 root work 18 Nov 3 13:07 project/

接著來看下效果:現在在dengaosky賬號下操作
[root@localhost ~]# su - dengaosky
[dengaosky@localhost ~]$ ll -d /home/project/
drwxrws---. 2 root work 6 Nov 3 13:10 /home/project/
[dengaosky@localhost ~]$ cd /home/project/
[dengaosky@localhost project]$ echo "123" > dengaosky.txt
[dengaosky@localhost project]$ ll dengaosky.txt                        #發現創建的文件的權限的所有者是work
-rw-rw-r--. 1 dengaosky work 4 Nov 3 13:11 dengaosky.txt

然後登陸gaogao賬號驗證下,發現可以正常操作上面的dengaosky.txt文件。
[root@localhost ~]# su - gaogao
[gaogao@localhost ~]$ cd /home/project/
[gaogao@localhost project]$ ll dengaosky.txt 
-rw-rw-r--. 1 dengaosky work 4 Nov 3 13:11 dengaosky.txt
[gaogao@localhost project]$ echo "gaogao123123" > dengaosky.txt
[gaogao@localhost project]$ cat dengaosky.txt
gaogao123123
[gaogao@localhost project]$ touch gaogao.txt
[gaogao@localhost project]$ ll
-rw-rw-r--. 1 gaogao work 0 Nov 3 13:12 gaogao.txt
-rw-rw-r--. 1 dengaosky work 16 Nov 3 13:12 dengaosky.txt

********************************************************************************************************************************
小知識點:
將一個用戶添加到一個組內的兩種方法:
"gpasswd -a 用戶名 組名"
"usermod -G 組名 用戶名"

將一個用戶從組內刪除
"gpasswd -d 用戶名 組名 "
*******************************************************************************************************************************

3)t權限:只能針對目錄而言,對文件來說無效!當用戶對目錄擁有wx權限時,用戶在該目錄創建的文件或目錄,只有自己與root才可以刪除。
案例說明:
[root@localhost src]#cd /usr/local/src
[root@localhost src]# touch aa
[root@localhost src]# ll
總用量 0
-rw-rw-r--. 1 root root 0 8月 28 05:21 aa 【註意,設置sgid權限,要保證文件的所屬組有操作權限】
[root@localhost src]# chown wutao.wutao aa
[root@localhost src]# ll
總用量 0
-rw-r--r--. 1 wutao wutao 0 8月 28 05:15 aa
[root@localhost src]# su - dengaosky
[dengaosky@localhost ~]$ cd /usr/local/src/
[dengaosky@localhost src]$ ls
aa
[dengaosky@localhost src]$ echo 123 > aa 由於a文件是wutao帳號下的文件,dengaosky用戶沒有操作權限
-bash: aa: 權限不夠
[dengaosky@localhost src]$

現在給a文件設置sgid權限,那麽dengaosky用戶只要在wutao組內,就能對a文件有操作權限

*******************************************************************************************************************************
小知識點:
將一個用戶拉到一個組內的兩種方法:
"gpasswd -a 用戶名 組名"
"usermod -G 組名 用戶名"

將一個用戶從組內刪除
"gpasswd -d 用戶名 組名 "
*******************************************************************************************************************************

[root@localhost src]# chmod 2664 aa 【設置sgid權限】
[root@localhost src]# ll
總用量 0
-rw-rwSr--. 1 wutao wutao 0 8月 28 05:21 aa
[root@localhost src]# gpasswd -a dengaosky wutao 【將dengaosky用戶拉到wutao組內】
Adding user dengaosky to group wutao
[root@localhost src]# id dengaosky
uid=501(dengaosky) gid=501(dengaosky) 組=501(dengaosky),500(wutao)

[root@localhost src]# su - dengaosky
[dengaosky@localhost ~]$ cd /usr/local/src/
[dengaosky@localhost src]$ echo 123 > aa 這樣,dengaosky用戶就能草組aa文件了
[dengaosky@localhost src]$

針對t權限的例子:
註意:t權限只對目錄設置有效!
/tmp目錄是linux下的一個臨時目錄,一般會設置777權限,為了方面其他用戶都能在這個目錄下操作,其實就是一個共用目錄,大家都可以用!
但有時有些目錄在tmp下存放自己的比較重要的文件,不想讓其他用戶操作,安全起見,會給tmp目錄設置t權限!

[root@localhost ~]# ll -d /tmp
drwxrwxrwx. 20 root root 4096 8月 28 05:32 /tmp 【tmp臨時目錄是777權限】
[root@localhost ~]# su - wutao
[wutao@localhost ~]$ cd /tmp/
[wutao@localhost tmp]$ vim sss
[wutao@localhost tmp]$ ll sss
-rw-rw-r--. 1 wutao wutao 7 8月 28 05:33 sss 【這個文件所有者是wutao】
[wutao@localhost tmp]$ logout
[root@localhost ~]# su - dengaosky
[dengaosky@localhost ~]$ ll /tmp/sss 【其他用戶對tmp臨時目錄下非自己所創建的文件也開可以操作】
-rw-rw-r--. 1 wutao wutao 7 8月 28 05:33 /tmp/sss
[dengaosky@localhost ~]$ echo 123123 > /tmp/s

現在為了安全起見,在tmp臨時目錄下創建的文件,除了自己和root外,其他用戶都不能操作。也就是非共用了!!
那麽這個時候就要給tmp設置t權限了!
[root@localhost ~]# ll -d /tmp
drwxrwxrwx. 20 root root 4096 8月 28 05:33 /tmp
[root@localhost ~]# chmod 1777 /tmp 【設置t權限】
[root@localhost ~]# ll -d /tmp
drwxrwxrwt. 20 root root 4096 8月 28 05:33 /tmp
[root@localhost ~]# su - dengaosky
[dengaosky@localhost ~]$ ll -d /tmp
drwxrwxrwt. 20 root root 4096 8月 28 05:37 /tmp
[dengaosky@localhost ~]$ ll /tmp/sss
-rw-rw-r--. 1 wutao wutao 4 8月 28 05:36 /tmp/sss
[dengaosky@localhost ~]$ echo 555 > /tmp/sss 
-bash: /tmp/sss: 權限不夠
[dengaosky@localhost ~]$

這個時候,dengaosky用戶就不能操作sss文件了。如果要想再擁有操作權限,可以把dengaosky用戶加到wutao組內,因為sss文件所在組有w寫權限。


(5)sudo權限

一般情況下,使用su命令在用戶之間切換,需要知道對方密碼。比如su切換到root下,需要知道root密碼。
但使用sudo命令,就不需要知道root密碼,只需要輸入自己賬號密碼即可!前提是需要將相關賬號設置sudo權限

sudo權限: 是為了讓普通用戶執行只有root用戶才能執行的操作命令(這種方式無需知道root密碼)
sudo所在文件:/etc/sudoers,編輯該文件的命令是visudo,不過只能在root賬號下可以使用該命令,且如果上一次visudo編譯未退出狀態下,不能重新visudo進行編輯(也可以直接vi編輯/etc/sudoers文件)

強烈推薦使用visudo命令修改sudoers,因為它會幫你校驗文件配置是否正確,如果不正確,在保存退出時就會提示你哪段配置出錯的。

sudo的工作過程如下:
1)當用戶執行sudo時,系統會主動尋找/etc/sudoers文件,判斷該用戶是否有執行sudo的權限
2)確認用戶具有可執行sudo的權限後,讓用戶輸入用戶自己的密碼確認
3)若密碼輸入成功,則開始執行sudo後續的命令
4)root執行sudo時不需要輸入密碼(eudoers文件中有配置root ALL=(ALL) ALL這樣一條規則)
5)若欲切換的身份與執行者的身份相同,也不需要輸入密碼

Sudo的特性:
sudo能夠限制用戶只在某臺主機上運行某些命令。
sudo提供了豐富的日誌,詳細地記錄了每個用戶幹了什麽。它能夠將日誌傳到中心主機或者日誌服務器。
sudo使用時間戳文件來執行類似的"檢票"系統。當用戶調用sudo並且輸入它的密碼時,用戶獲得了一張存活期為5分鐘的票(這個值可以在編譯的時候改變)。也就是說,我剛剛輸入了sudocat /etc/issue 然後可以再次只需要輸入cat/etc/issue即可,不需要再次輸入sudo。
sudo的配置文件是sudoers文件,它允許系統管理員集中的管理用戶的使用權限和使用的主機。它所存放的位置默認是在/etc/sudoers,屬性必須為0411。

---------------------------------------------------------------------------------------------------------------------------------------------
su和sudo切換命令的時候,註意有個-
加-,表示不僅切換到用戶下,連同用戶的系統環境變量也切換進來了 【切換前後執行env看下環境變量】
不加-,表示僅僅切換到用戶狀態下,用戶的系統環境變量沒有切換進來

su root 僅僅切換到root用戶狀態下,root的系統環境變量沒有切換過來 【比如說有些只能在root下操作的命令,不加-雖然切換到root下了,但是還不能操作】
su - root 不僅切換到root下了,root的系統環境變量也切換過來了
---------------------------------------------------------------------------------------------------------------------------------------------

常用sudo權限的安全設置一般可以滿足下面4個條件:
1.禁止普通用戶使用sudo 命令切換到root模式下
2.用戶使用sudo命令,必須每次都輸入密碼
3.用戶組管理(組內添加和刪除用戶)以及組權限管理設置
4.使用別名(用戶名以及命令的別名)進行設置

1.禁止普通用戶使用sudo su切換到root用戶模式下
總所周知,只要給普通用戶設置了sudo權限,那麽它就可以使用"sudo su root"命令切換到root用戶下(只要知道自己的密碼即可,sudo權限只要輸入自己的密碼),這是很不安全的。必須禁止這種做法。
只需要在sudo的配置文件裏添加下面內容即可。

sudo切換到root模式下有以下幾種方式:
1)sudo su -
2)sudo -s
3)sudo su root
4)sudo su - root
5)sudo -u root su

在root賬號下輸入visudo(或/etc/sudoers)命令,設置如下:



如上設置,表示dengaosky用戶在使用sudo權限後,禁止使用bash和su命令。也就是說:禁止了該用戶使用sudo切換到root模式下了。
其中:
!/bin/bash 是禁止了sudo -s的切換
!/bin/su 是禁止了sudo中帶su的切換

************************************禁止賬號間使用su命令切換************************************

su的缺點
1)不安全su工具在多人參與的系統管理中,並不是最好的選擇,su只適用於一兩個人參與管理的系統,畢竟su並不能讓普通用戶受限的使用;超級用戶root密碼應該掌握在少數用戶手中。
2)麻煩:需要把root密碼告知每個需要root權限的人。

可以在/etc/pam.d/su文件裏設置禁止用戶使用su命令
#vim /etc/pam.d/su
auth sufficient pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth sufficient pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth required pam_wheel.so use_uid

以上標紅的兩行是默認狀態,這種狀態下是允許所有用戶間使用su命令進行切換的!
如果開啟第二行,表示只有root用戶和wheel組內的用戶才可以使用su命令。
如果註釋第一行,開啟第二行,表示只有wheel組內的用戶才能使用su命令,root用戶也被禁用su命令。
******************************************************************************************



以上設置表示:dengaosky賬號在使用sudo時不享有root用戶狀態下的權限,即sudo狀態下享有除root之外的其他用戶狀態下的權限。
默認是(ALL),即sudo享有所有用戶狀態下的權限。

--------------------------------------------------------------------------------------------------------------
root ALL=(ALL) ALL 
以上是/etc/sudoers配置文件中默認定義的用戶sudo設置,其中解釋如下:
1)第一個字段root指定的是用戶:可以是用戶名,也可以是別名。每個用戶設置一行,多個用戶設置多行,也可以將多個用戶設置成一個別名後再進行設置。
2)第二個字段ALL指定的是用戶所在的主機:可以是ip,也可以是主機名,表示這個sudo設置後的文件(/etc/sudoers)只在這個主機上生效,ALL表示在所有主機上都生效!限制的一般都是本機,也就是限制使用這個文件的主機,如果指定為:192.168.1.88= 表示這個文件只有在這臺主機上生效,如果拷貝到別的機子上是不起作用的!一般都指定為:ALL 表示所有的主機,不管文件拷到那裏都可以用。
3)第三個字段(ALL)括號裏指定的也是用戶:指定以什麽用戶身份執行sudo,即使用sudo後可以享有所有賬號下的權限。如果要排除個別用戶,可以在括號內設置,比如ALL=(ALL,!root,!ops)。也可以設置別名
4)第四個字段ALL指定的是執行的命令:即使用sudo後可以執行所有的命令。也可以設置別名
--------------------------------------------------------------------------------------------------------------

2.用戶使用sudo命令,必須每次都輸入密碼
在/etc/sudoers文件裏添加內容"Defaults timestamp_timeout=0"
即表示每次使用sudo命令時都要輸入密碼。



-----------------------------------------------------------------------------------------
還可以通過設置命令的別名進行權限設置。
即將一系列命令放在一起設置一個別名,然後對別名進行權限設置。註意:別名一定要是大寫字母。
Delegating permissions 代理權限相關命令別名





以上設置說明:
wnagshibo用戶在sudo權限下只能使用ls,rm,tail命令
----------------------------------------------------------------------------------------

3.用戶組管理(組內添加和刪除用戶)以及組權限管理設置

進行用戶權限管理,設置sudo權限時,可以設置組的權限,不同的組有不同的權限,然後將用戶拉到相應權限的組內。
將一個用戶拉入到一個組內,有下面兩種方法:
1)usermod -G 組名 用戶名
2)gpasswd -a 用戶名 組名     #添加到組內
    gpasswd -d 用戶名 組名     #從組內刪除



以上設置表示wheel組內的用戶在使用sudo權限後,禁止使用bash和su命令,也就是禁止了該組內用戶使用sudo切換到root模式下了。

4.使用別名進行sudo權限設置。
Alise設置別名有以下四種情況:
Host_Alias
Cmnd_Alias
User_Alias
Runas_Alias

1)配置Host_Alias:就是主機的列表,可以使用主機名,也可以使用ip,不過在同一個別名內不能同時混用主機名和ip地址!
Host_Alias HOST_FLAG = hostname1, hostname2, hostname3
Host_Alias HOST_FLAG1 = 192.168.1.12, 192.1681.13, 192.168.1.14
Host_Alias HOST_FLAG2 = hostname1, 192.1681.13, 192.168.1.14                 #這種設置是錯誤的!不能在同一個別名內混用主機名和ip
2)配置Cmnd_Alias:就是允許執行的命令的列表,命令前加上!表示不能執行此命令.
命令一定要使用絕對路徑,避免其他目錄的同名命令被執行,造成安全隱患,因此使用的時候也是使用絕對路徑!
Cmnd_Alias COMMAND_FLAG = command1, command2, command3 ,!command4
3)配置User_Alias:就是具有sudo權限的用戶的列表
User_Alias USER_FLAG = user1, user2, user3
4)配置Runas_Alias:就是用戶以什麽身份執行(例如root)的列表
Runas_Alias RUNAS_FLAG = operator1, operator2, operator3

使用別名配置權限的格式如下:
USER_FLAG HOST_FLAG=(RUNAS_FLAG) COMMAND_FLAG
如果不需要密碼驗證的話,則按照這樣的格式來配置
USER_FLAG HOST_FLAG=(RUNAS_FLAG) NOPASSWD:COMMAND_FLAG

案例說明:
例如1:把wangsb,wangbz,songj用戶設置成別名ADMINS,都擁有duso權限
#visudo
User_Alias ADMINS = wangsb, songj,wangbz
......
ADMINS ALL=(ALL) ALL

例如2:把visudo、chown、chmod等命令設置成別名DELEGATING,別名ADMINS裏面的用戶都禁用DELEGATING裏面的命令
#visudo
Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp
......
ADMINS ALL=(ALL) ALL,!DELEGATING
.......

綜合使用:
[root@test-hello ~]# visudo
........
User_Alias ADMINS = wangbz,zhoulw,songj,wangsb
.......
Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp
.......
root ALL=(ALL) ALL
ADMINS ALL=(ALL) ALL,!DELEGATING,!/bin/bash,!/bin/su
.......
Defaults timestamp_timeout = 0

其他的可以參考:sudo命令使用的幾個場景

-----------------------------------------------------------------------
下面是在線上服務器上用過的一個小設置:

[root@hqsb_web1 ~]# visudo
.......
Defaults timestamp_timeout=0       //表示每次sudo時都要強行輸入密碼
.......
kevin  ALL=(ALL)       /usr/bin/tail,/bin/gzip,/usr/bin/vim,/bin/chown,/bin/chmod,/Data/app/nginx/sbin/nginx    //kevin用戶在使用sudo時只能使用這幾個命令,其他sudo命令全部禁止!
 
grace  ALL=(ALL)       ALL,!/bin/bash,!/bin/su,!/bin/chown,!/bin/chmod,!/sbin/init,!/sbin/reboot,!/sbin/poweroff    //grace用戶使用sudo時,禁止後面設置的命令,其他的都可以使用。
-------------------------------------------------------------------------------------------------------------------
最後解釋下sudo權限配置文件:
使用visudo命令打開sudo配置文件,如下:
## Sudoers allows particular users to run various commands as 
## the root user, without needing the root password. 
## 該文件允許特定用戶像root用戶一樣使用各種各樣的命令,而不需要root用戶的密碼 
## 
## Examples are provided at the bottom of the file for collections 
## of related commands, which can then be delegated out to particular 
## users or groups. 
## 在文件的底部提供了很多相關命令的示例以供選擇,這些示例都可以被特定用戶或 
## 用戶組所使用 
## 
## This file must be edited with the 'visudo' command. 
## 該文件必須使用"visudo"命令編輯 

## Host Aliases 
## Groups of machines. You may prefer to use hostnames (perhaps using 
## wildcards for entire domains) or IP addresses instead. 
## 對於一組服務器,你可能會更喜歡使用主機名(可能是全域名的通配符) 
## 、或IP地址,這時可以配置主機別名 
# Host_Alias FILESERVERS = fs1, fs2 
# Host_Alias MAILSERVERS = smtp, smtp2 

## User Aliases 
## These aren't often necessary, as you can use regular groups 
## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname 
## rather than USERALIAS 
## 這並不很常用,因為你可以通過使用組來代替一組用戶的別名 
# User_Alias ADMINS = jsmith, mikem 

## Command Aliases 
## These are groups of related commands... 
## 指定一系列相互關聯的命令(當然可以是一個)的別名,通過賦予該別名sudo權限, 
## 可以通過sudo調用所有別名包含的命令,下面是一些示例 

## Networking 網絡操作相關命令別名 
# Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient 
, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig 
, /sbin/mii-tool 

## Installation and management of software 軟件安裝管理相關命令別名 
# Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum 

## Services 服務相關命令別名 
# Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig 

## Updating the locate database 本地數據庫升級命令別名 
# Cmnd_Alias LOCATE = /usr/bin/updatedb 

## Storage 磁盤操作相關命令別名 
# Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe 
, /bin/mount, /bin/umount 

## Delegating permissions 代理權限相關命令別名 
# Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp 

## Processes 進程相關命令別名 
# Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall 

## Drivers 驅動命令別名 
# Cmnd_Alias DRIVERS = /sbin/modprobe 

# Defaults specification 

# 
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear. 
# You have to run "ssh -t hostname sudo <cmd>". 
# 一些環境變量的相關配置,具體情況可見man soduers 
Defaults requiretty 

Defaults env_reset 
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS" 
Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE" 
Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES" 
Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE" 
Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY" 

Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin 

## Next comes the main part: which users can run what software on 
## which machines (the sudoers file can be shared between multiple 
## systems). 
## 下面是規則配置:什麽用戶在哪臺服務器上可以執行哪些命令(sudoers文件可以在多個系統上共享) 
## Syntax(語法): 
## 
## user MACHINE=COMMANDS 用戶 登錄的主機=(可以變換的身份) 可以執行的命令 
## 
## The COMMANDS section may have other options added to it. 
## 命令部分可以附帶一些其它的選項 
## 
## Allow root to run any commands anywhere 
## 允許root用戶執行任意路徑下的任意命令 
root ALL=(ALL) ALL 

## Allows members of the 'sys' group to run networking, software, 
## service management apps and more. 
## 允許sys中戶組中的用戶使用NETWORKING等所有別名中配置的命令 
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE 
, DRIVERS 

## Allows people in group wheel to run all commands 
## 允許wheel用戶組中的用戶執行所有命令 
%wheel ALL=(ALL) ALL 

## Same thing without a password 
## 允許wheel用戶組中的用戶在不輸入該用戶的密碼的情況下使用所有命令 
# %wheel ALL=(ALL) NOPASSWD: ALL 

## Allows members of the users group to mount and unmount the 
## cdrom as root 
## 允許users用戶組中的用戶像root用戶一樣使用mount、unmount、chrom命令 
# %users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom 

## Allows members of the users group to shutdown this system 
## 允許users用戶組中的用戶關閉localhost這臺服務器 
# %users localhost=/sbin/shutdown -h now 

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment) 
## 讀取放置在/etc/sudoers.d/文件夾中的文件(此處的#不意味著這是一個聲明) 
#includedir /etc/sudoers.d


linux系統下的權限知識梳理