本節所講內容:
- 7.1文件的基本權限:r w x (UGO)
- 7.2文件的特殊權限:suid sgid sticky和文件擴展權限ACL
- 7.3實戰:創建一個讓root都無法刪除的文件
- 7.1 文件的基本權限
- 7.1.1 權限的作用
通過對文件設定權限可以達到以下三種訪問限制權限:
- 只允許用戶自己訪問;
- 允許一個預先指定的用戶組中的用戶訪問;
- 允許系統中的任何用戶訪問。
7.1.2 查看權限
[root@xuegod63 ~]# ll /etc/passwd
-rw-r--r--. 1 root root 2053 9月 19 2017 /etc/passwd
文件權限基本解釋:
- rw- r-- r--. 1 root root 2053 9月 19 2017 /etc/passwd
- rwx r-x r-x user1 user1 time FILENAME
文件類型 擁有者的權限 所屬組的權限 其他人的權限 擁有者 屬組 最後修改時間 對象
- 其中:文件類型,可以爲p、d、l、s、c、b和 –
- p表示命名管道文件
- d表示目錄文件
- l表示符號連接文件
- -表示普通文件
- s表示socket套接口文件,比如我們啓用mysql時,會產生一個mysql.sock文件
- c表示字符設備文件,例: 虛擬控制檯 或tty0
- b表示塊設備文件 例: sda, cdrom
例:
[root@xuegod63 ~]# ll /dev/sda /dev/cdrom /etc/passwd /dev/tty0
lrwxrwxrwx 1 root root 3 9月 19 2017 /dev/cdrom -> sr0
brw-rw---- 1 root disk 8, 0 9月 19 2017 /dev/sda
crw--w---- 1 root tty 4, 0 9月 19 2017 /dev/tty0
-rw-r--r--. 1 root root 2053 9月 19 2017 /etc/passwd
如下效果圖:
7.1.3 權限說明
對於文件來說:
- r:讀
- w:寫
- x:執行
對於目錄來說:
- r:讀(看到目錄裏面有什麼) ls
- w:在目錄裏面建文件,刪除,移動 touch mkdir rm mv cp
- x:進入 cd cat
7.1.4 文件擁有者
- UGO:所有者--用戶組--其它用戶
- 所有者: 就是創建文件的用戶,這個用戶擁有對它所創建的文件的一切權限,所有者可以允許其所在的用戶組可以訪問所有者的文件。
- 用戶組:
用戶組是具有相同特徵用戶的邏輯集合,有時我們需要讓多個用戶具有相同的權限,比如查看、修改某一個文件的權限,一種方法是分別對多個用戶進行文件訪問授權,如果有10個用戶的話,就需要授權10次,顯然這種方法不太合理;另一種方法是建立一個組,讓這個組具有查看、修改此文件的權限,然後將所有需要訪問此文件的用戶放入這個組中,那麼所有用戶就具有了和組一樣的權限。這就是用戶組。 - 其它用戶:系統內的其他所有者用戶就是other用戶類
7.1.5 舉例說明
7.1.5.1 常見幾種文件權限組成
- rwx --- ---:文件所有者對文件具有讀取、寫入和執行的權限。
- rwx r-- r--: 文件所有者具有讀、寫與執行的權限,用戶組裏用戶及其他用戶則具有讀取的權限
- rw- rw- r-x:文件所有者與同組用戶對文件具有讀寫的權限,而其他用戶僅具有讀取和執行的權限。
- drwx--x—x: 目錄所有者具有讀寫與進入目錄的權限,其他用戶近能進入該目錄,卻無法讀取任何數據。
- drwx------: 除了目錄所有者具有完整的權限之外,其他用戶對該目錄完全沒有任何權限。
舉例如下:
每個用戶都擁有自己的專屬目錄,通常放置/home下
- [root@xuegod63 home]# ll /home/
- 總用量 0
- drwx------. 3 mk mk 78 9月 19 2017 mk
- 注: [rwx------]表示目錄所有者本身擁有的權限,其它用戶是無法進入的。 root可以。
例2: 你以什麼用戶身份登錄,那麼你創建的文件或目錄,自動成爲該文件的所屬主和組
- [root@xuegod63 home]# su - mk
上一次登錄:二 9月 19 12:57:21 CST 2017:0 上
[mk@xuegod63 ~]$
[mk@xuegod63 ~]$ touch a.txt
[mk@xuegod63 ~]$ ll a.txt
-rw-rw-r-- 1 mk mk 0 5月 8 20:58 a.txt
7.1.5.2 更改文件的屬主和屬組
- 改變文件的所屬關係用到命令:
- chown:可以用來改變文件(或目錄)的屬主
- chgrp:可以用來改變文件(或目錄)的默認屬組
- 如果你要對目錄進行操作,加參數 -R
chown
語法:
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 :遞歸(目錄下的所有內容都更改,否則只修改目錄)
例:
[root@xuegod63 ~]# touch {a,b,c}.txt
[root@xuegod63 ~]# ll *.txt
-rw-r--r-- 1 root root 0 5月 8 21:03 a.txt
-rw-r--r-- 1 root root 0 5月 8 21:03 b.txt
-rw-r--r-- 1 root root 0 5月 8 21:03 c.txt
[root@xuegod63 ~]# chown mk a.txt
[root@xuegod63 ~]# ll a.txt
-rw-r--r-- 1 mk root 0 5月 8 21:03 a.txt
[root@xuegod63 ~]# chown mk:mk a.txt
[root@xuegod63 ~]# ll a.txt
-rw-r--r-- 1 mk mk 0 5月 8 21:03 a.txt
[root@xuegod63 ~]# chown :root a.txt
[root@xuegod63 ~]# ll a.txt
-rw-r--r-- 1 mk root 0 5月 8 21:03 a.txt
互動:一個文件只有讀的權限,擁有者是否可以寫這個文件?
實驗:
[root@xuegod63 ~]# su - mk
[mk@xuegod63 ~]$ touch a.txt
[mk@xuegod63 ~]$ ll a.txt
-rw-rw-r-- 1 mk mk 0 5月 8 21:07 a.txt
在另一個終端上,以root身份登錄:
[root@xuegod63 ~]# chmod 000 /home/mk/a.txt #修改成000權限
[root@xuegod63 ~]# ll /home/mk/a.txt
---------- 1 mk mk 14 5月 8 21:08 /home/mk/a.txt
回到以mk身份登錄的終端:
[mk@xuegod63 ~]$ vim a.txt # 寫入aaa , :wq! 保存
在另一個終端上,以root身份登錄:
[root@xuegod63 ~]# cat /home/mk/a.txt
aaaaa
實驗結果:文件所有者一定可以寫文件。 就像root可以對shadow強制寫。 因shadow的擁有者是root
7.1.6 修改權限
7.1.6.1 使用字符設定
修改權限用的命令:chmod
- 作用:修改文件,目錄的權限
- 語法:chmod [對誰操作] [操作符] [賦於什麼權限] 文件名
對誰操作:
- u----> 用戶user,表示文件或目錄的所有者
- g---->用戶組group,表示文件或目錄所屬的用戶組
- o---->其它用戶others
- a---->所有用戶all
操作符:
- #添加權限 ; - # 減少權限 ; = #直接給定一個權限
權限:r w x
例如下在的組合:
-
u-w user 擁有者
-
g+x group 組
-
o=r other 其他人
- a+x all 所有人
例:chmod修改權限
[root@xuegod63 ~]# touch 1.txt
[root@xuegod63 ~]# ll 1.txt
-rw-r--r-- 1 root root 0 5月 8 21:20 1.txt
[root@xuegod63 ~]#
[root@xuegod63 ~]# chmod u-w 1.txt
[root@xuegod63 ~]# ll 1.txt
-r--r--r-- 1 root root 0 5月 8 21:20 1.txt
[root@xuegod63 ~]# chmod g+x 1.txt
[root@xuegod63 ~]# ll 1.txt
-r--r-xr-- 1 root root 0 5月 8 21:20 1.txt
[root@xuegod63 ~]# chmod a+x 1.txt # 給shell腳本加一個可執行權限
[root@xuegod63 ~]# ll 1.txt
-r-xr-xr-x 1 root root 0 5月 8 21:20 1.txt
[root@xuegod63 ~]#
[root@xuegod63 ~]# chmod a=rwx 1.txt
[root@xuegod63 ~]# ll 1.txt
-rwxrwxrwx 1 root root 0 5月 8 21:20 1.txt
7.1.6.2 使用八進制(0-7)數字表示權限法
權限 二進制值 八進制值 描述
- --- 000 0 沒有任何權限
- --x 001 1 只有執行權限
- -w- 010 2 只有寫入權限
- -wx 011 3 有寫入和執行權限
- r-- 100 4 只有讀取權限
- r-x 101 5 有讀取和執行權限
- rw- 110 6 有讀取和寫入權限
- rwx 111 7 有全部權限
例1:
例2:
- 互動:rw- 的值是多少? 答: 4+2=6
- rwx r-x r-x 的值是多少? 答: rwx=4+2+1=7 ; r-x=4+1=5 rwx
r-x r-x=7 5 5
語法:
chmod 755 文件或文件夾名字
chmod a=rwx b.txt 等於 chmod 777 b.txt
例:
[root@xuegod63 ~]# touch dd.txt
[root@xuegod63 ~]# ll dd.txt
-rw-r--r-- 1 root root 0 5月 8 21:40 dd.txt
[root@xuegod63 ~]# chmod 755 dd.txt
[root@xuegod63 ~]# ll dd.txt
-rwxr-xr-x 1 root root 0 5月 8 21:40 dd.txt
[root@xuegod63 ~]# chmod 700 dd.txt
[root@xuegod63 ~]# ll dd.txt
-rwx------ 1 root root 0 5月 8 21:40 dd.txt
7.1.7 權限對文件和目錄的影響
有三種權限可以應用:讀取,寫入與執行,這些權限對訪問文件和目錄的影響如下:
權限 對文件的影響 對目錄的影響
- r(讀取) 可以讀取文件的內容 可以列出目錄的內容(文件名)
- w(寫入) 可以更改文件的內容 可以創建或刪除目錄中的任意文件
- x(執行) 可以作爲命令執行文件 可以訪問目錄的內容(取決於目錄中文件的權限)
7.1.8 補碼
爲什麼我們創建的文件的權限是644呢?
我們創建文件的默認權限是怎麼來的?
umask命令允許你設定文件創建時的缺省模式,對應每一類用戶(文件屬主、同組用戶、其他用戶)存在一個相應的umask值中的數字
文件默認權限=666 ,目錄默認權限=777
我們一般在/etc/profile、$ [HOME]/.bash_profile或$[HOME]/.profile中設置umask值。
永久生效,編輯用戶的配置文件vim .bash_profile
[root@xuegod63 ~]# vim /etc/profile
注: UID大於199 且用戶的組名和用戶名一樣,那麼 umask值爲002,否則爲022.
注: -gt 在shell中表示大於; id -g 顯示用戶組ID ,id -gn顯示組名。
臨時生效: umask 權限補碼
[root@xuegod63 ~]# umask 044
[root@xuegod63 ~]# touch ss.txt
[root@xuegod63 ~]# ll ss.txt
-rw--w--w- 1 root root 0 5月 8 21:47 ss.txt
權限的算法:一般情況是:目錄默認權限-umask 值
666-022=644
777-022=755
#這是一個好的記憶方法,但不嚴謹。
互動:umask掩碼爲033 創建普通文件後,權限是什麼?
互動:umask掩碼爲033 創建普通文件後,權限是什麼? 666-033=633 ( rw- -wx -wx) ?
例:[root@xuegod63 ~]# umask 033
[root@xuegod63 ~]# touch k.txt
[root@xuegod63 ~]# ll k.txt
-rw-r--r-- 1 root root 0 5月 8 22:00 k.txt
答:結果爲: 644
權限科學的計算方法:
- 1、將默認權限(目錄777,文件666)和umask值都轉換爲2進制 2、對umask取反 3、將默認權限和umask取反後的值做與運算
4、將得到的二進制值再轉換8進制,即爲權限,
例1: umask 爲022
6 6 6 umask 0 2 2
110 110 110 000 010 010 # 轉成二進制
111 101 101 # umask取反的值
110 110 110 與 #第二步,默認權限和umask取反後的值做與運算
111 101 101 # umask取反的值
110 100 100
6 4 4 #轉成8進制
例2: umask 爲033 結果爲: 644
6 6 6 umask 0 3 3
110 110 110 000 011 011 # 轉成二進制
111 100 100 # umask取反的值
110 110 110 與 #默認權限和umask取反後的值做與運算
111 100 100 # umask取反的值
110 100 100
6 4 4 #轉成8進制
7.2 文件的特殊權限:suid sgid sticky和文件擴展權限ACL
-
其實文件與目錄設置不止這些,還有所謂的特殊權限。由於特殊權限會擁有一些“特權”.
- 特殊權限:
7.2.1 文件的特殊權限:suid sgid sticky
- 1、SUID(set uid設置用戶ID):限定:只能設置在二進制可執行程序上面。對目錄設置無效
功能:程序運行時的權限從執行者變更成程序所有者的權限
- 2、SGID:限定:既可以給二進制可執行程序設置,也可以對目錄設置
功能:在設置了SGID權限的目錄下建立文件時,新創建的文件的所屬組會,繼承上級目錄的所屬組 - 3、Stickybit:粘滯位權限是針對目錄的,對文件無效,也叫防刪除位 這3個特殊權限對應的數值爲
SUID SGID Stickybit
- u+s或u=4 g+s或g=2 o+t或o=1
SUID屬性一般用在可執行文件上,當用戶執行該文件時,會臨時擁有該執行文件的所有者權限。使用”ls -l” 或者”ll”
命令瀏覽文件時,如果可執行文件所有者權限的第三位是一個小寫的”s”,就表明該執行文件擁有SUID屬性。比如/usr/bin/passwd文件
**互動: 普通用戶mk,沒有對shadow文件寫入的權限, 但是mk用戶使用passwd修改自己密碼時,可以修改shadow文件中的內容,這是什麼原因?
[root@xuegod63 ~]# ll /etc/shadow
----------. 1 root root 1179 9月 19 2017 /etc/shadow
[root@xuegod63 ~]# su - mk
上一次登錄:二 5月 8 21:07:24 CST 2018pts/0 上
[mk@xuegod63 ~]$ passwd
更改用戶 mk 的密碼 。
爲 mk 更改 STRESS 密碼。
(當前)UNIX 密碼:123456
新的 密碼:Xuegod666
重新輸入新的 密碼:Xuegod666
passwd:所有的身份驗證令牌已經成功更新。
[root@xuegod63 ~]# vim /etc/shadow #查看shadow文件已經被mk用戶修改成功。
因爲mk用戶執行passwd命令時,權限會提升成root用戶,所以可以修改成功。**
例2:
[root@xuegod63 ~]# useradd mk
[root@xuegod63 ~]# su - mk
[root@xuegod63 ~]$less /etc/shadow #看不到內容
[root@xuegod63 ~]# su - root
[root@xuegod63 ~]# chmod u+s /usr/bin/less #切換到root,給一個suid權限
[root@xuegod63 ~]# su - mk
[mk@xuegod63 ~]$ less /etc/shadow #看到
查看u+s後的效果:
[root@xuegod63 ~]# ll /usr/bin/less
-rwsr-xr-x 1 root root 154536 Sep 26 2011 /usr/bin/less
[root@xuegod63 ~]# ps -axu | grep less
root 43407 0.0 0.0 110260 980 pts/0 S+ 22:30 0:00 less /etc/shadow
另外:
[root@xuegod63 ~]# chmod 4755 /usr/bin/less # 等同於 chmod u+s /usr/bin/less
SGID:
- 限定:既可以給二進制可執行程序設置,也可以給目錄設置。
-
功能:在設置了SGID權限的目錄下建立文件時,新創建的文件的所屬組會繼承上級目錄的權限。
[root@xuegod63 ~]# mkdir test
[root@xuegod63 ~]# ll -d test
drwxr-xr-x 2 root root 4096 Jan 24 20:14 test
[root@xuegod63 ~]# chmod g+s test
[root@xuegod63 ~]# !ll
ll -d test
drwxr-sr-x 2 root root 4096 Jan 24 20:14 test
測試:sgid效果
-[root@xuegod63 ~]# chown :bin test/ [root@xuegod63 ~]# touch
test/a.txt [root@xuegod63 ~]# ll !$ ll test/a.txt
-rw-r--r-- 1 root bin 0 Jan 24 20:15 test/a.txt
Stickybit
限定:只作用於目錄
功能:目錄下創建的文件只有root、文件創建者、目錄所有者才能刪除。
例: 系統中的tmp目錄就是這樣
[root@xuegod63 ~]# ll -d /tmp/
drwxrwxrwt. 11 root root 4096 Jan 24 19:41 /tmp/
用法:
chmod o+t /tmp/test/
7.2.1 文件擴展權限ACL
擴展ACL :access control list
例:設置用戶mk對文件a.txt擁有的rwx權限 ,mk不屬於a.txt的所屬主和組,mk是other。怎麼做?
[root@xuegod63 ~]# touch /tmp/a.txt
[root@xuegod63 ~]# getfacl /tmp/a.txt
getfacl: Removing leading '/' from absolute path names
# file: tmp/a.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--
#setfacl -m u:mk:rwx /tmp/a.txt u : 設置某個用戶擁有的權限
[root@xuegod63 ~]# getfacl /tmp/a.txt
getfacl: Removing leading '/' from absolute path names
...
user::rw-
user:mk:rwx
[mk@xuegod63 ~]$ vim /tmp/a.txt
[mk@xuegod63 ~]$ ll /tmp/a.txt
-rw-rwxr--+ 1 root root 8 5月 8 22:42 /tmp/a.txt
例2: 給目錄加擴展權限
[root@xuegod63 ~]# mkdir /tmp/test
#setfacl -m d:u:mk:rwx /tmp/test # -d default 設置默認acl,對目錄有效,此目錄下新建的目錄或文件都繼承此acl權限
例:測試一下 -d 參數:
[root@xuegod63 ~]# mkdir /tmp/test
[root@xuegod63 ~]# setfacl -m d:u:mk:rwx /tmp/test
[root@xuegod63 ~]# getfacl /tmp/test/
getfacl: Removing leading '/' from absolute path names
# file: tmp/test/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:mk:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
[root@xuegod63 ~]# touch /tmp/test/a.txt
[root@xuegod63 ~]# mkdir /tmp/test/data
[root@xuegod63 ~]# getfacl /tmp/test/a.txt #因爲-d參數,所以test下所有創建的文件和目錄都繼承了默認的acl權限
getfacl: Removing leading '/' from absolute path names
# file: tmp/test/a.txt
# owner: root
# group: root
user::rw-
user:mk:rwx #effective:rw-
group::r-x #effective:r--
mask::rw-
other::r--
[root@xuegod63 ~]# getfacl /tmp/test/data
getfacl: Removing leading '/' from absolute path names
# file: tmp/test/data
# owner: root
# group: root
user::rwx
user:mk:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:mk:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
例3:給目錄下所有文件都加擴展權限
[root@xuegod63 ~]# setfacl -R -m u:lee:rw- testdirectory/ #-R一定要在-m前面,表示目錄下所有文件
[root@xuegod63 ~]# setfacl -x u:mk /tmp/a.txt # 去掉單個權限
[root@xuegod63 ~]# setfacl -b /tmp/a.txt # 去掉所有acl權限
7.3實戰:創建一個讓root都無法刪除的文件
發現windows中 有文件刪除不了,怎麼辦? 使用360 強制刪除,粉碎文件
那麼在Linux下怎麼辦?
[root@xuegod63 ~]# touch hack.sh aa.sh
[root@xuegod63 ~]# ll hack.sh aa.sh
-rw-r--r-- 1 root root 0 May 24 21:29 aa.sh
-rw-r--r-- 1 root root 0 May 24 21:29 hack.sh
[root@xuegod63 ~]# rm -rf aa.sh
***使用xshell悄悄執行在後臺添加attr擴展屬性:(這個別讓學員看到^_^)
[root@xuegod63 ~]# chattr +i hack.sh
刪除文件:
[root@xuegod63 ~]# rm -rf hack.sh #發現刪除不了
爲什麼刪除不了?
從REHL6 開始,新增加文件系統擴展屬性:
命令:chattr
- 參數: a 只能追加內容 ; i 不能被修改
- +a: 只能追加內容 如: echo aaa >> hack.sh
- +i:即Immutable,系統不允許對這個文件進行任何的修改。如果目錄具有這個屬性,那麼任何的進程只能修改目錄之下的文件,不允許建立和刪除文件。
注:immutable [ɪˈmju:təbl] 不可改變的 ; Append [əˈpend] 追加
- -i :移除i參數。 -a :移除a參數
解決:
[root@xuegod63 ~]# lsattr hack.sh
----i----------- hack.sh
[root@xuegod63 ~]# chattr -i hack.sh
[root@xuegod63 ~]# echo aa >> hack.sh
[root@xuegod63 ~]# lsattr hack.sh #查看擴展屬性
---------------- hack.sh
[root@xuegod63 ~]# chat
chat chattr
[root@xuegod63 ~]# chattr +a hack.sh
[root@xuegod63 ~]# rm -rf hack.sh
rm: 無法刪除"hack.sh": 不允許的操作
[root@xuegod63 ~]# echo aaa >> hack.sh
總結:
- 7.1文件的基本權限:r w x (UGO)
- 7.2文件的特殊權限:suid sgid sticky和文件擴展權限ACL
- 7.3實戰:創建一個讓root都無法刪除的文件