上一篇介紹了 Linux 用戶管理,接下來介紹一下 Linux 的權限管理。Linux 是多用戶的操做系統,容許多個用戶同時登陸和工做,Linux 權限是操做系統用來限制不一樣用戶對資源的訪問機制。這裏暫且將 Linux 中的權限分爲三類:算法
使用 ls 命令時,長格式顯示的第一列就是文件的權限,例如:數據庫
[root@localhost ~]# ls -l install.log -rw-r--r--. 1 root root 28425 11月 30 18:50 install.log
第一列的權限位 -rw-r--r--.
,則共11位,這11位權限位的含義以下圖所示:
vim
第1位:表明文件類型。Linux不像Windows使用擴展名錶示文件類型,而是使用權限位的第一位表示文件類型。雖然Linux文件的種類不像Windows中那麼多,可是分類也很多,詳細狀況可使用「info ls
」 命令查看。這裏列出一些常見的文件類型:segmentfault
-
: 普通文件d
: 目錄文件。Linux中一切皆文件,因此目錄也是文件的一種l
: 軟連接文件b
: 塊設備文件。這是一種特殊設備文件,存儲設備都是這種文件,如分區文件/dev/sda1就是這種文件c
: 字符設備文件。這也是特殊設備文件,輸入設備通常都是這種文件,如鼠標、鍵盤等p
: 管道符文件。這是一種很是少見的特殊設備文件。s
: 套接字文件。這也是一種特殊設備文件,一些服務支持socket訪問就會產生這樣的文件第2~4位:表明文件所屬者的權限數組
r
: 表明read,是讀取權限w
: 表明write,是寫權限x
: 表明execute,是執行權限第11位安全
.
:若是是個點表明受 SELinux 安全上下文保護,這裏忽略暫不作詳細介紹+
:若是是個加號表示設置了ACL權限,下文再作詳細介紹讀、寫、執行權限對文件和目錄的含義是不一樣的。bash
權限對文件的做用app
cat
、more
、less
、head
、tail
等文件查看命令vim
、echo
等修改文件數據的命令。注意:對文件有寫權限,是不能刪除文件自己的,只能修改文件中的數據,若是想要刪除文件,則須要對文件的上級目錄擁有寫權限。權限對目錄的做用less
ls
命令查看目錄下的內容了touch
、rm
、cp
、mv
等命令cd
命令進入目錄chmod
命令用來修改文件或目錄的權限。異步
命令格式:chmod [選項] 權限模式 文件或目錄
選項:
-R
:遞歸設置權限,也就是給予目錄中的全部文件和子目錄設定權限--reference=參考文件或目錄
:使用參考文件或參考目錄的權限來設置目標文件或目錄的權限權限模式
:權限模式分爲符號組合和八進制數組合 符號組合的格式是[ugoa][[+-=][permission]]
,也就是[用戶身份][[賦予方式][權限]]
的格式。
用戶身份
u
:表明全部者(user)g
:表明所屬組(group)o
:表明其餘人(other)a
:表明所有身份(all)賦予方式
+
:加入權限-
:減去權限=
:設置權限權限
r
: 讀取權限(read)w
: 寫權限(write)x
: 執行權限(execute)八進制數組合的格式是 [0-7][0-7][0-7]
三位數字組成(每一位數字都是權限之和),第一位是所屬者權限之和,第二位是所屬組權限之和,第三位其餘人權限之和
r
讀取權限對應的數字是 4
w
寫權限對應的數字是 2
x
執行權限對應的數字是 1
rw
八進制數表示 6
示例:
# 1. 添加組用戶的寫權限。 chmod g+w test.log # 2. 刪除其餘用戶的全部權限。權限爲空,即權限設置爲'---' chmod o= test.log # 使全部用戶都沒有寫權限 chmod a-w test.log # 3. 當前用戶具備全部權限,組用戶有讀寫權限,其餘用戶只有讀權限 chmod u=rwx, g=rw, o=r test.log 等價於 chmod 754 test.log # 4. 將目錄以及目錄下的文件都設置爲全部用戶都擁有讀寫權限 chmod -R a=rw testdir/ # 5. 根據參考文件 a.log 的權限來 設置文件 test.log 的權限 chmod --reference=a.log ./test.log
chown
命令用來修改文件和目錄的全部者和所屬組。
命令格式:chown [選項] 全部者[:所屬組] 文件或目錄
選項:
-R
:遞歸修改目錄下全部的文件及子目錄的所屬者和所屬組--reference=參考文件或目錄
:使用參考文件或參考目錄的所屬者和所屬組來設置目標文件或目錄的所屬者和所屬組全部者[:所屬組]
:當省略 ":所屬組
",僅改變文件所屬者注意:普通用戶不能修改文件的所屬者和所屬組,哪怕本身是這個文件的所屬者也不行。普通用戶能夠修改所屬者是本身的文件權限
示例:
# 修改文件的所屬者爲 user1,所屬組爲 group1 chown user1:group1 test.log
chown
命令只能用來修改文件和目錄的所屬組,其實徹底能夠由 chown
命令來替代。
命令格式:chgrp 用戶組 文件或目錄
選項:
-R
:遞歸修改目錄下全部的文件及子目錄的所屬組--reference=參考文件或目錄
:使用參考文件或參考目錄的所屬組來設置目標文件或目錄的所屬組當建立一個新的文件和目錄是都默認會有一些權限,新建的文件權限通常是 "-rw-r--r--
",新建的目錄權限通常是 "drwxr-xr-x
"。這些新建文件或目錄的默認權限是由權限掩碼 umask來決定的。在講解 umask 以前,須要先了解一下文件和目錄的默認最大權限
666
(即 -rw-rw-rw-
),沒有執行權限,只是由於執行權限對文件來說比較危險,不能再新建文件的時候默認賦予,而必須經過用戶手工賦予777
(即 drwxrwxrwx
),這是由於對目錄而言,執行權限僅僅表明進入目錄,因此即便新建目錄時直接默認賦予也沒有什麼危險查看權限掩碼值 和 新文件新目錄的預設權限,以下
[root@localhost ~]# umask 0022 [root@localhost ~]# umask -S u=rwx,g=rx,o=rx [root@localhost ~]# touch testfile [root@localhost ~]# mkdir testdir [root@localhost ~]# ls -ld testfile testdir/ drwxr-xr-x. 2 root root 4096 4月 22 14:48 testdir/ -rw-r--r--. 1 root root 0 4月 22 14:47 testfile [root@localhost ~]#
權限掩碼值所表示的權限就是新建文件和新建目錄要從默認最大權限裏要排除的權限。查詢掩碼值由兩種方式,直接執行 "umask
" 以數字方式展現,能夠看到有四位 '0022
',其中第一位是特殊權限用的,這裏暫時先無論,主要看後三位 "022
",即"----w--w-
";執行 "umask -S
" 以符號方式展現,其中缺乏的權限對應的權限值就是掩碼值,這裏用戶組和其餘用戶都缺乏 w
,因此掩碼值是 022
。
按照官方的標準算法,umask
默認權限須要使用二進制進行邏輯與和邏輯非聯合運算才能夠獲得正確的新建文件和目錄的默認權限,這種方法既很差計算也很差理解,不推薦。咱們這裏按照權限字母相減的方式來講明默認權限的計算方式,以權限掩碼值等於 "022
" 爲例:
-rw-rw-rw-
,經過計算 (-rw-rw-rw-) - (-----w--w-) = (-rw-r--r--)
,則新建文件默認權限是 -rw-r--r--
,即 644
drwxrwxrwx
,經過計算 (drwxrwxrwx) - (d----w--w-) = (drwxr-xr-x)
,則新建目錄默認權限是 drwxr-xr-x
,即 655
注意:
計算新建文件的默認權限時,網上有些教程直接使用使用權限數字相減獲得默認權限,這樣實際上是不對的。例如 umask 值爲003
(即--------wx
),權限數字相減666 - 003 = 663
,獲得的默認權限是663
(即-rw-rw--wx
), 顯然不對,由於經過權限掩碼能夠看出默認權限裏 other 是不該該包含wx
權限的。正確的計算結果是(-rw-rw-rw-) - (--------wx) = (-rw-rw-r--)
,即664
。形成這個錯誤的根本緣由是文件的默認最大權限是666
,全部二進制位並無滿1
,而目錄的默認最大權限是777
,全部二進制位都滿1
了,因此新建目錄的默認權限計算是可使用權限數字相減的,而新建文件的默認權限計算不能使用權限數字相減的
umask
命令是用來顯示或設置建立文件或目錄的權限掩碼的。
命令格式:umask [選項] [權限模式]
選項:
-S
:以符號組合的方式輸出權限掩碼,不使用該選項時以八進制數的形式輸出權限模式
:與上面 chmod
命令的權限模式相同使用umask
命令設置的權限掩碼只是臨時有效,若是須要永久有效,須要修改/etc/bashrc
文件裏的內容,可是不建議修改
示例:
# 修改權限掩碼爲 033。等價於 "umask u=rwx,g=r,o=r" [root@localhost testdir]# umask 033 [root@localhost testdir]# umask 0033 [root@localhost testdir]# umask -S u=rwx,g=r,o=r [root@localhost testdir]# touch testfile2 [root@localhost testdir]# mkdir testdir2 [root@localhost testdir]# ls -ld testfile2 testdir2/ drwxr--r--. 2 root root 4096 4月 22 16:36 testdir2/ -rw-r--r--. 1 root root 0 4月 22 16:36 testfile2 [root@localhost testdir]#
假若有這樣一種場景,有一個這樣一個文件,權限是 "rwx-r----
",所屬者是 user1,所屬組組 gruop1。如今須要對另外一個用戶 user2 單獨設置該文件的寫(w) 權限,可以想到的方法是 把其餘用戶(other) 的權限賦予寫權限,可是這樣除了 user2 以外的其餘用戶都能對該文件進行寫操做了,顯然不合適;若是把 user2 加入到用戶組 group1,並設置 group1 對該文件有寫權限,一樣也不合適,由於這樣 group1 內的用戶對該文件都有了寫權限;若是把全部者改成 user2 顯然更不合適,這樣該文件原有的所屬者 user1 就對該文件沒有了操做權限。
上面那種場景,只經過 所屬者(u)、所屬組(g)、其餘用戶(o) 配合 讀(r)、寫(w)、執行(x)權限 是沒法知足的。這時就須要設定 ACL 權限來實現。ACL 是 Access Control List 的縮寫,主要的目的是在提供傳統的 owner、group、others 的 read、write、execute 權限以外的細部權限設定,ACL 能夠針對單一使用者,單一文件或目錄來進行 r、w、x 的權限規範。
ACL 主要是針對三個方面來控制權限的:
事實上,本來 ACL 是 unix-like 操做系統的額外支持項目,但由於近年以來 Linux 系統對權限細部設定的熱切需求,所以目前 ACL 幾乎已經預設加入在全部常見的 Linux 文件系統(ext2/ext3/ext4/xfs 等)的掛載參數中!因此你無須進行任何動做,ACL 就能夠被使用了!不過,若是你不放心文件系統是否真的支持 ACL 的話,那麼就檢查一下磁盤分區信息,以確保開啓了 ACL。
1. 查看磁盤分區是否開啓 ACL
# 1. 查看當前系統有哪些分區。其中"/dev/mapper/VolGroup-lv_root"是邏輯卷分區,"/dev/sda1"是傳統分區 [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_root 18G 3.7G 13G 23% / tmpfs 490M 0 490M 0% /dev/shm /dev/sda1 477M 35M 417M 8% /boot # 2. 查看指定分區文件信息。若是輸出包含"acl"字眼則表明該分區已經開啓了 ACL [root@localhost ~]# dumpe2fs -h /dev/mapper/VolGroup-lv_root | grep -i acl dumpe2fs 1.41.12 (17-May-2010) Default mount options: user_xattr acl [root@localhost ~]# dumpe2fs -h /dev/sda1 | grep -i acl dumpe2fs 1.41.12 (17-May-2010) Default mount options: user_xattr acl [root@localhost ~]#
2. 開啓 ACL
若是上面的查看信息中分區沒有開啓 ACL的話,你也能夠經過下面兩種方式來開啓 ACL
mount -o remount,acl /
"。這種方式只能臨時生效,系統重啓又會恢復vim /etc/fstab
",找到對應分區那一行,在 "defaults" 後面追加 "acl",以下圖。而後重啓系統或者從新掛載 "mount -o remount /
" 使修改生效
setfacl 命令用來設定 acl 權限,命令格式:setfacl 選項 文件或目錄
選項
-m [u|g|m]:[用戶名|組名]:權限
:設定 acl 權限。也能夠設置 acl 的有效權限(不用指定用戶或用戶組)-x [u|g]:[用戶名|組名]
:刪除指定的 acl 權限。與 -m
選項是相對的-b
:刪除所有 acl 權限-R
:遞歸設定 acl 權限,指目錄下現有的全部文件和子目錄也設定相同的 acl 權限-d
:設定默認 acl 權限,指目錄下後續新建的文件和子目錄擁有的默認 acl 權限-k
:刪除默認 acl 權限getfacl 用來查看 acl 權限,命令格式:getfacl 文件或目錄
ll
命令查看,第一列權限位的最後一個字符顯示 "+
"。注意,此時看到的權限(664
)和實際的權限(644
)是有所差異的,此時實際權限就須要經過 getfacl
命令查看了getfacl
命令查詢 acl 權限輸出結果中,"user:user1:rw-
" 表示用戶 user1 對該文件擁有讀寫權限,若是省略中間的用戶名,即"user::rw-
"表明文件所屬者擁有的權限,用戶組表示規則也同樣mask::rw-
" 爲 acl 的默認最大有效權限,即給用戶或者用戶組設置的 acl 權限不能超出該範圍與針對用戶設定 acl 權限類似,以下:
使用 getfacl
命令查詢輸出的結果中, mask
表明針對用戶和用戶組可以設定的最大有效權限,即設定的 acl 權限不能超出 mask 的範圍。若是超出了,超出的部分權限是不生效的。
能夠經過 "-R
" 選項給目錄設定 acl 權限的同時,也給該目錄下面的全部文件和子目錄設定相同的 acl 權限。以下:
相對有 "-R
" 選項給目錄先現有的文件和子目錄設定 acl 權限,而 "-d
" 選項是給目錄下未來要新建的文件和子目錄設定默認 acl 權限,即該目錄下文件一旦成功建立成功就擁有的 acl 權限。以下:
其中 "setfacl -d -m u:user2:rwx /tmp/acl_test_dir/
" 等同於 "setfacl -m d:u:user2:rwx /tmp/acl_test_dir/
"
setfacl -x u:user1 /tmp/acl_test_file
setfacl -k /tmp/acl_test_dir/
setfacl -b /tmp/acl_test_dir/
Liunx 中處理常見的 "讀寫執行(rwx
)" 權限外還有一些特殊權限 s
和 t
,以下:
這些特殊權限是什麼意思呢?咱們先從 SUID 開始提及
當 s
權限標誌出如今文件所屬者的 x
權限位時,如 "/usr/bin/passwd
" 的權限狀態 "-rwsr-xr-x
",則表明該文件被設置了 SetUID 權限,簡稱 SUID。若是文件被設置了 SUID 所起到的做用是任何用戶去執行該文件時,用戶的身份會被切換爲該文件所屬者的身份去執行而不是以該用戶本身的身份去執行。
以仍是 "/usr/bin/passwd
" 命令爲例,使用 passwd
命令修改密碼時,實際上修改的是 "/etc/shadow
" 文件,而該文件的權限是 "----------
",所屬者和所屬組都是 root,也就是說只有 root 用戶才能夠強制修改 "/etc/shadow
" 文件。可是實際使用中普通用戶也是能夠修改本身的密碼的,即也能修改 "/etc/shadow
" 文件,這是由於 "/usr/bin/passwd
" 被設置了 SUID,普通用戶執行 passwd
命令的過程當中其實是以 root 身份去執行的。
SUID 的限制與功能:
設置 SUID 權限
chmod u+s 可執行二進制程序文件
或 chmod 4(0-7)(0-7)(0-7) 可執行二進制程序文件
s
權限標誌佔用所屬者本來的 x
權限位。若是顯示的是大 S
,說明是在所屬者沒有執行權限的狀況下設置的 SUID,這時設置的 SUID 權限是無效的,須要把所屬者的執行權限加上纔能有效,即變爲小 s
s
對應的數值是 4
通常不要輕易設置 SUID 權限,由於該動做很危險,試想一下,若是給 "/usr/bin/vim" 設置 SUID 權限,那麼任何用戶都能使用 "vim" 命令修改任何文件了
當 s
權限標誌出如今文件所屬組的 x
權限位時,如 "/usr/bin/locate
" 的權限狀態 "-rwx--s--x
",則表明該文件被設置了 SetGID 權限,簡稱 SGID。與 SUID 相比,SGID既能夠針對文件來設定,又能夠針對目錄來設定,功能分別以下:
針對文件 SGID 的限制與功能:
例如,任何用戶都能使用 locate
命令來查詢數據庫文件 "mlocate.db"。由於使用 locate
命令時,所屬組都會被切換爲 "slocate"
針對目錄 SGID 的限制與功能:
r
和 x
權限 w
權限時,新建文件的所屬組是此目錄的所屬組設置 SGID 權限
chmod g+s 目錄或文件
或 chmod 2(0-7)(0-7)(0-7) 目錄或文件
s
權限標誌佔用所屬組本來的 x
權限位。若是顯示的是大 S
,說明是在所屬組沒有執行權限的狀況下設置的 SGID,這時設置的 SGID 權限是無效的,須要把所屬組的執行權限加上纔能有效,即變爲小 s
s
對應的數值是 2
當 t
權限標誌出如今文件其餘用戶(other)的 x
權限位時,如 "/tmp/
" 的權限狀態 "drwxrwxrwt
",則表明該文件被設置了 Sticky Bit 權限,簡稱 SBIT。SBIT 權限只能針對目錄生效。
SBIT 的限制與功能:
w
和 x
權限例如,目錄 "/tmp/" 被設置了 SBIT 權限,普通用戶是不能刪除該目錄下所屬者非本身的文件的,即使全部用戶對 "/tmp/" 目錄都有寫權限
設置 SBIT 權限
chmod o+t 目錄
或 chmod 1(0-7)(0-7)(0-7) 目錄
s
權限標誌佔用其餘用戶本來的 x
權限位。若是顯示的是大 T
,說明是在其餘用戶(other)沒有執行權限的狀況下設置的 SBIT,這時設置的 SBIT 權限是無效的,須要把其餘用戶(other)的執行權限加上纔能有效,即變爲小 t
t
對應的數值是 1
除了上面所說的幾種權限外,還能夠給文件或目錄設置隱藏屬性起到權限限制的做用。關於隱藏屬性的設置和查看涉及到兩個命令 chattr
和 lsattr
。
命令格式:chattr [+-=][屬性] 文件或目錄
+-=
:+
增長屬性;-
:移除屬性;=
:設定屬性,覆蓋原有值A
:當設定了 A 這個屬性時,存取此文件(或目錄)時,訪問時間 atime 將不會被修改。可避免 I/O 較慢的機器過分的存取磁盤S
:通常文件是異步寫入磁盤的,若是加上 S
這個屬性時,當你進行文件的修改時,會當即同步寫入磁盤中a
:文件將只能增長數據,而不能刪除也不能修改數據c
:會自動的將此文件壓縮,在讀取的時候將會自動解壓縮。對於大文件挺有用的d
:使文件(或目錄)不會被 dump 備份i
:讓一個文件(或目錄)不能被刪除、更名、設定連結也沒法寫入或新增數據s
:文件被刪除時,將會被徹底的移除出這個硬盤空間,因此若是誤刪了,徹底沒法救回來了u
:與 s
相反的,該文件被刪除了,則數據內容其實還存在磁盤中,能夠恢復該文件示例:
# 1. 建立一個文件 [root@localhost ~]# touch testfile # 2. 給 testfile 文件設置 "i" 屬性 [root@localhost ~]# chattr +i testfile # 3. 試圖刪除 testfile 文件失敗,即便是 root 用戶 [root@localhost ~]# rm -rf testfile rm: 沒法刪除"testfile": 不容許的操做 # 4. 移除 "i" 屬性 [root@localhost ~]# chattr -i testfile # 5. 再次刪除成功 [root@localhost ~]# rm -rf testfile [root@localhost ~]#
chattr
命令只有在 ext2/ext3/ext4 文件系統下才生效
命令格式:lsattr 選項 文件或目錄
選項
-a
:將目錄下隱藏文件的屬性也展現出來-d
:若是查詢的是目錄,僅列出目錄自己的屬性而非目錄內的文件-R
:連同子目錄的數據也一併列出來示例:
[root@localhost ~]# touch testfile [root@localhost ~]# lsattr testfile -------------e- testfile [root@localhost ~]# chattr +aiS testfile [root@localhost ~]# lsattr testfile --S-ia-------e- testfile [root@localhost ~]#