當普通用戶(非根用戶)在本地登錄到計算機上,他們被授予兩類特殊權限:
他們可以運行某些通常無法運行的程序
他們可以訪問某些通常無法訪問的文件(通常是用來訪問磁盤、光盤等的特殊設備文件)
由於單個計算機有多個控制台,多位用戶可以在同一時間內在計算機上本地登錄,其中之一必定在訪問這些文件的角逐中“獲勝”。第一個在控制台登錄的用戶完全擁有那些文件。一旦第一個用戶注銷,下一個登錄的用戶就會擁有這些文件。
與之相反, 每個 在控制台登錄的用戶都被允許運行通常只限於根用戶的程序來完成任務。如果 X 在運行,這些行動可以被包括在圖形化用戶界面的菜單內。在該發行版本中,可從控制台訪問的程序包括 halt 、 poweroff 、和 reboot 。
24.1. 禁用通過 Ctrl-Alt-Del 關機按照默認設置, /etc/inittab 文件指定你的系統可在控制台使用 [Ctrl] - [Alt] - [Del] 鍵組合來關閉並重啟系統。如果你想完全禁用這項能力,你需要把 /etc/inittab 文件中下面一行變成注釋,方法是在句前加一個井號( # ):
ca::ctrlaltdel:/sbin/shutdown-t3-rnow另外,你可能只是想授予個別非根用戶從控制台使用 [Ctrl] - [Alt] - [Del] 來重啟系統的權利。你可以通過下面的步驟來把該特權僅限定給某些用戶使用:
在上面顯示的 /etc/inittab 的那一行中添加 -a 選項,如下所示:
ca::ctrlaltdel:/sbin/shutdown -a -t3 -r now-a 標志通知 shutdown 命令去尋找 /etc/shutdown.allow 文件,我們在下一步驟中將會創建該文件。
在 /etc 目錄中創建一個叫做 shutdown.allow 的文件。 shutdown.allow 文件應該列出允許使用 [Ctrl] - [Alt] - [Del] 來關閉系統的用戶名。 /etc/shutdown.allow 文件使用列表格式,每行列出一名用戶,如下所示:
stephen jack sophie根據以上 shutdown.allow 文件的例子,stephen、jack、和 sophie 被允許使用 [Ctrl] - [Alt] - [Del] 來從控制台關閉系統。當這個鍵組合被使用時, /etc/inittab 中的 shutdown -a 就會查看 /etc/shutdown.allow 中列出的用戶(或根用戶)是否在虛擬控制台上登錄了。如果登錄者是其中之一,系統關閉就會繼續;否則,系統控制台上就會顯示出錯誤消息。
24.2. 禁用控制台程序訪問為了禁用用戶對控制台程序的訪問,你應該以根用戶身份運行下面的命令:
rm -f /etc/security/console.apps/*在控制台沒有被保護的環境下(BIOS 和引導裝載程序的口令沒有被設置; [Ctrl] - [Alt] - [Delete] 鍵組合沒有被禁用;電源和重設開關沒有被禁用等等),你可能不想允許任何用戶在控制台上運行這些默認可以從控制台上使用的命令: poweroff 、 halt 、和 reboot 。
要取消這些能力,以根用戶身份運行下面的命令:
rm -f /etc/security/console.apps/poweroff rm -f /etc/security/console.apps/halt rm -f /etc/security/console.apps/reboot 24.3. 禁用所有控制台訪問PAM pam_console.so 模塊管理控制台文件的權限和驗證。如果你想禁用所有的控制台訪問,包括程序和文件的訪問,把所有 /etc/pam.d 目錄中引用 pam_console.so 的句子都改為注釋。以根用戶使用下面的腳本就可以達到這一目的:
cd /etc/pam.d for i in * ; do sed '/[^#].*pam_console.so/s/^/#/' < $i > foo && mv foo $i done 24.4. 定義控制台
pam_console.so 模塊使用 /etc/security/console.perms 文件來判定系統控制台上用戶的權限。該文件的語法非常靈活;你可以編輯該文件以便 不再應用這些指示。然而,默認文件中有一行看起來如下:
當用戶登錄後,他們會被連接到某種有名稱的終端,要麼是名稱類似 :0 或 mymachine.example.com:1.0 的 X 服務器,要麼是類似 /dev/ttyS0 或 /dev/pts/2 的設備。默認設置中,本地虛擬控制台和本地 X 服務器被定義為本地,但是如果你想把和你相鄰的位於端口 /dev/ttyS1 上的串線終端也當作本地,你可以把上面一行改為:
<console>=tty[0-9][0-9]* :[0-9]\.[0-9] :[0-9] /dev/ttyS1 24.5. 使文件可從控制台訪問/etc/security/console.perms 文件中的某段包含以下幾行:
<floppy>=/dev/fd[0-1]*\ /dev/floppy/*/mnt/floppy* <sound>=/dev/dsp*/dev/audio*/dev/midi*\ /dev/mixer*/dev/sequencer\ /dev/sound/*/dev/beep <cdrom>=/dev/cdrom*/dev/cdroms/*/dev/cdwriter*/mnt/cdrom*如果有必要,你可以在這段裡加入你自己編寫的句子。請確定你添加的句中所指代的是正確的設備。譬如,你可以添加以下這一行:
<scanner>=/dev/scanner/dev/usb/scanner*(當然,請確定 /dev/scanner 的確是你的掃描儀設備,而不是你的硬盤驅動器。)
這是第一步。第二步是定義如何處置那些文件。在 /etc/security/console.perms 文件的最後一段尋找與以下類似的句子:
<console>0660<floppy>0660root.floppy <console>0600<sound>0640root <console>0600<cdrom>0600root.disk然後,添加和以下類似的一行:
<console> 0600 <scanner> 0600 root當你在控制台登錄後,你就會被給予 /dev/scanner 設備的所有權,其權限是 0600(僅可被你讀寫)。當你注銷後,該設備就會被根用戶所有,權限依舊是 0600(現在將只能被根用戶讀寫)。
24.6. 為其它應用程序啟用控制台訪問如果你想使其它應用程序能被控制台用戶訪問,你要采取的步驟就會多一些。
首先, 只有 駐留在 /sbin 或 /usr/sbin 中的應用程序才能在控制台上訪問,因此你想運行的程序也必須被保存在那兩個目錄中。滿足了上面的條件後,執行下面的步驟:
創建一個從你的應用程序(如以下例子中的 foo )到 /usr/bin/consolehelper 的鏈接:
cd /usr/bin ln -s consolehelper foo
創建文件 /etc/security/console.apps/ foo :
在 /etc/pam.d/ 目錄中為 foo 服
在 /etc/pam.d/ 目錄中為 foo 服