使用 Linux 遇到一些問題而卡住,有時候是權限不足所造成。權限調整的太過於安全,比較容易造成使用上的不方便;調整的太過於鬆散,又容易造成資安方面的問題。如何將 Linux 調整成適當的權限、開放的剛剛好,系統管理員對於權限的觀念,一定要特別的清楚才行,底下透過建置群組共享目錄的實際案例,來了解 Linux 設定檔案與目錄的權限觀念。
建置群組共享的目錄
在中小企業營運的期間,往往會接到一些專案,專案則是會有參與成員以及專屬資料夾,而與此專案無關的成員,就不會給予存取專案資料的權利。
接下來假設接到一個 project2 專案,而帳號 foo2、foo3 是 project2 專案的參與成員,於是就在 Linux 建立 project2 群組來實做群組共享目錄功能。
建立帳號與群組
使用指令「useradd foo2」、「useradd foo3」與「useradd foo4」建立帳號 foo2、foo3、foo4,按照原訂計畫,
foo2 與 foo3 稍後會附屬於 project2 群組,至於 foo4 則是用來代表『與此專案無關』的使用者。
使用指令「groupadd -g 50000 project2」建立群組 project2 且使用 GID 50000 號。
使用指令「id foo2」、「id foo3」與「id foo4」觀察使用者 UID、GID 以及附屬群組(groups)。
設定 foo2、foo3 附屬於 project2 群組
使用指令「vigr」(vi /etc/group 之意)編輯群組資訊檔案,來到檔案的尾端,
會看到『project2:x:50000:』這行
修改成『project2:x:50000:foo2,foo3』
請注意此檔案共四個欄位,以冒號(:)作為分隔符號,修改的是第四個欄位,內容填寫的是附屬於此群組的使用者,如果有多位使用者附屬於此群組,使用逗點(,)作為分隔使用者的符號。
溫馨提示:上述設定可仿造 /etc/group 檔案開頭那幾行的格式當成範本,例如:『sys:x:3:root,bin,adm』意思是 sys 群組有 root、bin、adm 這三個成員(member)使用者。
在指令「vigr」結束後,會詢問是否要順道改 /etc/gshadow(群組密碼檔),沒有要改的話按下 Enter 即可;接著二度使用 id 指令觀察 foo2 與 foo3 已經附屬於 project2 群組,而 foo4 依然沒有附屬於 project2 群組。
群組共享目錄權限設定
使用指令「mkdir /home/group_data/」建立此目錄用來放置各個群組共享資料用的,例如未來有 project3、project4 群組的共享目錄都預計建立在這裡。
使用指令「mkdir /home/group_data/project2」建立此目錄用來放置 project2 群組共享資料用的。
使用指令分別觀察 /home/、/home/group_data/ 以及 /home/group_data/project2 預設都屬於 root 使用者、root 群組,權限以數字方式表達是 755,意思是只有 root 可以完全控制這些資料夾,其餘帳號都只能讀取以及進入目錄而無法在這些目錄下產生新的檔案或子目錄。
使用指令「chgrp project2 /home/group_data/project2/」將此目錄改成 project2 群組的。
使用指令「chmod 2770 /home/group_data/project2/」將此目錄權限改成 2770,關於 2770 稍後會有更詳細的解說。
二度使用指令「ls -ld /home/group_data/project2/」觀察設定後的狀態。
上述設定的觀念剖析
上述設定針對 root 擁有者欄位來說,並沒有改變,仍然是完全控制;至於群組則是改成 project2 且開放 project2 群組的成員能夠完全控制此目錄;另外針對不是檔案擁有者 root、且不是 project2 群組的不相關帳號,則是無法存取的狀態。
在指令「ls -ld /home/group_data/project2/」顯示的狀態中:
開頭 rwx 針對檔案擁有者 root 是完全控制的,也就是 chmod 指令 2770 選項的第一個 7
中段 rws 設計給 project2 群組完全控制用的,是 chmod 指令 2770 選項的第二個 7
結尾 --- 是希望不相關帳號完全無法存取,是 chmod 指令 2770 選項的 0
如果讀者有仔細看的話,中段的 rws 不是 rwx 喔!
這個 s 是 chmod 指令 2770 選項的 2,也就是 set gid 權限,當 set gid 用在群組共享目錄的時候,會使得後續建立出來的檔案,鎖定成該群組,以上述的範例來說就是鎖定成 project2 群組,這就是 set gid 用在群組共享目錄的主要用意。
測試群組共享資料夾
使用指令「su - foo2」變換身份成 foo2
使用指令「mkdir /home/group_data/project2/foo2/」產生子資料夾。
使用指令「touch /home/group_data/project2/foo2/foo2.txt」產生子資料夾下的 foo2.txt 空白檔案。
開啟另一個 root 指令的視窗
使用指令「su - foo3」變換身份成 foo3
使用指令「rm /home/group_data/project2/foo2/foo2.txt」試著刪除 foo2 所產生子資料夾下的 foo2.txt 空白檔案。
使用指令「rmdir /home/group_data/project2/foo2」刪除 foo2 所產生的子資料夾。
以上兩個刪除動作皆成功。
再開啟另一個 root 指令的視窗
使用指令「su - foo4」變換身份成 foo4
使用指令「mkdir /home/group_data/project2/foo4/」會失敗,因為權限不足。
使用指令「ls /home/group_data/project2/」會失敗,同樣也是因為權限不足。
權限不足的主因是 foo4 不屬於 project2 專案的成員(不屬於 project2 群組)。
有無設定 set gid 的差異
在目錄有 set gid 的情況下,foo2 在 /home/group_data/project2/ 下建立檔案或目錄是屬於 project2 群組的。
例如:使用帳號 foo2 下指令「mkdir /home/group_data/project2/foo2」建立目錄是屬於 project2 群組的。
在目錄沒有 set gid 的情況下,foo2 建立檔案或目錄是屬於 foo2 群組的。
例如:使用帳號 foo2 下指令「mkdir foo2」在家目錄建立子目錄是屬於 foo2 群組的。
以 foo2 的家目錄來說,是沒有設定 set gid 的情況,因此所產生的子目錄,依照權限比對的順序,此時 foo3 並不是屬於同 foo2 群組的帳號,而是僅僅擁有其他人的權限(只有唯讀權利)則無法寫入 foo2 產生的資料(雖然 foo2、foo3 都是附屬於 project2 群組的成員)。
請注意到預設的 foo2 家目錄的權限是 700 而已,意思是只有 foo2 自己可以完全控制、其他帳號都無法存取才對。
下圖是使用 foo3 帳號存取 foo2 家目錄的情況,使用指令「mkdir /home/foo2/foo3」、「ls /home/foo2/」皆權限不足。
在帳號 foo2 使用指令「chmod 755 /home/foo2」開放自己的家目錄給他人唯讀的權限之後。
用帳號 foo3 再次使用指令「mkdir /home/foo2/foo3」依舊失敗;但「ls /home/foo2」是可以成功的,因為是唯讀的權限。
看到 /home/foo2/ 目錄下的子目錄 foo2 也是可以存取的(使用指令 ls 列出資料)。
特別注意:使用 foo2 帳號建立的 /home/foo2/foo2/ 目錄預設群組是 foo2 而不是 project2 所以使用帳號 foo3 時只有唯讀的權限。
所以下圖中使用 foo3 帳號執行指令「mkdir /home/foo2/foo2/foo3」會失敗,因為權限不足。
權限比對的順序與流程
用過 Linux 的人都知道 root 是 Linux 系統管理帳號,擁有至高無上的權利,可是對於電腦來說,主要是因為 root 帳號 UID 為 0、GID 為 0 的關係。
至於其他的帳號,存取的權限皆使用三階段的比對敘述如下:
首先會比對存取的使用者是不是檔案或目錄的擁有者(使用者),如果是就採用第一階段的權限
第一階段的權限就是九個 rwx 的前面三個,也就是使用者的權限;
再來會比對存取的使用者是不是檔案或目錄的預設群組或是附屬群組,如果是就採用第二階段的權限
第二階段的權限就是九個 rwx 的中間三個,也就是群組的權限;
最後只要是存取的使用者有這台電腦的系統帳號,那就採用第三階段的權限
第三階段的權限就是九個 rwx 的最後三個,也就是其他人的權限。
溫馨提示:權限如果沒有對應到這台主機的任何帳號,則沒有存取這台主機的任何權限。
設定權限改成某個使用者的資料
設定權限改成某個使用者的資料
如果想要把某個檔案或目錄,授予某個使用者完整控制的權限的話,就使用 chown 指令,改成是那個帳號的即可。
舉例來說:家目錄(例如:/home/foo2)都是那個使用者(例如:foo2)擁有完整的控制權限。
設定權限改成某個群組用的資料
不只是一個帳號要使用,而是一群使用者要共用時,則要將這群使用者,納為同一個群組,再建立群組共享的資料。
本文介紹的重點就是建立群組共享的資料夾。
設定權限改成大家都可用的資料
如果要讓大家都能夠讀寫,則是開放成 777 的權限。
開放成 777 感覺上不是很安全,所以除非是不得以,或是暫時開放一下,測試一些東西,稍後就應該要關閉。
系統內建開放成大家都可讀寫的資料,最有名的是 /tmp/ 目錄,其實 /tmp/ 目錄的權限不只是 777 而已,應該說是 1777 的權限才對,開頭的 1 是 sticky bit ,這導致存取 /tmp/ 目錄的使用者,『黏住』原來的身份,這樣的結果是造成A使用者產生的檔案或目錄,B使用者不一定可以修改或刪除。
原因就是存取 /tmp/ 期間,使用者都『黏住』用原本的身份來存取資料,避免了互相砍殺資料的情況。
溫馨提示:/tmp/ 目錄的權限 1777 是 drwxrwxrxt 而不是 drwxrwxrwx 喔!
存取各類型服務時,對應帳號權限及其用意
客戶端來訪存取網頁服務時,Server 上對應的使用者身份是定義在 httpd.conf 裡面 User 與 Group 參數,使用指令「grep -E '^User|^Group' /etc/httpd/conf/httpd.conf」可以找出來訪問網頁的身份是對應成 apache 使用者、apache 群組。
使用「id apache」來確認系統真的是有這個帳號,至於網頁的文件根目錄(DocumentRoot)/var/www/html/ 一定要讓 apache 帳號可以讀取才行。
客戶端存取匿名 ftp 服務時,Server 上對應的使用者身份是 ftp,使用指令「grep ftp /etc/passwd」、「id ftp」確認有 ftp 這個帳號以及家目錄是 /var/ftp/,同樣的 /var/ftp/ 目錄要讓 ftp 這個帳號可以讀取才行。
像是存取 samba 服務的訪客身份(Windows 稱作 guest),對應到 Linux 的 nobody 帳號。
指令「testparm -v | grep 'guest account'」來觀察。
存取 nfs 服務時,客戶端的 root 身份預設被轉換成 Server 上的 nfsnobody、存取 DNS 服務的身份 named、存取 proxy 服務的身份 squid 等等,都是類似的機制,主要的用意都是在壓低服務存取的權限,避免客戶端存取服務時對應到 root 身份來存取資料,這樣就算是服務程式發生漏洞,災害的範圍也可控制的比較小一些。
作者 徐秉義
出處 NetAdmin 網管人雜誌
沒有留言:
張貼留言