linux-特殊許可權
許可權細分
檔案分類
雖說檔案許可權不過三類三組
,不過想理解特殊許可權,還得把檔案再分類。
- 操作檔案
一般的操作檔案,對應的就是rw
讀寫許可權,常被命令
作為元素所操作。
- 執行檔案
可執行檔案,對應的就是x
等其他許可權。此類檔案可以直接進行執行,是命令
一類。
命令
分兩類
- 純命令
指令碼或程式當中不需要外部引數,不操作其他檔案,單純執行操作。
- 操作命令
需要操作其他檔案,對其他檔案進行操作,依賴其他檔案許可權。
許可權依賴
- 操作檔案
單純的rw
提供給執行檔案
進行操作的許可權依據,由rw
判斷執行檔案
是否擁有操作許可權。
- 執行檔案
單純的判斷使用者是否擁有執行此命令的許可權。
- 相互關聯
- 命令許可權
判斷此使用者是否擁有此命令的執行許可權。
- 操作許可權
判斷此使用者是否擁有此檔案的操作許可權。
許可權判斷
- 執行許可權
- 操作許可權
- 程序歸屬
當兩個部分歸納完畢,命令執行的程序的屬主
就看命令執行時的執行角色了。
當other
運行了一個屬主為godme
的命令,啟動的程序屬主是other
。
程序不看命令歸屬,只看啟動角色,誰啟動的誰就是程序的屬主。
特殊許可權
基本許可權
符號 | 許可權 | 說明 |
---|---|---|
r |
讀 | 讀取內容 |
w |
寫 | 寫入內容 |
x |
執行 | 作為命令執行 |
三個許可權,全部依照上述流程,大部分的許可權不外乎這三個。
SUID
許可權設定
命令 | 效果 |
---|---|
chmod u+s file |
新增s 許可權 |
chmod u-s file |
移除s 許可權 |
chmod u=rws,go= file |
設定許可權 |
- 許可權分類
該特殊許可權為
執行許可權
,通用x
第三位置,與rw
的操作許可權
無關。
- 特殊顯示
原操作許可權為
x
,+s
後顯示許可權為s
。原操作許可權為
-
,+s
後顯示許可權為S
。
許可權操作
s
雖然作為執行許可權
,但是影響的卻是操作許可權
。
在執行許可權
的鑑權階段,和一般許可權一致,在檔案許可權的判斷階段有特殊邏輯。
邏輯梳理
- 舊邏輯
- 新邏輯
可以發現,整個過程增添了額外一步。
- 執行許可權鑑權
- 更換操作許可權
- 操作許可權鑑權
預設沒有第二步
更換操作
許可權。s
的作用就是更換操作許可權。同時,程序的歸屬,也會被替換。
程序的屬主不再是先到先得的
啟動者
,而是標記了s
命令的屬主。
例子詳解
- 基本檔案
/etc/passwd
chmod u=rw,go= /etc/passwd
/bin/cat
chmod u=rwx, go= /bin/cat
- 直接執行
root
cat /etc/passwd
# 成功
other
cat /etc/passwd
# 失敗,沒有cat的執行許可權
- 執行許可權
/bin/cat
chmod a+x /bin/cat
other
cat /etc/passwd
# 失敗,沒有passwd的操作許可權
- 檔案許可權
/etc/passwd
chmod a+r /etc/passwd
other
cat /etc/passwd
# 成功,但是不安全
- 許可權替換
/bin/cat
chmod u=rws,go= /bin/cat
other
cat /etc/passwd
# 執行成功
沒有
操作許可權
卻能夠操作檔案,這是因為在檔案操作
鑑權的時候更換了鑑權物件
。預設情況下,
執行鑑權
和操作鑑權
鑑權物件是同一個。但是
s
會修改操作鑑權
的物件,從而讓有些沒有許可權的使用者可以操作某些檔案。再次宣告,這樣更換身份後,程序的屬主也會對應的更換為命令的屬主,而不是啟動者。
SGID
和SUID
一樣,SGID
也是s
許可權。
SUID
是針對屬主
的操作鑑權角色替換。
SGID
是針對屬組
的操作鑑權角色替換。
- 設定
chmod g+s cat
chmod g-s cat
- 邏輯
邏輯同
SUID
- 特殊
chmod a+s cat
同時設定了
SUID
和SGID
,不具有實用意義。普通使用者
other
不具備s
許可權,因為把自己替換為自己
實在是…
實際作用
- 檔案共享
半路更換了鑑權物件
,讓其他使用者(組)擁有特定的檔案操作許可權。
相當於是把檔案共享給了使用者(組)。
不過是通過命令
進行的共享,必須通過特定的命令
才有所謂的共享。
- 程序歸納
啟動者啟動,程序歸屬卻是命令屬主(組)
。
可以很明確的對程序進行分類管理,不過人太多了也會變得更雜亂。
迴歸一句話,誰啟動的程序,誰就是程序的屬主。
關鍵看頂著的誰的名,而不是誰做的。
s
在啟動過程當中,把名號給換了。所以後續的一切都變了,
操作鑑權
物件換了,啟動的程序屬主(組)也換了,啟動者已不重要了。
Sticky
SUID
和SGID
針對的是執行許可權
,那麼sticky
針對的就是操作許可權
。
操作許可權
- 基本許可權
符號 | 許可權 |
---|---|
r |
讀取 |
w |
修改 |
x |
執行 |
之前因為顯示佔據的位置是
x
所在的位置,劃分的不夠明確,現在重申一遍。
- 基本許可權
rwx
是基本許可權,x
不是特殊許可權。
- 顯示合併
特殊許可權的顯示合併
x
一起顯示,原來沒有x
顯示為大寫,原來有x
顯示成小寫。但是並不覆蓋。
- 操作許可權
操作許可權
是什麼,就是rw
。所謂的
SUID
和SGID
是針對x
的特殊許可權設定。影響後續歸納。先說說讀寫許可權
rw
算什麼。
說實話,讀寫沒啥更多東西,關鍵是目錄的讀寫。
把讀寫進行擴充套件,目錄的讀寫也即是建立
和刪除
。
問題就出在這,多個使用者同時工作時,必然屬於同一個組。
如果能夠建立,必然能夠刪除。
也就是說,使用者之間可以刪除別人的檔案,除非每個人都沒權利刪除任何檔案。
許可權設定
命令 | 說明 |
---|---|
chmod o+t dir |
新增t 許可權 |
chmod o-t dir |
移除t 許可權 |
有
x
則t
,是-
就是T
。反正和
x
相關,有則小寫,無則大寫。
執行邏輯
- 預設邏輯
- 新邏輯
例子詳解
- 基本檔案
users
useradd judas
usermod -a -G foreva judas
useradd godme
usermod-a -G foreva godme
dir
mkdir -p /tmp/project
chgrp -R foreva
chmod a=rwx /tmp/project
- 操作
judas
cd /tmp/project
touch judas
# 成功
godme
cd /tmp/project
rm judas
# 成功
- 修改
dir
chmod o=r /tmp/project
judas
touch judas
# 成功
rm judas
# 失敗
godme
rm judas
# 失敗
- 特殊
dir
chmod -o=rt /tmp/project
judas
touch judas
rm judas
# 成功
touch judas
godme
rm judas
# 失敗
設定了
t
,只能管理自己的檔案,別人或可檢視,不可刪除。
擴充套件許可權
基本擴充套件
所謂特殊許可權,不過是擴充套件而已
基本許可權 | 擴充套件許可權 | 說明 |
---|---|---|
r |
- | 無 |
w |
t |
檔案操作 |
x |
s |
程序啟動 |
數值許可權
umask
還記得這篇文章麼,其中說到了umask
,我們簡單的說了一下。
- 檢視辦法
umask
- 設定辦法
umask 0022
- 影響
檔案預設許可權
666
,資料夾預設許可權777
。新建檔案許可權為
0666-umask
。新建資料夾許可權為0777-umask
。
新建型別 umask
許可權 file
umask
0666-umask
dir
umask
0777-umask
第四組
最大的疑問就是,許可權不是
三組三類
的麼?
- 組別
- 屬主
- 屬組
- 其他
- 類別
- r
- w
- x
-
表示空
umask
為什麼有四位?有第四組?
SUID |
SGID |
Sticky |
---|---|---|
us |
gs |
t |
就是這個意思了,而它,就是最前面的那一組。
例子詳解
us
mkdir us
chmod a= us
ls -l us
# ---------
chmod 4000 us
# --S------
gs
mkdir us
chmod a= gs
ls -l gs
# ---------
chmod 2000 gs
# -----S---
t
mkdir t
chmod a= t
ls -l t
# ---------
chmod 1000 t
# --------T
數值對照
SUID |
SGID |
Sticky |
Oct |
power |
---|---|---|---|---|
0 |
0 |
0 |
0 |
--- |
0 |
0 |
1 |
1 |
--T |
0 |
1 |
0 |
2 |
-S- |
0 |
1 |
1 |
3 |
-ST |
1 |
0 |
0 |
4 |
S-- |
1 |
0 |
1 |
5 |
S-- |
1 |
1 |
0 |
6 |
SS- |
1 |
1 |
1 |
7 |
SST |