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