先來看問題
問題來了:
echo的行為返回是對的還是vi是對的?
現場分析:
-
vi 和 echo 都被設置為SGID權限。
-
abc文件所在的父目錄權限是777
-
echo無法寫abc文件,而vi是可以的
當時被問到這個問題時,我也是一征,怎么會這樣。加之SUID,SGID在企業應用很少,如此這么久早忘了一干二凈,只是趕緊去補課~,但經過30MIN后依然沒有找到問題所在,不名有些尷尬。后來在群里和朋友們一起討論下后發現了問題所在。我們這里一一道來。
一道:
因為該父目錄權限是777
,所以該目錄是任何人可寫,又因為該目錄只是普通的777權限目錄,沒有ST保護,所以該目錄下的文件是任何人可寫可刪可改的。正做簡單演示:
-
-
先增加兩個普通用戶
stanley
和tom
[root@app1 ~]# id stanley uid=501(stanley) gid=501(stanley) groups=501(stanley) [root@app1 ~]# id tom uid=502(tom) gid=502(tom) groups=502(tom)
-
-
創建/root_test_dir 目錄并賦權為777
[root@app1 ~]# mkdir /root_test_dir [root@app1 ~]# chmod 777 /root_test_dir [root@app1 ~]# ll /root_test_dir/
-
-
分別登錄
stanley
和tom
用戶,并在/root_test_dir目錄下創建以自己姓名命名的文件stanley.txt 和 tom.txt,并分別編輯內容
###stanley用戶 [stanley@app1 ~]$ cd /root_test_dir/ [stanley@app1 root_test_dir]$ touch stanley.txt [stanley@app1 root_test_dir]$ echo -e "###Notice:\nThis is stanley's file" > stanley.txt ###tom用戶 [tom@app1 ~]$ cd /root_test_dir/ [tom@app1 root_test_dir]$ touch tom.txt [tom@app1 root_test_dir]$ echo -e "###Notice:\nThis is tom's file" > tom.txt ###root用戶 [root@app1 ~]# ll /root_test_dir/ [root@app1 ~]# cat /root_test_dir/{stanley.txt,tom.txt}
為方便實現,分別使用對應用戶各自復制一份文件出來
###stanley用戶 [stanley@app1 root_test_dir]$ cp stanley.txt stanley1.txt ###tom用戶 [tom@app1 root_test_dir]$ cp tom.txt tom1.txt
-
-
確認777目錄權限。使用stanley編輯并保存tom的文件。
不理它,繼續編寫
提示要加!
強制保存。輸入:wq!
發現是可以強制保存的。同時文件的權限會被強制修改為stanley的文件。這個大家一定要留意?。。。?!
/tmp目錄之所以不會出現這樣的問題是因為/tmp目錄添加了ST粘貼位,所以不會出現這樣的問題
-
-
驗證完前面的問題后,我們來模擬
vi
和echo
的SGID權限(同時這里也要聲明的是SUID,SGID只對二進制文件生效?。。?br style="margin: 0px;padding: 0px;max-width: 100%"/> -
-
用stanley分別使用
echo
和vi
命令來編輯tom的文件來模擬圖中的問題
開始之前再來驗證下用戶屬主屬組是否有特殊權限,/root_test_dir權限是否被特殊設置,文件的權限都是ok的。一切ok模擬第一幅圖中的問題。
執行echo命令:
[stanley@app1 root_test_dir]$ echo 'stanley need tom1.txt file too!' >> tom1.txt
執行vi命令:
vi tom1.txt文件后強制編輯后wq!
強制保存。
大家可以看到問題確認是這樣的。這是為什么呢?
最開始的時候,個人也納悶了很久,折騰了30來分鐘也沒有搞定。但絲毫沒有懷疑是Linux系統的問題。所以問題肯定還是出在權限的問題上。
幾經折騰后,最終忽略了一個問題,同時對SUID,SGID的概念沒有深入理解。
-
問題1: vi是的工作原理是先寫.swap臨時文件再覆蓋原文件的。因為父目錄是777,所以任何用戶都可以覆蓋其它人的文件
-
問題2:我們賦予了
/bin/echo
/bin/vi
SGID權限,那為什么文件還是不能被重寫呢?
SGID的權限賦予的是vi 和 echo兩個命令,而且這兩個命令也確實是被正常執行了。只是/root_test_dir目錄下的文件沒有權限被重寫而已。
大家試下在/root_test_dir目錄下,mv是可以被覆蓋其它人的文件的。
所以,這SUID,SGID和目錄777權限的問題,大家應該清楚了吧。
原創文章,作者:sjfbjs,如若轉載,請注明出處:http://www.www58058.com/30602