Linux分類筆記(一) 權限管理
普通權限
文件的普通權限
對一個普通的文件使用ls -ll命令后,看到下面的輸出內容
而對於文件權限中的每一位,又分別代表了以下的意思
文件類型又有以下幾類:
- [d]:目錄
- [-]:文件
- [l]:連接文件
- [b]:可供存儲的接口設備
- [c]:串行端口設備,如鍵盤和鼠標
權限的定義:
- r:可讀,普通文件的r代表可以讀取該文件的實際內容;目錄的r代表可以讀取該目錄結構列表的權限
- w:可寫,普通文件的w代表可以編輯,新增或者修改文件內容,但不能刪除該文件;目錄的w代表可以更改該目錄結構列表的權限如新建,刪除,重命名,轉移該目錄下的文件或目錄
- x:可執行,普通文件的x代表該文件可以被系統執行;目錄的x代表該目錄能否成為工作目錄,即能否cd進該目錄
普通權限變更命令
注意:各種權限的設置對root無效
- chgrp:改變文件所屬用戶組
- chgrp [-R] groupname filename/dirname:-R是遞歸更改目錄下的文件
- chown:改變文件所有者(也可以實現chgrp的功能)
- chown [-R] username filename/dirname:只修改所有者
- chown [-R] username:groupname filename/dirname:同時修改所有者和用戶組
- chown [-R] .groupname filename/dirname:只修改用戶組
- chmod:改變文件的權限
- 數字表達 chmod [-R] num filename/dirname
- r:4
- w:2
- x:1
- 將一個文件的權限設置為-rwxr-xr-x: chmod 7555 file
符號表達
將一個文件的權限設置為-rwxr-xr-x: chmod u=rwx,g=rx,o=rx file
特殊權限
文件的特殊權限
在前面的圖中,只有rwx這三個普通權限,但是通過瀏覽tmp目錄和/usr/bin/passwd文件的權限,可以發現多了一些特殊權限
當s出現在文件的所有者標記上,代替了x權限,就稱為Set UID,簡稱為SUID的特殊權限,該權限具有以下功能:
SUID僅對二進制程序有效
執行者對於該程序需要具有x的可執行權限
本權限僅限於在執行該程序的過程中有效
執行者將具有該程序所有者的權限
舉例說明:一個普通用戶要修改自己的密碼,該密碼是要寫入到文件/etc/shadow中的,而/etc/shadow的權限為
-r-------- 1 root root 1249 Nov 9 15:53 /etc/shadow
可見,只有root用戶才具有強制修改的能力,而普通用戶是可以通過命令passwd來修改自己的密碼,這是因為/usr/bin/passwd文件的SUID讓所有的用戶在執行這個命令時具有root的權限。
當s出現在用戶所有組標記上,代替了x權限,就稱為Set GID,簡稱為SGID。該權限具有以下功能:
SGID應用在文件上:
SGID對二進制程序有用
程序執行者對於該程序來說,需具備x的權限
執行者在執行過程中將會獲得該程序用戶組的支持
SGID應用在目錄上:
用戶若對於此目錄具有r和x的權限時,該用戶能夠進入此目錄
用戶在此目錄下的有效用戶組將會變成該目錄的用戶組
若用戶在此目錄下具有w的權限(可以新建文件),則用戶所創建的新文件的用戶組與此目錄的用戶組相同
SGID對於項目開發來說非常重要
舉例說明:A和B兩個開發者分別屬於不同的用戶組,現在需要使用一個共同的目錄(/test),在這個目錄里的任何文件都可以被雙方任意修改內容和屬性,但不允許其他人修改。如果只是簡單地把A和B放到同一個用戶組(developer)中,並且把該/test目錄的用戶組設置為developer,那么A在test目錄下創建的文件的屬性為:-rw-r--r-- 1 A A 0 Nov 9 18:02 file
可見,此時A新創建的文件的用戶組仍只屬於A,所以B是不能做任何修改的,但只要給test目錄設置SGID:chmod 2770 /test,此時不管是A還是B,在這個目錄下新建的文件都屬於develper用戶組,並且A和B都在這個目錄下新建文件前都設置umask 為002,,那么雙方在這個目錄下創建的文件都可以被對方任意的修改,而阻止其他人修改
注意上圖中的/tmp目錄有一個t標記,這個稱為SBIT,只針對目錄有效,該權限具有以下功能:
當用戶對於此目錄具有w,x權限,即具有寫入的權限
當用戶在該目錄下創建文件或目錄時,僅有自己與root才有權利刪除該文件
舉例說明:任何用戶都能在/tmp目錄下創建文件和目錄,但是每一個用戶只能在/tmp目錄下刪除自己的文件和目錄,而不能刪除其他用戶的文件和目錄。但是root賬戶可以刪除所有
特殊權限變更命令
同樣通過chmod命令來修改特殊權限,通過使用數字表達即可:
SUID:4
SGID:2
SBIT:1
只要在普通權限的前面加上一位即可,例如,要設置一個普通權限為755,並且是SUID,就使用命令:chmod 4755 filename即可
文件默認權限
在新建一個文件或者目錄時,會根據umask來生成默認權限,直接輸入命令umask或者umask -S可以查看當前設置,注意,umask的分數指的是“該默認值需要減掉的權限”。
默認的情況下:
若用戶創建文件,該文件是沒有執行權限的,所以最大值為666,即-rw-rw-rw-
若用戶創建目錄,該目錄具有所有的權限,所以最大值為777,即drwxrwxrwx
umask的默認值為0022,第一個0代表的是特殊權限,后面三位代表普通權限
那么:
用戶新建文件時:(-rw-rw-rw-) - (-----w--w-) = -rw-r--r--(644)
用戶新建目錄時:(drwxrwxrwx) - (d----w--w-) = drwxr-xr-x(755)
如果要讓新建的文件的默認權限變為664,使用命令umask 002即可,注意:在計算默認權限時不要用數字的減法進行運算,假如umask設置為003,此時666-003=663,會平白多出了一個根本不存在的x權限,所以最好使用符號表達式運算
ACL
ACL是Access Control List的縮寫,主要提供更加細粒度的權限設置,ACL可以針對單一用戶,單一文件或目錄進行r、w、x的權限設置,對於需要特殊權限的使用狀況非常有用。
ACL必須要有文件系統的支持才行,目前絕大部分的文件系統都支持ACL功能,尤其是CentOS在默認情況下就加入了acl的支持。
getfacl命令:取得某個文件/目錄的ACL設置項目
上圖中的有效權限的意思是用戶或組所設置的權限必須要存在於mask的權限設置范圍內才會有效,即不能超出mask規定的權限
setfacl命令:設置某個目錄/文件的ACL規定
用法:setfacl [-bkRd] [{-m | -x}] acl參數 filename
參數:
-m:設置后續的acl參數給文件使用,不可與-x合用
-x:刪除后續的acl參數,不可與-m合用
-b:刪除所有的acl參數
-k:刪除默認的acl參數
-R:遞歸設置acl,子目錄也會被設置acl
-d:設置默認的acl參數,只對目錄有效,在該目錄新建的數據都會引用該值
舉例說明:幾個程序員對同一個目錄(/home/project)具有完全的權限,但是只允許項目經理(manager)進入到該目錄里查看(不允許任何的其他人進入該目錄,同時項目經理也不能修改任何的東西)。此時就要使用到acl:
setfacl -m u:manager:rx /home/project
此時的/home/project的狀態為:
drwxrws---+ 2 root develop 6 Nov 10 11:41 project
SELinux
SELinux是Security Enhanced Linux的縮寫,字面上的意思就是安全強化的Linux,是用來防止資源誤用的。
傳統的文件系統是使用DAC(自主訪問控制)來進行訪問控制的,就是根據進程的所有者與文件資源的rwx權限來決定該進程有沒有訪問能力,DAC有幾個要害:
1.root具有最高權限,不受任何限制;
2.如果不小心將目錄全設置為777,會讓任何人隨意訪問並更改該目錄
而SELinux使用MAC(強制訪問控制)來進行訪問控制,可以針對特定的進程與特定的文件資源來進行權限的控制!也就是說,即使你是root,那么在使用不同的進程時,你所能取得的權限不一定是root,而要看當時該進程的設置而定。如此一來,我們針對控制的主體變成了進程而不是用戶,此外,這個主體進程也不能任意使用系統文件資源,因為每個文件資源也有針對該主體進程設置可取用的權限,SELinux提供了一些默認的策略,並在策略內提供多個規則,讓你選擇是否啟用該控制規則。
舉例說明:www服務器軟件的實現程序為httpd這個進程,默認情況下,httpd僅能在/var/www這個目錄下訪問文件,如果httpd這個進程要到其他目錄去訪問數據,除了規則設置要開放外,目標目錄也得設置成httpd可讀取的模式才行,所以,即使httpd不小心被黑客取得了控制權,他也無權訪問/etc/shadows等重要的配置文件
SELinux的啟動和關閉
SELinux支持三種模式:
enforcing:強制模式,代表SELinux正在運行中,且強制限制資源訪問
permissive:寬容模式,代表SELinux正在運行中,不過僅會有警告信息並不會實際限制資源的訪問,用來調試所用
disabled:關閉
使用命令getenforce可以獲取當前的模式,一旦更改了模式,就要重啟,有兩種切換方式:
如果已經處於enforcing模式,但是由於一些設置導致SELinux讓某些服務無法運行,就通過命令setenforce 0 來切換到permissive之間的模式,這樣只會讓SELinux警告無法順利連接的信息,而不是直接抵擋主體進程的讀取權限,通過setenforce 1從permissive切換到enforcing模式
如果要從disabled切換到啟動模式,則要修改配置文件/etc/selinux/config,將SELINUX=disabled修改為SELINUX=enforcing,相反,要關閉SELinux就將SELINUX=enforcing修改為SELINUX=disabled,並重啟。
注意,從disabled抓換為enforcing時,開機過程會變得漫長,因為要重新寫入SELinux安全上下文
SELinux的決策過程
進程能否通過SELinux取得權限就依靠上圖的決策過程,由上圖可知,主體程序必須要通過SELinux策略內的規則放行后,就可以與目標資源進行安全上下文(值的是上圖中的“安全性本文比對”)的比較,若比較失敗則無法訪問目標,若比較成功就可以開始訪問目標,問題是,最終能否訪問目標還是要與文件系統的rwx權限設置有關,如此一來,當出現了權限不符合的問題后,就要根據上圖一步一步地分析問題。
那么安全上下文究竟是什么?
使用命令ls -Z就可以查看,如下圖所示,主要由三個部分組成這個安全上下文
那么在上圖中的/usr/sbin/httpd進程又是如何通過SELinux決策訪問到/var/www/html/目錄下的文件?
首先,/usr/sbin/httpd這個文件具有httpd_exec_t這個類型,在執行這個文件的時候,會讓這個文件的主體進程具有httpd這個域,而SELinux的策略中已經針對這個域制定了很多的規則,其中的一條規則就是允許這個域能夠讀取httpd_sys_content_t這個類型的目標文件,因此,只要把網頁放置在/var/www/html目錄下,就能被httpd進程讀取
但是最終讀取文件的限制,就是因為普通權限中含有rx
關於SELinux的策略和規則管理,更詳細的內容參考這里:
http://vbird.dic.ksu.edu.tw/linux_basic/0440processcontrol.php
SElinux的運行例子
成功
在/var/www/html目錄下新建一個文件並寫入內容:
echo “First page” > /var/www/html/index.html
然后在瀏覽器輸入網址http://192.168.1.112,就能看到頁面顯示First page
這是因為在/var/www/html目錄下新建的index.html文件的權限如下:
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
失敗
刪除剛才在/var/www/html目錄下新建的index.html文件
rm -f /var/www/html/index.html
然后在/tmp目錄下新建一個文件並寫入內容:
echo “Second page” > /var/www/html/index.html
mv index.html /var/www/html
然后在瀏覽器輸入網址http://192.168.1.112/index.html(記得指定index.html否則會變成歡迎頁面),彈出了錯誤提示:“You don't have permission to access /index1.html on this server.”
因為此時的index1.html的權限如下:
-rw-r--r--. root root unconfined_u:object_r:user_tmp_t:s0 index1.html
留意與上面index.html文件不同的地方(灰色字體),因為httpd進程不能讀取user_tmp_t類型的目標文件。這就是SELinux的強大之處
安裝setroubleshoot
其實你可以不使用工具就分析SELinux的問題,你可以打開日志文件/var/log/audit/audit.log來直接查找,但是這個日志文件的記錄形式讓你幾乎不能解讀,所以使用setroubleshoot來處理Selinux所帶來的問題,直接使用yum安裝即可:
yum install setroubleshoot setools -y
在安裝完成后,就可以使用一個名為sealert的命令來分析日志,這個命令會掃描整個日志文件並識別出SELinux的部分,運行命令:
sealert -a /var/log/audit/audit.log
在前面的例子中已經產生了一個SELinux的問題,所以在我這里可以掃描出內容:
運行在結果中提示的解決方法就可解決SELinux的問題








