User and Group ID Numbers
我們可透過 ls 指令配合參數 -l 來查看詳細的檔案及權限內容 (顯示的 owner 及 group 為名稱),若配合參數 -n 則可將 owner 及 group 轉換為 UID 及 GID 顯示。ls -l 指令查看 (顯示的 owner 及 group 為名稱)。
# ls -l
total 592
-rw-r--r-- 1 root root 510762 Aug 5 08:32 04_1.html
-rw-r--r-- 1 root root 0 Aug 4 09:49 -13_1
-rw------- 1 root root 1391 Jul 30 16:29 anaconda-ks.cfg
drwxr-xr-x 2 root root 4096 Jul 30 16:32 Desktop
-rw-r--r-- 1 root root 38677 Jul 30 16:29 install.log
-rw-r--r-- 1 root root 4388 Jul 30 15:46 install.log.syslog
drwxr-xr-x 2 weithenn root 4096 Aug 5 08:44 test
ls -ln 指令查看 (顯示的 owner 及 group 為 UID 及 GID)。
# ls -ln
total 592
-rw-r--r-- 1 0 0 510762 Aug 5 08:32 04_1.html
-rw-r--r-- 1 0 0 0 Aug 4 09:49 -13_1
-rw------- 1 0 0 1391 Jul 30 16:29 anaconda-ks.cfg
drwxr-xr-x 2 0 0 4096 Jul 30 16:32 Desktop
-rw-r--r-- 1 0 0 38677 Jul 30 16:29 install.log
-rw-r--r-- 1 0 0 4388 Jul 30 15:46 install.log.syslog
drwxr-xr-x 2 500 0 4096 Aug 5 08:44 test
User Management Tools
GUI Tools- system-config-users
Command Line Tools
useradd、usermod (UID 1 ~ 499 為 System UID、User UID 從 500 開始)。
- -g: 指定預設的 Group。
- -G: 指定 Group Member。
- -u: 指定 UID。
- -L: 鎖定使用者帳號 (將 ! 帶入 Salt 欄位)。
- -U: 解除鎖定使用者帳號 ((將 ! 從 Salt 欄位內移除)。
- -r: 刪除使用者帳號包含家目錄及 Mail (前提是確認該使用者是否仍登入系統中,若然則系統將不會刪除使用者家目錄及 Mail 且系統不會顯示任何訊息告知)。
新增使用者帳號完成後接著會使用指令 passwd 來設定使用者密碼時我們可透過參數 --stdin 來達成只需輸入一次密碼 (通常為二次) 即可完成密碼更新設定,這樣有助於使用 Shell Script 來一次大量設定使用者帳號時使用,如下為設定密碼 wei1234 至使用者帳戶 weithenn 內。
# echo wei1234 | passwd --stdin weithenn
Changing password for user weithenn.
passwd: all authentication tokens updated successfully.
設定完成的使用者密碼存放於 /etc/shadow 中並將密碼欄位利用 MD5 演算法進行加密 (不可逆),您可嘗試使用上述指令再設定同樣的密碼您會發現即使密碼相同,但經過 MD5 加密演算後的密碼欄位值皆不相同。
# grep weithenn /etc/shadow
weithenn:$1$fNoxaXXK$TtZPrVIYJGwPZ2tNnrXqB0:14467:0:99999:7::: //第一次密碼設定為 wei1234
weithenn:$1$Kxk7efF4$EHK6KZqerxOA.4m7B44Wr0:14467:0:99999:7::: //第二次密碼設定為 wei1234
我們可以看到第一次設定密碼為 wei1234 時其密碼經過 MD5 演算之後為 $1$fNoxaXXK$TtZPrVIYJGwPZ2tNnrXqB0,第二次再次設定密碼為 wei1234 時其密碼經過 MD5 演算之後為 $1$Kxk7efF4$EHK6KZqerxOA.4m7B44Wr0,為何密碼設定相同但演算出來之後不同? 原因在於 每次演算的 Salt 不同 所致,我們可將密碼欄位值分成二個部份來看如下表格所示,所以從下列表格可以了解到即使每次使用者密碼都相同,但透過 不同的 Salt 來對密碼加以調味 (演算) 結果 (菜) 當然是不同的。
Monitoring Logins
我們可利用如下指令來觀察目前或之前誰登入系統。- w: 查詢 目前 系統線上使用者。
- last: 查詢 最近 哪些使用者登入過系統。
- lastb: 查詢最近哪些使用者 登入系統失敗。
- lastlog: 查詢所有使用者 登入記錄。
Default Permissions
系統在預設的情況下其檔案 (Files) 權限為 666 而目錄 (Directory) 的權限為 777,那系統如何來設計一般使用者 (Non-Privileged Users) 及超級使用者 (Root) 所建立的檔案及目錄權限? 答案為使用 umask 來達成此項目的。- 一般使用者 (Non-Privileged Users): umask 為 002。
- 超級使用者 (Root): umask 為 022。
透過下列表格我們可以清楚了解系統利用 umask 遮罩值來 遮住 預設權限值後,所得到的值即為一般使用者 (Non-Privileged Users) 所得到的檔案 (664) 及目錄 (775) 的權限。
Special Permissions for Executables and Directories
- Executable Files (suid、sgid)
- Directory (sticky、sgid)
suid 功能為何? 簡單來說設定 suid 可使一般使用者在該程式執行時可 暫時提升權限 至與該檔案擁有者 (Owner) 相同的權限。舉例來說我們已經知道使用者密碼資訊存放於 /etc/shadow 中,您可嘗試使用一般使用者身份去查看此檔案內容您將發現無法查看此檔案內容如下訊息所示。
- $cat /etc/shadow
- cat: /etc/shadow: Permission denied
但當我們使用一般使用者身份登入系統時您可執行指令 passwd 來變更您的密碼且可儲存於 /etc/shadow 中,為何沒有權限查看 /etc/shadow 內容但欲可執行 passwd 指令來更新密碼於 /etc/shadow 中? 原因就在於 passwd 執行檔有設定 suid 因此當一般使用者執行 passwd 指令時會 暫時提升權限 至該檔案擁有者 (Owner) 也就是 Root 相同的權限,因此可寫入您新設定的密碼至 /etc/shadow 檔案中。
# ll /etc/shadow
-r-------- 1 root root 1129 Aug 13 08:16 /etc/shadow
# ll /usr/bin/passwd
-rwsr-xr-x 1 root root 22960 Jul 17 2006 /usr/bin/passwd
至於如何表示 suid、sgid、sticky 呢? 在之前的章節第 5 章時有提到關於每個檔案及目錄均透過 10 個字符 (Ten-Character) 4 組數字來表示其權限,其中第一個字符即為表示 suid、sgid、sticky。
- 第 1 個字符: 特殊權限 (Suid、Sgid、Sticky)。
- 第 2 ~ 4 個字符: 使用者權限 (User Permission)。
- 第 5 ~ 7 個字符: 群組權限 (Group Permission)。
- 第 8 ~ 10 個字符: 其它人權限 (Other Permission)。
以下表格為說明 suid、sgid、sticky 如何表示:
suid、sgid: 覆蓋 x 欄位
- x 欄位值 存在 則 s 為小寫。
- x 欄位值 不存在 則 S 為大寫。
sticky: 覆蓋 x 欄位
- x 欄位值 存在 則 t 為小寫。
- x 欄位值 不存在 則 T 為大寫。
補充
當您操作系統中途必須短暫離開座位時我們可透過安裝 vlock 套件來達成鎖定桌面的目的,詳細內容請參考 vlock - virtual console lock program。- vlock: 鎖定 目前 terminal (但仍可透過其它 Virtual Console 或 GUI 來進行登入)。
- vlock -a: 鎖定 所有 Virtual Console。
Lab
Lab1. 使用者 weithenn 為 MIS 部門而 chris 為 Sales 部門,如今老板將此二位使用者加入 project 部門中,請設定此二位使用者於 project 資料夾下新增的檔案或目錄及 GID 權限為該群組名稱。
Ans:整個建立相關環境及設定步驟流程如下:
- 使用 Root 建立如下環境。
- 建立 project 資料夾 (mkdir)。
- 建立使用者帳號 weithenn、chris (useradd)。
- 設定使用者密碼 weithenn、chris (passwd)。
- 建立郡組 mis、sales、project (groupadd)。
- 將使用者預設郡組指定為 mis 及 sales (usermod)。
- 使用者 weithenn、chris 登入使用指令 id 確定相關資訊。
- 切換路徑至 /project 下建立檔案後查看檔案權限。
- 使用 Root 設定 /project 權限為 3770。
- 使用者 weithenn、chris 切換路徑至 /project 下建立檔案後查看檔案權限。
使用 Root 身份建立相關環境。
# mkdir /project //建立 project 資料夾
# useradd weithenn //建立使用者帳號 weithenn
# useradd chris //建立使用者帳號 chris
# passwd weithenn //設定使用者 weithenn 密碼
# passwd chris //設定使用者 chris 密碼
# groupadd mis //建立 mis 群組
# groupadd sales //建立 sales 群組
# groupadd project //建立 project 群組
# vi /etc/group //修改群組設定檔
project:x:504:weithenn,chris //將 weithenn 及 chris 加入 project 群組
# usermod -g mis weithenn //將使用者 weithenn 預設群組設定為 mis
# usermod -g sales chris //將使用者 chris 預設群組設定為 sales
使用者 weithenn 登入系統。
$ id //查詢帳號資訊
uid=500(weithenn) gid=502(mis) groups=502(mis),504(project) context=user_u:system_r:unconfined_t
$ touch f1.weithenn //建立檔案
$ ll //查詢檔案權限
-rw-r--r-- 1 weithenn mis 0 Aug 13 08:53 f2.weithenn
使用者 chris 登入系統。
$ id //查詢帳號資訊
uid=501(chris) gid=503(sales) groups=503(sales),504(project) context=user_u:system_r:unconfined_t
$ touch f1.chris //建立檔案
$ ll //查詢檔案權限
-rw-r--r-- 1 chris sales 0 Aug 13 08:54 f1.chris
使用 Root 身份設定 project 資料夾權限。
# chmod 3770 /project -v
mode of `/project' changed to 3770 (rwxrws--T)
使用者 weithenn、chris 再度登入系統並新增檔案,您可發現之後新增的檔案及 GID 均為 project 了。
$ touch f2.weithenn //使用者 weithenn 建立此檔案
$ touch f2.chris //使用者 chris 建立此檔案
$ ll //查詢檔案權限
-rw-r--r-- 1 chris sales 0 Aug 13 08:54 f1.chris
-rw-r--r-- 1 weithenn project 0 Aug 13 08:52 f1.weithenn
-rw-r--r-- 1 chris project 0 Aug 13 08:55 f2.chris
-rw-r--r-- 1 weithenn mis 0 Aug 13 08:53 f2.weithenn