linux系統下的權限知識梳理
阿新 • • 發佈:2018-02-08
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系統下的權限知識梳理