如果今天管理的是自己使用的機器而不是提供眾多服務的 Server,那麼權限問題將會簡單的多,也許可以不用擔心權限的問題。然而,在一部提供眾多使用者的機器上,權限設定是很重要的。

在一部檔案伺服器來說,使用者都可以隨便就進去"觀看",而且都不設防。這對於不重要的檔案來說是沒什麼大礙,但是這是一家軟體公司,假如 R&D 部門的工程師把 source code 放到自己的家目錄,那麼別人不是很容易就可以取得了嗎?這是多麼恐怖的一件事! 在這一篇文章,我將會介紹 Linux 系統的檔案權限設定,讓大家知道如何以及為何要這麼做。當然,我也會簡單的提到如何新增使用者和管理者用者。

下面,我會以我自己的親身經歷在說明這篇文章。

Story:新增使用者 / 群組

最近有又了新的員工進來了,Steven 將為新員工建立新的帳號和可使用的目錄權限。後來 Steven 想了一下,為什麼不能一次管理眾多使用者,而不須為使用者一個一個設定他們的權限或事物,舉個例子來說好了,之前 Steven 在使用 Quota 的限定磁碟配額的時候,好像要一個一個設定,雖然可以以某位使用者當範例而套用到別的使用者上,但這樣似乎不是很理想。後來 Steven 想到不如使用群組的觀念,把同一部門的員工都設成同一個群組,那麼要管理起來就方便多了!

Service 部門有位 Sandy 的新職員進來,Steven 在之前就想到要為新進來的職員做群組的規劃,比如客服部的員工就統一在 service 群組,會計部門就統一在 account 群組,開發部門就統一在 rd 群組,所以為了以後的管理方面,於是就要先建立群組之後再對要新增的使用者做群組的設定,如此一來以後就可以一次對一個群組做大批的設定而不用一個一個慢慢設定了!

以下是 Steven 對於新的政策規劃:

建立群組

要新增使用者很簡單,只要下 useradd [USER] 就可以新增了,如果要為使用者設定密碼,那麼就下達 passwd [USER] 就可以了!但是事情還沒這麼簡單,因為目前的目標是要把使用者分類到不同的群組中,所以就要先做新增群組的動作了。

新增群組很簡單,只要下命令 groupadd 就好了:

新增 service 群組

[root@test root]# groupadd service
新增 account 群組:

[root@test root]# groupadd account
新增 rd 群組:

[root@test root]# groupadd rd
基本上,以上就已經新增好 service、account 和 rd 三個群組了。

不同群組要分在不同目錄

不同群組要分在不同目錄這是什麼意思呢?現在試想看看因為 Linux 在建立新使用者時,預設使用者的家目錄是放在 /home 目錄裡頭,如果現在每位使用者都放在 /home 目錄裡頭,那麼到時候有什麼更改,比如說要把 service 部門每位使用者的家目錄都改到不同的家目錄,那麼到時候就會很難找了!

舉個例子來說,目前因為有 service、account 和 rd 三個部門,所以 Steven 就想說把 service 成員的家目錄放到 /home/service 之下;而 account 成員放到 /home/account 下;同理 rd 部門就放在 /home/rd 目錄下,如此如果未來有什麼重大改變(比方說各群組的家目錄改變)就會顯得簡單得多。

建立 sa、account 和 rd 三部們的目錄

[root@test root]# mkdir /home/service
[root@test root]# mkdir /home/account
[root@test root]# mkdir /home/rd
以上就完成了建立類別目錄,再下去,就要準備建立使用者了!

新增的使用者家目錄要被分在該群組的目錄下

經過以往的經驗,馬上就知道 useradd 這個指令就是新增一個帳號。不過現在想一想,前面又說過 Linux 使用者在建立新使用者時,預設使用者的家目錄都是在 /home,那麼如果要在建立帳號時就馬上指定該帳號的家目錄要怎麼辦呢?還有要如何指定群組?這些問題其實在 useradd 就可以完成了!

[root@test root]# useradd -d /home/sa/sandy -g service sandy
以上就完成了 sandy 這個使用者的新增,下面是參數簡單的明: 使用者新增之後並沒有密碼,所以要新替 sandy 新增一個密碼才行。

[root@test sa]# passwd sandy
Changing password for user sandy.
New password: usersandy <- 這個秘碼其實不會出現,是為了說明而印出來!
Retype new password: usersandy <- 再輸入一次確認!
passwd: all authentication tokens updated successfully.
[root@test sa]#
出現了 "all authentication tokens updated successfully." 訊息就表示新增成功,現在來檢查看看 /home/service 目錄裡是否有 sandy 目錄

[root@test sa]# cd /home/service
[root@test sa]# ls -l
total 4
drwx------    3 sandy    service            4096 May  4 21:02 sandy
[root@test sa]#
就像所想的一樣,sandy 這個目錄不旦被新增,而且也被規為 service 群組。
檔案 / 目錄權限管理

不論你在任何路徑下,一只要下達 ls -l 就應該會看到下面類似的畫面:

steven $ ls -l
total 8312
-rw-r--r--   1 root   root      5165 May 23 12:26 10_misc.cf
-rw-r--r--   1 steven steven    5150 May 23 12:28 10_misc.cff
drwx------   2 steven steven    4096 Mar 10 02:11 Mail
-rw-rw-r--   1 steven steven 8447605 Apr 13 15:06 firefox-1.5.0.2.tar.gz
drwx------   3 steven steven    4096 Mar  9 10:18 mail
-rw-------   1 steven steven    8208 Mar 10 02:18 mbox
-rw-r--r--   1 steven steven     702 May 25 14:23 web-index.htm
drwxrwxr-x  21 steven steven    4096 May 25 22:06 www
steven $
我們先不討論他每一欄的格式是什麼,先來看看第一欄位那第鬼畫符的東西。其實第一個欄位就很清楚明白的指出這個檔案或目錄的權限,雖然只有十個字符的表示,但確是檔案權限表示最精華所在,我們以以下的圖來看看:
符號:    _d_ _r_ _w_ _x_ _r_ _w_ _x_ _r_ _w_ _x_    drwxrwxrwx
數字:         4   2   1   4   2   1   4   2   1       7  7  7
類別:        \__USER___/ \__GROUP__/ \__OTHER__/      U  G  O
一個檔案或目錄有十個字符,去掉第一個字符外,可分為三個字符一組,分別為 User (使用者本身)、Group (群組)、Other (其它),而每一組,又分別以 r (read)、w (write)、x (excute) 做為權限控制,下面,會舉列說明:

上面說了一堆,應該是 "霧煞煞" 才對,沒關係,你只要三個三個分組就可以很容易知道了。而每個文字符號又分別對應到權限位元,這個權限位元是要使用二進制再使用 AND 算出來的,可不是 4 + 2 + 1 = 7 喔。