Linux 基礎學習訓練教材 - CentOS 8.x

第 4 堂課:Linux 基礎檔案權限與基礎帳號管理

Linux 的權限概念相當的重要!這裡先簡略的了解一下。權限與帳號相關性很高喔!所以,也要玩一下帳號管理!

最近更新時間: 2020/03/16

從前幾節課的練習中發現,使用 student 這種一般身份帳號在進行一些任務時,總是發現無法順利的複製或者是進行其他的檔案管理任務, 這是因為『權限不足』所致。本堂課要來介紹 Linux 基礎檔案系統,藉以了解為何 student 的任務會成功或失敗。 此外,為了管理權限,有時也需要管理使用者帳號,因此基礎帳號管理也在本堂課簡單介紹。

4.1:Linux 傳統權限

Linux 權限的目的是在『保護某些人的檔案資料』,因此,讀者在認識『權限』的角度上,應該要思考的是『這個檔案的權限設定後, 會造成哪個個人?或某群人的讀寫開放或保護』。所以,這些權限最終都是『應用在某個/某群帳號』上面!而且,權限都是『設定在檔案/目錄』上, 不是設定在帳號上面的,這也要先釐清。

4.1.1:使用者、群組與其他人

Linux 的檔案權限在設定上,主要依據三種身份來決定,包括:

  • user / owner / 檔案擁有者 / 使用者:就是檔案所屬人
  • group / 群組:這個檔案附屬於那一個群組團隊
  • others / 其他人:不是 user 也沒加入 group 的帳號,就是其他人。

底下以一個小案例來說明這三種身份的用法。

假設讀者還在學校當老師,你有一本書要讓班上同學借閱,但你又不想管,此時你會如何決定『這本書 (檔案)』的命運? 通常的作法是:

  • 使用者:讓某個學生當小老師,這本書就歸他管 (使用者),同學要借得要透過這位小老師
  • 群組:任何加入本班的同學 (一群帳號) 都是本班群組,這本書對本班群組的同學來說,大家都能借閱。
  • 其他人:不是本班的同學,例如隔壁班的阿花與阿咪,對這本書來說,他們都是屬於『其他人』,其他人沒有權限可以借閱這本書。

由上面這個簡單的小案例,讀者應該能夠知道,Linux 上面的檔案『都是針對帳號』來進行管理的, 只是為了方便管理上的設定 (班級同學與非本班其他同學) ,因此又將非本人的所有帳號分為兩類,一類是加入使用者所設定的群組, 一個則是沒有加入群組的其他人。

  • 檔案權限的觀察

單純的檔案權限觀察,可以使用 ls -l 或 ll 來查閱,底下為查詢系統 /var/spool/mail 這個目錄的權限方式:

[student@localhost ~]$ ls -ld /var/spool/mail
drwxrwxr-x. 2 root mail 32    2月 26 09:10 /var/spool/mail
[    A    ][B][C ] [D ] [E ]  [    F     ] [    G        ]

簡單的分析,上述的資料共有七個欄位,每個欄位的意義為:

  1. 檔案類型與權限,第 1 個字元為檔案類型,後續 9 個字元每 3 個一組,共分 3 組,為三種身份的權限;
  2. 檔案連結數,這與檔案系統有關,讀者可暫時略過;
  3. 該檔案的擁有者,本例當中,擁有者身份為 root
  4. 該檔案的所屬群組,本例當中這個檔案屬於 mail 這個群組底下
  5. 這個檔案的容量
  6. 該檔案最後一次被修改/修訂的日期時間
  7. 這個檔案的檔名。

讀者首先可以分析一下這個『檔案』的『類型』。之前讀者應該看過第一個字元為 - 以及 d 的表示方式,事實上還有很多常見的檔案類型, 底下僅為常見的類型介紹:

  • -: 代表後面的檔名為一般檔案
  • d: 代表後面的檔名為目錄檔
  • l: 代表後面的檔名為連結檔 (有點類似 windows 的捷徑概念)
  • b: 代表後面的檔名為一個裝置檔,該裝置主要為區塊裝置,亦即儲存媒體的裝置較多
  • c: 代表後面的檔名為一個週邊裝置檔,例如滑鼠、鍵盤等

所以讀者可以知道 /var/spool/mail 為一個目錄檔案 (d 開頭,為 directory 的縮寫)。確定了檔案類型後,接下來的 9 個字元都是 rwx 與減號而已, 從這 9 個字元判斷,讀者大概可以猜出 rwx 的意義為:

  • r: read,可讀的意思
  • w: write,可寫入/編輯/修改的意思
  • x: eXecutable,可以執行的意思

只不過 rwx 該如何與 root, mail 這個使用者與群組套上關係?我們可以使用下圖來查閱第 1, 3, 4 個欄位的相關性:

圖4.1-1、使用者、群組與權限的相關性
圖4.1-1、使用者、群組與權限的相關性

如上圖所示,第一組為檔案擁有者的權限,第二組為檔案擁有群組的權限,第三組為不是擁有者也沒有加入該群組的其他人權限。 所以上述的檔案權限為:

  • 擁有者為 root,root 具有 rwx 的權限 (第一組權限)
  • 群組設定為 mail,則所有加入 mail 這個群組的帳號可以具有 rwx 的權限 (第二組權限)
  • 不是 root 也沒有加入 mail 的其他人 (例如 student 這個帳號) 具有 rx 的權限 (第三組權限)
實際練習:認識檔案的權限概念,若有一個檔案的類型與權限資料為『-rwxr-xr--』,請說明其意義為何?
  1. 拆開權限位元:先將整個類型與權限資料分開查閱,並將十個字元整理成為如下所示:
    [-][rwx][r-x][r--]
     0  123  456  789
    
  2. 理解各個位置的意義:
     0 為:代表這個檔名為目錄或檔案,本例中為檔案(-);
    123為:擁有者的權限,本例中為可讀、可寫、可執行(rwx);
    456為:同群組使用者權限,本例中為可讀可執行(rx);
    789為:其他使用者權限,本例中為可讀(r),就是唯讀之意 
  3. 同時注意到,rwx所在的位置是不會改變的,有該權限就會顯示字元,沒有該權限就變成減號(-)。
實際練習:需要了解帳號本身與檔案權限的應用關係!很重要喔!
  1. 帳號的前提假設情況:假設有帳號資料如下:
    帳號名稱  加入的群組
    test1     test1, testgroup
    test2     test2, testgroup
    test3     test3, testgroup
    test4     test4
    
  2. 檔案的狀態:如果有下面兩個檔案,請分別說明 test1, test2, test3, test4 針對底下兩個檔案的權限各為何?
    -rw-r--r--  1 root     root          238 Jun 18 17:22 test.txt 
    -rwxr-xr--  1 test1    testgroup    5238 Jun 19 10:25 ping_tsai
  3. 關於 test.txt 檔案權限與帳號間的關係:
    • test.txt 為一般檔案 (-),擁有者為 root,所屬群組為 root。
    • 權限方面,只有root這個帳號可以存取此檔案,其他人則僅能讀此檔案。
    • 由於 test1, test2, test3, test4 既不是 root 本人,也沒有加入 root 群組,因此四個人針對這個 test.txt 的檔案來說,都屬於其他人, 僅有可讀 (r) 的權限。
  4. 關於 ping_tsai 檔案權限與帳號間的關係:
    • ping_tsai 為一般檔案 (-),擁有者為 test1,而所屬群組為 testgroup。
    • 權限方面,test1 本人具有可讀可寫可執行,加入 testgroup 的用戶可讀可執行,其他非 testgroup 帳號成員的其他人,僅具有唯讀
      • test1 就是這個 ping_tsai 的擁有者,因此具有可讀、可寫、可執行的權力(rwx)
      • test2 與 test3 都不是 test1,但是兩個都有加入 testgroup 群組,因此 test2 與 test3 參考的權限為群組權限,亦即可讀與可執行 (rx),但不可修改 (沒有 w 的權限)
      • test4 不是 test1 也沒有加入 testgroup 群組,因此 test4 參考其他人的權限,亦即可讀 (r)

上面這個練習還挺重要的!因為,檔案權限判斷的重點,都是:『哪個用戶可以對這個檔案進行讀、寫、執行』這樣的概念,而帳號是否加入這個檔案所屬群組, 就是個需要考慮的重點!

  • 觀察帳號與權限的相關指令

如上面例題,讀者可以知道 test1 屬於 test1 及 testgroup 群組,所以可以理解帳號與權限的相關性。不過在實際的系統操作中, 若想知道帳號所屬的群組,可以使用 id 這個指令來觀察即可理解。

實際練習:承上題,student 這個帳號對於 ping_tsai 來說,具有什麼權限?
  1. 首先需要了解 student 的所屬群組,可使用 id 這個指令來查詢即可:
    [student@localhost ~]$ id
    uid=1000(student) gid=1000(student) groups=1000(student) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
    [student@localhost ~]$ id student
    uid=1000(student) gid=1000(student) groups=1000(student)
    # 可以加上帳號在 id 後面喔!若是自己本身,則會列出 selinux 相關的資料!
    
  2. 上述的資料中, gid 為所謂的『原生群組 (primary group)』, groups 則是所有支援的群組。
  3. 由 id 的輸出中,發現 student 並沒有加入 testgroup 群組,因此 student 針對 ping_tsai 為『其他人』亦即僅有 r 的權限。

而除了 id 可以觀察帳號與權限的相關性,在檔案類型部份,可以使用前一堂課談到的 file 來查詢。

實際練習:使用 file 與 ls -l 查看不同檔名的檔案類型
  1. 先以 ls -l 檢查可能不能檔案類型的 /etc/init.d /etc/passwd /dev/vda /dev/zero 等檔名:
    [student@localhost ~]$ ll /etc/init.d /etc/passwd /dev/vda /dev/zero
    brw-rw----. 1 root disk 252, 0  3月  9 16:21 /dev/vda
    crw-rw-rw-. 1 root root   1, 5  3月  9 16:21 /dev/zero
    lrwxrwxrwx. 1 root root     11  5月 11  2019 /etc/init.d -> rc.d/init.d
    -rw-r--r--. 1 root root   2433  3月  8 00:15 /etc/passwd
    
    根據前面第一個字元判斷, /dev/vda 為區塊裝置檔案、 /dev/zero 為週邊裝置檔案、 /etc/init.d 為連結檔案、/etc/passwd 為一般檔案。
  2. 再使用 file 查詢一下上述的檔名類型:
    [student@localhost ~]$ file /etc/init.d /etc/passwd /dev/vda /dev/zero
    /etc/init.d: symbolic link to rc.d/init.d
    /etc/passwd: ASCII text
    /dev/vda:    block special (252/0)
    /dev/zero:   character special (1/5)
    
    可以顯示出更多的結果喔!

使用 ls -l 可以很快速的看到檔案屬性、權限的概觀,不過,其實讀者也能使用 getfacl 這個指令來了解檔案的相關屬性與權限。 如下所示,同樣使用 /var/spool/mail 作為範本:

[student@localhost ~]$ getfacl /var/spool/mail
getfacl: Removing leading '/' from absolute path names
# file: var/spool/mail   <==檔名
# owner: root            <==檔案擁有者
# group: mail            <==檔案群組
user::rwx                <==使用者的權限
group::rwx               <==同群組帳號的權限
other::r-x               <==其他人的權限

透過 getfacl 可以更清楚的查詢到檔案的擁有者與相關的權限設定,只不過就沒有檔案的類型、修改的時間等參數。

4.1.2:檔案屬性與權限的修改方式

檔案的權限與屬性的修改,若以 ls -l 的輸出來說,則每個部份可以修改的指令參照大致如下:

[student@localhost ~]$ cd /dev/shm/
[student@localhost shm]$ touch checking
[student@localhost shm]$ ls -l checking
-rw-rw-r--. 1 student student 0  3月 14 21:45 checking
 [ chmod ]    [chown] [chgrp]    [   touch  ] [  mv  ]

由於一般帳號僅能修改自己檔案的檔名、時間與權限,無法隨意切換使用者與群組的設定。因此底下的例題中, 讀者應該使用 root 的身份來進行處理,方可順利進行。首先,切換身份成為 root ,並且將工作目錄切換到 /dev/shm。

[student@localhost shm]$ su -
password:
[root@localhost ~]# cd /dev/shm
[root@localhost shm]# ll checking
-rw-rw-r--. 1 student student 0 Mar 14 21:45 checking
# 因為不同的帳號使用的語系不同,root 使用英文語系,因此可以發現日期格式不同。
  • 使用 chown 修改檔案擁有者

查詢系統中是否有名為 daemon 的帳號,如果存在該帳號,請將 checking 的使用者改為 daemon 所擁有,而非 student 所擁有。

[root@localhost shm]# id daemon
uid=2(daemon) gid=2(daemon) groups=2(daemon)

[root@localhost shm]# chown daemon checking
[root@localhost shm]# ll checking
-rw-rw-r--. 1 daemon student 0 Mar 14 21:45 checking

其實 chown 的功能非常多,chown 也可以用來進行群組的修改,也能同時修改檔案擁有者與群組。建議讀者們應該 man chown 查詢相關語法。

  • 使用 chgrp 修改檔案擁有的群組

系統的群組都紀錄在 /etc/group 檔案內,若想要了解系統是否存在某個群組,可以使用 grep 這個關鍵字擷取指令來查詢。 舉例來說,當系統內有 bin 這個群組時,就將 checking 的群組改為 bin 所有,否則就不予修改。

[root@localhost shm]# grep myname /etc/group
# 不會出現任何資訊,因為沒有這個群組存在的意思。

[root@localhost shm]# grep bin /etc/group
bin:x:1:        <==代表確實有這個群組存在!

[root@localhost shm]# chgrp bin checking
[root@localhost shm]# ll checking
-rw-rw-r--. 1 daemon bin 0 Mar 14 21:45 checking
  • 使用 chmod 搭配數字法修改權限

由於檔案紀錄了三種身份,每種身份都擁有 rwx 的最大權限與 --- 沒權限的情況。為了搭配性的方便,於是使用 2 位元的方法來記憶! 亦即是 2 進位的情況:

  • r ==> read    ==> 22 ==> 4
  • w ==> write   ==> 21 ==> 2
  • x ==> eXecute ==> 20 ==> 1

於是每種身份最低為 0 分,最高則為 r+w+x --> 4+2+1 --> 7 分!而因為有 3 種身份,因此使用者,群組,其他人的身份, 最多為 777 最少為 000 。以上述 checking (-rw-rw-r--)的分數來說,使用者為 rw=6, 群組為 rw=6,其他人為 r=4,亦即該檔案權限為 664。

實際練習:讓 daemon 可讀、可寫、可執行 checking,讓加入 bin 群組的用戶可唯讀該檔案,讓其他人沒有權限!
  1. 先分析應該完成的權限設計,基本上,應該會是『rwxr-----』,因為:
    • daemon 為使用者,可讀可寫可執行則為 rwx = 7
    • 加入 bin 的群組為唯讀,亦即為 r-- = 4
    • 其他人沒權限,因此為 --- = 0
  2. 最終可以使用『 chmod 740 checking 』修改權限
    [root@localhost shm]# chmod 740 checking
    [root@localhost shm]# ll checking
    -rwxr-----. 1 daemon bin 0 Mar 14 21:45 checking
    
  • 使用 chmod 搭配符號法修改權限

另外,讀者也能夠透過直觀的方式來進行權限的設定,亦即使用 u,g,o 代表使用者、群組與其他人, 然後使用 +, -, = 來加入/減少/直接設定權限,使用表列方式說明如下:

chmodu(user)
g(group)
o(other)
a(all)
+(加入)
-(減去)
=(設定)
r
w
x
檔案或目錄

舉例來說,讓 daemon 可讀可寫可執行 checking 檔案,bin 群組的用戶們為可讀可寫,其他人則為可讀,使用符號法的處理方式:

[root@localhost shm]# chmod u=rwx,g=rw,o=r checking
[root@localhost shm]# ll checking
-rwxrw-r--. 1 daemon bin 0 Mar 14 21:45 checking
  • 其他屬性的修改

假如讀者需要修改時間參數與檔名,就得要使用 touch 與 mv 這兩個指令了。舉例來說, 讓 checking 的修改日期改到 1 月 5 日的中午 12 點(年度不變),實驗的方式如下:

[root@localhost shm]# touch -t 01051200 checking
[root@localhost shm]# ll checking
-rwxrw-r--. 1 daemon bin 0 Jan  5 12:00 checking

至於檔名的修改則是前一堂課談到的 mv 這個指令。

例題 4.1.2-1:實際設定檔案權限
  1. 使用 root 身份,並且移動工作目錄到 /dev/shm
  2. 將 /etc/fstab 複製到 /dev/shm 底下
  3. 將 /dev/shm/fstab 更改檔名成為 newfs
  4. 讓 newfs 的用戶成為 sshd 、群組成為 wheel
  5. sshd 這個帳號可讀、可寫 newfs,wheel 群組成員僅可讀,其他人則無任何權限
  6. 讓這個檔案的日期設定為前一天的 13:30 (日期請依據實際日期來指定)。
  7. 讓所有的人都可以執行 newfs 這個檔案 (請使用符號法,同時不要更動到既有的權限!)

4.2:基礎帳號管理

帳號管理是系統管理員很重要的一個任務,例如學校的教學環境中,教師通常需要預先建置學生的帳號,以方便學期間上課使用。 公司行號一樣也需要讓管理員建置好員工的帳號密碼,才能讓員工順利的辦公。此外,『將帳號分組』也是很重要的一項工作。

4.2.1:簡易帳號管理

讀者應該還記得,要登入系統的時候,需要輸入兩個資料,一個是點選帳號名稱,再來則是輸入該帳號的密碼。 因此,最簡單的帳號管理,即是建立帳號與給予密碼的任務。

請讀者嘗試建立一個名為 myuser1 的帳號,以及給予 MypassworD 的密碼,方式如下:(記得,帳號管理是系統管理員的任務, 所以,身份一定要是 root 才行!)

[root@localhost ~]# useradd  myuser1
[root@localhost ~]# passwd  myuser1
Changing password for user myuser1.
New password:          <==此處輸入密碼
BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word
Retype new password:   <==再輸入密碼一次
passwd: all authentication tokens updated successfully.

[root@localhost ~]# id myuser1
uid=1014(myuser1) gid=1015(myuser1) groups=1015(myuser1)

給予密碼的 passwd 這個指令操作時,有幾個重點,需要特別注意:

  • 單純輸入 passwd 是『修改自己的密碼』,因此,改到誰的密碼是很需要確認的。所以如上表所示, 要特別注意第一行出現的是哪一個帳號 (常常有同學不小心改到 root 的密碼了...)
  • 由於系統管理員可以給予帳號任意的密碼,因此雖然 MypassworD 並不是一個好密碼,不過系統還是予以接受。 但是,還是不要設定太過簡單的密碼,系統很容易被攻破!
  • 出現 New 的關鍵字,代表輸入新的密碼,輸入 Retype 則是顯示剛剛的密碼已經可以被接受。

而若帳號設定錯誤,可以使用 userdel 刪除帳號,例如:

[root@localhost ~]# userdel -r myuser1
# 有趣的是, myuser1 的出現也能用 [tab] 按鈕喔! userdel -r my[tab] 看看!

加上 -r 的目的是要該帳號連同家目錄與電子郵件新件夾通通刪除的意思。如果忘記加上 -r 的話,那就需要手動刪除用戶的家目錄與郵件檔案。 一般帳號自己能不能修改自己的密碼?以及如何修改?參考底下的例題看看:

例題 4.2.1-1:一般帳號修改自己的密碼方式
  1. 先另開一個視窗,用 student 身份,輸入 passwd student 與 passwd ,分別會出現什麼訊息?
  2. 直接輸入 passwd 之後,嘗試修改自己的密碼,分別輸入 123456 以及 password 兩種常見密碼,會出現什麼錯誤?
  3. 請嘗試到一個可以被系統接受的密碼為止。
  4. 最終,請另外再以 root 將 student 密碼修改回原本的 mystdgo !

上面的範例中,我們可以知道一般帳號也是能修改自己密碼的,只是,密碼的強度要夠,否則你的密碼將無法通過系統的強度驗證, 那就無法順利的修改一般用戶的密碼了!接下來,以 root 身份管理其他用戶的帳號與密碼吧!

例題 4.2.1-2:建立與刪除使用者的簡單方式,以及新增用戶時,會產生的系統的新資料!
  1. 建立名為 myuser2 的帳號,該帳號密碼為 mypassWORD
  2. 建立名為 myuser3 的帳號,該帳號密碼為 mypassWORD
  3. 觀察 myuser2 與 myuser3 的 id 情況
  4. 觀察 /home 與 /var/spool/mail 這兩個目錄的內容,是否有名為 myuser2 及 myuser3 的檔名存在?
  5. 使用 userdel myuser2 刪除帳號 (注意,不要加上 -r 的參數)
  6. 再次觀察 /home 與 /var/spool/mail 的內容,myuser2 檔名是否存在?該檔名的權限為何?
  7. 重新建立名為 myuser2 的帳號,密碼亦同為 mypassWORD,嘗試討論 (1)建立過程中出現的問題原因為何? (2)是否能夠順利建立該帳號?
  8. 承上,請在 tty4 以後的終端機,使用 myuser2 登入系統,登入後是否出現問題?為什麼?
  9. 再次使用 userdel -r 的方式刪除 myuser2 與 myuser3,是否能夠順利刪除?
  10. 承上,若無法順利刪除帳號,請以手動的方式自行刪除餘留的使用者家目錄與郵件檔案。

4.2.2:帳號與群組關聯性管理

若需要建立帳號時,給予帳號一個次要的群組支援,就需要先行建置群組。舉例而言,以學校專題製作為例,有三個帳號 prouser1, prouser2, prouser3 加入共有的群組 progroup 時,該如何建立?首先,應該要先建立群組,透過 groupadd 來處理,再來則是透過 useradd --help 找到次要群組支援的選項為 -G 的項目, 即可建立好群組、帳號與密碼。同時,管理員可以透過 passwd --help 找到 --stdin 的選項來操作密碼的給予。整體流程如下:

[root@localhost ~]# groupadd progroup
[root@localhost ~]# grep progroup /etc/group
progroup:x:1001:    <==確定有 progroup 在設定檔當中了

[root@localhost ~]# useradd -G progroup prouser1
[root@localhost ~]# useradd -G progroup prouser2
[root@localhost ~]# useradd -G progroup prouser3
[root@localhost ~]# id prouser1
uid=1001(prouser1) gid=1002(prouser1) groups=1002(prouser1),1001(progroup)

[root@localhost ~]# echo mypassword
mypassword    <== echo 會將訊息從螢幕上輸出

[root@localhost ~]# echo mypassword | passwd --stdin prouser1
Changing password for user prouser1.
passwd: all authentication tokens updated successfully.
[root@localhost ~]# echo mypassword | passwd --stdin prouser2
[root@localhost ~]# echo mypassword | passwd --stdin prouser3

讀者可以發現到使用 passwd --stdin 的方式來給予密碼時,密碼會紀錄到螢幕與 history 的環境中,因此不見得適用於所有需要資安的系統中。 不過對於大量建置帳號時,會是一個很好用的工具。

另外,如果建立好帳號之後才想到要修改群組資源時,不需要刪除帳號再重建,此時可以透過 usermod 來進行修改。舉例來說,當 prouser1 還需要加入 student 群組時, 可以使用 usermod -G 的方式來處理!不過需要留意到 -a 的選項才行。

例題 4.2.2-1:使用 usermod 管理已經存在的帳號之屬性變化
  1. 使用 usermod -G student prouser1 將 prouser1 加入 student 群組的支援,並觀察次要群組支援的狀態
  2. 請使用 usermod --help 查詢 -a 的選項功能為何?
  3. 請使用 usermod -a -G progroup prouser1 來延伸給予群組,並檢查其次要群組的情況喔!

4.3:帳號與權限用途

使用者能使用系統上面的資源與權限有關,因此簡易的帳號管理之後,就需要與權限搭配設計。

4.3.1:單一用戶所有權

一般用戶只能夠修改屬於自己的檔案的 rwx 權限,因此,若 root 要協助複製資料給一般用戶時,需要特別注意該資料的權限。 例如底下的範例中,管理員要將 /etc/tcsd.conf 複製給 student 時,需要注意相關的事宜如下:

[root@localhost ~]# ls -l /etc/tcsd.conf
-rw-------. 1 tss tss 7046 Dec 14 00:44 /etc/tcsd.conf  <==一般用戶根本沒權限

[root@localhost ~]# cp /etc/tcsd.conf ~student/
[root@localhost ~]# ls -l ~student/tcsd.conf
-rw-------. 1 root root 7046 Mar 15 23:13 /home/student/tcsd.conf

[root@localhost ~]# chown student.student ~student/tcsd.conf
[root@localhost ~]# ls -l ~student/tcsd.conf
-rw-------. 1 student student 7046 Mar 15 23:13 /home/student/tcsd.conf

原本 root 複製資料給 student 時,若沒有考量到權限,則 student 依舊無法讀取該檔案的內容,這在資料的複製行為上,需要特別注意才行。

另外,如果使用者想要自己複製指令,或者是進行額外的工作任務,可以將指令移動到自己的家目錄來處理, 例如 student 想要將 ls 複製成為 myls 並且直接執行 myls 來運作系統,可以這樣處理:

[student@localhost ~]$ cp /bin/ls myls
[student@localhost ~]$ ls -l myls
-rwxr-xr-x. 1 student student 166448  3月 15 23:15 myls

[student@localhost ~]$ chmod 700 myls
[student@localhost ~]$ ls -l myls
-rwx------. 1 student student 166448  3月 15 23:15 myls
# 未來這個檔案,就只有 student 自己能玩!

[student@localhost ~]$ myls
bash: myls: 找不到指令...

[student@localhost ~]$ ./myls
Desktop    Downloads  history.log  myls      Public     Templates  Videos
Documents  group      Music        Pictures  tcsd.conf  text1.txt
# 但是,要執行就得要這樣做!當然,也能自己寫入 PATH 變數內!如下:

[student@localhost ~]$ mkdir bin
[student@localhost ~]$ mv myls bin
[student@localhost ~]$ myls
bin      Documents  group        Music     Public     Templates  Videos
Desktop  Downloads  history.log  Pictures  tcsd.conf  text1.txt

若僅想要讓自己執行,可以將權限改為 700 之類的模樣。而『在本目錄執行』則需要使用『 ./command 』的型態來執行, 若想要直接輸入指令即可,那需要放入使用者自己家目錄下的 bin 子目錄才行 (與 $PATH 變數有關)。因此本範例中,最終將 myls 移動到 /home/student/bin/ 目錄下。

例題 4.3.1-1:使用者自己建立的指令程式功能
  1. 讓 student 帳號直接執行 mymore 即可達成與 more 相同功能的目的 (亦即將 more 複製成為 mymore ,並放置到正確的位置即可)

4.3.2:群組共用功能

某些情境下,群組可能需要共享某些檔案資料。舉例來說,在學校做專題時,同組專題成員可能需要個別的帳號,不過卻需要一個共享的目錄, 讓大家可以共同分享彼此的專題成果。舉例來說, progroup 成員 prouser1, prouser2, prouser3 (前小節建置的帳號資料),需要共用 /srv/project1/ 的目錄, 則該目錄的建置與共享可以使用如下的方式來達成:

[root@localhost ~]# mkdir /srv/project1
[root@localhost ~]# chgrp progroup /srv/project1
[root@localhost ~]# chmod 770 /srv/project1
[root@localhost ~]# ls -ld /srv/project1
drwxrwx---. 2 root progroup 6 Mar 16 00:38 /srv/project1/

此時 progroup 的成員即可在 project1 目錄內進行任何動作。但 770 並非最好的處理方式,下一堂課讀者們將會學習到 SGID 的功能, 屆時才會學到較為正確的權限設定。

除了共享目錄之外,在執行檔的可執行權限設計上,也能夠針對群組來給予可執行權,讓其他人不可隨意執行共用的指令。 例如讓 mycat 執行與 cat 相同的結果,但是僅有 progroup 的用戶能夠執行,可以這樣執行:

[root@localhost ~]# which cat
/usr/bin/cat
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# 基本上,我們執行指令時,該指令名稱就會到 PATH 設定的目錄去找,
# 找到的第一個同名的指令,就會被執行喔!

[root@localhost ~]# cp /usr/bin/cat /usr/local/bin/mycat
[root@localhost ~]# ll /usr/local/bin/mycat
-rwxr-xr-x. 1 root root 51856 Mar 16 00:42 /usr/local/bin/mycat

[root@localhost ~]# chgrp progroup /usr/local/bin/mycat
[root@localhost ~]# chmod 750 /usr/local/bin/mycat
[root@localhost ~]# ll /usr/local/bin/mycat
-rwxr-x---. 1 root progroup 51856 Mar 16 00:42 /usr/local/bin/mycat

接下來,請讀者分別以 student 與 prouser1 的身份執行一次『 mycat /etc/hosts 』,即可發現不同點了。

那如何切換身份成為 prouser1 呢?基本上,可以使用『 su - prouser1 』即可切換該身份! 倒不用一定要從其他終端機登入喔!
例題 4.3.2-1:設定群組共用的功能。
  1. 前提與目標:student 有個群組名為 student,任何加入 student 的用戶可以在 /srv/mystudent/ 目錄中進行任何動作,但沒加入 student 的用戶,僅能讀與執行,不能寫入。
  2. 先建立 /srv/mystudent 目錄
  3. 修改上述目錄的群組成為 student,並觀察有沒有修改成功
  4. 最後權限應該更改為幾分才對?

4.4:課後練習操作

  • 上課的課後練習,非作業:
  1. 檔案權限的探索與確認:
    1. 檢視系統上的 /etc/chrony.keys 這個檔案,並且說明這個檔名的:(1)擁有者 (2)擁有群組 (3)權限幾分?
    2. 上述檔名的類型是什麼檔? (一般、目錄、連結或裝置檔等等)
    3. 請問 chrony 這個用戶對於 /etc/chrony.keys 這個檔案,具有什麼權限 (寫下 r/w/x)
    4. 請問 root 對於這個檔案,又具有什麼權限?
  2. 帳號管理:
    1. 建立名為 theuser1, theuser2, theuser3 三個帳號,三個帳號都加入 thegroup 群組,且密碼都是 thisgroup
    2. 觀察 theuser1 的 UID 與 GID 規劃,記下來他是幾號喔!
    3. 單純使用 userdel 不要加上 -r 來刪除 theuser1 這個帳號
    4. 現在,請使用查詢到的 UID 與 GID 資料,來重新建置 theuser1 這個帳號,且這個帳號可以使用原本的家目錄等資源。
  3. 權限管理:
    1. 建立一個名為 /srv/thegroup 目錄,這個目錄可以讓 thegroup 的成員在裡面做任何事情
    2. /usr/local/sbin/myif 複製來自 /sbin/ifconfig 檔案,這個檔案只有 thegroup 成員可以執行,其他人無任何權限。
  • 作業 (不提供學生答案,僅提供教師參考答案)

作業硬碟一般操作說明:

  • 開啟雲端虛擬機器前,請務必確認你開啟的硬碟是『unit04』,否則就會做錯題目
  • 若要使用圖形界面,請務必使用 student 身份登入,若需要切換身份,再啟用終端機處理。
  • 若有簡答題需要使用中文,請自行以第一堂課的動作自行處理輸入法安裝。
  • 每部虛擬機器均有獨特的網卡位址,請勿使用他人硬碟上傳,否則計分為 0 分。
  • 每位同學均有自己的 IP 尾數,請先向老師詢問您的 IP 尾數,才可以進行作業上傳。
  • 最終上傳作業結果,請務必使用 root 身份上傳。
  • 進入作業硬碟後,先用 root 身份執行 vbird_book_setup_ip , 執行流程請參考:vbird_book_setup_ip

作業當中,某些部份可能為簡答題~若為簡答題時,請將答案寫入 /home/student/ans.txt 當中,並寫好正確題號,方便老師訂正答案。 請注意,檔名寫錯將無法上傳!

ps: 請使用 root 的身份進行如下實做的任務。直接在系統上面操作,操作成功即可,上傳結果的程式會主動找到你的實做結果。

  1. (15%)請將底下的答案寫入 /home/student/ans.txt 的檔案中:
    1. 系統內有名為 /examdata/exam.check 的檔案,這個檔案的 (1)擁有者、 (2)群組 各為何?且 (3)權限是幾分?
    2. 承上,該檔案的檔案類型是什麼 (說明是純文字檔?資料庫檔還是 32 位元或 64 位元執行檔等)?
    3. 承上,請問 student 對於 exam.check 這個檔案來說,具有什麼權限?(寫下 rwx 或 --- 等權限標誌即可)
  2. (40%)請『依序』進行如下的帳號管理任務:
    1. 建立三個用戶,帳號名稱分別為: examuser1, examuser2, examuser3 ,三個人都加入 examgroup 的次要群組支援,同時三個用戶的密碼都是『 ItIsExam 』。 (i 與 e 都是大寫字元)
    2. 建立一個用戶,帳號名稱為 examuser4,密碼為『 ItIsExam 』但這個帳號沒加入 examgroup 群組
    3. 請刪除系統中的 examuser5 這個帳號,同時將這個帳號的家目錄與郵件檔案同步刪除。
    4. 有個帳號 myuser1 不小心被管理員刪除了,但是這個帳號的家目錄與相關郵件都還存在。請參考這個帳號可能的家目錄所保留的 UID 與 GID, 並嘗試以該帳號原有的 UID/GID 資訊來重建該帳號。而這個帳號的密碼請給予 ItIsExam 的樣式。(相關建置帳號的指令,請參考 man useradd 等線上文件的說明)
    5. 讓 examuser1 額外加入 student 這個群組,亦即 examuser1 至少有加入 examgroup 與 student 群組
  3. (45%)請進行如下的權限管理任務:
    1. 使用 root 將 /etc/gshadow 複製給 examuser4 (放在這個用戶的家目錄),且這個帳號要能夠完整使用該檔案才行。
    2. 建立一個空的檔案,檔名為 /srv/examcheck.txt,這個檔案可以讓 examuser1 完整的使用,而 examuser2 與 examuser3 可以讀取,但不能執行與寫入, 至於 examuser4 什麼權限都沒有。
    3. examgroup 群組的成員想要共用 /srv/examdir 目錄,而沒有加入 examgroup 的其他人不具備任何權限,應該如何處理?
    4. /usr/local/bin/mymore 複製來自 /bin/more,但我只想要讓 examgroup 的成員能夠執行 /usr/local/bin/mymore 這個指令,其他人不能執行這個指令。
    5. 建立一個名為 /examdata/change.txt 的空檔案,這個檔案的擁有者為 sshd,擁有群組為 users,sshd 可讀可寫,users 群組成員可讀, 其他人沒權限。且這個檔案的修改日期請調整成 2012 年 12 月 21 日 (日期正確即可,時間隨便)

作業結果傳輸:請以 root 的身分執行 vbird_book_check_unit 指令上傳作業結果。 正常執行完畢的結果應會出現【XXXXXX_aa:bb:cc:dd:ee:ff_unitNN】字樣。若需要查閱自己上傳資料的時間, 請在作業系統上面使用瀏覽器查詢: http://192.168.251.254 檢查相對應的課程檔案。 相關流程請參考: vbird_book_check_unit

修改歷史:
  • 2016/07/01:加入了習題項目了!
  • 2017/03/09:修改了習題作業,比較適合做為練習之用喔!
  • 2020/03/16:加入了習題的解答,基本上,變動的幅度不大!
2020/03/16 以來統計人數
計數器
伺服器篇文件
各版本彙整說明
CentOS 6.x