權限概述
Linux系統一般將文件可存/取訪問的身份分為3個類別:owner(擁有者)、group(和所有者同組的用戶)、others(其他人,除了所有者,除了同組的用戶以及除了超級管理員),且3種身份各有read(讀)、write(寫)、execute(執行)等權限。
權限介紹
什么是權限?
在多用戶(可以不同時)計算機系統的管理中,權限是指某個特定的用戶具有特定的系統資源使用權力,像是文件夾、特定系統指令的使用或存儲量的限制。
在Linux中分別有讀、寫、執行權限:
讀權限:
對於目錄來說,讀權限影響用戶是否能夠列出目錄結構
對於文件來說,讀權限影響用戶是否可以查看文件內容
寫權限:
對目錄來說,寫權限影響用戶是否可以在文件夾下“創建/刪除/復制到/移動到”文檔
對於文件來說,寫權限影響用戶是否可以編輯文件內容
執行權限:
對於目錄來說:執行權限影響用戶是否可以執行cd操作
對於文件來說,特別腳本文件。執行權限影響文件是否可以運行。
身份介紹
Owner身份(文件所有者,默認為文檔的創建者)
由於Linux是多用戶、多任務的操作系統,因此可能常常有多人同時在某台主機上工作,但每個人均可在主機上設置文件的權限,讓其成為個人的“私密文件”,即個人所有者。因為設置了適當的文件權限,除本人(文件所有者)之外的用戶無法查看文件內容。
Group身份(與文件所有者同組的用戶)
與文件所有者同組最有用的功能就體現在多個團隊在同一台主機上開發資源的時候。例如主機上有A、B兩個團體(用戶組),A中有a1,a2,a3三個成員,B中有b1,b2兩
個成員,這兩個團體要共同完成一份報告F。由於設置了適當的權限,A、B團體中的成員都能互相修改對方的數據,但是團體C的成員則不能修改F的內容,甚至連查看
的權限都沒有。同時,團體的成員也能設置自己的私密文件,讓團隊的其它成員也讀取不了文件數據。在Linux中,每個賬戶支持多個用戶組。如用戶a1、b1即可屬於A用戶組,也能屬於B用戶組【主組和附加組】。
Others身份(其他人,相對於所有者與同組用戶)
這個是個相對概念。打個比方,大明、二明、小明一家三兄弟住在一間房,房產證上的登記者是大明(owner所有者),那么,大明一家就是一個用戶組,這個組有大明、二明、小明三個成員;另外有個人叫張三,和他們三沒有關系,那么這個張三就是其他人(others)了。
同時,大明、二明、小明有各自的房間,三者雖然能自由進出各自的房間,但是小明不能讓大明看到自己的情書、日記等,這就是文件所有者(用戶)的意義。
Root用戶(超級用戶)
在Linux中,還有一個神一樣存在的用戶,這就是root用戶,因為在所有用戶中它擁有最大的權限 ,所以管理着普通用戶。
root用戶可以無視讀寫權限,root用戶無執行權限也是無法執行,但自身可以加上權限 。
Linux權限介紹
要設置權限,就需要知道文件的一些基本屬性和權限的分配規則。在Linux中,ls命令常用來查看文件的屬性,用於顯示文件的文件名和相關屬性。
標紅的部分就是Linux的文檔權限屬性信息。
Linux中存在用戶(owner)、用戶組(group)和其他人(others)概念,各自有不同的權限,對於一個文檔來說,其權限具體分配如下:
十位字符表示含義:
第1位:表示文檔類型,取值常見的有“d表示文件夾”、“-表示文件”、“l表示軟連接”、“s表示套接字”、“c表示字符設備”、“b表示塊狀設備”等等;
第2-4位:表示文檔所有者的權限情況,第2位表示讀權限的情況,取值有r、-;第3位表示寫權限的情況,w表示可寫,-表示不可寫,第4位表示執行權限的情況,取值有x、-。
第5-7位:表示與所有者同在一個組的用戶的權限情況,第5位表示讀權限的情況,取值有r、-;第6位表示寫權限的情況,w表示可寫,-表示不可寫,第7位表示執行權限的情況,取值有x、-。
第8-10位:表示除了上面的前2部分的用戶之外的其他用戶的權限情況,第8位表示讀權限的情況,取值有r、-;第9位表示寫權限的情況,w表示可寫,-表示不可寫,第10位表示執行權限的情況,取值有x、-。
權限分配中,均是rwx的三個參數組合,且位置順序不會變化。沒有對應權限就用 – 代替。
權限設置
語法:#chmod 選項 權限模式 文檔
注意事項:
常用選項:
-R:遞歸設置權限 (當文檔類型為文件夾的時候)
權限模式:就是該文檔需要設置的權限信息
文檔:可以是文件,也可以是文件夾,可以是相對路徑也可以是絕對路徑。
注意點:如果想要給文檔設置權限,操作者要么是root用戶,要么就是文檔的所有者。
1、字母形式
給誰設置:
u:表示所有者身份owner(user)
g:表示給所有者同組用戶設置(group)
o:表示others,給其他用戶設置權限
a:表示all,給所有人(包含ugo部分)設置權限
如果在設置權限的時候不指定給誰設置,則默認給所有用戶設置
權限字符:
r:讀
w:寫
x:表示執行
-:表示沒有權限
權限分配方式:
+:表示給具體的用戶新增權限(相對當前)
-:表示刪除用戶的權限(相對當前)
=:表示將權限設置成具體的值(注重結果)【賦值】
例如:需要給/root/anaconda-ks.cfg文件(-rw-------.)設置權限,要求所有者擁有全部的權限,同組用戶擁有讀和寫權限,其他用戶只讀權限。
答案:
所有者:全部權限(rwx)
同組用戶:讀寫(rw)
其他:只讀(r)
[root@ken ~]# chmod u+x,g+rw,o+r anaconda-ks.cfg
2、數字形式
經常會在一些技術性的網頁上看到類似於#chmod 777 a.txt 這樣的一個權限,這種形式稱之為數字形式權限(777)。
讀:r 4
寫:w 2
執行:x 1
沒有任何權限:0 對應---
例如:需要給anaconda-ks.cfg設置權限,權限要求所有者擁有全部權限,同組用戶擁有讀執行權限,其他用戶只讀。
所有者權限 = 全部權限 = 讀 + 寫 +執行 = 4 + 2 + 1 = 7
同組用戶權限 = 讀權限 + 執行權限 = 4 + 1 = 5
其他用戶權限 = 讀權限 = 4
最終得出的結果是754
[root@ken ~ ]# chmod 754 anaconda-ks.cfg
面試題:用超級管理員設置文檔的權限命令是#chmod -R 731 aaa,請問這個命令有沒有什么不合理的地方?
所有者 = 7 = 4 + 2 + 1 = 讀 + 寫 + 執行
同組用戶 = 3 = 2 + 1 = 寫 + 執行
其他用戶 = 1 = 執行
問題在權限731中3表示寫+執行權限,但是寫又不必須需要能打開之后才可以寫,因此必須需要具備讀權限,因此權限不合理。以后建議各位在設置權限的時候不要設置這種“奇葩權限”。
單獨出現2、3的權限數字一般都是有問題的權限
屬主和屬組設置
屬主:所屬的用戶(文件的主人),文檔所有者
屬組:所屬的用戶組
前面的那個root就是屬主
后面的那個root就是屬組
這兩項信息在文檔創建的時候會使用創建者的信息(用戶名放在前面的root、用戶所屬的主組名稱放在后面的root)。
之所以需要設置這個:如果有時候去刪除某個用戶,則該用戶對應的文檔的屬主和屬組信息就需要去修改(類似離職之前的工作交接)。
1、chown
作用:更改文檔的所屬用戶(change owner)
語法:#chown -R 新的username 文檔路徑
-R:表示選項 文件不需要-R
目錄需要加-R
如果你要對目錄進行操作,加參數 -R
案例:
chown user:group filename 比如:chown hr:san a.txt 把文件的屬主和屬組改為hr,san
chown user filename 比如:chown san a.txt 把文件的屬主改為san用戶
chown :group filename 比如: chown :miao a.txt 把文件的屬組改為miao這個組
chown user: filename 比如:chown san: a.txt 自動繼承這個用戶所有的組
chgrp hr filename 比如: chgrp hr f.txt
-R :遞歸(目錄下的所有內容都更改,否則只修改目錄)
文件的特殊權限
suid sgid和文件擴展權限ACL
其實文件與目錄設置不止這些,還有所謂的特殊權限。由於特殊權限會擁有一些“特權”.
特殊權限:suid sgid
1、SUID(set uid設置用戶ID):限定:只能設置在二進制可執行程序上面。對目錄設置無效
功能:程序運行時的權限從執行者變更成程序所有者的權限
2、SGID:限定:既可以給二進制可執行程序設置,也可以對目錄設置
功能:在設置了SGID權限的目錄下建立文件時,新創建的文件的所屬組會,繼承上級目錄的所屬組
SUID |
SGID |
u+s或u=4 |
g+s或g=2 |
SUID屬性一般用在可執行文件上,當用戶執行該文件時,會臨時擁有該執行文件的所有者權限。使用”ls -l” 或者”ll” 命令瀏覽文件時,如果可執行文件所有者權限的第三位是一個小寫的”s”,就表明該執行文件擁有SUID屬性。
例如現在普通用戶不能查看/etc/shadow文件
[root@ken ~]# su - ken Last login: Wed Feb 27 22:26:26 CST 2019 on pts/0
[ken@ken ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
現在賦予文件passwd特殊權限suid
[root@ken ~]# chmod u+s `which cat` [root@ken ~]# ls -l `which cat` -rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/cat
再次切換普通用戶執行cat,可以發現可以查看該文件了
[ken@ken ~]$ cat /etc/shadow root:$6$9XC/lEl96ujGI9c8$E55wvS9amcKFj7/0HmblYg0j28FHwfymL.mQliqQNSElicrQKkZLurkSvVAv6NXM/KiJWFYV8NAh8imLiFedb/::0:99999:7::: bin:*:17632:0:99999:7::: daemon:*:17632:0:99999:7::: adm:*:17632:0:99999:7::: lp:*:17632:0:99999:7::: sync:*:17632:0:99999:7::: shutdown:*:17632:0:99999:7::: halt:*:17632:0:99999:7::: mail:*:17632:0:99999:7::: operator:*:17632:0:99999:7::: games:*:17632:0:99999:7::: ftp:*:17632:0:99999:7:::
SGID
限定:既可以給二進制可執行程序設置,也可以給目錄設置。
功能:在設置了SGID權限的目錄下建立文件時,新創建的文件的所屬組會繼承上級目錄的權限。
[root@ken ~]# mkdir test1 [root@ken ~]# ls -ld test1 drwxr-xr-x 2 root root 6 Feb 27 22:38 test1 [root@ken ~]# chmod g+s test1 [root@ken ~]# chown :ken test1 [root@ken ~]# touch test1/test.txt [root@ken ~]# ls -ls test1/test.txt 0 -rw-r--r-- 1 root ken 0 Feb 27 22:40 test1/test.txt
SBIT
對於設置sbit權限的文件,用戶只能刪除自己創建的文件,無法刪除其他用戶的文件
對目錄/tmp添加sbit權限,刪除文件的時候顯示拒絕操作
[root@ken ~]# chmod o+t /tmp [root@ken ~]# useradd t1 [root@ken ~]# useradd t2 [root@ken ~]# su - t1 Last login: Thu Mar 14 14:04:37 CST 2019 on pts/1 [t1@ken ~]$ touch /tmp/t1 [t1@ken ~]$ exit logout [root@ken ~]# su - t2 Last login: Thu Mar 14 14:03:59 CST 2019 on pts/1 [t2@ken ~]$ touch /tmp/t2 [t2@ken ~]$ rm -rf /tmp/t1 rm: cannot remove ‘/tmp/t1’: Operation not permitted
去掉sbit權限之后,再次刪除即可
[root@ken ~]# chmod o-t /tmp [root@ken ~]# su - t2 Last login: Fri Mar 15 12:49:54 CST 2019 on pts/4 [t2@ken ~]$ rm -rf /tmp/t1
文件擴展權限ACL
擴展ACL :access control list
例:設置用戶ken對文件a.txt擁有的rwx權限 ,ken不屬於a.txt的所屬主和組,ken是other。怎么做?
[root@ken ~]# setfacl -m u:ken:rwx a.txt
-m表示設置的意思
查看擴展權限getfacl
[root@ken ~]# getfacl a.txt # file: a.txt # owner: root # group: root user::rw- user:ken:rwx group::r-- mask::rwx other::r--
去除權限
[root@ken ~]# setfacl -R -m u:ken:rw- testdirectory/ #-R一定要在-m前面,表示目錄下所有文件 [root@ken ~]# setfacl -x u:ken /tmp/a.txt # 去掉單個權限 [root@ken ~]# setfacl -b /tmp/a.txt # 去掉所有acl權限
實戰sudo
問題:reboot、shutdown、init、halt、user管理,在普通用戶身份上都是操作不了,但是有些特殊的情況下又需要有執行權限。又不可能讓root用戶把自己的密碼告訴普通用戶,這個問題該怎么解決?
該問題是可以被解決的,可以使用sudo(switch user do)命令來進行權限設置。Sudo可以讓管理員(root)事先定義某些特殊命令誰可以執行。
默認sudo中是沒有除root之外用戶的規則,要想使用則先配置sudo。
Sudo配置文件:/etc/sudoers
該文件默認只讀,不允許修改,因此不能直接修改。
a. 配置sudo文件請使用“#visudo”,打開之后其使用方法和vim一致
b. 配置普通用戶的權限
Root表示用戶名,如果是用戶組,則可以寫成“%組名”
ALL:表示允許登錄的主機(地址白名單)
(ALL):表示以誰的身份執行,ALL表示root身份
ALL:表示當前用戶可以執行的命令,多個命令可以使用“,”分割
案例:創建ken用戶,本身ken用戶不能添加用戶,要求使用sudo配置,將其設置為可以添加用戶。
[root@ken ~]# su - ken Last login: Wed Feb 27 22:34:04 CST 2019 on pts/0 [ken@ken ~]$ useradd test -bash: /usr/sbin/useradd: Permission denied
修改sudo文件
注意:在寫sudo規則的時候不建議寫直接形式的命令,而是寫命令的完整路徑。
路徑可以使用which命令來查看
語法:#which 指令名稱
在添加好對應的規則之后就可以切換用戶,切換到普通用戶ken,再去執行:
此時要想使用剛才的規則,則以以下命令進行:
#sudo 需要執行的指令
[root@ken ~]# su - ken Last login: Wed Feb 27 22:51:26 CST 2019 on pts/0 [ken@ken ~]$ useradd test #需要加上sudo -bash: /usr/sbin/useradd: Permission denied [ken@ken ~]$ sudo useradd test1 We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. [sudo] password for ken:
在輸入sudo指令之后需要輸入當前的用戶密碼進行確認的操作(不是root用戶密碼),輸入之后在接下來5分鍾內再次執行sudo指令不需要密碼。