Linux的檔案許可權管理

背對背依靠發表於2023-03-14

Linux檔案許可權管理介紹

一:Ubuntu 簡介

1 、什麼是Ubuntu

Ubuntu是基於Debian開發的一個開源的Linux作業系統,Ubuntu這個名字名稱來⾃⾮洲南部某種語言的一個詞語,Ubuntu每6個月會發布⼀個新版本,每隔兩年,在四月份的時候,會推出⼀個⻓期⽀持版本(LTS)。其⽀持期⻓達五年,⽽⾮ LTS 版本的⽀持期通常只有半年。

ubuntu的第⼀個版本是釋出於2004 年,所以Ubuntu的⽣⽇是2004年的10⽉20⽇,後面Ubuntu版本的命名規則是根據正式版釋出的年⽉命名,Ubuntu 16.04 也就意味著 2016年4⽉釋出的Ubuntu。

https://baike.baidu.com/item/ubuntu # Ubuntu歷史版本⼀覽表

image

2、使用ubuntu的場景

  • 桌面應用程式:Ubuntu 提供了一個易於使用的桌面環境,適合日常計算機使用。
  • 伺服器:Ubuntu 是一個流行的伺服器作業系統,因為它提供了高度可定製的安裝選項,安全更新和廣泛的應用程式支援。
  • 雲端計算:Ubuntu 在雲端計算中也很流行,因為它提供了雲服務商所需的安全性、效能和可擴充套件性等關鍵功能。
  • 物聯網:Ubuntu 可以作為 IoT 裝置的作業系統,它提供了穩定的核心作業系統,同時也提供了與雲服務連線和遠端管理的工具。
  • 開發:Ubuntu 內建了各種程式語言和工具,適合開發者進行軟體開發和測試

3、Ubuntu 的軟體管理

剛開始的時候,開源軟體最初只提供了原始碼,安裝軟體的時候需要自行編譯安裝,但是編譯安裝存在很多依賴,這樣就造成了早期軟體的部署困難。

後面Debian誕生的時候,開發了一個包管理工具dpkg,透過將編譯好的二進位制檔案、配置檔案、庫檔案和幫助檔案等資訊封裝在一個軟體包裡面,透過dpkg工具來進行快速安裝。

因為ubuntu是基於Debian開發而來的,所以ubutu也繼承了Debian的軟體包和包管理工具等。

離線安裝:

如果是離線安裝,就使用dpkg這個工具,並且dpkg只能用來管理本地的軟體包,需要將指定的軟體包下載到本地才可以使用dpkg進行管理,並且dpkg只能管理.deb格式的軟體包。dpkg安裝軟體包的時候不會自動解決軟體包之間的依賴關係。

線上安裝:

如果是線上安裝,就使用apt(Advanced Package Tool)這個工具,apt是一個高階軟體包管理工具,只能線上管理軟體包,只需要提供軟家源就可以線上下載安裝。並且可以自動解決軟體包的依賴關係。apt工具也是基於dpkg開發而來的。

dpkg 的使用

# 安裝
    # 通常用於查詢已安裝的軟體包的資訊。 -I
    sudo dpkg -I pacakage_name
 
# 解除安裝刪除
	# 刪除已經安裝在系統上的軟體包(包括配置檔案) -P 或者 --purge 
	sudo dpkg -p package_name
 
# 檢視
    # 用於檢視系統中都裝了哪些軟體包  -l 或 list
    sudo dpkg -l 

    # 檢視已安裝的軟體包的檔案路徑
    sudo dpkg -L  pacakage_name

    # 查詢某個檔案屬於哪個軟體包。 -S
    sudo dpkg -S file_name

    # 詢軟體包的基本資訊,不需要詳細資訊 -s
    sudo dpkg -s package_name 

    # 查詢軟體包的詳細資訊 -p
    sudo dpkg -p package_name 

例如:檢視系統中是否已經安裝了指定的軟體包

root@ubuntu:~# dpkg -l | grep redis
ii  libhiredis0.14:amd64                       0.14.0-6                              amd64        minimalistic C client library for Redis
ii  redis-server                               5:5.0.7-2ubuntu0.1                    amd64        Persistent key-value database with network interface
ii  redis-tools                                5:5.0.7-2ubuntu0.1                    amd64        Persistent key-value database with network interface (client)

例如:查詢ls屬於哪個軟體包

[root@ubuntu1804 ~]#dpkg -S /bin/ls
coreutils: /bin/ls

apt的使用

apt這個工具是在ubuntu1604的LTS版本中引入的,引入apt以後,將之前的apt-get、apt-cache等工具對軟體包的操作整合到一個命令中,使得軟體包管理更加方便和簡單。

例如:

# 更新軟體包列表: update
sudo apt update

# 升級所有已安裝的軟體包: upgrade
sudo apt upgrade

# 安裝一個或多個軟體包: install
sudo apt install package1 package2 ...

# 解除安裝一個或多個軟體包:	remove或purage
sudo apt remove package1 package2 ...  # 只會解除安裝軟體包,不會刪除相關的配置檔案
sudo apt purge  package1 package2 ...  # 解除安裝軟體包時,刪除相關配置檔案

# 清理本地軟體包快取: clean
sudo apt clean

# 顯示軟體包之間的依賴關係: depends
apt depends package_name

# 只下載deb包和這個包的依賴,不進行安裝  --download-only
sudo apt --download-only install package_name

# 檢視下載的軟體包和依賴: /var/cache/apt/archives/是預設的軟體包下載目錄
ls /var/cache/apt/archives/

例如:檢視keepalived這個軟體包的依賴資訊

# 檢視某個軟體包的依賴資訊時,需要先在系統中安裝了該軟體包才能檢視其依賴資訊。
[root@ubuntu1804 ~]#apt depends keepalived
keepalived
 Depends: iproute2
   iproute2:i386
 Depends: libc6 (>= 2.27)
 Depends: libglib2.0-0 (>= 2.26.0)
 Depends: libip4tc0 (>= 1.6.0+snapshot20161117)
 Depends: libip6tc0 (>= 1.6.0+snapshot20161117)
 Depends: libnl-3-200 (>= 3.2.27)
 Depends: libnl-genl-3-200 (>= 3.2.7)
 Depends: libnl-route-3-200 (>= 3.2.7)
 Depends: libsnmp30 (>= 5.7.3+dfsg-1.8ubuntu3.1~dfsg)
 Depends: libssl1.1 (>= 1.1.0)
 Depends: libxtables12 (>= 1.6.0+snapshot20161117)
 Recommends: ipvsadm

二:Linux目錄結構

Linux的哲學思想:

  • 一切皆檔案(包括硬體):將裝置也視為一個檔案,使得使用者可以使用相同的命令和工具來管理檔案和裝置
  • 配置存放在文字檔案中:將配置儲存在文字檔案中,可以讓配置的檢視、編輯更加方便。

1、Linux的目錄結構

image

目錄的功能:

  • bin:binary。的相關目錄存放的是二進位制程式(所有人都可執行的二進位制檔案)
  • sbin :super binary。 管理員可以執行的二進位制檔案
  • boot: 和計算機啟動相關的檔案,如核心等檔案
  • dev: device。 存放硬體裝置
  • etc:et cetera, 相當於windows的登錄檔,存放各種程式的配置檔案
  • home: 普通使用者的家目錄
  • usr: 相當於第二個根(usr下面的資料夾根下面都有,相當於windows系統下的windows這個資料夾的功能
  • run: 系統執行過程中生成的臨時檔案
  • tmp: 臨時檔案
  • var:variety 。存放經常變化的內容 ,比如日誌、網站
  • lib: library。存放庫檔案,程式的依賴等內容
  • proc: process 。存放程式相關的資訊
  • sys: 和硬體相關的檔案,資料存放在記憶體中的

2、Linux檔案的型別

  • - :普通檔案
  • d :目錄檔案directory
  • l :符號連結檔案link
  • b :塊裝置block ,例如硬碟檔案,訪問的時候是一塊一塊訪問的
  • c :字元裝置character。訪問的時候是一個字元一個字元訪問的
  • p : 管道檔案pipe
  • s :套接字檔案socket

3、Linux 檔案的顏色

  • 綠色: 可執行檔案

  • 紅色: 壓縮檔案、打包檔案

  • 白色: 文字檔案

  • 藍色: 目錄檔案

  • 黃色: 裝置檔案

  • 淺藍色: 連結檔案(軟連線)

image

Linux 檢視檔案的型別:

方法一:透過顏色判斷

方法二:透過ls -l或者file命令檢視

三:Linux使用者管理

Linux使用者分類:

image

相關檔案:

/etc/passwd:儲存系統中所有使用者的資訊,例如使用者名稱、使用者ID、使用者主目錄和預設shell等

可以透過檢視/etc/passwd內容來確定系統是否存在指定的使用者。

# 檢視passwd檔案的方式
root@ubuntu1804:~# cat /etc/shadow | grep nginx
nginx:!:19339::::::

# 使用id命令進行檢視
root@ubuntu1804:~# id nginx
uid=999(nginx) gid=999(nginx) groups=999(nginx)

/etc/shadow:儲存使用者的密碼和其他敏感資訊

1、useradd

useradd用於建立使用者。

#選項
-s   # 指定該使用者使用的shell型別
-u   # 指定uid ,不指定預設從1000開始
-r   # 建立系統使用者,也就是 UID 在 1~499 之間,供系統程式使用的使用者。
       # 由於系統使用者主要用於執行系統所需服務的許可權配置,因此係統使用者的建立預設不會建立主目錄
-d   # 指定家目錄,這個目錄要提前存在
-p   # 指定使用者的密碼(需要的是加密的密碼,明文密碼不可以
-m   # 建立使用者時強制建立使用者的家目錄。在建立系統使用者時,該選項是預設的
-g   # 指定使用者所屬於的主要組
-G   # 指定使用者的附加組。我們把使用者加入其他組,一般都使用附加組;

例如:建立一個普通使用者指定家目錄

#建立一個普通使用者指定家目錄
root@ubuntu1804:~# useradd -m bob 

root@ubuntu1804:~# ll -d /home/bob/
drwxr-xr-x 2 bob bob 4096 Dec  8 14:28 /home/bob//

root@ubuntu1804:~# id bob 
uid=1001(bob) gid=1001(bob) groups=1001(bob)

例如:建立系統使用者:

# 1.先建立組 使用 -g指定gid
# 2.建立系統使用者 使用-r表示建立系統使用者 使用 -u指定uid 使用-g指定組
# 這樣做的好處是多臺伺服器上建立的使用者gid、uid保持一致

#系統使用者的uid和gid範圍是1-999
root@ubuntu1804:~# groupadd -g 666 bob

root@ubuntu1804:~# useradd -r -s  /sbin/nologin -u 666 -g bob  user1

root@ubuntu1804:~# id user1	
uid=666(user1) gid=666(bob) groups=666(bob)  

2、userdel

userdel用於刪除系統中指定的使用者

# userdel [-r] user_name 新增-r引數就刪除使用者的所有資訊。

root@ubuntu1804:~# userdel -r bob
userdel: bob mail spool (/var/mail/bob) not found

3、usermod

更改使用者的相關資訊

# 修改使用者的使用者名稱:使用 -l 選項:
usermod -l 新使用者名稱 老使用者名稱

# 修改使用者的家目錄:使用 -d 選項:
usermod -d /新的/家目錄 要修改的使用者名稱

# 修改使用者的預設 shell:使用 -s 選項:
usermod -s /bin/bash 要修改的使用者名稱

# 將使用者新增到一個或多個附加組中:使用 -aG 選項,-a 選項表示將使用者新增到附加組中,而不是替換使用者的組
usermod -aG 組名 要修改的使用者名稱

四:Linux 組管理

在Linux中的每個使用者必須屬於一個組,不能獨立於組外。一般建立使用者的時候會以該使用者的名稱為組名建立一個使用者組。

相關檔案;

/etc/gshadow檔案

儲存使用者組的密碼和其他敏感資訊。

/etc/group檔案

儲存系統中所有使用者組的資訊,可以透過這個檔案檢視是否存在指定的使用者組。

/etc/login.defs檔案

用於配置Linux系統中各種登入相關的預設值和策略資訊。

1、groupadd

用於建立一個使用者組。

例如:

sudo groupadd group_name

# 引數
	-g:指定gid,未指定系統隨機分配
	-r:建立系統使用者組,系統使用者組通常用於管理系統程式和服務

2、groupdel

用於刪除一個使用者組。

例如:

sudo groupdel group_name

# 引數
	-f:強制刪除,不管該組中是否還存在使用者,慎用,強制刪除可能會導致一些問題。
	-r:刪除組時,同時刪除與該組相關的檔案和目錄

3、groupmod

用於修改一個組的資訊。

例如:

sudo groupmod group_name

# 引數
	-g:設定使用者的gid
	-n:--new-name,修改組名

五:Linux檔案許可權

在Linux作業系統中,因為設計思想就是一切皆檔案,所以可以針對檔案或目錄所設定的訪問許可權控制規則。這些許可權規則可以控制不同使用者或使用者組對檔案或目錄的讀、寫、執行等操作許可權。

1、檔案許可權的組成

由三部分組成:所有者許可權、群組許可權和其他使用者許可權。每個使用者或使用者組在訪問檔案或目錄時,都會受到這三個許可權規則的限制。

說明:root使用者例外。

2、檔案的許可權屬性

Linux的檔案許可權屬性用10個字元表示,分為四部分。

  • 第一部分:一個字元來表示檔案的型別
  • 第二部分:三個字元表示檔案的所有者
  • 第三部分:三個字元表示檔案的所屬組
  • 第四部分:三個字元表示檔案的其它使用者許可權

![image-20230310165156515](E:\學習文件\Linux檔案許可權管理\Linux檔案許可權管理 - 副本_img\image-20230310165156515.png)

許可權屬性說明:dang

r(讀)、w(寫)、x(執行)和 -(無許可權)

普通檔案

  • 讀許可權(r)表示可以讀取檔案內容。如果沒有讀許可權,則使用者無法檢視檔案內容
  • 寫許可權(w)表示可以修改檔案內容,如沒有寫許可權,則使用者無法修改檔案內容
  • 執行許可權(x)表示可以將檔案作為可執行檔案執行,如果沒有執行許可權,則使用者無法執行可執行檔案

目錄檔案:

  • 讀取許可權(r):表示允許檢視目錄中的檔案列表。如果沒有讀取許可權,則使用者無法檢視目錄列表。
  • 寫入許可權(w):表示可以在目錄中建立、刪除、重新命名、移動檔案或目錄
  • 執行許可權(x):表示允許進入該目錄。如果沒有執行許可權,則使用者無法進入該目錄。

目錄檔案的最小許可權:

目錄檔案的最小許可權是可執行許可權,因為目錄是一種特殊的檔案型別,用於儲存其他檔案和目錄。對於一個目錄來說,必須擁有執行許可權才能進入這個目錄。

如果一個目錄沒有執行許可權,那麼使用者就不能進入這個目錄,也就無法訪問該目錄下的任何檔案或子目錄,即使這些檔案或子目錄的訪問許可權是允許的,所以目錄的最小許可權是可執行許可權。

例如:執行 cp /etc/issue /data/dir/ 所需要的最小許可權?

/bin/cp     # 需要x許可權,需要對cp有可執行的許可權
/etc/       # 需要x許可權,需要進入到etc目錄下
/etc/issue  # 需要r許可權,需要能讀取issue檔案的內容
/data       # 需要x許可權,需要能進入data目錄下
/data/dir   # 需要w,x許可權,需要能進入dir目錄,並且能在下面建立一個叫做issue的檔案。

3、檔案所有者

檔案所有者指的是建立該檔案的使用者的UID或程式的UID,這個UID會被寫入檔案的後設資料中作為檔案的所有者屬性,不會隨著檔案的複製或移動而改變。

如何理解檔案所有者指的是建立該檔案的使用者的UID或程式的UID

例如當tom使用者執行touch命令建立一個檔案A的時候,因為touch的本質就是一個使用者空間的應用程式,當在終端中輸入touch命令並按下Enter鍵時。系統會為該命令建立一個新程式,並將該程式的有效使用者ID設定為tom的UID,然後,該程式建立檔案A時,檔案A的所有者就會被設定為該程式的有效使用者ID,也就是tom的UID。因此,檔案A的所有者就是tom使用者。

如何理解檔案的所有者和所屬組不會隨著檔案的移動而改變:

例如建立了一個新檔案A,檔案系統會為這個新檔案A分配一個唯一的inode號,並在系統中為其分配空間,在檔案系統中,每個檔案都有一個與之相關聯的inode資料結構,這個資料介面就是用來存放檔案屬性資訊的包括檔案所有者、所屬組、許可權等,建立檔案的時候就把A檔案的所有者屬性寫入檔案的inode中了,當使用mv命令將檔案從一個目錄移動到另一個目錄時,實際上是在檔案系統中修改了檔案的路徑。檔案本身的內容和屬性不會被修改,包括檔案的所有者和所屬組。因此,無論您將檔案移動到哪個目錄,檔案的所有者和所屬組都將保持不變。

注意:複製的本質就是建立一個新的檔案,使用cp命令將檔案複製到另一個目錄中,則複製的檔案將具有與原始檔案相同的所有者和所屬組。

六:Linux檔案許可權管理

Linux檔案許可權包含了普通許可權,特殊許可權,特殊屬性和ACL。

1、預設許可權屬性

在Linux中,新建檔案時,檔案的預設許可權由umask的值來進行控制。umask是一個許可權掩碼,它會在建立新檔案時掩蓋某些預設許可權。

  • root使用者:umask 預設值通常是 0022
  • 普通使用者: umask 預設值通常是 0002
# 檢視umask預設值
root@ubuntu1804:~# umask 
0022

如何計算檔案的預設許可權:

普通檔案預設許可權: 666 - umask,如果值為奇數就 + 1

目錄檔案預設許可權 :777 - umask

計算普通檔案預設許可權的時候結果是奇數需要 +1的原因:

因為結果存在奇數,說明包含有可執行許可權,所以需要 +1 來保證這個檔案預設不具備可執行許可權,保證系統的安全。

計算普通檔案使用666和計算目錄使用777的原因:

為了保證目錄檔案預設就有可執行許可權,不然使用者沒法訪問,因為只有擁有可執行許可權的目錄,才能讓使用者進入並訪問該目錄下的檔案和子目錄(目錄的執行許可權表示是否允許訪問該目錄)。

普通檔案不需要考慮可執行許可權,擁有可執行許可權太危險,所以就使用666(包含了讀和寫許可權)來計算預設許可權。

root使用者建立的檔案許可權和普通使用者建立的檔案許可權不同的原因:

root使用者和普通使用者的umask值預設是不同是為了保護系統的安全和完整性,併為不同的使用者角色提供不同的預設許可權。

對於普通使用者來說:只需要考慮對自己的檔案和目錄具有讀、寫、執行的許可權,預設即拒絕組和其他使用者的寫許可權。所以預設的umask是002。所以普通使用者建立的檔案和目錄的預設許可權是 664 和 775

對於root使用者來說:因為root使用者具有系統管理的特權,需要確保檔案和目錄對所有使用者都是可讀的,但只有所有者才能修改或刪除它們。所以預設的umask是022,所以root 使用者建立的檔案和目錄的預設許可權是 644 和 755

一個檔案是否能被刪除取決於這個檔案所在目錄的許可權:

一個檔案是否能被刪除和自身許可權無關,取決於這個檔案所在的目錄檔案是否對執行刪除操作的使用者具有寫許可權。

2、修改預設的許可權

chown工具

用於更改檔案或目錄的所有者,同時也可以用於更改檔案所屬組。

更改檔案所有者:

chown owner file_name

# 將/home/user1/file.txt的所有者更改為user2
chown user2 /home/user1/file.txt

更改檔案所屬組:

chown :group file_name 或 chown .group file_name

更改檔案所有者和所屬組:

chown ower:group file_name 或 chown ower.group file_name 

更改一個目錄檔案以及目錄檔案中所有檔案的屬性:

# 需要使用 -R 引數進行遞迴修改
chown -R ower:group file_name 或 chown ower.group file_name 

chgrp工具

用於更改檔案的所屬組

例如:更改檔案或目錄的所屬組

chgrp group_name file_name

# 將/home/user1/file.txt的所屬組更改為dev
chgrp dev /home/user1/file.txt

chmod工具

方法一:符號法:

# who opt permission(誰對誰做什麼操作)
    who:u,g,o,a (a:all,所有)
    opt: + - = (=:會修改使用者的所有許可權)
    permission:r,w,x
  
  owner 屬主, u
  group 屬組, g
  other 其他, o

  r Readable
  w Writable
  x eXcutable

例如:

# 給檔案所有者加上可執行許可權
chmod u+x filename 

# 讓檔案所有者只有r的許可權
chmod u=r file_name 

# 給檔案所有者讀寫執行許可權,給所屬組讀和執行許可權,不給其它使用者任何許可權
chmod u=rwx,g=rx,o= file_name

方法二:數字表示法

在Linux系統中,檔案和目錄的許可權可以用數字表示法來表示。

數字表示法由三個八進位制數字組成,每個數字代表一個許可權組,從左到右依次是檔案所有者許可權、檔案所屬組許可權和其他使用者許可權。

一個八進位制數字可以表示三個二進位制數字,意味著可以用二進位制位表示一個許可權標誌。

例如:如果一個檔案的許可權是755

7 --> 111(0b) 
5 --> 101(0b)
5 --> 101(0b)

# 這三個二進位制數字從左到右分表表示讀、寫、執行三種許可權屬性。如果該位的狀態為1表示具備對應的許可權。

例如:給檔案所有者讀寫執行許可權,所見所屬組讀許可權,其它使用者讀許可權

chmod 754 file_name 

3、檔案的三種特殊許可權

SUID許可權

作用:允許一個普通使用者以該檔案所有者的許可權來執行該檔案。

例如:

普通使用者使用 passwd 命令修改自己的密碼時,需要訪問 /etc/shadow 檔案,但是該檔案只有 root 使用者才有許可權訪問。

為了允許普通使用者修改自己的密碼,passwd 程式需要擁有 SUID 許可權,這樣普通使用者在執行 passwd 程式時,就會暫時獲得 root 使用者的許可權,可以訪問 /etc/shadow 檔案並修改自己的密碼。

ehigh@ubuntu:~$ ll /etc/shadow
-rw-r----- 1 root shadow 1697 5月  24  2022 /etc/shadow

ehigh@ubuntu:~$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 7月  15  2021 /usr/bin/passwd

SGID許可權

作用:讓使用者在執行某些程式時暫時獲得程式所屬組的許可權。

例如:需要多個使用者共享一個目錄並保持目錄下檔案的訪問許可權時非常有用

Sticky Bit許可權

作用:該目錄下的檔案只能由檔案的所有者、目錄的所有者以及超級使用者刪除或移動,其他使用者無法刪除或移動該目錄下的檔案。

例如:linux系統的/tmp這個臨時檔案目錄就設定了stick bit許可權,只允許檔案所有者刪除這個檔案。

ehigh@ubuntu:~$ ll -d /tmp/
drwxrwxrwt 24 root root 4096 3月  13 09:20 /tmp/

4、三個特殊許可權的設定

SUID許可權設定

如果檔案設定了 suid 許可權,則在檔案所有者的可執行許可權的位置上會顯示一個 s 字元。

# 方法一:字元法:u+s
chmod u+s filename  

# 方法二:先寫出傳統許可權 然後再加4
# 比如: 傳統許可權是755 加suid許可權後: 4755 ---> rwsr-xr-x
chomod 4755 filename

SGID許可權設定

如果檔案設定了 sgid 許可權,則在檔案所屬組的可執行許可權的位置上會顯示一個 s 字元。

# 方法一:字元法:g+s
chmod g+s filename

# 方法二:數字法: 2
# 比如:傳統許可權是755 加sgid許可權後: 2755 ---> rwsr-xr-x
chmod 2775 filename

Sticky Bit許可權設定

如果檔案設定了 sticky bit 許可權,則在其他使用者的可執行許可權的位置上會顯示一個 t 字元.

# 方法一:字元法:o+t
chmod o+t filename

#方法二:數字法 1
例如:原來的許可權是744,設定了Sticky Bit許可權後是 1744
chmod 1744 filename

5、檔案的特殊屬性

因為檔案的所有者、所屬組和其它這三種許可權是不會限制root使用者的操作。

root 使用者是系統的超級管理員,具有最高的許可權,可以執行任何操作,包括讀、寫、執行任何檔案,即使該檔案的許可權是 000(即沒有任何許可權),root 使用者也可以對其進行讀寫操作。

所以有些時候為了防止root使用者誤操作一些資料,可以給檔案設定一些特殊屬性來限制對檔案的刪除、修改、追加等操作,從而保護檔案的安全性。

chattr工具

可以透過charrt工具來設定檔案的特殊屬性。

語法:

# 格式
	chattr [選項] [+/-][屬性] 檔名

# 選項:
    -R:遞迴處理目錄下的所有檔案和子目錄
    -v:顯示檔案的屬性設定過程
    
# + -
	+:表示新增這個屬性
	-:表示取消這個屬性

# 屬性
    a:
    	# 普通檔案:表示只允許追加到檔案中,不允許其它修改、刪除、移動等操作;
    	# 目錄檔案:表示只能在目錄中建立和修改檔案,但是不允許刪除檔案
    i:
    	# 普通檔案:設定檔案為不可修改,不可刪除;
    	# 目錄檔案: 只能修改目錄下檔案中的資料,但不允許建立和刪除檔案
    	
   	u:檔案刪除後,資料內容還儲存在磁碟中,可以使用恢復工具進行恢復,常用來防止意外刪除檔案或目錄。
   	

例如:

# 設定檔案為只讀模式
ehigh@ubuntu:~/test$ sudo chattr +i a.txt 
ehigh@ubuntu:~/test$ sudo rm -rf a.txt 
rm: cannot remove 'a.txt': Operation not permitted

# 防止檔案被刪除或改變
ehigh@ubuntu:~$ sudo chattr +a a.txt 
ehigh@ubuntu:~$ echo 1234 >> a.txt 

ehigh@ubuntu:~$ echo 1234 > a.txt 
-bash: a.txt: Operation not permitted

lsattr工具

透過lsattr可以檢視某個檔案是否設定了特殊屬性。

例如:

root@ubuntu1804:~# lsattr test 
----i---------e--- test

6、ACL

ACL:Access Control List,訪問控制列表。一種在檔案系統上控制檔案和目錄許可權的機制。

允許使用者在不更改所有權或許可權模式的情況下,對檔案和目錄進行更細粒度的控制。

主要是用於實現單獨給某個使用者設定許可權,因為chmod只能整體給檔案所有者、所屬組和其它使用者設定許可權。

setfacl工具

setfacl工具是Linux系統中用於設定檔案和目錄訪問控制列表(ACL)的工具,ACL可以授予使用者和組不同於標準Unix許可權的訪問許可權。

例如:

設定acl:

# 格式
	setfacl -m u:username:rwx filename

# 設定tom使用者對A檔案有讀寫執行的許可權 
	root@ubuntu1804:~# setfacl -m  u:tom:rwx A

刪除acl:

# 刪除某個檔案所有的acl設定
	setfacl -b filename

# 刪除ACL中的一個特定條目
	setfacl -x u:username filename

修改acl:

# 格式
	setfacl -m u:username:rx filename

# 修改tom對A檔案的許可權為讀和執行
	root@ubuntu1804:~# setfacl -m  tom:r-x A

getfacl工具

使用getfacl可以檢視一個檔案是否設定了acl,以及acl的詳細資訊。

# 格式
	getfacl filename

# 檢視A檔案的acl資訊
    root@ubuntu1804:~# getfacl A
    # file: A
    # owner: root
    # group: root
    user::rw-
    user:tom:rwx 
    group::r--
    mask::rwx
    other::r--

image

7、mask

mask 是用來限制了除了檔案所有者和所屬組之外的其他使用者或組的許可權,因為檔案所有者和所屬組本來就有檔案所有權和群組許可權,不受 ACL 許可權的限制。

說明:

設定了acl後,使用ls -l命令檢視檔案許可權時,所屬組現實的許可權是mask的值,真正的組的許可權是getfacl中的group。

#  原檔案許可權
root@ubuntu1804:~# ll -l test 
-rw-r--r-- 1 root root 10485760 Mar 13 15:23 test

#設定acl 
root@ubuntu1804:~# setfacl -m u:tom:rwx test 

# 所屬組許可權這兒顯示的是mask的值
root@ubuntu1804:~# ls -l test 
-rw-rwxr--+ 1 root root 10485760 Mar 13 15:23 test

# group顯示的才是所屬組的許可權
root@ubuntu1804:~# getfacl test 
# file: test
# owner: root
# group: root
user::rw-
user:tom:rwx
group::r--
mask::rwx
other::r--

總結:

  • 如果沒有設定acl,那麼使用ls -l 命令看到的許可權屬性就是檔案所有者、檔案所屬組和其它使用者的許可權屬性資訊。
  • 如果設定了acl,使用ls -l命令檢視的時候,原來檔案所屬組的位置顯示的就是mask許可權的值。

七:檔案許可權的生效順序

不設定ACL,檔案許可權的生效順序:

從左到右匹配,匹配到了就不匹配了

例如:

檔案A的許可權是rw-rw-r,如果一個使用者tom需要對A檔案進行寫操作,會先判斷tom是否是A檔案的所有者,如果是就不在匹配,不是就繼續匹配。

設定了ACL後,檔案許可權的生效順序:

檔案件所有者 -->自定義的使用者(單獨給檔案設定的acl許可權) --> 檔案所屬組 --> 自定義的組(acl中定義的) --> other(其它使用者)

目錄檔案下的兩個特殊檔案:

root@ubuntu1804:~/nginx-1.20.2# ls -a
.  ..  auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  Makefile  man  objs  README  src

# .  :表示的是當前檔案的一個硬連結,
# .. :表示的是當前檔案所在目錄的一個硬連結
  • . 代表當前目錄,是當前目錄的一個硬連結。
  • .. 代表上一級目錄,是上級目錄的一個硬連結。

在linux中,建立一個文字檔案連結數為1,建立一個目錄檔案連結數為2的原因:

  • 普通檔案: 建立一個新檔案時,連結數為1的原因是該檔案自己就是自己的一個硬連結。
  • 目錄檔案:建立要給目錄檔案時,連結數為2的原因是建立新目錄的同時會在這個目錄的內部建立一個名字位 . 的硬連結

例如:建立一個目錄檔案xx,使用stat命令檢視該檔案和該檔案下的.檔案,發現inode號相同,說明是同一個檔案。

image

相關文章