文件的特殊權限
在復雜多變的生產環境中,單純設置文件的rwx權限無法滿足我們對安全和靈活性的需求,因此便有了SUID,SGID,SBIT的特殊權限位。這是一種對文件權限進行設置的特殊功能,可以與一般權限同時使用,以彌補一般權限不能實現的功能。
SUID
SUID是一種對二進制程序進行設置的特殊權限。可以讓二進制程序的執行者臨時擁有屬主的權限(僅對擁有執行權限的二進制程序有效)。
例如:
所有用戶都可以執行passwd命令來修改自己的用戶密碼,而用戶密碼保存在/etc/shadow文件中。仔細查看這個文件就會發現它默認權限是000,也就是說除了root管理員外,所有用戶都沒有查看或編輯這個文件的權限。但是,在使用passwd命令時如果加上SUID特殊權限位,就可讓普通用戶臨時獲得程序所有者的身份,把變更的密碼信息寫入到shadow文件中。
SGID
SGID主要實現如下兩種功能:
①讓執行者臨時擁有屬組的權限(對擁有執行權限的二進制程序進行設置);
②在某個目錄中創建的文件自動繼承該目錄的用戶組(只可以對目錄進行設置)。
SGID的第一種功能是參考SUID而設計的,不同點在于執行程序的用戶獲取的不再是文件所有者的臨時權限,而是獲取到文件所屬組的權限。舉例來說,在早期的Linux系統中,/dev/kmem是一個字符設備文件,用于存儲內核程序要訪問的數據,權限為:
cr--r-----? 1 root? system? 2,? 1 Feb 11? 2017? kmem
除了root管理員或屬于system組成員外,所有用戶都沒有讀取該文件的權限。由于在平時我們需要查看系統的進程狀態,為了能夠獲取到進程的狀態信息,可在用于查看系統進程狀態的ps命令文件上增加SGID特殊權限位,這樣一來,由于ps命令被增加了SGID特殊權限位,所以當用戶執行該命令時,也就臨時獲取到了system用戶組的權限,從而可以順利地讀取設備文件了。
前面我們提到,每個文件都有其歸屬的所有者和所屬組,當創建或傳送一個文件后,這個文件就會自動歸屬于執行這個操作的用戶(即該用戶是文件的所有者),如果現在需要一個部門內設置共享目錄,讓部門內所有人員都能夠讀取目錄中的內容,那么就可以創建部門共享目錄后,在該目錄上設置SGID特殊權限位。這樣,部門內的任何人員在里面創建的任何文件都會歸屬于該目錄的所屬組,而不再是自己的基本用戶組。此時,我們用到的就是SGID第二個功能,即在某個目錄中創建的文件自動繼承該目錄的用戶組(只可以對目錄進行設置)
在使用上述命令設置好目錄的777權限(確保普通用戶可以向其中寫入文件),并為該目錄設置了SGID特殊權限位后,就可以切換一個普通用戶,然后嘗試在該目錄中創建文件,并查看新創建的文件是否會繼承新創建的文件所在的目錄的所屬組名稱:
除了上面提到的SGID的這兩個功能,我們再簡單學習兩個權限的命令:chmod和chown
chmod命令是一個非常有用的命令,能夠用來設置文件或者目錄的權限。
格式為:chomd 【參數】權限 文件或目錄名稱
如果要把一個文件的權限設置成其所有者可讀可寫可執行、所屬組可讀可寫、其他人沒有任何權限,則相應的字符法表示為rwxrw----,其對應的數字法表示為760.
通過前面的學習,可以體會到數字法的簡捷度
除了設置文件或目錄的權限外,還可以設置文件或目錄的所有者和所屬組,這里使用的命令為chown。
其格式為: chown 【參數】所有者:所屬組 文件或目錄名稱
chmod和chown命令是用于修改文件和權限的最常用的命令
它們還有一個特別的共性,就是針對目錄進行操作時需要加上大寫參數 -R 來表示遞歸操作,即對目錄內所有的文件進行整體操作。
SBIT
SBIT特殊權限位(也可以稱之為特殊權限位之粘滯位)
SBIT特殊權限位可確保用戶只能刪除自己的文件,而不能刪除其他用戶的文件。
與前面所講的SUID和SGID權限顯示方法不同,當目錄被設置SBIT特殊權限位后,文件的其他人權限部分的x執行權限就會被替換成t或者T,原本有x執行權限則會寫成t,原本沒有x執行權限則會被寫成T
?其實,文件是否被刪除并不取決于自身的權限,而是看其所在目錄是否有寫入權限。我們切換到另外一個普通用戶,然后嘗試刪除這個其他人創建的文件就會發現,即便讀、寫、執行權限全開,但是由于SBIT特殊權限位的緣故,依然無法刪除這個文件:
當然,要是也想對其他目錄來設置SBIT特殊權限位,用chomd命令就可以了。對應的參數o+t代表設置SBIT粘滯位權限:
文件的隱藏屬性
chattr命令
chattr命令用于設置文件的隱藏權限
格式位 chattr 【參數】文件
如果想要把某個隱藏功能添加到文件上,則需要再命令后面追加“+參數”,如果想要把某個隱藏功能移出文件,則要追加“-參數”。
chattr命令可供選擇的隱藏權限參數非常豐富
參數 | 作用 |
i | 無法對文件進行修改;若對目錄設置了該參數,則僅能修改其中的子文件內容而不能新建刪除文件 |
a | 僅允許補充內容,無法覆蓋/刪除內容 |
S | 文件內容在變更后立即同步到硬盤(sync) |
s | 徹底從硬盤中刪除,不可恢復(0填充原文件所在的硬盤區域) |
A | 不再修改這個文件或目錄的最后訪問時間 |
b | 不再修改文件或目錄的存取時間 |
D | 檢查壓縮文件中的錯誤 |
d | 使用dump目錄備份時忽略本文件/目錄 |
c | 默認將文件或目錄進行壓縮 |
u | 當刪除該文件后依然保留其在硬盤中的數據,方便日后恢復 |
t | 讓文件系統支持尾部合并(tail-merging) |
x | 可以直接訪問壓縮文件中的內容 |
?我們來簡單實驗一下
我們先刪除一個普通文件,在刪除一個加權的普通文件,作為對比
lsattr命令
lsattr命令用于顯示文件的隱藏權限
格式為 lsattr 【參數】 文件
在Linux系統中,文件的隱藏權限必須使用lsattr命令來查看,平時使用的ls之類的命令則看不出細節
文件訪問控制列表
權限一般是針對某一類用戶設置的。
如果希望對某個指定的用戶進行單獨的權限控制,那么就需要用到文件中的訪問控制列表(ACL)了。通俗來講,基于普通文件或目錄文件設置ACL其實就是針對指定的用戶或用戶組設置文件或目錄的操作權限。另外。如果針對某個目錄設置ACL,則目錄中的文件就會繼承其ACL;若針對文件設置了ACL,則文件不再繼承其所在目錄的ACL。
我們來簡單實驗一下,看看效果
setfacl命令
setfacl命令用于管理文件的ACL規則
格式為 setfacl 【參數】文件名稱
文件的ACL提供的是在所有者、所屬組、其他人的讀/寫/執行的權限之外的特殊權限控制,使用setfacl命令可以針對單一用戶或者用戶組,單一文件或者目錄來進行讀/寫執行權限的控制。其中,針對目錄文件需要用到-R遞歸參數;針對普通文件則使用-m參數;如果想要刪除某個文件的ACL則可以使用-b參數
我們來簡單演示一下設置root目錄上的權限
常用的ls命令是看不到ACL表的信息的,但卻可以看到文件的權限最后一個點(.)變成加號(+),這就意味著該文件已經設置了ACL了
getfacl命令
getfacl命令用于顯示文件上設置的ACL信息
格式為:getfacl 文件名稱
Linux系統中的命令有一定的規律
設置ACL? setfacl
查看ACL? getfacl
su命令和sudo命令
su命令可以解決切換用戶身份的需求
su - 用戶名 之間的減號(-)代表完全切換到新的用戶
即把環境變量信息也變更為新用戶的相應信息,而不是保留原有的信息。
root管理員切換到普通用戶是不需要密碼的,而普通用戶切換到root管理員則需要密碼
sudo命令用于給普通用戶提供額外的權限來完成原本root管理員才能完成的任務
格式: sudo 【參數】命令名稱
參數 | 作用 |
-h | 列出幫助信息 |
-l | 列出當前用戶可執行的命令 |
-u 用戶名或UID值 | 以指定的用戶身份執行命令 |
-k | 清空密碼的有效時間,下次執行sudo時需要再次進行密碼驗證 |
-b | 在后臺執行指定的命令 |
-p | 更改詢問密碼的提示語 |
sudo命令有以下幾個功能:
①限制用戶執行指定命令
②記錄用戶執行的每一條命令
③配置文件(/etc/sudoers)提供集中的用戶管理、權限和主機等參數
④驗證密碼的后5分鐘內(默認值)無須再讓用戶再次驗證密碼
如果擔心直接修改配置文件會出現問題,我們可以使用sudo命令提供的visudo命令來配置用戶權限。
這條命令在配置用戶權限時將禁止多個用戶同時修改sudoers配置文件,還可對配置文件內的參數進行語法檢查,并發現參數錯誤時進行報錯。
只有root管理員才可以使用visudo命令編輯sudo服務的配置文件
[root@DongFang ~]# visudo
?我們切換到普通用戶,執行sudo -l 查看所有可執行命令(下面驗證的是該普通用戶的密碼,而不是root管理員的密碼)
?作為一個普通用戶,是肯定看不到root用戶的家目錄的,但是,經過修改配置文件后,我們只需要在想執行的命令前面加上sudo命令就可以了
ALL參數不太合適,因此只能賦予普通用戶具體的命令以滿足工作的需求,這也受到了必要的約束
如果需要讓某個用戶只能使用root管理員的身份執行指定的命令,切記一定要給出該命令的絕對路徑
否則系統識別不出來,我們可以先使用whereis命令找出命令所對應的保存路徑,然后把配置文件的用戶權限參數修改成相應的路徑即可
?每次我們使用sudo前綴使用命令時。總是要驗證普通用戶的密碼,接下來我們也可以解決這個繁瑣的步驟
驗證密碼這個問題在Linux8上并未成功,上圖解決頻繁驗證密碼的方法是7版本,或許有不同把,另外,有大神發現了錯誤,請在評論區留言。學習學習!