第 2 堂課 - 權限的意義與管理、帳號的建置與管理
上次更新日期 2018/10/03
上週的檔案處理流程中,同學應該會發現到,某些檔案使用 student 一般帳號是沒有辦法進行複製與讀取的。 那麼檔案的權限如何觀察?檔案的權限如何修改與相關的意義?另外,既然講到權限了,那麼不同的帳號使用的權限當然不同! 所以,就得要來了解一下基礎帳號的管理 (建置、刪除) 囉!
- 2.1: Linux 權限基礎
- 2.2: 權限的管理
- 2.3: 基礎帳號管理
- 2.4: 本日練習
- 2.5: 課後練習
2.1: Linux 權限基礎
Linux 的權限概念目的在於讓『檔案』跟『帳號』有相關性,讓檔案或許能夠在帳號間分享,或者能夠讓帳號保密住該檔案等等的用途。 因此,權限就是設定在檔案上面的項目!簡單說,在 Linux 底下的任何一個檔名 (目錄或一般檔案) 都是一個物件,這個物件誰可以使用,就是重點。 所以,權限的目的,就是在規範:『某一個檔案是誰可以讀取、寫入與執行』的概念!
- 權限基礎認知:三種身份 - 使用者、群組與其他人
為了方便管理與設定,所以,針對每一個物件 (檔案),Linux 會給予該物件三種身份的權限,分別是『使用者、群組與其他人』。 想像一下,你的家庭。你買的包包是屬於你的,但是可能你的包包會借給你的家人使用,但是不是你自己也不是你的家人可以用嘛? 那就是其他人的權限!於是,這個包包就可以讓你規範成為『我自己、我家人、路人甲乙丙』這三種基本身份的權限囉!
如果以目前年輕人可能經常使用的 Facebook 社團軟體的概念來說,權限概念的使用有點像這樣:
- 就跟 FB 一樣,你可以將一個訊息 (檔名) 分享給 A 用戶 (使用者) 或是在 B 社團 (群組) 當中發布,而不 A 個人也不是加入 B 社團的其他帳號,當然就是其他人!
- 因此,你可以想像,所謂的群組就是 FB 成立的社團,目的不在於『社團』而是『加入這個社團的帳號可以做些什麼』, 重點還是在『帳號』上面喔!群組只是讓我們管理員可以快速的做某些檔案權限的設計而已。
- 總之,針對一個檔案來說,這個檔案會有 (1)所屬帳號 (2)所屬群組與 (3)其他人 的三種身份的權限,使用英文來表示就是:
- u: user, 使用者
- g: group, 群組
- o: other, 其他人
- 每種身份具有的權限: read, write, execute
以檔案來說,到底你需要檔案的什麼權限呢?好簡單喔!就是讀、寫、執行而已~英文是:
- r: read, 讀取
- w: write, 寫入
- x: executable, 可執行
所以,身份與權限的結果就是:共有三組人,每組人有三個可能的權限,因此就會有 9 個權限 (3X3 的緣故),使用簡單的 rwx 來做解釋的話,就會變成:
- 全部的權限都存在: rwxrwxrwx
- 全部的權限都不存在: ---------
如果用圖示的方法來看,例如當你使用『 ll /etc/hosts 』時,產生這樣的結果:
[student@localhost ~]$ ll /etc/hosts -rw-r--r--. 1 root root 158 Jun 7 2013 /etc/hosts
上面的輸出中,特殊字體的部份就是我們要注意的!如果以圖示來說,他會有點像這樣:
共分為七個欄位,其他欄位都很好解釋~但是三種身份與權限的對應是怎麼回事呢?看底下這張圖:
- 每一個檔案會分配給哪三種身份有各別的權限?
- 每一種身份具有哪幾種權限?
- 承上,這些權限的英文符號為何?
- 用『 ll 』去觀察檔名時,最左邊的字元代表什麼?例如 - 與 d 各別代表什麼?
- 開始觀察檔案的權限
根據上面的說法,讓我們來看看 /etc/hosts 這個檔案的相關權限屬性:
[student@localhost ~]$ ll /etc/hosts -rw-r--r--. 1 root root 158 Jun 7 2013 /etc/hosts
你會發現到幾個事情如下:
- 該檔名為一般檔案 (不是目錄檔,是一般檔)
- 該檔名屬於 root 這個帳號的
- 該檔名屬於 root 這個群組的
- root 這個用戶具有可讀可寫 (rw-) 的權限
- 加入 root 群組的所有帳號,具有可讀 (r--) 的權限
- 不是 root 帳號,也沒有加入 root 群組的其他帳號,具有其他人的可讀 (r--) 的權限。
好像還挺容易的啊!不過,還有一件事要注意,那就是,你怎麼知道 A 帳號有沒有加入 B 群組?舉例來說,系統上面的 student 這個帳號, 有沒有加入 root 群組呢?這個時候就需要使用 id 這個指令來查詢了:
# 1. 查看 student 自己支援的群組有哪些? [student@localhost ~]$ id uid=1000(student) gid=1000(student) groups=1000(student) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 # 2. 查看有沒有 vbird 這個帳號? [student@localhost ~]$ id vbird id: vbird: no such user # 3. 查看 bin 這個帳號的支援群組 [student@localhost ~]$ id bin uid=1(bin) gid=1(bin) groups=1(bin)
gid 後面接的是原生群組,至於 groups 後面接的則是所有群組。如此一來,我們知道 student 並沒有加入 root 群組,因此,對於 /etc/hosts 來說, student 就是其他人 (other) 的權限。
- 是一般檔案、目錄檔案還是特殊檔案
- 擁有者是誰
- 擁有群組為何
- 擁有者的權限為何?
- 加入群組的帳號擁有的權限為何?
- 其他人的權限為何?
- student 的權限為何?
- root 的權限為何?
- mail 的權限為何?
- 一般檔案與目錄檔案的權限差異
事實上,權限相當的麻煩!上面的觀察只是一個基本的概念而已。你要知道的是,目錄的功能是放置檔案,那麼目錄為什麼需要有『執行 x 』權限? 也就是說,有人在執行目錄的嘛?當然沒有~那目錄的權限到底是什麼?其實,這都要從一般檔案與目錄檔案的『內容』來理解的。
- 一般檔案的內容就是文字、資料庫、執行程式碼等等,因此, r 為讀取檔案內容, w 為修改檔案內容, x 為讓檔案內容具有執行權的意思。
- 目錄檔案的內容是檔名,因此 r 為可列出檔名, w 為可修改檔名, x 就是讓用戶進入該目錄成為工作目錄。
若以較人性化的角度來思考,讓檔案變成資料卷宗、目錄變成抽屜,則 rwx 的功能彙整如下表:
元件 | 內容 | 思考物件 | r | w | x |
檔案 | 詳細資料data | 文件資料卷宗 | 讀到文件內容 | 修改文件內容 | 執行文件內容 |
目錄 | 檔名 | 可分類抽屜 | 讀到檔名 | 修改檔名 | 進入該目錄的權限(key) |
讀者須注意,目錄的 rw 與『檔名』有關,而檔案的 rw 則與『檔案的內容,包括程式碼與資料等』有關。比較特別的是目錄的 x,該權限代表用戶能否打開抽屜取得該抽屜內的檔名資料。
很難理解嘛?沒關係,現在請開啟兩個終端機,一個用 root 權限,一個用 student 權限,然後觀察一下相關的資料內容:
先用 root 權限進行底下的觀察:
[root@localhost ~]# ll -rw-------. 1 root root 2166 Jan 3 2017 anaconda-ks.cfg -rw-r--r--. 1 root root 2214 Jan 3 2017 initial-setup-ks.cfg [root@localhost ~]# ll -d / /root dr-xr-xr-x. 20 root root 4096 Jun 6 08:38 / dr-xr-x---. 17 root root 4096 Oct 2 22:59 /root
回答下列問題:
- 針對 /root/initial-setup-ks.cfg 檔名來說, studnet 具有什麼身份?具有什麼權限?
- 針對 /root 檔名來說, studnet 具有什麼身份?具有什麼權限?
再用 student 的權限進行底下的觀察
[student@localhost ~]$ ll -d / [student@localhost ~]$ ll -d /root [student@localhost ~]$ ll /root [student@localhost ~]$ cat /root/initial-setup-ks.cfg
請回答上述指令可成功或失敗的原因,主要是因為哪個權限所致?
- 前往 /dev/shm
- 建立名為 student 的目錄
- 進入 /dev/shm/student 目錄下
- 觀察家目錄的檔案,應該會有 anaconda-ks.cfg initial-setup-ks.cfg 兩個檔案
- 將兩個檔案連同權限資料全部複製到 /dev/shm/student 去
- 直接以『 ll /dev/shm/student 』觀察檔案是否順利複製成功
- 分別使用 cat anaconda-ks.cfg 及 cat initial-setup-ks.cfg
- 分別說明成功與失敗的原因。
- 說明 /root/initial-setup-ks.cfg 及 /dev/shm/student/initial-setup-ks.cfg 內容與權限有無不同?
- 承上,那 student 對這兩個檔案的權限有無不同?
- 承上,那 student 最終具有的權限 (考量上層資料) 有無不同?
2.2: 權限的管理
從上面的分析,現在你知道一個檔案會有三種身份的 rwx 權限,所以共有 9 個權限。此外,你也可以修改 owner, group 的位置的使用者與群組名稱。
管理員有時候需要調整權限,就像前面說的,你有可能要在 Line 或 FB 上面建立社團,然後將社團成員拉進來吧!?然後調整社團的隱私性質吧? 沒錯!在 Linux server 底下也一樣,有時候你要針對你的專題組員進行檔案的共享或隱私,這都需要管理員的處理。因此, 底下我們先以管理員的身份來進行各項練習喔!
- chown :修改檔案的『擁有者』,就是修改使用者名稱欄位
修改檔案的所屬用戶,使用『 chown 帳號名稱 檔名 』 來處理
[student@localhost ~]$ su - (先切換身份,否則無法進行底下的任務) [root@localhost ~]# cp -a /etc/hosts myfile (複製檔案並修改檔名) [root@localhost ~]# ll myfile (先查看原本的權限資訊) -rw-r--r--. 1 root root 158 Jun 7 2013 myfile # 注意,我們要修改的是上面那個特殊字體的 root 位置喔! [root@localhost ~]# id bin (看看有沒有 bin 這個帳號的存在,若沒有就會顯示無帳號) uid=1(bin) gid=1(bin) groups=1(bin) [root@localhost ~]# chown bin myfile (更改檔案所屬人) [root@localhost ~]# ll myfile (看看有沒有更改成功) -rw-r--r--. 1 bin root 158 Jun 7 2013 myfile
這樣就改完檔案擁有者的屬性了。現在,請問一下,針對 myfile 來說:
- student 具有什麼權限?
- bin 具有什麼權限?
- root 具有什麼權限?(其實是最特別的概念)
全系統都屬於 root 所有,所以,所有的權限對於 root 來說,都是沒有限制的!
- chgrp :修改檔案的『擁有群組』,就是修改群組名稱欄位
修改檔案的所屬群組,使用『 chgrp 群組名稱 檔名 』 來處理。另外,你要先知道的是,系統所有紀錄的群組都會在 /etc/group 裡面,因此, 如果你想要事先知道某個 A 群組是否存在於系統中,可以使用擷取指令『 grep 』來處理。
# grep 的基本語法 [root@localhost ~]# grep 'keyword' filename # 找出 /etc/services 是否存在 https 這個關鍵字: [root@localhost ~]# grep https /etc/services https 443/tcp # http protocol over TLS/SSL https 443/udp # http protocol over TLS/SSL https 443/sctp # http protocol over TLS/SSL oob-ws-https 664/tcp # DMTF out-of-band secure web services management protocol .... # 找出是否有 vbird 這個關鍵字在 /etc/services 檔案內? [root@localhost ~]# grep vbird /etc/services
如果有存在關鍵字,那就會有訊息跑出來,如果不存在關鍵字,那就不會有訊息跑出來!很簡單的!那就來觀察檔案的群組變化吧!
# 先檢查一下是否有存在 sshd 這個群組名稱在系統上? [root@localhost ~]# grep sshd /etc/group (確認一下有沒有 sshd 這個群組的存在呢?) sshd:x:74: (恩!是存在這個群組沒問題!) [root@localhost ~]# ll myfile (再次觀察群組欄位的資料) -rw-r--r--. 1 bin root 158 Jun 7 2013 myfile [root@localhost ~]# chgrp sshd myfile (群組直接去設定,若無群組就會回報錯誤) [root@localhost ~]# ll myfile (再次查看有沒有成功) -rw-r--r--. 1 bin sshd 158 Jun 7 2013 myfile
這樣就改完檔案群組的屬性了。現在,請問一下,針對 myfile 來說:
- student 具有什麼權限?
- bin 具有什麼權限?
- sshd 具有什麼權限?
- chmod :修改三種身份的個別權限
因為有三個人,每個人有 rwx ,如果 r 是 4 分, w 是 2 分,x 是 1 分時,那麼每個身份會有一個分數,最低分就是 0 ,最高分就是 7,因此, 依據 『使用者、群組、其他人』 的權限排列,最低分為 『000』 ,最高分為 『777』 這樣。
- 全部的權限都存在: rwxrwxrwx: 777
- 全部的權限都不存在: ---------: 000
- 某些權限存在的情況: rwxr-x---: 750
修改檔案的權限,使用『 chmod 權限分數 檔名 』 來處理
[root@localhost ~]# ll myfile -rw-r--r--. 1 bin sshd 158 Jun 7 2013 myfile [root@localhost ~]# chmod 764 myfile [root@localhost ~]# ll myfile -rwxrw-r--. 1 bin sshd 158 Jun 7 2013 myfile
這樣就改完權限的屬性了。現在,請問一下,針對 myfile 來說:
- student 具有什麼權限?
- bin 具有什麼權限?
- sshd 具有什麼權限?
- 你要在 /dev/shm/perm/ 底下,將 /etc/hosts 複製成為 /dev/shm/perm/check.txt 檔案
- 在 /dev/shm/perm 底下,將 check.txt 檔案的權限修改成為如下的模樣:
- bin 為擁有者,且具有 rwx 的權限
- mail 為擁有群組,且具有 rx 的權限
- 其他人只有讀取的權限
- 每個步驟完成後,請立即查閱才好!
2.3: 基礎帳號管理
管理員一定會更動到系統的帳號與權限,例如我們要建立專題同組員的聯繫,就需要用到帳號管理。而一般最簡單的帳號管理,就是 (1)建立帳號, (2)給予密碼這兩個動作而已,不要想的太難。只是,如果還需要類似 Line 的建立聊天室,就需要建立共同群組囉!
- 帳號的建立
當我們登入系統時,會輸入的資訊有帳號與密碼,因此,建立新的帳號也一樣,需要的就是帳號名稱與密碼資料。 此外,當帳號建立後,該帳號會主動的在 /home 底下建立一個相同帳號名稱的目錄,作為該帳號的家目錄。
帳號的管理方式:記得,要有帳號與密碼喔!
- 帳號:帳號的建立使用 useradd 來處理,請先 useradd --help 查看可以加的選項,之後使用『 useradd 帳號名稱 』
- 密碼:密碼的給予使用 passwd 來處理,直接『 passwd 帳號名稱 』即可
# 基本語法: [root@localhost ~]# useradd 帳號名稱 [root@localhost ~]# passwd 帳號名稱 # 嘗試建立一個名為 myuser1 的帳號,密碼為 hehepw01 [root@localhost ~]# id myuser1 id: myuser1: no such user (確定現在是沒有這個帳號的) [root@localhost ~]# useradd myuser1 (開始建立帳號) [root@localhost ~]# passwd myuser1 (開始給予此帳號一個密碼,但是要輸入兩次) Changing password for user myuser1. New password: (這裡輸入一次) Retype new password: (這裡再輸入一次) passwd: all authentication tokens updated successfully. [root@localhost ~]# id myuser1 uid=1001(myuser1) gid=1001(myuser1) groups=1001(myuser1)
最後建議還是要用 id 這個指令來確認一下該帳號是否順利的建置妥當較佳。
- 帳號名稱: mystd1
- 密碼內容: hahapw11
- 帳號的刪除方式
記得使用 userdel -r 這個 -r 的選項才行!,刪除直接用『 userdel -r 帳號名稱』 即可。 但是不要隨意刪除帳號,除非你知道自己是在幹麻,否則系統預設的帳號千萬不要惡搞!
# 刪除帳號的語法: [root@localhost ~]# userdel -r 帳號名稱 # 刪除剛剛建立的 myuser1 這個帳號 [root@localhost ~]# id myuser1 (再次確認有沒有這個帳號) uid=1001(myuser1) gid=1001(myuser1) groups=1001(myuser1) [root@localhost ~]# ll /home drwx------. 3 myuser1 myuser1 78 Oct 3 12:00 myuser1 (確認有這個用戶的家目錄) drwx------. 14 student student 4096 Oct 2 11:29 student [root@localhost ~]# userdel -r myuser1 (就刪除吧!) [root@localhost ~]# id myuser1 (確認應該是不存在囉!) id: myuser1: no such user [root@localhost ~]# ll /home (確認家目錄也不在囉!) drwx------. 14 student student 4096 Oct 2 11:29 student
事實上只有一個指令,就是『 userdel -r myuser1 』就搞定了!為啥要搞的這麼複雜?這都是為了要理解這些指令背後的意義啦! 也方便未來出問題,你可以快速的找到答案!
- 群組的管理
加入使用者到某個群組或移除的方式
- 增加群組使用:『 groupadd 群組名稱 』
- 將某個用戶加進這個群組:『 usermod -a -G 群組名稱 帳號名稱 』,完成後使用『 id 帳號名稱 』檢查即可
# 基本語法的說明 [root@localhost ~]# groupadd 群組名稱 [root@localhost ~]# usermod -a -G 群組名稱 帳號名稱 [root@localhost ~]# id 帳號名稱 # 重點在觀察有沒有更改成功
假設我們要建立一個新的群組,名稱為 mygroup 好了,然後將 student 加入這個群組當中。執行的流程會有點像這樣:
[root@localhost ~]# grep mygroup /etc/group (先檢查有沒有這個群組的存在,沒有訊息是好訊息) [root@localhost ~]# groupadd mygroup (增加這個群組名稱) [root@localhost ~]# grep mygroup /etc/group (再次檢查,這次則是必需要看到輸出訊息) mygroup:x:1001: [root@localhost ~]# id student (先檢查 student 的支援群組) uid=1000(student) gid=1000(student) groups=1000(student) [root@localhost ~]# usermod -a -G mygroup student [root@localhost ~]# id student (再檢查一次囉!) uid=1000(student) gid=1000(student) groups=1000(student),1001(mygroup)
群組的刪除則用『 groupdel 群組名稱 』即可!例如,將剛剛的群組刪除看看。
[root@localhost ~]# id student uid=1000(student) gid=1000(student) groups=1000(student),1001(mygroup) [root@localhost ~]# groupdel mygroup uid=1000(student) gid=1000(student) groups=1000(student)
刪除很快速喔!
- 帳號的建立:
- 建立一個名為 alex 的帳號
- 密碼請設定為 'GoGo123_' 這樣 (英文大小寫、數字、符號搭配)
- 群組的建立與分配:
- 建立一個名為 mypro 的群組
- 並且將 alex 加入到這個群組當中。
- 帳號的額外目錄利用:
- 建立名為 /srv/alex/ 的目錄
- 讓這個目錄屬於 alex 擁有,且擁有群組為 mypro
- 且 alex 具有完整的權限,且加入 mypro 的用戶具有 rx 的權限,其他用戶無權限
- 帳號的實際使用:
- 按下 [ctrl]+[alt]+[F2] 來到文字畫面,使用 alex 登入看看
- 登入後,按下 w, whoami, pwd 看看相關的帳號登入與訊息
- 前往 /srv/alex 並且嘗試將 /etc/hosts 複製到本目錄,並觀察檔案權限
- 最終請登出 alex 用戶
- 按下 [ctrl]+[alt]+[F1] 回到原本的圖形畫面。
2.4: 本日練習
現在來複習一下今日的動作,作為本日的點名與查驗資訊。請在目前的雲端機器上面完成底下的實做,要完成且讓老師檢查完畢後,才可以離開教室喔!
本日的練習請記得使用 root 的權限來處理
- 帳號建置:
- 建立 myuser1, myuser2, myuser3 三個帳號
- 且三個帳號的密碼都是 iamuser1 這樣
- 群組建置與管理:
- 建立名為 myproject 的群組
- 將這三個帳號加入 myproject 群組的支援當中
- 共享目錄的建置:
- 在 /srv 底下建立名為 project 的目錄
- 該目錄屬於 myproject 群組,且加入 myproject 的用戶具有 rwx 的完整權限,其他人則沒有任何權限,無法進入該目錄!
- 實際用戶的操作練習
- 在 tty2 嘗試使用 myuser1 進入 /srv/project ,並複製 /etc/hosts 成為 /srv/project/myuser1
- 在 tty3 嘗試使用 student 進入 /srv/project,看看結果是如何?
- 資料檢查:
- 請按右上角的設定,去啟動網路
- 使用 ifconfig 這個指令,找出你的 IP 後,告訴老師你的 IP 號碼 (例如 172.16.8.8),老師會線上檢查你是否完成作業了!
2.5: 課後練習
請撰寫一個 word 檔案,檔名為:『 unit02-A050cxxx-你的名字.docx 』,內容回答下列問題,然後每週作業上傳到對應的 EP 上面去:
- 檔案權限的概念:
- 傳統 Linux 的檔案中,針對『使用者身份』來說,每個檔案會有哪幾種分份的權限設定?
- 承上,每一種身份具有哪幾種權限?分別用中文、英文與代表權限的符號說明
- 觀察 /var/spool/at 這個檔名,並且回答 (1)是一般檔案還是目錄檔案? (2)擁有者 (3)群組 (4)權限是幾分
- 你想要觀察 daemon 這個帳號的 UID 與 GID,應該用什麼指令查詢?
- 修改一個檔案的擁有者,是用哪個指令?
- 修改一個檔案的群組名稱,是用哪個指令?
- 修改一個檔案的權限 (rwx),是用哪個指令?
- 帳號的建置需要哪兩個指令的支援?
- 群組的建置是使用哪一個指令?
- 系統整理:
- 將 tty2, tty3 登入的帳號登出,讓系統保持只有 tty1 才有登入的狀態
- 刪除剛剛建立的 mypro, myproject 等群組
- 刪除剛剛建立的 alex, myuser1, myuser2, myuser3 等帳號
- 刪除剛剛建立的 /srv/alex, /srv/project 等目錄
- 群組、帳號的管理
- 新增名為 prouser1, prouser2 這兩個帳號,且密碼均為 hehepw12
- 新增 progroup 群組,且將 prouser1, prouser2 加入此群組當中
- 完成之後使用『 id prouser1; id prouser2; ll /home 』檢測,然後將結果拍照貼上
- 共享目錄的建置
- 建立名稱為 /srv/prodir/ 目錄,此目錄可以提供給 progroup 的群組內帳號完整使用,其他人則無任何權限。
- 完成後請輸入『 ll /srv 』檢測,然後將結果拍照貼上
- 實際操作
- 透過 root 帳號,切換身份成為 prouser1 ( su - prouser1 )
- 切換工作目錄到 /srv/prodir/ 去
- 將 /etc/crontab /etc/cron.d 複製到當前的工作目錄下
- 用 vim 打開 /srv/prodir/crontab ,第一行加入你的學號與姓名,完成之後儲存離開
- 在 /srv/prodir/ 裡面執行『 id; ll -R . ; head -n 5 crontab 』,將輸出的結果拍照貼上。
同場加映:不用上傳的資料,請 google 一下打字時,手指與鍵盤指法的對應,然後自由練習底下的資訊:
- 小寫的 a~z (abcdefg...xyz) ,共打 10 次
- 小寫的 0~9,a~z (012..89abcdefg...xyz) ,共打 10 次
- 不要啟動大寫燈,用組合按鍵輸入 A-Z (ABCD...XYZ),共 10 次
每天上課各練一次,最慢 10 天,你的打字就會嚇嚇叫了!