1. 程式人生 > 實用技巧 >Linux - 許可權管理(檔案許可權)

Linux - 許可權管理(檔案許可權)

Linux - 許可權管理(檔案許可權)

一:基本許可權

1.基本許可權介紹

基本許可權型別

型別全拼釋義許可權位
r read 可讀 4
w write 可寫 2
x execute 可執行 1

許可權的歸屬

歸屬字母
屬主 u
屬組 g
其他使用者 o

2.設定許可權

修改屬主、屬組

# 修改檔案:1.txt的 屬主為:darker 屬組為:human
[root@localhost ~]# chown darker.human 1.txt


# 修改檔案:1.txt的 屬主為:darker 
[root@localhost 
~]# chown darker 1.txt # 修改檔案:1.txt的 屬組為:human [root@localhost ~]# chown .human 1.txt # 遞迴修改目錄:file1的 屬主為:darker 屬組為:human [root@localhost ~]# chown -R darker.human file1

修改u、g、o對應的許可權

# 加減法
# 修改檔案:1.txt的許可權為:屬主為u 屬組為w
[root@localhost ~]# chmod u+x,g-w 1.txt


# 賦值法
# 修改檔案:1.txt的許可權為:所有使用者為rwx
[root@localhost 
~]# chmod a=rwx 1.txt # 修改檔案:1.txt的許可權為:- [root@localhost ~]# chmod a=- 1.txt # 修改檔案:1.txt的許可權為:屬主屬組為rw 其他使用者為r [root@localhost ~]# chmod ug=rw,o=r 1.txt # 數字 # 修改檔案:1.txt的許可權為:所有使用者的許可權為rwx [root@localhost ~]# chmod 777 1.txt # 遞迴修改目錄:file1的許可權為:所有使用者的許可權為rwx [root@localhost ~]# chmod 777 file1

注意:把某一個非屬主使用者新增到檔案的屬組裡,他就擁有了該組的許可權,而不再是其他人

許可權對檔案/目錄的意義

檔案:ls -l 檔名

許可權釋義
r 可以cat讀取檔案內容
w 可以修改檔案
x 可以執行檔案程式碼,如果該檔案的程式碼是編譯好的結果
那麼只有x許可權即可執行
但如果該檔案的程式碼是一個解釋型的指令碼程式
則需要配合r許可權才可執行

目錄:ls -dl 檔名

許可權釋義
r 可以ls瀏覽檔案下的內容
w 可以在目錄下建立新檔案or目錄
x 可以執行目錄下的程式,除了對目錄有執行許可權外,還要對程式檔案有執行許可權才行
可以正常cd切換到目錄下
涉及到多層目錄如/a/b/c,需要對每一級都有x許可權才可以正常走到下一級

對資料夾的操作(不操作檔案內容),需要當前使用者具備的許可權

  • 對沿途所有資料夾有x許可權
  • 對目標資料夾有r或w許可權
許可權釋義
r 可以瀏覽
w 可以建立、刪除、移動子檔案和子目錄

對檔案的操作(操作檔案內容),需要當前使用者具備的許可權

  • 對沿途所有資料夾有x許可權
  • 對目標檔案有r或w許可權
許可權釋義
r 可以讀取檔案內容
w 可以修改檔案內容
注意點:

vim修改的原理是將原檔案刪掉,然後再將內容的內容覆蓋寫入了新檔案,新檔名重新命名為原檔名

驗證vim修改的原理

# (root使用者)切換到/usr/local目錄
[root@localhost local]# cd /usr/local


# (root使用者)遞迴建立test01/dir1目錄
[root@localhost local]# mkdir -p test01/dir1


# (root使用者)遞迴修改目錄test01許可權為733
[root@localhost local]# chmod -R 733 test01


# (root使用者)在test01目錄下建立1.txt並寫入內容“123”
[root@localhost local]# echo "123" > test01/1.txt


# (root使用者)檢視1.txt的內容
[root@localhost local]# cat test01/1.txt
123


# (root使用者)檢視test01目錄下的檔案1.txt的詳情資訊:其他使用者只有(r)讀的許可權
[root@localhost local]# ll test01/1.txt
-rw-r--r--. 1 root root 4 Nov 25 10:02 test01/1.txt


# (root使用者)檢視test01目錄下的檔案1.txt的iNode資訊
[root@localhost local]# stat test01/1.txt
  File: ‘test01/1.txt’
  Size: 4               Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 23609       Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:usr_t:s0
Access: 2020-11-25 10:02:58.471562017 -0500
Modify: 2020-11-25 10:02:58.471562017 -0500
Change: 2020-11-25 10:02:58.471562017 -0500
 Birth: -



# 切換到其他使用者/用其他使用者登入
PS C:\Users\Darker> ssh darker@192.168.50.101
darker@192.168.50.101's password:
[darker@localhost ~]$ whoami
darker


# (普通使用者)用vim開啟/usr/local/test01目錄下的1.txt
[darker@localhost ~]$ vim /usr/local/test01/1.txt
123
~  
~ 
~ 
"/usr/local/test01/1.txt" [readonly] 1L,   4C   1,1   All    # [readonly] 只讀

# 按i進入插入模式
-- INSERT -- W10: Warning: Changing a readonly file


# (普通使用者)修改1.txt的內容,強制儲存並退出
456
Esc
:wq!



# 回到原來的root使用者的視窗
# (root使用者)檢視1.txt的內容
[root@localhost local]# cat test01/1.txt
456


# (root使用者)檢視test01目錄下的檔案1.txt的詳情資訊:屬主和屬主變了
[root@localhost local]# ll test01/1.txt
-rw-r--r--. 1 darker darker 4 Nov 25 10:21 test01/1.txt


# (root使用者)檢視test01目錄下的檔案1.txt的iNode資訊
[root@localhost local]# stat test01/1.txt
  File: ‘test01/1.txt’
  Size: 4               Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 23609       Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/  darker)   Gid: ( 1000/  darker)
Context: unconfined_u:object_r:usr_t:s0
Access: 2020-11-25 10:30:54.822530748 -0500
Modify: 2020-11-25 10:21:17.823541511 -0500
Change: 2020-11-25 10:21:17.824541511 -0500
 Birth: -

結論

vim修改檔案時:會將原檔案刪除,生成新的檔案,屬主和主組會變成修改的那個使用者和使用者所在的組

二:特殊許可權

許可權許可權位
SUID 4
SGID 2
SBIT 1

SUID

1.疑問

普通使用者既不是root也不屬於root組,因此 它對/etc/shadow檔案沒有任何許可權(全是---
# 檢視/etc/shadow資訊
[darker@localhost ~]# ll /etc/shadow
----------. 1 root root 970 Nov 24 07:29 /etc/shadow
但是:普通使用者為何可以用passwd直接修改密碼?並且修改的是/etc/shadow檔案,如何實現的?
[darker@localhost ~]$ ll `which passwd`
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd
這裡可以看到,本應為rwx的第三個x變成了s,這就是s許可權

2.s許可權的特殊之處

  • SUID許可權僅對二進位制可執行檔案有效(對目錄無效)
  • 如果執行者對於該二進位制可執行檔案具有x的許可權,執行者將具有該檔案的所有者的許可權
  • 本許可權 僅在執行該二進位制可執行檔案的過程中有效

3.許可權設定的方法

  • 字母表示法
chmod u+s 可執行檔案    # 給屬主新增s許可權
chmod u-s 可執行檔案    # 刪除屬主的s許可權
  • 數字表示法(第1位4表示SUID,後3位表示普通許可權 rwx
chmod 4755 可執行檔案    # 新增SUID許可權到二進位制可執行檔案
chmod 0xxx ...            # 可以刪除檔案的SUID(但是無法刪除目錄的SUID)

4.例項

# (root使用者)檢視which cat
[root@localhost ~]# ll `which cat`
-rwxr-xr-x. 1 root root 54048 Nov 20  2015 /usr/bin/cat


# (普通使用者)檢視/etc/shadow:沒有許可權(普通使用者雖然是r-x,但是無法直接檢視)
[darker@localhost local]$ cat /etc/shadow
cat: /etc/shadow: Permission denied


# (root使用者)修改 which cat 許可權
[root@localhost ~]# chmod u+s `which cat`    # 或者 chmod 4755 `which cat`


#(root使用者) 再次檢視which cat
[root@localhost ~]# ll `which cat`
-rwsr-xr-x. 1 root root 54048 Nov 20  2015 /usr/bin/cat


# (普通使用者)檢視/etc/shadow:有許可權了
[darker@localhost local]$ cat /etc/shadow
root:$6$Jvw3z/jmU1ASO4P1$vpTJ5OGEtfBOmIpjyK55k87iQPHXCC3.kKOFW9jkyslqC2DMdN7SZdT/zYRfmQ4hBAQXG6CQ4kKdRQ8eFqChf.::0:99999:7:::
bin:*:16659:0:99999:7:::
daemon:*:16659:0:99999:7:::
adm:*:16659:0:99999:7:::
lp:*:16659:0:99999:7:::
...

5.上例的工作原理

環境前提:
    Linux中有1個二進位制程式:cat,屬組屬組都是root
    Linux中有一個系統檔案:/etc/shadow,屬組屬組是: root:root
    有一個普通使用者:darker
    普通使用者:darker 屬於其他使用者,對二進位制程式:cat 有執行(x)的許可權
    普通使用者:darker 對系統檔案:/etc/shadow 沒有任何許可權
    
    
預設情況下:
    普通使用者:darker 執行二進位制程式:cat
    系統會建立1個:cat程序
    該程序的屬主屬組是該程式的發起者:darker,也就是: darker:darker
    cat程序 訪問系統檔案:/etc/shadow
    cat程序的屬主和屬主:darker:darker    /etc/shadow檔案的屬主和屬主:root:root
    二者的屬主屬組不匹配,所以被拒絕訪問了:Permission denied
    
    
給二進位制程式:cat 設定SUID之後:
    普通使用者:darker 執行二進位制程式:cat
    系統會建立1個:cat程序
    執行者對於該二進位制可執行檔案具有 x 的許可權,執行者將擁有該檔案的屬組的許可權
    該程序屬主是程式的發起者:darker,屬組是cat原來的:root,屬主屬組就是:darker:root
    cat程序 訪問系統檔案:/etc/shadow
    cat程序的屬主和屬主:root:darker    /etc/shadow檔案的屬主和屬主:root:root
    二者的屬主匹配,可以正常訪問

SGID

1.許可權設定的方法

  • 字母表示法
chmod g+s 檔案/目錄        # 給檔案/目錄的屬組新增s許可權
chmod g-s 檔案/目錄        # 刪除檔案/目錄的屬組的s許可權
  • 數字表示法(第1位2表示SGID,後3位表示普通許可權 rwx
chmod 2755 檔案/目錄    # 給檔案/目錄的屬組新增s許可權
chmod 0755 檔案/目錄    # 刪除檔案/目錄的屬組的s許可權
chmod 755 檔案/目錄        # 同上

2.檔案許可權位的表示

[root@localhost ~]# ll 1.txt
-rwxr-sr-x. 1 root root 3243 Nov 25 15:41 1.txt

3.SGID相關說明

作用在二進位制可執行檔案上時:

執行有SGID許可權的程式時,該使用者將繼承該程式的屬組許可權

作用在目錄上時:

該目錄下所有使用者新建的檔案都會自動繼承該目錄的屬組

當一個使用者對某一目錄有執行許可權時,該使用者就可以在該目錄下建立檔案

如果該目錄同時用SGID修飾,則該使用者在這個目錄下建立的檔案都是屬於這個目錄的屬組

4.例項

# (root使用者)切換到/usr/loca/目錄 並建立目錄:test02
[root@localhost ~]# cd /usr/local
[root@localhost local]# mkdir test02


# (root使用者)檢視目錄:test02 的資訊
[root@localhost local]# ls -dl test02/
drwxr-xr-x. 2 root root 6 Nov 25 14:19 test02/


# !測試(root使用者)在目錄:test02 下建立檔案:1.txt 並檢視該檔案的資訊
[root@localhost local]# touch /usr/local/test02/1.txt
[root@localhost local]# ll /usr/local/test02/1.txt
-rw-r--r--. 1 root root 0 Nov 25 14:19 /usr/local/test02/1.txt

# !測試(普通使用者)在目錄:test02 下建立檔案:2.txt 並檢視該檔案的資訊
[darker@localhost ~]$ touch /usr/local/test02/2.txt
[darker@localhost ~]$ ll /usr/local/test02/2.txt
-rw-rw-r--. 1 darker darker 0 Nov 25 14:20 /usr/local/test02/2.txt


# (root使用者)修改目錄:test02 的許可權
[root@localhost local]# chmod 2773 test02


# (root使用者)再次檢視目錄:test02 的資訊
[root@localhost local]# ls -dl test02/
drwxr-sr-x. 2 root root 6 Nov 25 14:20 test02/


# !測試(root使用者)在目錄:test02 下建立檔案:3.txt 並檢視該檔案的資訊
[root@localhost local]# touch /usr/local/test02/3.txt
[root@localhost local]# ll /usr/local/test02/3.txt
-rw-r--r--. 1 root root 0 Nov 25 14:21 /usr/local/test02/3.txt

# !測試(普通使用者)在目錄:test02 下建立檔案:4.txt 並檢視該檔案的資訊
[darker@localhost ~]$ touch /usr/local/test02/4.txt
[darker@localhost ~]$ ll /usr/local/test02/4.txt
-rw-rw-r--. 1 darker root 0 Nov 25 14:21 /usr/local/test02/4.txt

SBIT

SBIT 是the restricted deletion flag or sticky bit的簡稱,有時也稱為Sticky,粘滯位

SBIT 與 SUID 和 SGID 的關係並不大

1.許可權設定的方法

  • 字母表示法
chmod o+t 檔案/目錄        # 給檔案/目錄的其他使用者設定Sticky
chmod o-t 檔案/目錄        # 刪除檔案/目錄的其他使用者的Sticky
  • 數字表示法(第1位1表示新增Sticky位,後3位表示普通許可權 rwx
chmod 1755 檔案/目錄        # 給檔案/目錄的其他使用者設定Sticky
chmod 0755 檔案/目錄        # 刪除檔案/目錄的其他使用者的Sticky
chmod 755 檔案/目錄            # 同上

2.檔案許可權位的表示

  • 檔案other位有x許可權,並且用t代替了,表示被設定了Sticky
  • 如果other位沒有x許可權,會顯示為大寫T,表示有故障(許可權無效)
[root@localhost local]# ls -dl test03
drwxr-xr-t. 2 root root 18 Nov 25 14:34 dir01

3.相關說明

  • 對於一個多人可寫的目錄,如果設定了sticky,則每個使用者僅能刪除和改名自己的檔案/目錄
  • 只能作用在目錄上,普通檔案設定無意義,而且會被Linux核心忽略
  • 使用者在設定 Sticky 許可權的目錄下新建的目錄不會自動繼承Sticky許可權

4.例項

# (root使用者)切換到 /usr/loca/目錄
[root@localhost ~]# cd /usr/local


# (root使用者)遞迴建立test03目錄及2個子目錄dir1和dir2
[root@localhost local]# mkdir -p test03/dir{1,2}


# (root使用者)建立2個使用者:user01、user02
[root@localhost local]# useradd user01
[root@localhost local]# useradd user02


# (root使用者)分別設定dir1和dir2的屬主屬組為user01和user02
[root@localhost local]# chown -R user01:user01 test03/dir1
[root@localhost local]# chown -R user02:user02 test03/dir2


# (root使用者)檢視目錄:test03的資訊
[root@localhost local]# ls -dl test03
drwxr-xr-x. 4 root root 28 Nov 25 15:37 test03

[root@localhost local]# ll test03
total 0
drwxr-xr-x. 2 user01 user01 6 Nov 25 15:37 dir1
drwxr-xr-x. 2 user02 user02 6 Nov 25 15:37 dir2


# (root使用者)修改目錄:test03 的許可權
[root@localhost local]# chmod 1777 test03


# (root使用者)檢視目錄:test03的資訊
[root@localhost local]# ls -dl test03
drwxrwxrwt. 4 root root 28 Nov 25 15:37 test03

[root@localhost local]# ll test03
total 0
drwxr-xr-x. 2 user01 user01 6 Nov 25 15:37 dir1
drwxr-xr-x. 2 user02 user02 6 Nov 25 15:37 dir2



# 切換到普通使用者:user01
[root@localhost local]# su - user01


# !測試(普通使用者)切換到test03目錄
[user01@localhost ~]$ cd /usr/local/test03


# !測試(普通使用者)檢視當前目錄下的資訊
[user01@localhost test03]$ ll
total 0
drwxr-xr-x. 2 user01 user01 6 Nov 25 15:37 dir1
drwxr-xr-x. 2 user02 user02 6 Nov 25 15:37 dir2


# !測試(普通使用者)使用者user01將dir1重新命名為dir11
[user01@localhost test03]$ mv dir1 dir11

# !測試(普通使用者)使用者user01將dir2重新命名為dir22
[user01@localhost test03]$ mv dir2 dir22
mv: cannot move ‘dir2’ to ‘dir22’: Operation not permitted


# !測試(普通使用者)使用者user01在dir11目錄中建立檔案:1.txt
[user01@localhost test03]$ touch dir11/1.txt

# !測試(普通使用者)使用者user01在dir2目錄中建立檔案:2.txt
[user01@localhost test03]$ touch dir2/2.txt
touch: cannot touch ‘dir2/2.txt’: Permission denied

5.注意點

  • SBIT 目前只對目錄有效,用來阻止非檔案的所有者刪除檔案:比較常見的例子就是/tmp目錄
  • 許可權資訊中最後一位t表示該目錄被設定了 SBIT 許可權
  • SBIT 對目錄的作用是:當用戶在該目錄下建立 新檔案或目錄時,僅有自己和 root 才有權力刪除,主要作用於一個共享的資料夾(目錄)

三:chattr

引言

你是否遇到過檔案或目錄具有可讀寫許可權,但是使用root使用者刪除、修改時提示"Operation not permitted"的情況?

可能是由chattr設定了檔案的隱藏保護許可權導致

通過chattr命令修改檔案或目錄屬效能夠提高系統的安全性

與chmod命令相比,chmod只是改變檔案的讀寫、執行許可權,更底層的屬性控制是由chattr命令改變的。

說明

這兩個命令在工作中用的比較少,經常用到的場景就是解決"Operation not permitted"問題

chattr 命令語法

語法

chattr [+-=] [ASacdistu] File/Directory

選項說明

選項釋義
+-= 分別為 [+ 增加] [- 減少] [= 設定] 指定屬性
A 當設定了 A 這個屬性時,檔案或目錄的存取時間atime (訪問時間) 將不可被修改
S 這個功能有點類似 sync 的功能!就是會將資料同步寫入磁碟當中!
可以有效的避免資料流失!
a 檔案將只能增加資料,而不能刪除,只有 root 才能設定這個屬性
C 這個屬性設定之後,將會自動的將此檔案『壓縮』
在讀取的時候將會自動解壓縮出來,但是在儲存的時候,將會先進行壓縮之後再儲存
d 當 dump (備份)程式被執行的時候,設定 d 屬性將可使該檔案(或目錄)具有 dump 功效!
i 指定檔案不能被刪除、改名、也無法寫入或新增資料!對於系統安全性有相當大的幫助!
j 當使用 ext3 這個檔案系統格式時,設定 j 屬性將會使檔案在寫入時先記錄在 journal 中!
但是當 filesystem 設定引數為 data=journalled 時,由於已經設定了日誌了,所以這個屬性無效!
s 當檔案設定了 s 引數時,他將會被完全的移除出這個硬碟空間
u 與 s 相反的
當使用 u 來設定檔案時,則資料內容其實還存在磁碟中,可以使用來 undeletion

chattr 使用例項

1.設定指定檔案的隱藏屬性,使其無法刪除、修改

# 新增"i"隱藏屬性後,就無法更動config.conf這個檔案了
chattr +i /home/config/config.conf 

2.取消檔案的刪除、修改保護許可權

# 解除"i"這個隱藏屬性
chattr -i /home/config/config.conf 

lsattr 命令語法

語法

 lsattr [-aR] File/Directory

選項說明

選項釋義
-a 將隱藏檔案的屬性也列出來
-R 連同子目錄的資料也一併列出來

lsattr 使用例項

檢視指定檔案隱藏屬性

# 檢視檔案:file.txt的隱藏屬性
lsattr file.txt

四:umask

1.新建檔案、目錄的預設許可權是由umask決定的

uid>199並且屬主與屬組相等的使用者下,umask: 0002

  • 檔案:664
  • 目錄:775

② 除1之外的其他使用者下,比如root使用者,umask: 0022

  • 檔案:664
  • 目錄:755

③ 預設許可權(在umask的影響下)

  • 檔案預設許可權:666
  • 目錄許可權預設:777

2.許可權的計算方法

檔案許可權的計算方法:偶數位直接相減,奇數位相減後加1

檔案的起始許可權值umask值操作計算後的檔案許可權值
666 022 (每位如果都是偶數) 直接相減 644
666 033 (每位如果有奇數或偶數) 相減(奇數位相減後在其原奇數 位加1) 644
666 325(每位如果有奇數或偶數) 相減(奇數位相減後在其原奇數 位加1) 442

目錄許可權的計算方法:直接相減即可

檔案的起始許可權值umask值操作計算後的檔案許可權值
777 022 相減 755
777 033 相減 744
777 325 相減 452

3.設定umask

臨時設定umask

[root@localhost local]# umask 000    # 設定umask為000

永久設定umask

# 用vim編輯/stc/profile
[root@localhost local]# vim /etc/profile    # 或者:vim /etc/bashrc


# 在最後新增如下程式碼
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
umask 002 //表示uid大於等於199的預設umask值,表示普通使用者
else
umask 022 //表示uid小於199的預設umask值,表示root
fi