下面對linux系統下的有關權限操作命令進行了梳理總結,並配合簡單實例進行說明。
linux中除了常見的讀(r)、寫(w)、執行(x)權限以外,還有其他的一些特殊或隱藏權限,熟練掌握這些權限知識的使用,可以大大提高我們運維工作的效率。
一、umask是權限碼,默認是022
使用命令"umask"就能查詢出來
文件默認的權限是666,目錄默認的權限是777
新建文件和目錄的權限分別是各自默認權限減去umask權限碼值
新建文件權限,666-022=644
新建目錄權限,777-022=755
二、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 huanqiu
[root@localhost src]# ll huanqiu
total 4
-rwxrwxr-x. 1 root root 4 Nov 3 17:30 test.txt
chown 設置字符權限,默認表示所屬者權限
chgrp 表示所屬組權限
通常我們可以直接用chown設置所屬者和所屬者
比如給a文件授權所屬者是wangshibo,所屬組是wutao,做法如下:
[root@localhost src]# ll test.txt
-rwx------. 1 root root 0 Nov 3 16:33 test.txt
[root@localhost src]# chown wangshibo test.txt
[root@localhost src]# ll test.txt
-rwx------. 1 wangshibo root 0 Nov 3 16:33 test.txt
[root@localhost src]# chgrp wangshibo test.txt
[root@localhost src]# ll test.txt
-rwx------. 1 wangshibo wangshibo 0 Nov 3 16:33 test.txt
也可以直接使用chown設置
[root@localhost src]# chown wangshibo.wangshibo test.txt # 或者chown wangshibo:wangshibo test.txt
[root@localhost src]# ll test.txt
-rwx------. 1 wangshibo wangshibo 0 Nov 3 16:33 test.txt
====================================================
root賬號在普通用戶家目錄下創建的文件,默認該文件的所有者和所屬組權限是root。
1)此普通用戶不能使用echo命令覆蓋和追加文件。
2)但是該用戶對此文件有有直接vim編輯的權限,並且編輯后,文件的所有者和所屬組權限就變成普通用戶的了。
如下:
[root@ops-server4 ~]# cd /home/wangshibo/
[root@ops-server4 wangshibo]# vim test
[root@ops-server4 wangshibo]# cat test
123456
[root@ops-server4 wangshibo]# ll
total 4
-rw-r--r--. 1 root root 7 Dec 3 10:47 test
[wangshibo@ops-server4 ~]$ echo "wangshibo" >> test
-bash: test: Permission denied
[wangshibo@ops-server4 ~]$ echo "wangshibo" > test
-bash: test: Permission denied
[wangshibo@ops-server4 ~]$ vim test
[wangshibo@ops-server4 ~]$ ll
total 4
-rw-r--r--. 1 wangshibo wangshibo 15 Dec 3 10:48 test
[wangshibo@ops-server4 ~]$ cat test
123456
wangshibo
三、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 huanqiu
[root@localhost src]# echo "123123" > huanqiu/test.txt
[root@localhost src]# chattr -R +i huanqiu
[root@localhost src]# lsattr -R huanqiu
----i----------- huanqiu/test.txt
由於添加權限的時候加了-R參數,所以這個目錄下的文件也被鎖定了!
[root@localhost src]# rm -rf huanqiu
rm: cannot remove ‘huanqiu/test.txt’: Permission denied
[root@localhost src]# rm -rf huanqiu/test.txt
rm: cannot remove ‘huanqiu/test.txt’: Permission denied
[root@localhost src]# echo "huhuhu" > huanqiu/test.txt
-bash: huanqiu/test.txt: Permission denied
[root@localhost src]# chattr -R -i huanqiu
[root@localhost src]# chattr -R +a huanqiu
[root@localhost src]# lsattr -R huanqiu
-----a---------- huanqiu/test.txt
[root@localhost src]# rm -rf huanqiu
rm: cannot remove ‘huanqiu/test.txt’: Operation not permitted
[root@localhost src]# rm -rf huanqiu/test.txt
rm: cannot remove ‘huanqiu/test.txt’: Operation not permitted
[root@localhost src]# echo "asdf" > huanqiu/test.txt
-bash: huanqiu/test.txt: Operation not permitted
[root@localhost src]# echo "asdf" >> huanqiu/test.txt
[root@localhost src]#
需要注意:
如果chattr針對目錄設置+i權限,不加-R參數時,那么只針對該目錄有效,目錄下的文件不受約束!
這種情況下:
目錄不能刪除,不能更名。
目錄下的文件也不能刪除,不能更名。文件可以被echo追加、覆蓋內容。vim可以任意修改文件內容。
[root@localhost src]# chattr -R -ai huanqiu
[root@localhost src]# chattr +i huanqiu
[root@localhost src]# lsattr -R huanqiu
---------------- huanqiu/test.txt # 可以看出不加-R,目錄下的文件沒有連帶權限
[root@localhost src]# rm -rf huanqiu
rm: cannot remove ‘huanqiu/test.txt’: Permission denied
[root@localhost src]# rm -rf huanqiu/test.txt # 由於上一級目錄刪除不了,所以文件也刪除不了
rm: cannot remove ‘huanqiu/test.txt’: Permission denied
[root@localhost src]# echo "123" > huanqiu/test.txt # 可以修改文件內容
[root@localhost src]# echo "123sdf" >> huanqiu/test.txt
[root@localhost src]# vim huanqiu/test.txt # vim里可以任意編輯文件
[root@localhost src]# mv huanqiu huanqiu233
mv: cannot move ‘huanqiu’ to ‘huanqiu233’: Operation not permitted
[root@localhost src]# mv huanqiu/test.txt huanqiu233/haha # 由於上一級目錄被鎖定不能更名,所以目錄下的文件也不能更名
mv: cannot move ‘huanqiu/test.txt’ to ‘huanqiu233/haha’: No such file or directory
如果chattr針對目錄設置+a權限,不加-R參數時,那么只針對該目錄有效,目錄下的文件不受約束!
這種情況下:
目錄不能刪除,不能更名。
目錄下的文件也不能刪除,不能更名。文件可以被echo追加、覆蓋內容。但是!但是不能使用vim編輯內容。
四、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權限
-m --modify=acl modify the current ACL(s)of file(s) #設置文件acl規則 -M --modify-file=file read ACL entries to modify from file #從文件讀取訪問控制列表條目更改 -x --remove=acl remove entries from the ACL(s)of file(s) #刪除文件的acl規則 -X --remove-file=file readACL entries to remove from file #從文件讀取訪問控制列表條目並刪除 -b --remove-all remove all extended ACL entries # 刪除所有擴展的acl規則,基本的acl規則(所有者,群組,其他)將被保留. -k --remove-default remove the defaultACL #刪除缺省的acl規則。如果沒有缺省規則,將不提示. --set=acl set the ACL of file(s),replacing the current ACL. --set-file=file readACL entries toset from file #從文件中讀設置ACL規則. --mask dorecalculate the effective rights mask #重新計算有效權限,即使ACL mask被明確指定. -n --no-mask don'trecalculate the effective rights mask #不要重新計算有效權限。setfacl默認會重新計算ACL mask,除非mask被明確的制定. -d --default operations apply tothe defaultACL #設定默認的acl規則,針對目錄而言. -R --recursive recurse into subdirectories #遞歸的對所有文件及目錄進行操作. -L --logical logical walk,follow symbolic links #跟蹤符號鏈接,默認情況下只跟蹤符號鏈接文件,跳過符號鏈接目錄。 -P --physical physical walk,donotfollow symbolic links #跳過所有符號鏈接,包括符號鏈接文件。 --restore=file restore ACLs(inverse of`getfacl-R') #從文件恢復備份的acl規則(這些文件可由getfacl -R產生)。通過這種機制可以恢復整個目錄樹的acl規則。此參數不能和除--test以外的任何參數一同執行. --test testmode(ACLs are notmodified) #測試模式,不會改變任何文件的acl規則,操作后的acl規格將被列出. -v --version print version andexit #版本. -h --help thishelp text #不用說肯定是幫助了. 當使用-M,-X選項從文件中讀取規則時,setfacl接受getfacl命令輸出的格式。每行至少一條規則,以#開始的行將被視為注釋.
案例說明1:針對文件操作
/usr/local/src下有一個文件test.txt,文件權限是guohuihui
[root@localhost src]# pwd
/usr/local/src
[root@localhost src]# ll test.txt
-rw-r--r--. 1 guohuihui guohuihui 5 Nov 3 13:19 test.txt
[root@localhost src]# cat test.txt
3457
默認情況下,wangshibo用戶對這個文件是沒有寫權限的。
[root@localhost ~]# su - wangshibo
[wangshibo@localhost ~]$ cd /usr/local/src/
[wangshibo@localhost src]$ ll test.txt
-rw-rw--r--. 1 guohuihui guohuihui 14 Nov 3 13:21 test.txt
[wangshibo@localhost src]$ echo "wangshibo123" > test.txt
-bash: test.txt: Permission denied
[wangshibo@localhost src]$
現在使用setfacl命令賦予wangshibo用戶對這個文件具有rwx的操作權限
[root@localhost src]# setfacl -m u:wangshibo:rwx test.txt
[root@localhost src]# getfacl test.txt
# file: test.txt #文件名
# owner: guohuihui #文件所屬者
# group: guohuihui #文件所屬組
user::rw- #文件所屬者的權限
user:wangshibo:rwx #可以看出,添加了wangshibo用戶對這個文件的rwx權限
group::rw-- #文件所屬組的權限
mask::rwx #文件當前的umask值
other::r-- #其他用戶對這個文件的權限
現在wangshibo用戶可以操作這個文件了(權限設置后,退出來重新登錄wangshibo用戶)
[wangshibo@localhost src]$ echo "wangshibo123" > test.txt
[wangshibo@localhost src]$ cat test.txt
wangshibo123
刪除文件test.txt上所有的acl權限
[root@localhost src]# setfacl -b test.txt
[root@localhost src]# getfacl test.txt
# file: test.txt
# owner: guohuihui
# group: guohuihui
user::rw-
group::rw--
other::r--
刪除test.txt文件對於wangshibo用戶的acl權限
[root@localhost src]# setfacl -x u:wangshibo test.txt
[root@localhost src]# getfacl test.txt
# file: test.txt
# owner: guohuihui
# group: guohuihui
user::rw-
group::rw-
mask::rw-
other::r--
[wangshibo@localhost src]$ echo "1234123" > test.txt
-bash: test.txt: Permission denied
[wangshibo@localhost src]$
上面是針對文件所屬者設置的acl權限,也可以針對文件所屬組設置acl權限:
[root@localhost src]# getfacl test.txt
# file: test.txt
# owner: guohuihui
# group: guohuihui
user::rw-
group::rw-
other::r--
如下設置wangshibo用戶組對這個文件的特殊權限是rwx
[root@localhost src]# setfacl -m g:wangshibo:rwx test.txt
[root@localhost src]# getfacl test.txt
# file: test.txt
# owner: guohuihui
# group: guohuihui
user::rw-
group::rw-
group:wangshibo:rwx
mask::rwx
other::r--
那么wangshibo用戶就可以寫入這個文件
[wangshibo@localhost src]$ echo "sadfasdf" > test.txt
案例說明2:針對目錄操作
[root@localhost src]# ll -d huanqiu
drwxr-xr-x. 2 root root 21 Nov 3 15:41 huanqiu
[root@localhost src]# getfacl huanqiu
# file: huanqiu
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
讓wangshibo用戶對這個huanqiu目錄及其子目錄下的文件都無訪問權限
[root@localhost src]# setfacl -R -m u:wangshibo:r huanqiu
[root@localhost src]# getfacl huanqiu
# file: huanqiu
# owner: root
# group: root
user::rwx
user:wangshibo:r--
group::r-x
mask::r-x
other::r-x
這樣,wangshibo用戶就訪問不了這個huanqiu目錄了
[root@localhost src]# su - wangshibo
Last login: Thu Nov 3 15:42:41 CST 2016 on pts/0
[wangshibo@localhost ~]$ cd /usr/local/src/huanqiu/
-bash: cd: /usr/local/src/huanqiu/: Permission denied
刪除這個huanqiu目錄上所有的acl規則
[root@localhost src]# setfacl -R -b huanqiu
[root@localhost src]# getfacl huanqiu
# file: huanqiu
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
刪除這個huanqiu目錄上的wangshibo這個用戶的acl權限
[root@localhost src]# setfacl -R -x u:wangshibo huanqiu
[root@localhost src]# getfacl huanqiu
# file: huanqiu
# owner: root
# group: root
user::rwx
group::r-x
mask::r-x
other::r-x
上面使用的是針對目錄所屬者的acl權限設置,當然也可以使用目錄所屬組設置acl設置
設置wangshibo用戶組對於目錄huanqiu的acl設置
[root@localhost src]# setfacl -R -m g:wangshibo:r huanqiu
刪除huanqiu目錄上針對wangshibo用戶組的acl權限
[root@localhost src]# setfacl -R -x g:wangshibo: huanqiu
========================================================
除了上面設置setfacl權限的方法外,要想讓wangshibo用戶對test.txt文件操作寫,還可以將wangshibo用戶添加到這個文件的所屬組內即可
[root@localhost src]# ll test.txt
-rw-rw-r--. 1 guohuihui guohuihui 5 Nov 3 13:29 test.txt
默認wangshibo用戶不能寫入這個文件
[wangshibo@localhost src]$ echo "erere" > test.txt
-bash: test.txt: Permission denied
將wangshibo用戶添加到guohuihui用戶組內
[root@localhost src]# gpasswd -a wangshibo guohuihui
[root@localhost src]# id wangshibo
uid=1001(wangshibo) gid=1001(wangshibo) groups=1001(wangshibo),1002(guohuihui)
這樣,wangshibo用戶就可以寫入這個文件了
[wangshibo@localhost src]$ echo "erere" > test.txt
[wangshibo@localhost src]$
************************************************************************************
五、特殊權限:SUID、SGID、t
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 - wangshibo
Last login: Thu Nov 3 10:53:38 CST 2016 on pts/0
[wangshibo@localhost ~]$ passwd
Changing password for user wangshibo.
Changing password for wangshibo.
(current) UNIX password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[wangshibo@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 - wangshibo
Last login: Thu Nov 3 11:03:34 CST 2016 on pts/0
[wangshibo@localhost ~]$ passwd
Changing password for user wangshibo.
Changing password for wangshibo.
(current) UNIX password:
New password:
Retype new password:
passwd: Authentication token manipulation error
[wangshibo@localhost ~]$
[wangshibo@localhost ~]$ passwd
Changing password for user wangshibo.
Changing password for wangshibo.
(current) UNIX password:
在上面要輸入密碼的時候,按ctrl+z掛起。然后接着輸入pstree -u命令,如下,發現passwd的權限確實是root,而不是wangshibo!
[wangshibo@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(wangshibo) │ └─sshd───bash───su───bash(wangshibo)─┬─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 - wangshibo
Last login: Thu Nov 3 11:11:10 CST 2016 on pts/1
[wangshibo@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 - wangshibo
Last login: Thu Nov 3 11:11:10 CST 2016 on pts/1
[wangshibo@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 #設置sgid權限
chmod g-s filename #取消sgid權限
案例說明:普通用戶使用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命令的用戶組權限,相當於wangshibo這個用戶被臨時加入了用戶組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權限。
實現方法:
1)創建一個用戶組(比如work),再創建幾個賬號(比如wangshibo、guohuihui),將創建的賬號加入到那個創建的用戶組內。
2)把/home/project目錄權限設為770,把這個目錄的用戶組改為work用戶組
3)將/home/project目錄設置sgid權限。
4)這樣就可以實現,/home/project目錄下,work組內任意一個用戶創建文件,文件所屬組都會是這個目錄的用戶組(即work)。
5)這樣的話,所有work組內的用戶在/home/project目錄下創建的文件,其他同組用戶都有權限操作。
[root@localhost home]# groupadd work
[root@localhost home]# gpasswd -a guohuihui work
Adding user guohuihui to group work
[root@localhost home]# usermod -G work wangshibo
[root@localhost home]# id guohuihui
uid=1002(guohuihui) gid=1002(guohuihui) groups=1002(guohuihui),1003(work)
[root@localhost home]# id wangshibo
uid=1001(wangshibo) gid=1001(wangshibo) groups=1001(wangshibo),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/
接着來看下效果:現在在wangshibo賬號下操作
[root@localhost ~]# su - wangshibo
[wangshibo@localhost ~]$ ll -d /home/project/
drwxrws---. 2 root work 6 Nov 3 13:10 /home/project/
[wangshibo@localhost ~]$ cd /home/project/
[wangshibo@localhost project]$ echo "123" > wangshibo.txt
[wangshibo@localhost project]$ ll wangshibo.txt #發現創建的文件的權限的所有者是work
-rw-rw-r--. 1 wangshibo work 4 Nov 3 13:11 wangshibo.txt
然后登陸guohuihui賬號驗證下,發現可以正常操作上面的wangshibo.txt文件。
[root@localhost ~]# su - guohuihui
[guohuihui@localhost ~]$ cd /home/project/
[guohuihui@localhost project]$ ll wangshibo.txt
-rw-rw-r--. 1 wangshibo work 4 Nov 3 13:11 wangshibo.txt
[guohuihui@localhost project]$ echo "guohuihui123123" > wangshibo.txt
[guohuihui@localhost project]$ cat wangshibo.txt
guohuihui123123
[guohuihui@localhost project]$ touch guohuihui.txt
[guohuihui@localhost project]$ ll
-rw-rw-r--. 1 guohuihui work 0 Nov 3 13:12 guohuihui.txt
-rw-rw-r--. 1 wangshibo work 16 Nov 3 13:12 wangshibo.txt
=================================================================
小知識點:
將一個用戶添加到一個組內的兩種方法:
“gpasswd -a 用戶名 組名”
“usermod -G 組名 用戶名”
將一個用戶從組內刪除
“gpasswd -d 用戶名 組名 ”
================================================================
3)t權限:只能針對目錄而言,對文件來說無效!當用戶對目錄擁有wx權限時,用戶在該目錄創建的文件或目錄,只有自己與root才可以刪除。
詳細可參考:https://www.cnblogs.com/kevingrace/p/5752632.html
六、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)命令,設置如下:
如上設置,表示wangshibo用戶在使用sudo權限后,禁止使用bash和su命令。也就是說:禁止了該用戶使用sudo切換到root模式下了。
其中:
!/bin/bash 是禁止了sudo -s的切換
!/bin/su 是禁止了sudo中帶su的切換
=============ubuntu下設置普通用戶的sudo無密碼登錄===========
# User privilege specification root ALL=(ALL:ALL) ALL kevin ALL=(ALL) NOPASSWD: ALL # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) NOPASSWD:ALL #這一行也要添加"NOPASSWD",否則前面的普通用戶設置的sudo無密碼切換無效!
==================禁止賬號間使用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命令。
==========================================================
以上設置表示:wangshibo賬號在使用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-huanqiu ~]# 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