Home | SmbFTPD | Forum |
|
第四章 使用者管理 FreeBSD 是一個多重使用者的作業系統,在系統可有存在多個使用者。使用者的管理可以說是系統管理最基本的議題,在系統一安裝完成時,我們就必須進行使用者的新增及設定。 本章將介紹和使用者相關的管理知識,包括:
4.1 帳號管理 4.1.1 新增使用者 新增使用者時,我們會以 adduser 這個指令來進行,adduser 指令其實是將新增使用者所必須做的事寫成一個執行檔來自動幫我們做,在 FreeBSD 4.x 是以 perl 所寫成,而 FreeBSD 5.x 改以 shell scripts 來實作。為了了解系統對於使用者管理細節,讓我們先回顧一下上一章關於使用 adduser 新增使用者的過程。在 4.x 和 5.x adduser 指令的細節有一點不同,但大同小異。
執行了 adduser 之後,首先要輸入使用者名稱,使用者名稱除了英文字、數字及 -_ 外不可以包含其他特殊字元。
接著我們要輸入使用者全名,這個欄位可以是空的,如果您不輸入則直接按 Enter 即可。
這個欄位是使用者編號,直接留白按 Enter 即可,系統會自動指定。
輸入使用者群組名稱,群組名稱預設會自動產生一個和新增的使用者同名的群組,如果要使用不同的群組,必須先手動新增群組。我們直接按 Enter 即可。
是否要將新的使用者加入其它群組,由於這是我們新增的第一個一般使用者,所以我們將它加入系統管理者 wheel 這個群組,讓他可以使用 su 這個指令來切換身份成 root。
登入的類別,這是用來分類控制使用者對於系統資源的使用,請參考下一節系統資源限制的說明。在這裡我們直接按 Enter 使用預設值即可。
輸入所要使用的 Shell,建議輸入 tcsh,如果您不想讓該使用者登入系統,可以輸入 nologin。
輸入使用者的家目錄,也就是使用者在系統中的資料夾,所有使用者的目錄我們都放在 /home 下,所以我們直接按 Enter 即可。
是否要使用密碼認証的方式,預設為是,我們直接按 Enter 即可。
是否要使用空密碼,預設為否。
是否使用隨機產生的密碼,如果使用隨機產生的密碼,在新增完畢後,系統會告知我們產生的密碼,預設為否。
輸入該使用者的密碼。
再輸入一次密碼,以確認輸入無誤。
在新增完使用者後,是否要先將該帳戶關閉。 看了 adduser 指令的過程,您對於新增使用者應有的步驟應該已經有初步的了解了,接下來我們要介紹 adduser 這個指令到底做了哪些事。
知道了以上的流程,我們也可以手動自己做上述的步驟,但我們必須先知道 group 及 master.passwd 等檔案的格式。所以我們接下來要介紹這些檔案。
4.1.2 /etc/group 介紹 在使用者的管理方面,FreeBSD 大致上可以分為群組管理及帳號管理。每一個帳號至少屬於一個群組,這樣子有利於權限控制。例如學生的帳號就有一個學生群組,而老師的帳號就屬於教師群組,某幾位老師屬於管理者的群組。這樣一來,我們除了可以針對個人設定權限外,也可以針對不同群組給予不同的權限。 每個使用者預設都會有一個群組,這個預設群組是設定在 /etc/master.passwd,我們會在下一小節中說明。而您也可以將使用者加入其它群組中,這些其它加入的群組設定是在 /etc/group 中,在群組後面加上使用者名稱即可。 /etc/group 這個檔案就是記錄群組的檔案,這是一個文字檔,我們可以使用 ee 等文字編輯軟體打開它。在 group 檔案中,其格式如下:
每一個欄位以冒號分開,以最後一行為例,第一個欄位代表群組名稱為 teachers,而群組代號(gid) 是 1001。我們可以自行使用文字編輯器加入想要的群組名稱及 gid,但要注意的是群組名稱和 gid 不能重覆。 第一行的最後面是 root,alex,表示該群組成員。由於記錄使用者資料的檔案中只能記錄使用者的預設群組,如果使用者還屬於其他群組,則必須記錄在 /etc/group 中。例如使用者 alex 的預設群組是 alex,我們希望他同時是 webadmin 群組,則我們必須在 webadmin 群組後加上該使用者。 在 FreeBSD 中,如果其他使用者要能使用 su 變成超級使用者的話,必須將其帳號加入 wheel 群組中。 # pw groupadd newgroup # pw groupshow newgroup newgroup:*:1002: 第一個指令是以參數 groupadd 來新增群組 newgroup,再以參數 groupshow 來顯示 newgoup 的資訊。 4.1.3 /etc/master.passwd 介紹 FreeBSD 使用 shadow password 的方式來保護密碼檔,只有 root 才可以讀取編碼後的密碼檔 /etc/master.passwd。但是這並不是系統用來驗証的檔案,為了加快速度,FreeBSD 將該檔做成資料庫 /etc/spwd.db 及 /etc/pwd.db, 因此在修改完 master.passwd 後,必須使用指令 pwd_mkdb 來將 master.passwd 做成資料庫檔案。不過一般而言,我會使用 vipw 這個指令來修改 master.passwd,vipw 會先將 master.passwd 以預設的文書編輯軟體打開,修改完存檔後,它會視需要自動更新資料庫。如果您沒有修改過 ~/.cshrc,則預設的文書編輯軟體是 vi。vi 在使用上比較複雜,如果您要離開編輯器,請依序按 [Esc] : q ! 再按 Enter 即可不存檔離開。關於 vi 的用法,您可以參考第三章相關章節。 在執行 vipw 之後,會出現:
master.passwd 這個檔案內容中,每個使用者都是獨立的一行,每個欄位使用冒號分開,它的格式是: name:password:UID:GID:class:change:expire:fullname:home:shell 每個欄位的說明如下:
# expr `date +%s` + 86400 \* 30
我們可以看到在 master.passwd 中已經有許多使用者,這些使用者是系統服務的使用者。例如 smmsp 是郵件伺服器的 daemon 所使用的使用者名稱。nobody 這個使用者是預設無任何權限的使用者,但有很多系統服務軟體的預設使用者都是 nobody,我們應該要注意不要以 nobody 負責為太多服務,否則它不就變成了擁有許多權限的使用者了嗎! 4.1.4 刪除使用者 知道了新增使用者的步驟後,您大概已經知道要怎麼刪除使用者了吧。只要把新增使用者的步驟反過來即可。
以上這些步驟其實就是指令 rmuser 所做的事。我們可以使用這個指令來快速的移除使用者帳號。以下即為 rmuser test 的執行結果:
4.2 系統資源限制 如果您的 FreeBSD 系統允許多位使用者同時使用,每個使用者可能同時執行許多工作,例如 Alex 可能會執行龐大的數學運作程式,而 Tom 在系統中執行佔用大量記憶體的資料庫程式。如此一來,我們的系統資源將全部被幾個使用者耗盡,其他正常的系統服務便無法擁有較高的效能。我們不能單純的假設系統中所有使用者都會乖乖的使用單純的服務,因此,在一個多重使用者的環境中,系統管理者有必要針對每個使用者限於他們所可以使用的系統資源,例如 CPU、記憶體、磁碟空間的使用量等。 4.2.1 登入類別 我們在新增使用者時會設定使用者的 login class,所謂的 login class 就是將使用者分類管理,以限制不同類別的使用者對於系統資源的使用。 /etc/login.conf 定義了不同的 login class。這個檔案中所有對於使用者限制的設定都是以 key=value 的方式來表示。這些限制大部份是針對某個使用者所執行的某一個行程 (process) 所能佔用的資源,而非該使用者全部執行的行程所佔用的資源總合。因此,除了每個行程所能佔用的資源外,我們還會設定使用者最多可以執行多少個行程。 以下為 /etc/login.conf 中關於 default class 的設定:
以下為關於系統資源限制的欄位說明,每一個欄位都有可使用的數值類型,例如 size、time 等,讓我們來看看每個欄位的說明:
以下為上表中數值類型的說明:
當要修改類別時,我們以將 default class 複製一份,並更名為其他類別,最後再進行編輯。類別新增完畢後,我們必須執行下列指令以重建系統資料庫。 # cap_mkdb /etc/login.conf 接下來我們就可以執行 vipw 在想要限制的使用者的 class 的欄位填入我們新增的類別了。 除了限制系統資源的使用外,我們也可以使用 login.conf 來客制化每個使用者的登入環境、所使用的語言等,請 man login.conf 以得到更多的說明。
4.2.2 磁碟配額 當系統中有多位使用者時,如果其中一個人擁有大量檔案,那麼其它使用者便無法有足夠的空間來使用。如果系統有許多使用者,而又不限制他們對磁碟的使用量,那麼磁碟很容易就會爆掉,因此我們必須對使用者加以限制。您可以限制系統中每個使用者可使用的硬碟大小(quota)。步驟如下:
完成了上述的步驟並重新開機之後,我們就可以使用指令 edquota 來編輯磁碟配額。首先,以指令 edquota -u tom 進入文書編輯,我們通常會加入二行,一行限制檔案大小,一行限制檔案數:
共中 blocks 代表使用者使用檔案大小總合,而 inodes 代表檔案數目。soft limits 代表使用量達到多少時提出警告,而 hard limits 代表使用量達多少時立刻禁止寫入。 上面的範例中,使用者 tom 目前使用的檔案大小為 65K,在檔案大小總合為 50000K 時提出警告,55000K 時禁止寫入。目前該使用者有7個檔案,在檔案數達 5000 個時提出警告,達 6000 個時禁止寫入。 我們也可以使用 edquota -p tom 2000-3000 來以使用者 tom 的設定為範例,將 UID 為 2000 到 3000 的使用者設定為和 tom 一樣。或者使用指令 edquota -p tom jack rose 來以使用者 tom 為範例,將 jack 及 rose 的設定變成和 tom 一樣。 您可以使用 quota -v tom 來看使用者 tom 目前的使用情形,或使用 repquota 來查看所有使用者目前的使用情形。 在 FreeBSD 3.2 以後的版本,系統開機後預設會檢查所有使用者的 quota,但這必須要花上一段時間,如果您不想在開機時自動檢查 quota 的話,請在 /etc/rc.conf 中加入下列設定:
在 FreeBSD 3.2 版以前,開機內定是不檢查 quota 的,如果你想在開機時即檢查的話,請在 /etc/rc.conf 中加入下列設定:
4.3 大量新增帳號 對於大型主機的管理者而言,要大量新增帳號時,若沒有一套"撇步"的話,使用 adduser 指令來新增帳號將會非常累人,所以我們必須要想出一個大量新增帳號的方法。 大量新增帳號的方法有很多,最簡單的就是寫一個程式來處理,只要依照之前提及的新增帳號步驟使用程式來一步步建立或在程式中呼叫 FreeBSD 系統中新增帳號的指令並經由迴圈來完成。但是 adduser 指令會問一堆問題,不適合拿來作程式中要呼叫的指令,所幸在 FreeBSD 中還有一個管理使用者帳號及群組的程式 pw ,所以筆者就以指令 pw 加上一些控制來寫成 script。 一般而言,如果要新增的帳號是沒有規則性的,那麼就必須先將帳號做成一個文字檔,再以程式讀入。若帳號是有規則性的,則可以給定參數來完成。您可以在本書所附的第二片光碟中的 examples 目錄中找到筆者所寫的「新增大量帳號」程式,檔名是 adduser.tar.gz。 這個程式可以使用檔案匯入帳號及密碼,或只給帳號並自動產生密碼,最後將帳號及密碼存成一個檔案(預設是 adduser.log)。我們也可以使用連續產生帳號的方式,產生一堆連續的帳號,產生的結果同樣會放成 adduser.log 中。 首先,將第二片光碟放入光碟機中,並使用下列指令將檔案複製到 root 的目錄下: # mount /cdrom # cp /cdrom/examples/adduser.tar.gz /root/ 將檔案放到硬碟中後,請切換目錄到 /root 並以下列指令解壓縮: # cd /root # tar zxvf adduser.tar.gz 解壓縮後,進入 adduser 目錄,你可以看到該目錄中有下列檔案:
adduser.pl 這個程式的使用方式如下:
在執行完 adduser.pl 之後,在該目錄下會產生一個 adduser.log,這個檔案將記錄我們新增的使用者及其密碼。 4.4 備份與移轉 在了解了新增使用者的步驟後,您對於備份使用者的作法在心中應該也有個譜了吧。在更新系統時,使用者的資料需要備份的有:
4.4.1備份 除非我們和使用者間已有共識,不幫使用者備份其郵件及檔案,否則平常想要備份使用者資料的話,這是一件麻煩且費時的工作。不管是外在因素或是硬體固障,系統都有可能資料流失。對於一個公眾伺服器的管理者而言,事前明白告知使用者系統管理的原則是一件十分重要的事。如果未事前請使用者自行備份個人的檔案及郵件的話,首先,備份的工作將非常耗時,尤其是使用者擁有大量檔案時。再者,若未備份檔案,當系統資料流失時,容易和使用者產生爭議,就算平常每天都有備份,也只能保住備份當時的檔案,從備份到系統出問題的時候所產生的檔案就無法回復了。 如果不必備份使用者個人資料的話,就只需把 /etc/master.passwd 及 /etc/group 存在別的儲存設備或電腦中,要回復時只要依下列移轉的步驟做即可。 4.4.2 移轉 如果系統中已有其它使用者,要先編輯 /etc/group,加入和備份的 group 檔案有差異的地方,再使用 vipw 來將加入和備份的 master.passwd 有差異的地方。如果新系統中無其它使用者,則將所備份的 master.passwd 及 group 放到新電腦的 /etc 下,再執行下列指令以將密碼檔轉成資料庫格式即可: # pwd_mkdb -p -d /etc /etc/master.passwd 如果沒有要移轉使用者個人資料的話,也必須建立使用者家目錄及郵件目錄。如果要移轉使用者目錄的話,記得移轉後要檢查一下該目錄的所有人是不是該使用者。如果不是,就必須使用下列指令來將使用者目錄擁有者更改為所屬的使用者: # chown -R user:group /home/user 上面這個指令是將 /home/user 這個目錄及其下所有目錄的所有人變成使用者名稱為 user,群組為 group。 # tar clf - . | tar xvpf - -C /home 來將使用者資料複製到 /home 中。並依此方法 mount 使用者郵件目錄磁區並複製到 /var/mail 下即可。 4.5 使用歷程記錄 4.5.1 記錄使用者指令 為什麼要記錄使用者下過的指令?並不是為了要監視使用者,而是在系統有問題時,可以找出原因。找出使用者曾經使用過哪些指令,以了解問題的所在。FreeBSD 提供指令 lastcomm 讓你查看系統中使用者執行的指令,但是你必須先修改 /etc/rc.conf,加上下列一行設定:
系統會將使用者的歷程記錄在 /var/account/acct* 中,最新的記錄是 acct,隨著資料越來越多,系統每天會將該檔案移成 acct1,而 acc1 將變成 acct2,依此類推。如果站上使用者很多的話,acct 的檔案將變得非常大,所以你必須確保該目錄有足夠的空間存放資料,為了避免檔案過多,系統內定只會保留最近四天的資料。 當下達指令 lastcomm 時,如果我們未使用任何參數,則系統會以 /var/account/acct 為參考,印出所記錄的資料。你也可以使用 lastcomm -f acct1 來查看前一天的資料。 4.5.2 監看使用者 當使用者登入系統後,root 可以使用 watch 指令來取得線上使用者的視窗畫面。也就是說當下達指令後,root 所看到的畫面就會和該線上使用者一樣。我們可以觀察該使用者在做些什麼事,輸出的結果又是什麼。 這個指令並不是要給人拿來做壞事用的。如果有不友善的使用者登入系統時,可以使用它來觀察該使用者的動作,並適時阻止。
最後使用下列指令新增 snoop device: # cd /dev # ./MAKEDEV snp0 snp1 snp2 snp3 接下來就可 watch 指令了。首先,先下指令 w 來看一下站上有哪些使用者。指令結果的第二個欄位部份,有使用者的 tty,例如 p0、v0 等,選定要監看的使用者後,使用 watch ttyp0 來監看該使用者,其中 ttyp0 即該使用者的 tty。你可以使用 CTRL+X 來切換不同的 tty,也可以使用 CTRL+G 離開回到自己的畫面。 4.5.3 控制 root 的使用 如果我們有在 wheel 群組中加入一般的使用者,則該使用者可以使用指令 su 並輸入 root 的密碼後變成超級使用者。但如果系統中有多位使用者具有 root 的權限,我們根本不知道是誰使用了 root 的權限、執行了哪些指令;如果我們想針對不同人給予不同的權限,例如一個人只有備份的權限、另一個人只能觀看系統設定,su 也無法達成我們的要求。因此有人發展出 sudo 這個軟體來支援系統的管理。 不過 sudo 並不是 FreeBSD 系統內定的指令,我們必須自己安裝。所幸 FreeBSD 己將該軟體移植到 "port" 中,我們只要執行下列指令即可輕鬆的安裝了。由於在 port 中 sudo 的安裝設定並未打開 sudo 執行指令記錄,如果你希望它能將執行 sudo 的 log 記下來的話,必須先編輯 /usr/ports/security/sudo/Makefile,將 CONFIGURE_ARGS 中的參數 --disable-log-wrap 拿掉。 # cd /usr/ports/security/sudo # make install clean 安裝完後,我們要先執行 /usr/local/sbin/visudo 以設定 sudo 的設定檔 (/usr/loca/etc/sudoers)。以下簡單說明該設定檔如何設定,詳細說明及範例請參考 /usr/local/etc/sudoers.sample:
設定完後,使用者即可執行 sudo <允許的指令> ,使用者只要輸入自己的密碼即可,不必知道 root 的密碼,而且 5 分鐘內再次執行 sudo 時不需再輸入密碼。如果你有打開 log 記錄功能,sudo 執行成功或失敗的 log 都將被記錄到 /var/log/sudo.log 中。詳細說明請閱讀說明 man sudo。
|