第四章 使用者管理

FreeBSD 是一個多重使用者的作業系統,在系統可有存在多個使用者。使用者的管理可以說是系統管理最基本的議題,在系統一安裝完成時,我們就必須進行使用者的新增及設定。

本章將介紹和使用者相關的管理知識,包括:

4.1 帳號管理

4.1.1 新增使用者

新增使用者時,我們會以 adduser 這個指令來進行,adduser 指令其實是將新增使用者所必須做的事寫成一個執行檔來自動幫我們做,在 FreeBSD 4.x 是以 perl 所寫成,而 FreeBSD 5.x 改以 shell scripts 來實作。為了了解系統對於使用者管理細節,讓我們先回顧一下上一章關於使用 adduser 新增使用者的過程。在 4.x 和 5.x adduser 指令的細節有一點不同,但大同小異。

# adduser
Username: jack

執行了 adduser 之後,首先要輸入使用者名稱,使用者名稱除了英文字、數字及 -_ 外不可以包含其他特殊字元。

Full name: Jack

接著我們要輸入使用者全名,這個欄位可以是空的,如果您不輸入則直接按 Enter 即可。

Uid (Leave empty for default):

這個欄位是使用者編號,直接留白按 Enter 即可,系統會自動指定。

Login group [jack]:

輸入使用者群組名稱,群組名稱預設會自動產生一個和新增的使用者同名的群組,如果要使用不同的群組,必須先手動新增群組。我們直接按 Enter 即可。

Login group is jack. Invite jack into other groups? []:wheel

是否要將新的使用者加入其它群組,由於這是我們新增的第一個一般使用者,所以我們將它加入系統管理者 wheel 這個群組,讓他可以使用 su 這個指令來切換身份成 root。

Login class [default]:

登入的類別,這是用來分類控制使用者對於系統資源的使用,請參考下一節系統資源限制的說明。在這裡我們直接按 Enter 使用預設值即可。

Shell (sh csh tcsh nologin) [sh]: tcsh

輸入所要使用的 Shell,建議輸入 tcsh,如果您不想讓該使用者登入系統,可以輸入 nologin。

Home directory [/home/jack]:

輸入使用者的家目錄,也就是使用者在系統中的資料夾,所有使用者的目錄我們都放在 /home 下,所以我們直接按 Enter 即可。

Use password-based authentication? [yes]:

是否要使用密碼認証的方式,預設為是,我們直接按 Enter 即可。

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]:

在新增完使用者後,是否要先將該帳戶關閉。

看了 adduser 指令的過程,您對於新增使用者應有的步驟應該已經有初步的了解了,接下來我們要介紹 adduser 這個指令到底做了哪些事。

知道了以上的流程,我們也可以手動自己做上述的步驟,但我們必須先知道 group 及 master.passwd 等檔案的格式。所以我們接下來要介紹這些檔案。

小提示

在舊版的 FreeBSD 中,adduser 一開始會先問您使用者名稱要符合怎樣的規則,通常我們會直接按 ENTER 跳過,您要注意看清楚喔,不要在那個時候輸入使用者名稱,否則在新增使用者時可能會有問題。如果您已經輸入錯了,可以將 /etc/adduser.conf 刪除,就可以恢復原本的設定。

4.1.2 /etc/group 介紹

在使用者的管理方面,FreeBSD 大致上可以分為群組管理及帳號管理。每一個帳號至少屬於一個群組,這樣子有利於權限控制。例如學生的帳號就有一個學生群組,而老師的帳號就屬於教師群組,某幾位老師屬於管理者的群組。這樣一來,我們除了可以針對個人設定權限外,也可以針對不同群組給予不同的權限。

每個使用者預設都會有一個群組,這個預設群組是設定在 /etc/master.passwd,我們會在下一小節中說明。而您也可以將使用者加入其它群組中,這些其它加入的群組設定是在 /etc/group 中,在群組後面加上使用者名稱即可。

/etc/group 這個檔案就是記錄群組的檔案,這是一個文字檔,我們可以使用 ee 等文字編輯軟體打開它。在 group 檔案中,其格式如下:

wheel:*:0:root,alex
students:*:1000:
teachers:*:1001:
webadmin:*:1002:alex,john,tom

每一個欄位以冒號分開,以最後一行為例,第一個欄位代表群組名稱為 teachers,而群組代號(gid) 是 1001。我們可以自行使用文字編輯器加入想要的群組名稱及 gid,但要注意的是群組名稱和 gid 不能重覆。

第一行的最後面是 root,alex,表示該群組成員。由於記錄使用者資料的檔案中只能記錄使用者的預設群組,如果使用者還屬於其他群組,則必須記錄在 /etc/group 中。例如使用者 alex 的預設群組是 alex,我們希望他同時是 webadmin 群組,則我們必須在 webadmin 群組後加上該使用者。

在 FreeBSD 中,如果其他使用者要能使用 su 變成超級使用者的話,必須將其帳號加入 wheel 群組中。
新增群組時,除了可以使用文字編輯外,也可以使用指令 pw 來新增群組:

# 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.passwdvipw 會先將 master.passwd 以預設的文書編輯軟體打開,修改完存檔後,它會視需要自動更新資料庫。如果您沒有修改過 ~/.cshrc,則預設的文書編輯軟體是 vi。vi 在使用上比較複雜,如果您要離開編輯器,請依序按 [Esc] : q ! 再按 Enter 即可不存檔離開。關於 vi 的用法,您可以參考第三章相關章節。

在執行 vipw 之後,會出現:

# $FreeBSD: src/etc/master.passwd,v 1.25.2.6 2002/06/30 17:57:17 des Exp $
#
root:$1$94sxalyM$w1lBLBGAsRPfdVciGqNfL/:0:0::0:0:Charlie &:/root:/bin/tcsh
toor:*:0:0::0:0:Bourne-again Superuser:/root:
daemon:*:1:1::0:0:Owner of many system processes:/root:/sbin/nologin
operator:*:2:5::0:0:System &:/:/sbin/nologin
bin:*:3:7::0:0:Binaries Commands and Source:/:/sbin/nologin
tty:*:4:65533::0:0:Tty Sandbox:/:/sbin/nologin
kmem:*:5:65533::0:0:KMem Sandbox:/:/sbin/nologin
games:*:7:13::0:0:Games pseudo-user:/usr/games:/sbin/nologin
news:*:8:8::0:0:News Subsystem:/:/sbin/nologin
man:*:9:9::0:0:Mister Man Pages:/usr/share/man:/sbin/nologin
sshd:*:22:22::0:0:Secure Shell Daemon:/var/empty:/sbin/nologin
smmsp:*:25:25::0:0:Sendmail Submission User:/var/spool/clientmqueue:/sbin/nologin
mailnull:*:26:26::0:0:Sendmail Default User:/var/spool/mqueue:/sbin/nologin
bind:*:53:53::0:0:Bind Sandbox:/:/sbin/nologin
uucp:*:66:66::0:0:UUCP pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico
pop:*:68:6::0:0:Post Office Owner:/nonexistent:/sbin/nologin
www:*:80:80::0:0:World Wide Web Owner:/nonexistent:/sbin/nologin
nobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/sbin/nologin
tom:Bk5AI4MiRKCJ2:1000:1000::0:0:Tom Chang:/home/tom:/bin/tcsh

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 的執行結果:

Matching password entry:
test:J7kPK0pKTn2oQ:1001:1001::0:0:Tom:/home/test:/bin/tcsh
Is this the entry you wish to remove? y →真的要移除這一個使用者嗎?
Remove user's home directory (/home/test)? y →是否要移除使用者家目錄?
# 移除使用者正在執行的程式及更新系統資料
Removing user's at jobs:Updating password file, updating databases, done.
# 移除使用者群組
Updating group file: (removing group test -- personal group is empty) done.
# 移除使用者家目錄
Removing user's home directory (/home/test): done.
# 移除使用者信件
Removing user's incoming mail file /var/mail/test: done.
# 移除使用者暫存目錄
Removing files belonging to test from /tmp: done.
Removing files belonging to test from /var/tmp: done.
Removing files belonging to test from /var/tmp/vi.recover: done.

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 的設定:

# defaults
# These settings are used by login(1) by default for classless users
# Note that entries like "cputime" set both "cputime-cur" and "cputime-max"

default:\
	:passwd_format=md5:\
	:copyright=/etc/COPYRIGHT:\
	:welcome=/etc/motd:\
	:setenv=MAIL=/var/mail/$,BLOCKSIZE=K,FTP_PASSIVE_MODE=YES:\
	:path=/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin
	:nologin=/var/run/nologin:\
	:cputime=unlimited:\
	:datasize=unlimited:\
	:stacksize=unlimited:\
	:memorylocked=unlimited:\
	:memoryuse=unlimited:\
	:filesize=unlimited:\
	:coredumpsize=unlimited:\
	:openfiles=unlimited:\
	:maxproc=unlimited:\
	:sbsize=unlimited:\
	:vmemoryuse=unlimited:\
	:priority=0:\
	:ignoretime@:\
	:umask=022:
	

以下為關於系統資源限制的欄位說明,每一個欄位都有可使用的數值類型,例如 size、time 等,讓我們來看看每個欄位的說明:

欄位名稱 數值類型 說明
coredumpsize Size 當使用者所執行的程式出了問題 (coredump),系統會將該程式的執行狀況從記憶體中寫到硬碟上,這個值就是在限制 core file 的檔案大小。如果使用者所執行的程式是需要消耗許多記憶體的程式,則所產生的 core file 也會很大。這個值不應該比使用者的磁碟配額限制大。
cputime Time 這是一個行程所能使用的最長 CPU 時間,這個時間指的不是我們在 top 或 ps 中看到的 CPU usage 百分比,而是一個行程所使用的 CPU 時間。當超過時間,系統核心會自動停止該行程。
filesize Size 使用者單一檔案的最大容量。我們對於使用者磁碟配額只能限制使用者對於硬碟的使用總額,而這個設定可以限制單一檔案的大小。
maxproc Number 限制使用者最多可以執行的行程總量。這個限制包含所有以該使用者名稱所執行的程式,有的程式在執行時,會自動產生許多子行程,如果這個值設定的太小,可能會造成使用者的困擾。
memorylocked Size FreeBSD 系統中有所謂的虛擬記憶體空間,當實體記憶體不足時,系統會將某部份的記憶體資料放到虛擬記憶體中。而有的程式會使用 mlock() 這個系統呼叫要求系統將它所佔用的記憶體空間全部放在實體記憶體中,memorylocked 就是限制使用 mlock() 的記憶體大小。
memoryuse Size 限制行程最大的記憶體使用量,包含實體記憶體及虛擬記憶體。
openfiles Number 限制使用者同一時間最多可以開啟的檔案數量。所謂的檔案數量包含了一般的檔案及 socket。
sbsize Size 用以限制最大的網路緩衝區的使用量。
stacksize Size 行程可使用的最大堆疊 (stack) 空間。

以下為上表中數值類型的說明:

類型 說明
Size 我們可以單純的以數字來表示 Size,預設的單位是 byte。例如 1234 表示 1234 bytes。除此之外,我們也可以在數字之後加上單位。例如:
    b: 表示 512-byte block (1b = 512bytes)。
    k: 表示 kilobytes,即 KB (1k=1024 bytes)。
    m: 表示 megabytes,即 MB (1m=1048576 bytes)。
    g: 表示 gigabytes,即 GB。
    t: 表示 terabytes,即 TB。
Time 當我們只寫數字時,預設的單位是秒。或者我們也可以在數字後加上單位 y (年)、w (週)、d (天)、h (時)、m (分)、s (秒)。

例如,三小時四十分可以表示為:13200s、220m、或是 3h40m。

Number 您可以使用 0 到 9 的數字,預設為十進位。您也可以使用開頭為 0x 的數字來表示十六進位。

當要修改類別時,我們以將 default class 複製一份,並更名為其他類別,最後再進行編輯。類別新增完畢後,我們必須執行下列指令以重建系統資料庫。

# cap_mkdb /etc/login.conf

接下來我們就可以執行 vipw 在想要限制的使用者的 class 的欄位填入我們新增的類別了。

除了限制系統資源的使用外,我們也可以使用 login.conf 來客制化每個使用者的登入環境、所使用的語言等,請 man login.conf 以得到更多的說明。

小提示

使用 login.conf 來設定 class 的好處是您可以統一在一個地方設定不同類別使用者的權限及系統資源的使用量,對於需要管理大量使用者時十分有用。

4.2.2 磁碟配額

當系統中有多位使用者時,如果其中一個人擁有大量檔案,那麼其它使用者便無法有足夠的空間來使用。如果系統有許多使用者,而又不限制他們對磁碟的使用量,那麼磁碟很容易就會爆掉,因此我們必須對使用者加以限制。您可以限制系統中每個使用者可使用的硬碟大小(quota)。步驟如下:

# Device	Mountpoint	FStype	Options	Dump	Pass#
/dev/ad0s1b	none	swap	sw	0	0
/dev/ad0s1a	/	ufs	rw	1	1
/dev/ad1s1f	/home	ufs	rw,userquota	2	2
/dev/ad0s1e	/usr	ufs	rw	2	2
/dev/ad1s1e	/var	ufs	rw	2	2

完成了上述的步驟並重新開機之後,我們就可以使用指令 edquota 來編輯磁碟配額。首先,以指令 edquota -u tom 進入文書編輯,我們通常會加入二行,一行限制檔案大小,一行限制檔案數:

Quotas for user tom:
/home: blocks in use: 65, limits (soft = 50000, hard =55000)
        inodes in use: 7, limits (soft = 5000, hard = 6000)

共中 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 中加入下列設定:

check_quotas="NO"

在 FreeBSD 3.2 版以前,開機內定是不檢查 quota 的,如果你想在開機時即檢查的話,請在 /etc/rc.conf 中加入下列設定:

check_quotas="YES"

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.cfg 這是 pw 這個指令所要使用的設定檔,我們可以在其中設定預設所要使用的群組名稱、shell、最大及最小的 uid、及家目錄等。您也可以 man pw.conf 來取得這個檔案格式的用法。

建議您至少應該要修改 defaultgroup 這個欄位,它是我們新增使用者預設所要使用的群組名稱,您必要先在 /etc/group 中加入所要使用的群組。如果 defaultgroup 所指定的群組不在 /etc/group 中,則預設會以讓使用者的名稱作為群組名稱。

readme.txt 這是 adduser.pl 的說明檔。
user.txt 你可以使用檔案匯入使用者的方式來新增使用者,這個檔案存放了我們所要新增的使用者及密碼。其格式是 username,password。如果只有使用者名稱而無密碼,我們會隨機產生新的密碼,並將密碼及使用者名稱存放在 adduer.log 中。

adduser.pl 這個程式的使用方式如下:

./adduser.pl -f users.txt 參數 -f 或 -file 表示使用檔案匯入,檔案名稱可以自由命名,檔案每一行內容即一個帳號 的設定,每一行的格式可以是只有帳號或者是有帳號及密碼,帳號和密碼間使用逗點 "," 隔開。本範例中將以檔案 user.txt 來產生帳號。
./adduser.pl -u alex 001 003 參數 -u 或 -user 表示使用連續帳號,此範例將產生 alex001 alex002 alex003 三個帳號。

在執行完 adduser.pl 之後,在該目錄下會產生一個 adduser.log,這個檔案將記錄我們新增的使用者及其密碼。

4.4 備份與移轉

在了解了新增使用者的步驟後,您對於備份使用者的作法在心中應該也有個譜了吧。在更新系統時,使用者的資料需要備份的有:

4.4.1備份

除非我們和使用者間已有共識,不幫使用者備份其郵件及檔案,否則平常想要備份使用者資料的話,這是一件麻煩且費時的工作。不管是外在因素或是硬體固障,系統都有可能資料流失。對於一個公眾伺服器的管理者而言,事前明白告知使用者系統管理的原則是一件十分重要的事。如果未事前請使用者自行備份個人的檔案及郵件的話,首先,備份的工作將非常耗時,尤其是使用者擁有大量檔案時。再者,若未備份檔案,當系統資料流失時,容易和使用者產生爭議,就算平常每天都有備份,也只能保住備份當時的檔案,從備份到系統出問題的時候所產生的檔案就無法回復了。

如果不必備份使用者個人資料的話,就只需把 /etc/master.passwd/etc/group 存在別的儲存設備或電腦中,要回復時只要依下列移轉的步驟做即可。

4.4.2 移轉

如果系統中已有其它使用者,要先編輯 /etc/group,加入和備份的 group 檔案有差異的地方,再使用 vipw 來將加入和備份的 master.passwd 有差異的地方。如果新系統中無其它使用者,則將所備份的 master.passwdgroup 放到新電腦的 /etc 下,再執行下列指令以將密碼檔轉成資料庫格式即可:

# pwd_mkdb -p -d /etc /etc/master.passwd

如果沒有要移轉使用者個人資料的話,也必須建立使用者家目錄及郵件目錄。如果要移轉使用者目錄的話,記得移轉後要檢查一下該目錄的所有人是不是該使用者。如果不是,就必須使用下列指令來將使用者目錄擁有者更改為所屬的使用者:

# chown -R user:group /home/user

上面這個指令是將 /home/user 這個目錄及其下所有目錄的所有人變成使用者名稱為 user,群組為 group。
我們也可以在密碼檔及群組資料移轉後,將舊的硬碟存放使用者資料的磁區(假設是 /home) mount 到 /mnt 下,再到 /mnt 下存放使用者資料的目錄中使用指令

# tar clf - . | tar xvpf - -C /home

來將使用者資料複製到 /home 中。並依此方法 mount 使用者郵件目錄磁區並複製到 /var/mail 下即可。

4.5 使用歷程記錄

4.5.1 記錄使用者指令

為什麼要記錄使用者下過的指令?並不是為了要監視使用者,而是在系統有問題時,可以找出原因。找出使用者曾經使用過哪些指令,以了解問題的所在。FreeBSD 提供指令 lastcomm 讓你查看系統中使用者執行的指令,但是你必須先修改 /etc/rc.conf,加上下列一行設定:

accounting_enable="YES"

系統會將使用者的歷程記錄在 /var/account/acct* 中,最新的記錄是 acct,隨著資料越來越多,系統每天會將該檔案移成 acct1,而 acc1 將變成 acct2,依此類推。如果站上使用者很多的話,acct 的檔案將變得非常大,所以你必須確保該目錄有足夠的空間存放資料,為了避免檔案過多,系統內定只會保留最近四天的資料。

當下達指令 lastcomm 時,如果我們未使用任何參數,則系統會以 /var/account/acct 為參考,印出所記錄的資料。你也可以使用 lastcomm -f acct1 來查看前一天的資料。

4.5.2 監看使用者

當使用者登入系統後,root 可以使用 watch 指令來取得線上使用者的視窗畫面。也就是說當下達指令後,root 所看到的畫面就會和該線上使用者一樣。我們可以觀察該使用者在做些什麼事,輸出的結果又是什麼。

這個指令並不是要給人拿來做壞事用的。如果有不友善的使用者登入系統時,可以使用它來觀察該使用者的動作,並適時阻止。
只有超級使用者 root 可以執行 watch,而且如果您使用的是 FreeBSD 4.6-RELEASE 以前的版本,在執行前必須先在 kernel 中加入下列的設定並重新編譯核心:

pseudo-device snp

最後使用下列指令新增 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

# Host alias specification(如果你只有一台機器,可以不必設)
Host_Alias     CUNETS = 128.138.0.0/255.255.0.0
Host_Alias     SERVERS = master, mail, www, ns

# User alias specification(把使用者分成群組,也可以不用分)
User_Alias     PARTTIMERS = millert, mikef, dowdy
User_Alias     WEBMASTERS = will, wendy, wim
User_alias     BACKUP = tom, jack

# Cmnd alias specification(把可以執行的指令分成一個個群組)
Cmnd_Alias     READ=/bin/ls,/bin/cat,/usr/bin/tail,/usr/bin/head
Cmnd_Alias     BACKUP=/sbin/dump,/usr/bin/tar,/usr/bin/find, \
               /usr/bin/cpio,/bin/cp,/sbin/mount,/bin/dd

# User privilege specification(設定使用者的權限)
root       ALL=(ALL) ALL
%wheel     ALL = (ALL) ALL

# 表示 jack 在 CUNET 中所有機器都可執行指令群組中 BACKUP 指令
jack       CUNETS = BACKUP

# 表示使用者群組中 PARTTIMERS 群組的人,只能在 SERVERS
#群組中的機器裡執行 READ 群組的指令
PARTTIMERS SERVERS = READ

設定完後,使用者即可執行 sudo <允許的指令> ,使用者只要輸入自己的密碼即可,不必知道 root 的密碼,而且 5 分鐘內再次執行 sudo 時不需再輸入密碼。如果你有打開 log 記錄功能,sudo 執行成功或失敗的 log 都將被記錄到 /var/log/sudo.log 中。詳細說明請閱讀說明 man sudo