iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0
自我挑戰組

[機派X] 無人機與樹莓派的相遇 Linux不只是過客系列 第 5

[機派X] Day 5 - Linux 隱藏壞壞的媒體檔案

引言

今天是機派X系列文章的第五天。
昨天介紹了 Linux 的檔案系統與一些指令,今天要繼續介紹使用者及權限管理相關概念,當然也會介紹許多實用的相關指令。

本篇大綱:

  • 引言
  • Linux 的權限管理機制
  • 我是誰
  • 變更使用者的密碼
  • 群組的概念
  • 使用者之王
  • 創建新使用者
  • 檔案權限管理
  • 關於本文章系列

Linux 的權限管理機制

首先,讓我們來討論為何需要做權限管理?
Linux 是一個多人(Multi User)多工(Multi Task)的作業系統,同一台電腦可能會有多個不同的使用者,為了保護每個使用者的資料隱私與安全性,所以需要權限管理,舉個簡單的例子來說:你總不會希望儲存在共用電腦中的私人聊天紀錄被其他人看到吧!權限管理除了保護每個使用者的隱私之外,也能有限度的將部份資料與其他使用者共享,例如你可以將自己的研究論文授權給指導教授觀看及修改,但又能防止其他同學偷看你的論文內容。而權限管理機制更能保護整個系統的安全性,防止懷抱惡意的陌生人亂搞系統,僅允許系統維護者查看、變更系統設定,並為系統適時的安裝軟體或更新套件。

由此可知,權限管理相當重要,就連大多數人愛用的 Windows 都有權限管理的機制。例如你在使用學校電腦時,若是想要安裝軟體,卻被 Windows 要求輸入管理員密碼,這就是權限管理的一種,透過權限管理可以避免學生自行安裝各式各樣的軟體。

Linux 系統本身也有權限管理機制,在 Linux 的世界中,權限管理是由使用者(User)的角度出發,針對不同使用者做相對應的權限設定,以達成權限管理的目標。

以上提到的使用者(User),指的是實體的人(或說操作系統的人)。然而,當你面對電腦時,電腦又該如何辨識身份呢?Linux 採用帳號(Account)的方式來處理,帳號是權限管理中的最小單位,使用不同帳號登入系統,系統就會視為不同人在操作電腦,不過若是使用相同帳號登入系統,則系統就會認為同一個身份的人在操作電腦。

同一個系統中,通常一個人會擁有一個帳號,這樣才能為每個人獨立做權限設定。帳號(Account)又常常會被稱為使用者(User),然而這邊的使用者與前段所講的使用者內涵不同,以下所指稱的使用者(User)是指系統中的帳號,因為在 Linux 的世界裡認的是帳號,而非實體的使用者。

我是誰

是否還記得,樹莓派開機後會需要輸入 ubuntu 作為使用者名稱(Username)與密碼,這其實就是驗證使用者的身份,當驗證成功後(密碼與使用者名稱都正確),才能進入 bash 環境中。當進入 bash 環境中,我們就能以 ubuntu 這個身份操作系統。

變更使用者的密碼

前面有提到過,Linux 是只認使用者不認操作者(也就是實體的人),因此如果別人使用你的帳號與密碼登入系統,在系統上就會留下「你」的足跡。我們登入時使用的帳號與密碼都是預設 ubuntu,這種資訊在網路上非常容易取得,因此我們應該變更使用者或修改密碼以防有心人士冒用我們的名義登入系統。

修改密碼其實很簡單,只需要透過 passwd 就可以完成了:

passwd [OPTION] [LOGIN]

passwd 的全名是 password,passwd 指令其中一個功能就是變更使用者的密碼。輸入 passwd 預設操作是變更當前使用者的密碼,如果想要變更其他使用者的密碼,只需要把 LOGIN 換成其他使用者名稱就可以了。

以下直接輸入 passwd 來變更當前登入的使用者(ubuntu)的密碼。

Changing password for ubuntu.
Current password: 
New password: 
Retype new password: 
passwd: password updated successfully

Note :
若需要詳細的指令說明,別忘了善用 man 或者是網路資源喔!

群組的概念

前面提到 Linux 以使用者為基底來執行權限管理,接下來要介紹的是群組(Group)的概念。有時候執行授權時,會針對一群使用者賦予權限,而非只是單一一位使用者,例如:你與三位同學一同製作某份專案報告,為了讓你們四位在系統中的身份有別,所以你們必須使用四個不同帳號,但是四個帳號卻又需要擁有報告檔案的存取權,此時就可以用到群組。將四位使用者加入到一個相同群組後,只要再把檔案的存取權限指定給該群組就可以讓群組中的四位使用者共享存取權。

也許你會問,為什麼不要四個人共用同一個帳號就好呢?這樣只需要一個帳號就好,組成群組很麻煩。
Answer:如果四個實體使用者共用同一個帳號,請問該如何分辨是誰搞砸呢哪件事呢?例如:系統日誌中記載 Project_A 使用者於今日早上 8:05 升級了某軟體,而這次的升級導致你們寫好的程式無法運行,此時若要追查是誰做的好事便會有困難,因為嫌疑人一共有四個,而且搞不好是多人「共謀」犯案,要追查事情原委、甚至復原系統便會相對不容易。

使用者之王

在實際帶領大家操作權限相關指令前,需要介紹一個很重要的使用者。

在 Linux 中有一個很特別的使用者,叫做 root ,root 是一個系統內建的使用者,擁有至高無上的權力,講的更具體一點就是「root 可以做任何事」。不管做什麼權限設定,只要是 root 出場,就能夠無視相關權限設定,直接霸王硬上弓。

由於 root 使用者權限很大,因此一般狀況下,不會直接以 root 身份登入系統,因為一個不小心就可能搞砸整個系統,通常只有管理系統時,我們才會暫時以 root 身份登入,結束管理作業後便會立刻登出 root 身份。
能力愈大,責任愈重
圖源傳送門

如果要以 root 身份登入,理論上只要先從當前使用者登出(之前提到的 exit 指令),接著在登入時使用 root 當作 username ,並輸入 root 帳號的密碼即可成功登入。

Note :
上面有提到一個很重要的關鍵詞「理論上」,之所以說是理論上是因為 root 的權限很大,為了維護系統安全,很多 Linux 發行版預設會禁止使用者以 root 身份登入,而必須間接取得 root 帳號的相關權限。至於如何間接取得權限,請參閱下面的說明。

如果每次管理系統時都要登出再登入再登出再登入,我想一般人會不開心、想要把樹莓派對折吧!
我把我對褶,輕輕把你也對褶
圖源傳送門

Note :
前面提到的「登出再登入再登出再登入」是指:

  1. 登出 - 登出目前使用者(Ex : ubuntu)
  2. 登入 - 登入 root
  3. 登出 - 登出 root
  4. 登入 - 登入目前使用者(Ex : ubuntu)

因此這時要介紹一個很重要的指令 sudo ,用法簡述如下:

sudo COMMAND

sudo 可以讓你暫時以 root 的身份執行 COMMAND ,而無須直接登入 root 帳號,通常 COMMAND 可以是任何指令。

不過究竟哪位使用者能夠使用 sudo 呢?如果每位使用者都能使用 sudo 切換成 root 來操作系統,那就失去 Linux 原有的權限機制了!原先透過基本的帳號、密碼機制來控制 root 帳號可以由哪位實體使用者使用,然而 sudo 的授權機制則比較不同,當某位使用者被加入到 sudo 群組後,便取得了使用 sudo 切換成 root 的權力。

Note :
sudo 群組是系統內建的群組,理論上只要是在 sudo 群組中的使用者都可以使用 sudo 指令切換身份至 root 來執行其他指令。

預建的使用者 ubuntu 其實早已在 sudo 群組中,因此之後會用到 sudo 的指令大家可以直接操作。通常作業系統安裝過程中所建立的使用者都會被自動加入到 sudo 群組中。然而,之後手動建立的使用者如果需要用到 root 權限,則需要手動被加入至 sudo 群組中。

創建新使用者

由於 ubuntu 是系統預先建立的使用者,因此容易成為壞壞份子攻擊的目標。接下來讓我們建立一個名叫 crazylab 的新使用者,並藉由這個過程學習權限相關的指令。

Step1. 創建使用者

透過 useradd 指令來創建新使用者,-m 引數可以幫新創的使用者建立家目錄,如果不希望使用者有家目錄的話可以不加 -m 引數。

sudo useradd -m crazylab

Note :
使用者的設定檔通常會儲存於家目錄中,因此建議給每位使用者家目錄,以免之後還要另外設定徒增困擾。通常家目錄預設會建立在 /home 目錄當中,如果希望建立在其他地方(例如:外接硬碟)可以使用 -b 引數來指定其他位置。

useradd 並非每位使用者都能執行,必須先取得 root 權限才能使用。因此如果直接執行 useradd 會報出權限錯誤,因此必須加 sudo 讓 useradd 以 root 身份執行。

ubuntu@ubuntu:~$ useradd -m crazylab
useradd: Permission denied.
useradd: cannot lock /etc/passwd; try again later.

Step2. 變更使用者密碼

還記得之前用過的 passwd 指令嗎?就是用它沒錯!不過因為是變更別的使用者(別忘了,你現在是 ubuntu 使用者)的密碼因此需要 root 權限!

sudo passwd crazylab

Step3. 取得 root 權限

你可以用前幾天提過的 Ctrl + Alt + Fx 來切換至其他獨立 shell ,然後嘗試以 crazylab 使用者登入。
crazylab 使用者已經可以使用了,只是該使用者無法使用 sudo 切換成 root 操作系統,如果你嘗試執行 sudo 會出現錯誤訊息如下。

crazylab is not in the sudoers file.  This incident will be reported.

接下來,讓我們將 crazylab 加入 sudo 群組中吧!(別問了要切回 ubuntu 使用者喔!)
使用 usermod 可以變更使用者相關的設定,最後的 crazylab 是要作用到的目標使用者,而 -a -G sudo 則是將使用者加入至群組 sudo 中。因為我們是修改其他使用者,因此加 sudo 是必要的!

sudo usermod -a -G sudo crazylab

將 crazylab 加入 sudo 群組中之後,已登入的 crazylab 必須要重新登入設定才會生效喔!
登入 crazylab 後,試試看 sudo 是否能正常執行呢?

Step4. 變更 shell

以 crazylab 登入時是否覺得怪怪的?

$

理論上應該是這樣才對吧!

crazylab@ubuntu:~$

因為新建的使用者預設是用 sh 當作 shell 而非 bash,接下來讓我們用 chsh 把預設 shell 改回 bash 吧。
chsh 全文是 change shell,可以變更使用者預設的 shell,-s 引數後方接新的 shell。

如果是以 crazylab 使用者執行 chsh 的話無須 root 權限,因為是變更自己的預設 shell,只是執行指令時會需要 crazylab 的密碼。完成設定後,別忘了重新登入設定才會生效喔!

# Login as crazylab.
chsh -s /bin/bash

如果是以 ubuntu 使用者執行 chsh 的話就會需要 root 權限,因為是變更別人的預設 shell。

# Login as ubuntu.
sudo chsh -s /bin/bash crazylab

Step5. 刪除使用者

之後我打算都以 crazylab 使用者登入,為了避免之後荒廢的 ubuntu 使用者帶來麻煩,讓我們將這位開疆闢土的大前輩刪除吧!
使用 userdel 可以刪除使用者,-r 引數可以一併刪除使用者的家目錄。

如果你在登入 ubuntu 的情況下想要刪除 ubuntu 那就會收到 ubuntu 使用中的錯誤訊息。

userdel: user ubuntu is currently used by process 16629

因此請先登出 ubuntu 並用 crazylab 登入,執行 userdel 時別忘了,你是刪除別的使用者,因此要加 sudo。

sudo userdel -r ubuntu

此時,如果你嘗試用 ubuntu 登入,會發現登入失敗。
也可以用 ls 來檢查 /home 中 ubuntu 目錄已被刪除。

檔案權限管理

本篇最後,讓我們來討論 Linux 的檔案權限管理。

之前使用 ls -l 時,應該可以看到類似的輸出訊息:

crazylab@ubuntu:~$ ls -l 
total 4
-rw-rw-r-- 1 crazylab crazylab 13 Sep 17 03:02 fruit.txt

有沒有好奇這串詳細資料代表什麼呢?
其實其中的部份資料與檔案或目錄的權限管理有關。

其中 crazylab crazylab 分別表示該檔案(或目錄)是屬於哪個使用者的(稱為 owner)、又是隸屬哪個群組(稱為 group)的。
而 -rw-rw-r-- 則是決定檔案(或目錄)隸屬的使用者及群組具有什麼權限。

-rw-rw-r-- 可以被切割成以下幾段:

編號 分斷 用途
1 - 用於指示這是個檔案還是目錄,- 代表檔案,d 代表目錄。
2 rw- 決定檔案(或目錄)隸屬的使用者所擁有的權限。r 代表具有讀取權限,w 代表具有寫入權限,x 代表具有執行權限,若沒有該權限會以 - 表示。
3 rw- 決定檔案(或目錄)隸屬的群組所擁有的權限。r 代表具有讀取權限,w 代表具有寫入權限,x 代表具有執行權限,若沒有該權限會以 - 表示。
4 r-- 決定其他人所擁有的權限。

檔案 fruit.txt(表格中的編號 1 欄位,因為是 - 不是 d,所以知道是個檔案)是使用者 crazylab 所擁有的(第一個 crazylab)。從表格中的編號 2 欄位可知,crazylab 可以讀取檔案內容、也可以寫入(或說變更)檔案,由於執行權限的部份是 - 所以得知並沒有執行權。

雖然 fruit.txt 是由 crazylab 使用者擁有,但是為了因應多人共同編輯的需求(可以參考前面說明群組時舉的例子),我們可以將 fruit.txt 指定權限給某個特定群組,該群組中的使用者便會擁有檔案的存取權。從表格中的編號 3 欄位可知,fruit.txt 隸屬於群組 crazylab,因此該檔案目前沒有被設定讓其他使用者或群組得以存取。在 crazylab 群組中的使用者擁有讀取與寫入的權限,但沒有執行權。

Note :
創建使用者的時候,系統會幫該位使用者創建一個同名的群組,而該群組中不會有任何使用者。以 crazylab 使用者來說,crazylab 群組會在 useradd 執行時被自動建立。建立同名群組的目的是,當檔案或目錄沒有打算共享(設定群組)時,可以直接套用與使用者同名的群組,就類似空頭帳戶的概念。

而如果要對 fruit.txt 操作的使用者既不是前面提到的檔案擁有者,也不是檔案被指定的群組,那該怎麼辦呢?此時存取權限就會由表格中的編號 4 欄位欄位來決定,我們可以得知不是 crazylab 使用者,也不在 crazylab 群組中的使用者對 fruit.txt 的操作只剩讀取權限,而不具有寫入與執行權限。

若是要變更檔案或目錄的權限設定,可以使用 chmod 指令,請參考下方語法。
FILE 代表要變更權限的檔案或路徑,MODE 代表權限設定。MODE 的撰寫方式有很多種,其中一種方式是「使用者代號±權限代號」的形式。

chmod MODE FILE

上面提到的 MODE 撰寫方式可以參考下表:

使用者代號 描述
u user,表示擁有檔案的使用者(owner)。
g group,表示擁有檔案的群組(group)。
o other,表示其他人(other)。
a all,表示代號 u、g 與 o。
權限代號 描述
r read,表示讀取權限。
w write,表示寫入權限。
x execution,表示執行權限。

舉例來說:

# 移除群組的寫入權限。
chmod g-w fruit.txt

# 給予其他人讀取與寫入權限。
chmod o+rw fruit.txt

以上就是 Linux 的檔案權限管理,在本篇的最後留給讀者一個練習:

  1. 請創建三個使用者:professor、mary、ken 。
  2. 給予 professor 使用者 root 權限,但不要給予 mary 與 ken root 權限。
  3. 請用 groupadd 創建一個群組 shineteam,並將 professor、mary、ken 都加入至群組中。
  4. 用 professor 使用者的身份建立一個目錄 Project A,並讓 shineteam 群組中的使用者都能讀取並寫入 Project A 目錄中的所有檔案與目錄。

關於本文章系列

如果對於文章內容有建議、糾錯或圖源標示不正確的問題,歡迎參考 [機派X] Day 1 嘗試與文章作者聯絡。
想看更多本系列的文章,請連結至 [機派X] Day 1 查看大綱。


上一篇
[機派X] Day4 - Bash 指令原來如此容易
下一篇
[機派X] Day 6 - Linux 沒網路,我要怎麼發鐵人賽的文章
系列文
[機派X] 無人機與樹莓派的相遇 Linux不只是過客15
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言