一、 權限之粘著位
Linux中有一個存放臨時文件的目錄/tmp(類似於Windows中的temp目錄),每個用戶產生的臨時文件都存放在此目錄下,也就是說每個用戶對/tmp目錄都應該有寫權限(否則無法拷貝生成文件),這樣造成一個問題,比如,高洛峰在/tmp目錄下創建了一個文件,張沫看著不爽就可以刪掉,這如何控制?
其實,這種情況永遠都不會發生,因為/tmp目錄有一個特殊的權限標記:
ls -ld /tmp
drwxrwxrwt 5 root root 4096 May 24 13:55 /tmp
瞧見那個rwx權限最後的“t”了沒,那個神奇的“t”就是粘著位t(有的資料中文也稱為粘滯位),是Linux特殊權限中的第三個(另外兩個是SetUID和SetGID),定義為:權限為777的目錄設置粘著位t以後,具有寫權限每個用戶都可以在目錄下創建文件,不同的是每個用戶只能刪除自己是所有者的文件,也就是說只能刪除自己創建的文件。
讀者可以做一下試驗,重復一下系列文章一 “從ls命令開始”中的案例一操作(給目錄/test授予777權限用一個普通用戶登錄刪除另一個普通用戶創建的文件),不過這次創建的目錄/test多授予它一個粘著位權限:
chmod o+t /test # 或 chmod 1777 /test
此時普通用戶嘗試刪除其他用戶的文件時,會給出提示“Operation not permitted”(中文翻譯:你丫沒事吧,瞎得瑟啥,哥的文件你刪不了)。
Linux權限360度赤裸裸華麗麗大曝光連載之一:從ls開始 http://www.linuxidc.com/Linux/2011-05/36487.htm
Linux權限360度赤裸裸華麗麗大曝光連載之二:深入理解SetUID http://www.linuxidc.com/Linux/2011-05/36488.htm
Linux權限360度赤裸裸華麗麗大曝光連載之三:查缺補漏 http://www.linuxidc.com/Linux/2011-05/36489.htm
二、 文件系統權限
每個操作系統都要有一種組織管理數據的方式,我們可以理解為就是文件系統,比如Windows的NTFS、FAT ,Linux的EXT ,而在Linux加載分區時可以針對文件系統進行權限設定。
配置文件/etc/fstab保存了Linux啟動時自動加載的分區信息,/etc/fstab文件中第四項定義了加載時的設置,默認為defaults ,包括rw、suid、dev、exec、auto、nouser、async ,如果想改變整個分區的限定,可以利用這些選項。本文舉兩例說明,證明基於文件系統的權限那是相當霸道。
案例一:只讀分區
默認加載分區是可讀寫rw的,但是如果特殊應用希望分區加載後是只讀的,可以做一下設置:
vi /etc/fstab # 編輯/etc/fstab文件在defaults後加入ro選項(逗號分隔)
LABEL=/soft /soft ext3 defaults,ro 1 2
mount -o remount /soft # 重新加載/soft分區,使設置生效
如果你不嫌麻煩也可以重啟系統,設置同樣會生效。
此時整個/soft分區都是只讀的,用root登錄後執行:
touch /soft/testfile
touch: cannot touch `testfile': Read-only file system
會提示/soft分區是只讀的,即便牛X到是root也不可以創建文件,這是凌駕於rwx權限之上的文件系統權限,相當的牛A與牛C之間。像本例是筆者公司的軟件共享目錄,一般半個月才更新一次軟件,平時不想任何人增加或刪除(包括不希望root用戶誤刪除),所以設置為ro ,更新軟件時,可以臨時更改會rw來設置:
mount -o remount,rw /soft
在命令行上也可以設置分區權限,但是只是當前會話有效,而寫入/etc/fstab文件後則會一直有效。
案例二:安全分區
數據存儲的分區,如用做備份的分區,我們可以增加下安全設置選項:
vi /etc/fstab # 編輯/etc/fstab文件在defaults後加入noexec選項
LABEL=/backup /backup ext3 defaults,noexec 1 2
mount -o remount /backup # 重新加載/backup分區,使設置生效
此時做個試驗,我們使用普通用戶拷貝一個命令文件pwd在/backup目錄下
cp /bin/pwd /backup
/backup/pwd
-bash: pwd: Permission denied
ls -l pwd
-rwxr-xr-x 1 liming liming 93560 Sep 25 10:13 pwd
命令拷貝到/backup下雖然具有可執行權限,但是也無法執行,在/backup分區下,任何可執行文件都將不能執行,這麼做的意義在哪裡?如果攻擊程序、木馬、病毒不能夠執行,那麼就相當於沒有意義。
其他選項不做更多演示,這裡只拋磚引玉,其他選項設置讀者可man mount查看,查看-o選項中的詳細介紹,更多設置讀者可自行嘗試,所謂授之以魚不如授之以漁讀萬卷書不如行萬裡路萬惡淫為首窗前明月光啊。
三、 權限之chattr
chatrr只有超人root用戶可以使用,用來修改文件的權限屬性,建立凌駕於rwx基礎權限之上的授權。
在此介紹兩個常用選項:
a 只允許在文件後追加數據,如果目錄具有此屬性,系統將只允許在目錄下建立和修
改文件,而不允許刪除任何文件。
i 不允許對文件進行任何修改,如果目錄具有此屬性,那麼只能修改目錄下的文件,
不允許建立和刪除文件。
案例一:無法刪除和更改的文件
如果要建立一個公共訪問的目錄,大家都可以刪除和創建、拷貝文件,但是有一個基本的使用此目錄的規則,要建立一個說明文件README ,這個文件不允許大家刪除和修改,則可以如下設置:
chattr +i README
這時,README文件所在目錄所有用戶都有讀寫權限,但是任何用戶都無法刪除README文件(包括root),嘗試刪除會提示:
rm README
rm: remove write-protected regular empty file `README'? y
rm: cannot remove `README': Operation not permitted
同樣也不可以改變文件的內容,可以查看到README文件被增加了一個不可更改的屬性:
lsattr README
----i-------- README
此時,README變成了一個非常牛XX的文件,即便你是SuperUser也無法刪除和修改它,想對它干嘛都不成。
若要更改或刪除文件也必須先去掉i屬性才可以:
chattr -i README
案例二:備份目錄應用
假設有這樣一種應用,我們每天自動化實現把上海服務器的日志通過scp和rsync遠程備份到北京的備份服務器上,備份服務器的存儲目錄可設置為只可創建文件而不可刪除。
chattr +a /backup/log
設置後,可在本機測試:
cp /var/log/messages /backup/log # 可以拷貝文件
rm /backup/log/messages # 刪除文件則被禁止
rm: remove regular file `messages'? y
rm: cannot remove `messages': Operation not permitted
chattr命令不宜對目錄/、/dev、/tmp、/var等設置,嚴重者甚至容易導致系統無法啟動,比如根目錄如果設置了i屬性,謹慎設置,看過此文試驗後造成系統問題者,筆者概不負責……
四 權限之ACL
Linux中默認的權限管理比較菜,難以實現復雜的權限控制,如針對一個文件設置幾個用戶或用戶組具有不同權限,這就需要依靠ACL(Access Control List)訪問控制列表實現,可以針對任意指定的用戶/用戶組分配權限。
開啟分區的ACL功能 ,需要在/etc/fstab文件中加入acl選項,如:
LABEL=/backup /backup ext3 defaults,acl 1 2
然後重新加載分區即可生效:
mount -o remount /backup
如果想臨時生效可不修改/etc/fstab文件,直接執行命令“mount -o remount,acl /backup”即可。
案例:設定復雜權限控制目錄
設定目錄/backup/log用戶zhangsan有讀寫執行權限,用戶lisi有讀權限,用戶wangwu有讀寫權限,而用戶組bakgroup有讀和執行權限,則可做如下設置:
setfacl -m u:zhangsan:rwx,u:lisi:r,u:wangwu:rw,g:bakgroup:rx /backup/log
setfacl -m可以設置文件/目錄的訪問權限,至於權限設定的寫法包括三個組成部分,第一部分列出設定對象是用戶u或用戶組g ;第二部分指定用戶名或用戶組名;第三部分指定訪問權限rwx ,設定多組權限中間用逗號分隔。如“u:lisi:r”表示設定用戶lisi為只讀權限。
查看目錄屬性:
ls -ld /backup/log
drwxrwxr-x+ 2 root root 4096 May 25 07:16 /backup/log
會發現文件權限位後增加了一個加號,這說明/backup/log設置了ACL ,同時可以查看其詳細的權限設置:
getfacl /backup/log
# file: backup/log
# owner: root
# group: root
user::rwx
user:zhangsan:rwx
user:lisi:r--
user:wangwu:rw-
group::r-x
group:bakgroup:r-x
mask::rwx
other::r-x
這樣即可實現Linux中文件/目錄的復雜權限控制,要注意的是ACL優先於基本權限設置,也就是說如果默認所屬組為rx權限,但是ACL若指定了所屬組中某個成員為rwx權限,則此成員擁有rwx權限。
五 權限之管理員授權
管理員做為特權用戶,很容易誤操作造成不必要的損失,再者都是root管理也怪累的,管理員也是人,也需要留點時間去約約會看看電影裝裝傻發發呆啥的不是……所以健康的管理方法是Linux服務架構好後,可授權普通用戶協助完成日常管理,現在最流行的工具是Sudo ,幾乎所有Linux都已缺省安裝。
Sudo使用簡單,管理員root使用visudo命令即可編輯其配置文件/etc/sudoers進行授權,具體格式為:
用戶名/用戶組名 主機地址=授權命令(絕對路徑)
如,授權用戶zhaoliu可以關機和重啟,則添加如下行:
zhaoliu Helen=/sbin/shutdown,/sbin/reboot
指定組名用百分號標記,如%admgroup ,多個授權命令之間用逗號分隔。
用戶zhaoliu可以使用sudo查看授權的命令列表:
sudo -l
Password:
User zhaoliu may run the following commands on this host:
(root) /sbin/shutdown
(root) /sbin/reboot
提示輸入密碼為zhaoliu的密碼,驗證其是否為管理員通過sudo授權的用戶,執行命令:
sudo /sbin/shutdown -h now
zhaoliu即可關機,注意命令寫絕對路徑,或者把/sbin路徑導入到用戶缺省路徑中,否則無法執行。
案例:授權用戶管理Apache
授權一個用戶管理你的Web服務器,不用自己插手是不是很爽,以後修改設置更新網頁什麼都不用管,一定Happy死了,LOOK——
首先要分析授權用戶管理Apache至少要實現哪些基本授權:
1、可以使用Apache管理腳本
2、可以修改Apache配置文件
3、可以更新網頁內容
假設Aapche管理腳本為/etc/rc.d/init.d/httpd ,滿足條件一,用visudo進行授權:
zhaoliu Helen=/etc/rc.d/init.d/httpd reload,/etc/rc.d/init.d/httpd configtest
授權用戶zhaoliu可以通過Apache管理腳本重新讀取配置文件讓更改的設置生效(reload)和可以檢測Apache配置文件語法錯誤(configtest),但不允許其執行關閉(stop)、重啟(restart)等操作。
滿足條件二,同樣使用visudo授權:
zhaoliu Helen=/bin/vi /etc/httpd/conf/httpd.conf
授權用戶可以root身份使用vi編輯Apache配置文件。
以上兩種sudo的設置,要特別注意,很多朋友使用sudo會犯兩個錯誤:第一,授權命令沒有細化到選項和參數;第二,認為只能授權管理員執行的命令。
條件三則比較簡單,假設網頁存放目錄為/var/www/html ,則只需要授權zhaoliu對此目錄具有寫權限或者索性更改目錄所有者為zhaoliu即可,如果需要還可以設置zhaoliu可以通過FTP等文件共享服務更新網頁。
至此,本系列權限管理文章基本涵蓋Linux的所有權限管理方式,雖不細致但足以讓讀者對其有一個整體的了解。最後請切記系統安全的基本原則:授權用戶最小的權限。
蜘蛛俠說“能力越大責任越大”,Linux管理員說“能力越大出錯幾率越大”,阿門。