3.3. 使用者與基礎帳號管理
前一頁 | 章 3. FreeBSD 基礎 | 下一頁

## 3.3. 使用者與基礎帳號管理

FreeBSD 允許多使用者同時使用電腦，在一次只能有一位使用者坐在電腦螢幕前使用鍵盤操作的同時，可讓任何數量的使用者透過網路登入到系統。每一位要使用該系統的使用者應有自己的帳號。

本章介紹︰

- FreeBSD 系統中各種類型的使用者帳號。

- 如何加入、移除與修改使用者帳號。

- 如何設定用來控制使用者與群組允許存取的資源的限制。

- 如何建立群組與加入使用者作為群組成員。

### 3.3.1. 帳號類型

由於所有對 FreeBSD 系統的存取是透過使用者帳號來達成，且所有的程序需要經由使用者來執行，因此使用者帳號管理非常重要。

有三種主要類型的帳號：系統帳號、使用者帳號以及超級使用者帳號。

#### 3.3.1.1. 系統帳號

系統帳號用來執行服務，例如 DNS、郵件及網頁伺服器，要這麼作是因為安全性考量，若所有的服務均以超級使用者來執行，那麼這些服務的運作將不會受到限制。

系統帳號的例子有 `daemon`, `operator`, `bind`, `news`, and `www`。

`nobody` 是通用的無權限系統帳號。雖然如此，只有要越多的服務使用 `nobody`，就會有更多的檔案與程式與該使用者相關聯，會讓該使用者擁有更多的權限。

#### 3.3.1.2. 使用者帳號

使用者帳號會分配給實際人員，用來登入及使用系統。每位要存取系統的人員需要擁有一組唯一的使用者帳號，這可讓管理者辨識誰在做什麼以及避免使用者覆蓋其他使用者的設定。

每位使用者可以設定自己的環境來配合自己使用系統的習慣，透過設定預設的 Shell、編輯器、組合鍵 (Key Binding) 及語言設定。

每個在 FreeBSD 系統的使用者帳號都會有一些相關的資訊：

使用者名稱 (User name)

  在 `login:` 提示出現時便要輸入使用者名稱，每位使用者必須要有一個唯一的使用者名稱。要建立有效的使用者名稱要遵守數條規則，在 passwd(5) 中有說明。建議使用者名稱由 8 個或更少的字母組成，全部採用小寫字元以向下相容應用程式。

密碼 (Password)

  每個帳號都會有密碼。

使用者 ID (UID)

  使用者 ID (User ID, UID) 是一組數字用來獨一無二的辨識 FreeBSD 系統的使用者，用到使用者名稱的指令會先將使用者名稱轉換為 UID。建議使用小於 65535 的 UID，超過這個值可能會造成部份軟體的相容性問題。

群組 ID (GID)

  群組 ID (Group ID, GID) 是一組數字用來獨一無二的辨識使用者所屬的主要群組。群組是一個除了使用 UID 之外根據使用者的 GID 來控制資源存取權的機制。這可以顯著的降低某些設定檔的大小且可讓使用者成為一個以上群組的成員。建議使用 65535 或以下的 GID，因超過此值的 GID 可能會讓部份軟體無法運作。

登入類別 (Login class)

  登入類別 (Login class) 擴充了群組機制，當在對不同使用者客製化系統時可提供額外的彈性。在 節 13.13.1, “設定登入類別” 有對登入類別更進一步的討論。

密碼更改時間 (Password change time)

  預設情況下密碼並不會過期，雖然如此，密碼期限可在各別使用者上開啟，可強制部份或所有使用者在某段期間過後更改他們的密碼。

帳號到期時間 (Account expiration time)

  預設情況下 FreeBSD 的帳號不會有期限。當建立需要有限壽命的帳號時，例如，學校的學生帳號，可使用 pw(8) 指定帳號的到期日期。到期日期過後，便無法使用該帳號登入到系統，儘管該帳號的目錄及檔案仍存在。

使用者的全名 (User's full name)

  使用者名稱用來獨一無二的辦識 FreeBSD 的帳號，但並不一定反映了使用者的真實姓名。類似註解，這個資訊可以含有空白、大寫字元並可超過 8 個字母的長度。

家目錄 (Home directory)

  家目錄是系統中某個目錄的完整路徑，這個目錄是使用者登入後的起點目錄。習慣上會將所有使用者目錄放置在 ``/home/username`` 或 ``/usr/home/username``。每位使用者可以儲存他們的個人檔案及子目錄於他們自己的家目錄。

使用者 Shell (User shell)

  Shell 提供了使用者預設的環境來與系統互動。有數種不同類型的 Shell，有經驗的使用者會有自己偏好的選擇，可儲存在自己的帳號設定。

#### 3.3.1.3. 超級使用者帳號

超級使用者帳號，通常稱作 `root`，用來管理系統，沒有權限的限制，也因這個原因，該帳號不應該用來做每日的例行作業，如：寄信與收信、系統的一般探索或程式設計。

超級使用者並不像其他使用者帳號，可以沒有限制的操作，不正確的使用超級使用者帳號可能會造成可觀的災害。一般使用者帳號不會因為失誤而法摧毀作業系統，所以建議登入一般使用者帳號，只有在指令需要額外權限時切換為超級使用者。

使用超級使用者下指令時永遠要再三檢查，由於一個多餘的空白或缺少的字元可能意味著無法挽回的資料遺失。

有數種方法可以提升為超級使用者權限，雖然可以直接登入為 `root`，但強烈不建議這樣做。

改使用 su(1) 切換為超級使用者。執行此指令時若指定 `-` 參數，該使用者會繼承 root 的使用者環境。執行此指令的使用者必須在 `wheel` 群組中，否則指令會失敗。使用者也必須要知道 `root` 使用者帳號的密碼。

在此例當中，該使用者只在要執行 `make install` 時切換為超級使用者，因為這個步驟需要超級使用者權限。指令完成之後，該使用者輸入 `exit` 離開超級使用者帳號並返回他的使用者帳號權限。

範例 3.1. 以超級使用者的身份安裝程式

    % configure
    % make
    % su -
    Password:
    # make install
    # exit
    %

內建的 su(1) 框架在單人系統或只有一位系統管理者的小型網路可以運作的很好。另一種方式是安裝 security/sudo 套件或 Port。此軟體提供了活動記錄且允許管理者設定那個使用者可以用超級使用者執行那個指令。

### 3.3.2. 管理帳號

FreeBSD 提供了各種不同指令來管理使用者帳號，最常用的指令已摘要於 表格 3.1, “管理使用者帳號的工具”，接著有一些用法的範例。請參考每個工具的操作手冊來取得更多詳細的資訊與用法範例。

表格 3.1. 管理使用者帳號的工具

指令 | 摘要
--- | ---
adduser(8) | 建議用來新增新使用者的指令列應用程式。
rmuser(8) | 建議用來移除使用者的指令列應用程式。
chpass(1) | 用來更改使用者資料庫資訊的工具。
passwd(1) | 用來更改使用者密碼的指令列工具。
pw(8) | 用來修改使用者帳號各方面資訊強大且靈活的工具。

#### 3.3.2.1. `adduser`

建議用來新增新使用者的程式為 adduser(8)。當新使用者新增之後，此程式會自動更新 `/etc/passwd` 以及 `/etc/group`，這同時也會建立新使用者的家目錄 (複製 `/usr/share/skel` 中的預設設定檔)，並且可以選擇是否要寄送歡迎訊息通知新使用者。這個工具必須使用超級使用者執行。

adduser(8) 工具採用互動的方式，只需幾個步驟便可建立新使用者帳號。如 範例 3.2, “在 FreeBSD 新增使用者” 所示，可輸入必填的資訊或按 Return 鍵採用方括中的預設值。在此例當中，使用者被邀請加入 `wheel` 群組，這讓使用者可使用 su(1) 變成超級使用者。完成之後，此工具會詢問是否要建立其他的使用者或離開。

範例 3.2. 在 FreeBSD 新增使用者

    # adduser
    Username: jru
    Full name: J. Random User
    Uid (Leave empty for default):
    Login group [jru]:
    Login group is jru. Invite jru into other groups? []: wheel
    Login class [default]:
    Shell (sh csh tcsh zsh nologin) [sh]: zsh
    Home directory [/home/jru]:
    Home directory permissions (Leave empty for default):
    Use password-based authentication? [yes]:
    Use an empty password? (yes/no) [no]:
    Use a random password? (yes/no) [no]:
    Enter password:
    Enter password again:
    Lock out the account after creation? [no]:
    Username   : jru
    Password   : ****
    Full Name  : J. Random User
    Uid        : 1001
    Class      :
    Groups     : jru wheel
    Home       : /home/jru
    Shell      : /usr/local/bin/zsh
    Locked     : no
    OK? (yes/no): yes
    adduser: INFO: Successfully added (jru) to the user database.
    Add another user? (yes/no): no
    Goodbye!
    #

### 注意:

由於密碼在輸入時並不會顯示，在建立使用者帳號時要小心密碼不要輸入錯誤。

#### 3.3.2.2. `rmuser`

要自系統完全移除一個使用者可使用超級使用者執行 rmuser(8)。這個指令會執行以下步驟：

1. 移除使用者的 crontab(1) 項目，若項目存在。

2. 移除任何屬於該使用者的 at(1) 工作。

3. 中止所有該使用者擁有的程序。

4. 自系統本地密碼檔移除該使用者。

5. 選擇性移除該使用者的家目錄，若使用者擁有該目錄。

6. 自 `/var/mail` 移除屬於該使用者的收件郵件檔。

7. 自暫存檔儲存區域 (如 `/tmp`) 移除所有使用者擁有的檔案。

8. 最後，自 `/etc/group` 中該使用者所屬的所有群組移除該使用者。若群組無任何成員且群組名稱與該使用者名稱相同，則該群組也會一併移除。這是為了輔助 adduser(8) 替每位使用者建立獨一無二的群組。

rmuser(8) 無法用來移除超級使用者帳號，因為這幾乎代表著大規模破壞。

預設會使用互動式模式，如下範例所示。

範例 3.3. `rmuser` 互動式帳號移除

    # rmuser jru
    Matching password entry:
    jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zsh
    Is this the entry you wish to remove? y
    Remove user's home directory (/home/jru)? y
    Removing user (jru): mailspool home passwd.
    #

#### 3.3.2.3. `chpass`

任何使用者都可以使用 chpass(1) 來變更自己的預設 Shell 以及與自己的使用者帳號關聯的個人資訊。超級使用者可以使用這個工具更改任何使用者的其他帳號資訊。

除了選填的使用者名稱外，未傳入任何選項時，chpass(1) 會開啟含有使用者資訊的編輯器。當使用者自編輯器離開，便會更新新的資訊到使用者資料庫。

### 注意:

離開編輯器時，此工具會提示使用者輸入密碼，除非使用超級使用者執行此工具。

在 範例 3.4, “以超級使用者的身份使用 `chpass`” 中，超級使用者輸入了 `chpass jru` 並正在檢視這個使用者可以更改的欄位。若改以 `jru` 執行這個指令，只會顯示最後六個欄位供編輯，如 範例 3.5, “以一般使用者的身份使用 `chpass`” 所示。

範例 3.4. 以超級使用者的身份使用 `chpass`

    #Changing user database information for jru.
    Login: jru
    Password: *
    Uid [#]: 1001
    Gid [# or name]: 1001
    Change [month day year]:
    Expire [month day year]:
    Class:
    Home directory: /home/jru
    Shell: /usr/local/bin/zsh
    Full Name: J. Random User
    Office Location:
    Office Phone:
    Home Phone:
    Other information:

範例 3.5. 以一般使用者的身份使用 `chpass`

    #Changing user database information for jru.
    Shell: /usr/local/bin/zsh
    Full Name: J. Random User
    Office Location:
    Office Phone:
    Home Phone:
    Other information:

### 注意:

指令 chfn(1) 以及 chsh(1) 皆連結至 chpass(1)，就如同 ypchpass(1), ypchfn(1) 以及 ypchsh(1) 的關係。自從 NIS 支援自動化以後，便不再需要特別加上 `yp`，如何設定 NIS 在章 29, 網路伺服器 中有說明。

#### 3.3.2.4. `passwd`

任何使用者皆可簡單的使用 passwd(1) 更改自己的密碼。要避免意外或未授權的變更，這個指令在設定新密碼之前會提示使用者輸入原來的密碼。

範例 3.6. 更改您的密碼

    % passwd
    Changing local password for jru.
    Old password:
    New password:
    Retype new password:
    passwd: updating the database...
    passwd: done

超級使用者可以更改任何使用者的密碼透過在執行 passwd(1) 時指定使用者名稱。當此工具以超級使用者執行時，將不會提示輸入使用者目前的密碼，這可在使用者忘記原來的密碼時更改密碼。

範例 3.7. 以超級使用者的身份更改其他使用者的密碼

    # passwd jru
    Changing local password for jru.
    New password:
    Retype new password:
    passwd: updating the database...
    passwd: done

### 注意:

如同 chpass(1)，yppasswd(1) 連結到 passwd(1)，因此 NIS 在兩個指令上皆可運作。

#### 3.3.2.5. `pw`

pw(8) 工具可以建立、移除、修改以及顯示使用者與群組，它的功能是做為系統使用者與群組檔的前端。pw(8) 有非常強大的的指令列選項集，這讓該指令非常適合用於 Shell scripts，但新的使用者可能會發現它比其他在本節的指令要複雜許多。

### 3.3.3. 管理群組

群組代表一群使用者，群組可以由其群組名稱及 GID 來辨識。在 FreeBSD，核心會使用程序的 UID 以及其所屬的群組清單來決定程序可以做那些事。大多數情況使用者或程序的 GID 通常指的是清單中的第一個群組。

群組名稱與 GID 的對應表列在 `/etc/group`。這個純文字檔案使用了四個以冒號分隔的欄位，第一個欄位為群組名稱，第二個欄位為加密後的密碼，第二個欄位為 GID 以及第四個欄位為以逗號分隔的成員清單。要取得更完整的語法說明，請參考 group(5)。

超級使用者可以使用文字編輯器修改 `/etc/group`，或者可使用 pw(8) 加入與編輯群組。例如，要加入一個叫做 `teamtwo` 的群組然後確認該群組已新增：

範例 3.8. 使用 pw(8) 新增群組

    # pw groupadd teamtwo
    # pw groupshow teamtwo
    teamtwo:*:1100:

在本例中，`1100` 是 `teamtwo` 的 GID。目前 `teamtwo` 沒有任何成員，這個指令會加入 `jru` 作為 `teamtwo` 的成員。

範例 3.9. 使用 pw(8) 加入使用者帳號到新的群組

    # pw groupmod teamtwo -M jru
    # pw groupshow teamtwo
    teamtwo:*:1100:jru

給 `-M` 的參數是以逗號分隔的使用者清單，用來加入成員到新的 (空的) 群組或取代既有群組中的成員。對使用者來說這裡的群組成員與使用者列於密碼檔的主要群組不同 (額外的)，這代表在 pw(8) 使用 `groupshow` 時不會顯示做為使用者主要群組的成員，但會顯示在使用 id(1) 或同類工具所查詢的資訊當中。當使用 pw(8) 來加入使用者到某個群組，該指令只會處理 `/etc/group` 且不會嘗試自 `/etc/passwd` 讀取其他的資料。

範例 3.10. 使用 pw(8) 加入新成員到群組

    # pw groupmod teamtwo -m db
    # pw groupshow teamtwo
    teamtwo:*:1100:jru,db

在本例當中，給 `-m` 的參數是以逗號分隔的使用者清單，用來加入使用者到群組。不像前面的例子，這些使用者會加入到群組，而非取代既有群組中的使用者。

範例 3.11. 使用 id(1) 來查看所屬群組

    % id jru
    uid=1001(jru) gid=1001(jru) groups=1001(jru), 1100(teamtwo)

在本例中，`jru` 是群組 `jru` 以及 `teamtwo` 的成員。

要取得更多有關此指令的資訊及 `/etc/group` 的格式，請參考 pw(8) 以及 group(5)。

前一頁 | 上一層 | 下一頁
3.2. 虛擬 Console 與終端機 | 起始頁 | 3.4. 權限

本文及其他文件，可由此下載： ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/。

若有 FreeBSD 方面疑問，請先閱讀 FreeBSD 相關文件，如不能解決的話，再洽詢 <questions@FreeBSD.org>。
關於本文件的問題，請洽詢 <doc@FreeBSD.org>。