Debian 安全手冊 第 4 章 - 安裝後(轉)

post0發表於2007-08-11
Debian 安全手冊 第 4 章 - 安裝後(轉)[@more@]

源出處:

[url][/url]

Debian 安全手冊

第 4 章 - 安裝後

系統安裝完成後您還要作一系列的工作來使系統更安全; 可以採取本章描述的一些步驟. 當然這取決於您的設定, 為了防止被物理訪問,你需要參閱 修改 BIOS (再次), 第 4.3 節,設定 LILO 或 GRUB 密碼, 第 4.4 節,取消 root 的提示等待, 第 4.5 節, 禁用軟盤啟動, 第 4.6 節, 限制控制檯登入, 第 4.7 節, 和 限制系統透過控制檯重起, 第 4.8 節.

在連入任何網路前, 特別是將要連入公網之前, 至少應該執行一次安全更新(參閱 進行安全更新, 第 4.2 節). 最好,您能對系統進行系統快照(參閱 生成系統快照, 第 4.18 節).

4.1 訂閱 Debian 安全公告郵件列表

您可以透過訂閱 debian-security-announce 郵件列表,接收 Debian 的安全公告(DSAs), 關於 Debian 安全小組的更多內容, 參閱 ee Debian 安全小組, 第 7.1 節 . 如何訂閱郵件列表參見

由 Debian 安全小組簽署的 DSAs 也可以從 http://security.debian.org 處獲取.

您還應該考慮訂閱 debian安全郵件列表 以獲取對 Deian 作業系統的一般性安全問題討論. 您可以與列表裡的其他系統管理員, Debian 開發者, 安全工具軟體上游開發者, 取得聯絡,他們可以回答您的問題,並提供建議.

FIXME: 增加知識點?

4.2 進行安全更新

當軟體包中發現新的安全問題時, Debian的維護者與軟體開發者一般會在幾天甚至幾個小時內將其修復. 問題修復後,新的軟體包可以從 http://security.debian.org 得到.

如果您安裝了一個 Debian 的發行版, 你必須考慮到, 這個版本發行後可能因為安全問題進行了多次更新. 並且,還可能發行了些包括更新軟體包的次發行版(ebian 2.2 potato 有7個次發行版.

應當注意可移動介質(如果你使用了的話)的製作日期, 並檢查安全站點有無更新. 如果在系統連入網際網路之前(你還沒有連入網際網路,不是嗎?), 不能從別的系統下載安全更新包, (如果您沒有外部防火牆的保護)可以考慮增加防火牆規則, 使之只能訪問 security.debian.org, 進行更新. 防火牆保護下的安全更新, 附錄 F 提供了一個示例配置.

注:從 Debian woody 3.0 開始, 安裝完成後, 系統提供一個安全更新的提示. 如果回答'是', 安裝系統將給出相應步驟為您的系統新增安全更新的源. 如果您可以連入網際網路, 就可以下載並進行安全更新. 如果您升級的 Debian 是一個早期版本或者您沒有要求系統進行更新, 您應該採取下邊的步驟.

手工更新系統, 將下邊一行加入您的 sources.list. 這樣每當您更新您的系統時, 您將自動的進行安全更新.

deb http://security.debian.org/ stable/updates main contrib non-free

然後,您可以使用 apt 或 dselect 進行升級:

* 使用 apt, 應如下操作:

# apt-get update

# apt-get upgrade

* 如果使用 dselect, 那麼, 首先[U]pdate, 然後 [I]nstall 最後, [C]onfigure the installed/upgraded packages.

如果願意, 您也可以在 /etc/apt/sources.list 中加入 deb-src 行. 更多內容參閱 apt(8).

注: 您 不 必加入如下行:

deb http://security.debian.org/debian-non-US stable/non-US main contrib non-free

這是因為 security.debian.org 位於 non-US 站點上, 並且沒有單獨的 non-US 內容.

4.3 修改 BIOS (再次)

還記得 選擇一個BIOS密碼, 第 3.1 節 嗎? 很好, 當你不必從可移動介質啟動的時候, 應當更改 BIOS 的預設設定,使之只能從硬碟引導. 確保不會丟失 BIOS 密碼, 否則, 硬碟啟動失敗的時候您將不能回到 BIOS 和更改設定, 例如從 CD-ROM 啟動.

其它不太安全但很方便的方式是, 設定系統從硬碟引導, 失敗後則嘗試從可移動介質引導. 通常是這樣設定的, 因為 BIOS 密碼不常使用,很容易忘記.

4.4 設定 LILO 或 GRUB 密碼

任何人能很容易的透過在啟動提示符後輸入 init=/bin/sh 來獲取 root-shell, 並修改您的密碼. 修改密碼後, 重新啟動, 就獲取了 root 許可權, 可以對您的系統做任何想做的事情. 設定 LILO 或 GRUB 密碼後, 不是root登入系統, 就不會獲取 root 密碼.

您應該為啟動載入器設定一個密碼以確保這類事情不會發生. 您可以選擇設定全域性密碼或為某個影像設定密碼.

對於LILO 您需要編輯配置檔案檔案 /etc/lilo.conf 增加 password 和 restricted, 如下所示.

image=/boot/2.2.14-vmlinuz

label=Linux

read-only

password=hackme

restricted

然後重新執行 lilo. 這樣啟動時, lilo 總是提示輸入密碼, 不管是否使用了啟動引數. 預設 /etc/lilo.conf 的許可權是 root可讀寫,root 組只讀.

如果您使用GRUB 代替 LILO, 則要編輯 /boot/grub/menu.lst, 在頂部加入下邊兩行(當然, 用您的密碼替換hackme). 這樣可以防止使用者編輯起動選項. timeout 3 是指 grub 使用預設啟動選項前僅有3秒延遲.

timeout 3

password hackme

您可以加密儲存密碼, 來更進一步強化密碼. grub-md5-crypt 工具可以生成密碼的hash值, 它與grub的加密演算法(md5)相相容. 使用如下方法在 grub 中指定使用 md5 格式密碼:

timeout 3

password --md5 $1$bw0ez$tljnxxKLfMzmnDVaQWgjP0

--md5 引數通知 grub 執行 md5 認證過程. 後邊的密碼是 hackme 的 md5 轉換. 使用 md5 加密方法相對於明碼通訊是一個很好的選擇. 更多關於 grub 密碼的資訊可以從 grub-doc 軟體包找到.

4.5 取消 root 的提示等待

Linux 2.4 kernel 在載入了 cramfs 檔案系統後, 提供一個訪問 root shell 的方法, 載入cramf檔案系統後, 將要啟動的時候, 出現提示資訊, 此時允許管理員輸入具有 root 許可權的可執行shell命令, 通常用於自動檢測失敗後手動裝載模組. 預設為 initrd 的 linuxrc. 隨後出現如下資訊:

Press ENTER to obtain a shell (waits 5 seconds)

可以透過編輯 /etc/mkinitrd/mkinitrd.conf 作如下設定, 來修改這一特性:

# DELAY The number of seconds the linuxrc script should wait to

# allow the user to interrupt it before the system is brought up

DELAY=0

然後重新生成您的 ramdisk image. 例如您可以這樣做:

# cd /boot

# mkinitrd -o initrd.img-2.4.18-k7 /lib/modules/2.4.18-k7

或 (推薦):

# dpkg-reconfigure -plow kernel-image-2.4.x-yz

注意,Debian 3.0 woody 允許使用者安裝 2.4 kernel(根據喜好選擇), 但是 預設 kernel 是 2.2 (除了在某些平臺上沒有移植 kernel 2.2). 如果您認為這是一個 Bug, 提交前參見 Bug 145244.

4.6 禁用軟盤啟動

在 Debian 2.2 以前, 預設 MBR 並不是主要引導方式, 並且有一個很容易進入系統:

* 引導時按下shift鍵, 出現 MBR 提示符

* 然後按 F, 這樣您的系統將從軟盤引導. 這樣就可作為root登入.

如下命令可以改變這一特性:

lilo -b /dev/hda

現在 LILO 被裝入MBR. 在 lilo.conf 中加入 boot=/dev/hda 可以達到同樣效果. 還有其他的方法完全禁用MBR提示符:

install-mbr -i n /dev/hda

另一方面, 這個"後門", 許多人還沒有意識到, may save your skin as well if you run into deep trouble with your installation for whatever reasons.

FIXME 檢查是否適用於2.2或2.1? INFO: The bootdisks as of Debian 2.2 do NOT install the mbr, but only LILO.

4.7 限制控制檯登入

一些安全策略或許強制管理員透過控制檯用普通使用者/密碼登入系統, 然後變成超級使用者(透過su 或 sudo). 可以透過編輯 /etc/login.defs檔案實現此策略, 當使用 PAM 時 則是 /etc/securetty 檔案:

* login.defs, 編輯 CONSOLE 變數, 為終端定義一個允許 root 登入檔案或列表

* securetty [6] by adding/removing the terminals to which root access will be allowed. If you wish to allow only local console access then you need console,ttyX [7] and vc/X (if using devfs devices), you might want to add also ttySX [8] if you are using a serial console for local access (where X is an integer, you might want to have multiple instances [9] depending on the number of virtual consoles you have enabled in /etc/inittab [10]).For more information on terminal devices read he Text-Terminal-HOWTO

使用PAM時, 可以透過配置 /etc/pam.d/login 檔案來完成對於登入過程的其他更改, 這可能包括使用者和組給定時間的約束. 很重要的一個特性是, 可以禁止空密碼. 這一特性可以透過把下行中的 nullok 刪除來實現:

auth required pam_unix.so nullok

4.8 限制系統透過控制檯重起

如果您的系統配有一個鍵盤, 任何人(是的 任何人)都可以用它重啟系統, 並不一定要登入系統. 這也許符合, 或違背了您的安全策略. 如果你想對此有所限制, 則必須檢查 /etc/inittab 檔案中含有 ctrlaltdel 並帶有 -a 選項 (記得檔案修改後執行 init q). 在Debian中預設包含此選項:

ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

現在,為了允許 一些 使用者可以關閉系統, 如shutdown(8) 中所述,您需要建立 /etc/shutdown.allow 檔案, 幷包括那些能啟動系統使用者的名字. 當 使用 三指禮(a.k.a. ctrl+alt+del)時, 系統就會檢查使用者列表, 如果使用者不在列表中, shutdown關機不會重起系統.

4.9 正確的掛接分割槽

當掛接 ext2 分割槽時, 有些附加選項您可以mount時使用, 或寫入/etc/fstab. 例如,這是我的fstab中 /tmp 分割槽部分:

/dev/hda7 /tmp ext2 defaults,nosuid,noexec,nodev 0 2

注意選項部分的不同, 選項 nosuid 將完全忽略setuid 和setgid 位, noexec 禁止任一個程式在掛接點上執行, nodev則忽略裝置. 這聽起來很棒, 但是這

* 只適用於 ext2 檔案系統

* 很容易繞過

選項 noexec, 禁止二進位制程式直接執行, 但很容易繞過:

alex@joker:/tmp# mount | grep tmp

/dev/hda7 on /tmp type ext2 (rw,noexec,nosuid,nodev)

alex@joker:/tmp# ./date

bash: ./date: Permission denied

alex@joker:/tmp# /lib/ld-linux.so.2 ./date

Sun Dec 3 17:49:23 CET 2000

然而, 很多指令碼小子會在 /tmp 目錄下建立和執行檔案. 如果找不到別的線索, 他們會利用這個pit. 換句話說, 使用者將不會被欺騙在 /tmp 目錄下執行一個木馬程式, 例如偶爾將/tmp加入他的PATH中.

並且事先說明,一些指令碼可能依賴於 /tmp 執行. 特別是,Debconf 就有(有過?) 這樣的問題, 更多資訊參見 116448.

下邊是一個更加詳盡的例子. 注意, 雖然: /var 可以被設為 noexec, 但一些軟體[11]把它們的程式存放在 /var 目錄下.nosuid 選項也是一樣.

/dev/sda6 /usr ext2 defaults,ro,nodev 0 2

/dev/sda12 /usr/share ext2 defaults,ro,nodev,nosuid 0 2

/dev/sda7 /var ext2 defaults,nodev,usrquota,grpquota 0 2

/dev/sda8 /tmp ext2 defaults,nodev,nosuid,noexec,usrquota,grpquota 0 2

/dev/sda9 /var/tmp ext2 defaults,nodev,nosuid,noexec,usrquota,grpquota 0 2

/dev/sda10 /var/log ext2 defaults,nodev,nosuid,noexec 0 2

/dev/sda11 /var/account ext2 defaults,nodev,nosuid,noexec 0 2

/dev/sda13 /home ext2 rw,nosuid,nodev,exec,auto,nouser,async,usrquota,grpquota 0 2

/dev/fd0 /mnt/fd0 ext2 defaults,users,nodev,nosuid,noexec 0 0

/dev/fd0 /mnt/floppy vfat defaults,users,nodev,nosuid,noexec 0 0

/dev/hda /mnt/cdrom iso9660 ro,users,nodev,nosuid,noexec 0 0

4.9.1 將 /tmp 設為 noexec

如果將 /tmp 設為 noexec 您想要安裝新軟體時應當小心, 因為一些程式可能使用它進行安裝. Apt 就是這樣一個程式 (參見 )是否正確配置了 APT::ExtractTemplates::TempDir (參見apt-extracttemplates(1)). 您可以在 /etc/apt/apt.conf 中設定此變數為有執行許可權的其他目錄.

關於 noexec, 請注意它可能會影響到您的安全. 考慮一下:

$ cp /bin/date /tmp

$ /tmp/date

(does not execute due to noexec)

$/lib/ld-linux.so.2 /tmp/date

(works since date is not executed directly)

4.9.2 設定 /usr 為只讀

如果將 /usr 設為只讀, 就不能在您的 Debian GNU/Linux 系統中安裝新軟體了. 您必須首先以讀寫方式重新掛接, 安裝軟體, 然後以只讀方式重新掛接. 最新版的apt(Debian 3.0 'woody') 可以設為在安裝軟體之前之後執行命令, 因此您也許想正確的設定它.

修改 /etc/apt/apt.conf 並加入:

DPkg

{

Pre-Invoke { "mount /usr -o remount,rw" };

Post-Invoke { "mount /usr -o remount,ro" };

};

注意 Post-Invoke 也許會失敗並給出 "/usr busy" 錯誤資訊. 這主要因為在更新過程中, 您使用了被更新的檔案. 不要太在意. 確定不再被使用並且手工手動執行.

4.10 提供安全的使用者訪問

4.10.1 使用者認證: PAM

PAM (可插入認證模組) 允許系統管理員選擇應用程式如何認證使用者. 注意只有在編譯應用程式時加入PAM支援才可能起作用. Debian 2.2 中的大多數應用程式是內建支援的. 此外, Debian在2.2版本以前並不支援PAM. 當前任何一個 PAM-enabled 服務的預設設定都是仿照 UNIX 認證 (關於Debian中PAM服務的更多資訊見/usr/share/doc/libpam0g/Debian-PAM-MiniPolicy.gz).

每個帶有PAM支援的服務在 /etc/pam.d/ 下都有一個配置檔案, 可以透過修改它來完成配置:

* 認證使用什麼樣的後端.

* 會話使用什麼樣的後端.

* 如何進行密碼檢測.

下邊扯的遠了點, 如果要更多瞭解您可以閱讀Linux PAM 系統管理員的指南 (在 PAM主發行站點), 此文件在 libpam-doc 中也有提供.

PAM 為您提供了在沒有使用者資訊的情況下進行分步認證的可能. 您可以依靠伯克利資料庫和普通的passwd檔案, 並且使用者只有兩個都透過認證才能登入. 您可以對 PAM 作更多限制, 以使您的系統更加寬鬆. 如過這樣您要小心. 一條典型的配置行有控制域作為其第二個元素. 通常這是必需的, 當一個模組失敗後,返回一個認證錯誤.

我喜歡首先對 PAM 應用加入 MD5 支援, 因為這有助於免受字典攻擊(使用MD5密碼可以更長). 應該將以下兩行加入 /etc/pam.d/ 下的所有檔案中, 以控制對機器的訪問, 如login和ssh.

# Be sure to install libpam-cracklib first or you will not be able to log in

password required pam_cracklib.so retry=3 minlen=12 difok=3

password required pam_unix.so use_authtok nullok md5

這樣,有什麼作用? 第一行載入 cracklib PAM 模組, 提供密碼強力檢查, 提示對於一個新密碼最短為12個字元, 至少有3個字元與舊口令不同, 允許3次嘗試. 第二行說明標準認證模組帶有 MD5 密碼支援並且允許零長度密碼. use_authtok 直接從前邊的模組接收密碼. 這個軟體包依賴於 wordlist (譬如 wenglish, wspanish, wbritish...), 確保您安裝適合您的語言的(否則它也許根本不起作用). [12]

可以在 /etc/pam.d/login 中加入一下行, 以確保root使用者只能從本地終端登入:

auth requisite pam_securetty.so

然後您應該在 /etc/security/access.conf 中增加使用者root可以登入到系統的終端. 最後如果您要設定使用者限制, 至少要設定一下行.

session required pam_limits.so

這樣就可以限制使用者允許使用的系統資源(參見後面的 資源的限制使用: limits.conf 檔案, 第 4.10.2 節). 例如, 您可以限制同時登入使用者的數量(一個指定的使用者組,或系統範圍), 程式數量, 記憶體容量...

現在, 編輯 /etc/pam.d/passwd, 更改第一行. 您使用MD5密碼需加入"md5"選項, 將密碼的最小長度由4改為6(或更長), 並設定最大長度,如果需要的話. 例似如下行:

password required pam_unix.so nullok obscure min=6 max=11 md5

如果您想要保護 su, 以便使得只有一些使用者可以使用它成為 root 使用者, 您需要在系統裡增加一個新組"wheel" (這是最乾淨的方式, 因為沒有檔案有這樣的組許可). 新增 root 和其他應當能使用 su 的使用者到這個組. 然後在 /etc/pam.d/su 中加入如下行:

auth requisite pam_wheel.so group=wheel debug

以確保只有組 "wheel" 的使用者可以使用 su 成為root. 其它使用者不能成為root. 事實上如果他們試圖成為root將會得到一條拒絕資訊.

如果您只要某些使用者需要 PAM 服務的認證, 使用檔案儲存允許(或拒絕)登入的使用者列表非常容易做到這一點. 假設你只允許使用者 'ref' 使用 ssh 登入. 把他加入到 /etc/sshusers-allowed 檔案, 並把如下行加入/etc/pam.d/ssh:

auth required pam_listfile.so item=user sense=allow file=/etc/sshusers-allowed onerr=fail

最後,但不是至少,建立 /etc/pam.d/other 檔案並加入如下內容:

auth required pam_securetty.so

auth required pam_unix_auth.so

auth required pam_warn.so

auth required pam_deny.so

account required pam_unix_acct.so

account required pam_warn.so

account required pam_deny.so

password required pam_unix_passwd.so

password required pam_warn.so

password required pam_deny.so

session required pam_unix_session.so

session required pam_warn.so

session required pam_deny.so

這些內容為所有的支援 PAM 的應用程式提供了很不錯的預設設定(預設訪問拒絕).

4.10.2 資源的限制使用: limits.conf 檔案

您應該仔細的研究一下這個檔案. 您可以在此處定義使用者資源限制. 如果您使用PAM, 應該使用 /etc/security/limits.conf 而不是/etc/limits.conf.

如果您不限制資源使用, 任何可以獲取合法shell的使用者(甚至攻擊您的系統的入侵者) 都可以耗盡系統可能提供資源如CPU, 記憶體, 堆疊, 等等. 這種資源耗盡問題只能透過PAM來解決. 注意, 還有別的方法對一些shell設定資源限制(例如, bash 有 ulimit, 參閱 bash(1)),但因為這些shell提供的限制方法不同且使用者有可能更換shell(參閱 chsh(1)), 最好的方法還是使用 PAM 模組.

更多資訊請閱讀:

* 配置文章.

* Seifried 的 Securing Linux Step by Step 中 使用者限制概述 部分.

* LASG 的 限制與監測使用者 部分.

FIXME: 在這裡提供一個經典的 limits.conf 檔案

4.10.3 使用者登入: 編輯 /etc/login.defs

下一步就是編輯基本的配置以影響使用者登入.

FAIL_DELAY 10

這個變數可以設的更大一點, 以增強終端登入的安全性. 如果鍵入了一個錯誤的密碼, 可能是攻擊者(或正常使用者!)必須等待10 秒才能得到新的登入提示, 如果您(手工)測試密碼這將相當費時. 注意這樣一個事實, 如果您使用getty以外的程式, 如 mingetty, 則這個設定並沒有什麼作用.

FAILLOG_ENAB yes

如果您使用這個變數, 將會記錄失敗的登入. 這對跟蹤嘗試暴力攻擊者非常重要.

LOG_UNKFAIL_ENAB yes

如果您設定變數 FAILLOG_ENAB 為 yes, 您也應該將這個變數設為 yes. 這將記錄登入失敗的未知使用者名稱. 如果這樣設定, 要確保日誌檔案設定了正確的訪問許可權(例如 640,和適當的組設定, 如adm), 因為有時使用者會把密碼當作使用者名稱輸入, 你當然不希望別人看到這些內容.

SYSLOG_SU_ENAB yes

啟用這個引數將在 syslog 中記錄試圖 su 的操作. 對於重要的機器這相當重要, 同時也要注意這可能引起保密性問題.

SYSLOG_SG_ENAB yes

與 SYSLOG_SU_ENAB 相同,但用於 sg 程式.

MD5_CRYPT_ENAB yes

如上述, MD5 密碼極大的減少了字典攻擊問題, 因為您可以使用更長的密碼. 如果您使用slink,使用這個選項前請閱讀MD5的相關文件. 否則在PAM中設定這一選項

PASS_MAX_LEN 50

如果在 PAM 配置中啟用 MD5 密碼選項, 這個變數值應該其設定相同.

4.10.4 限制ftp: 編輯 /etc/ftpusers

檔案 /etc/ftpusers 包含不允許使用 ftp 登入主機的使用者名稱單. 如果你真的想允許 ftp 就使用這個檔案(通常不推薦使用, 因為它使用明文傳送密碼). 如果您的守護程式支援PAM, 您也可用它來定義某些服務對使用者的允許和拒絕.

FIXME (BUG): 這是一個缺陷,Debian中預設的 ftpusers 不包括所有管理員使用者 (在base-passwd中).

4.10.5 使用 su

如果您真的需要系統中的使用者變為超級使用者, 例如, 安裝軟體包或增加使用者, 您可以使用 su 命令來改變身份. 您應該設法避免任何人使用 root 登入系統, 而應當使用su. 實際上, 最好的解決辦法是刪除su, 而是使用sudo, 因為它比 su 有更多特點. 但是, su 在類unix系統上 更具通用性.

4.10.6 使用 sudo

sudo 允許使用者執行以其他使用者身份定義的命令, 甚至是 root. 如果使用者被加入 /etc/sudoers 並且透過認證, 他就能執行 /etc/sudoers 定義的命令. 違規, 如密碼不正確, 或者試圖執行沒有授權的程式, 將被記錄下來, 並郵寄給root.

4.10.7 禁止管理員遠端訪問

您應當修改 /etc/security/access.conf 以禁止管理員遠端登入. 這樣使用者就需要使用 su (或 sudo), 無論本地使用者什麼時候使用管理員許可權, 就都可以進行跟蹤了.

您需要在 /etc/security/access.conf 中加入如下行, 預設的Debian 配置檔案中這一行被註釋掉了:

-:wheel:ALL EXCEPT LOCAL

4.10.8 限制使用者訪問

有時候您也許認為需要建立本地使用者以執行特定的服務(pop3郵件服務或ftp). 動手前, 首先記得, Debian GNU/Linux 系統中的PAM工具允許使用各種外部地址伺服器提供的libpam軟體包來認證使用者(radius, ldap, 等等).

如果需要建立此類使用者, 且考慮到使用者有可能遠端訪問系統. 則可以透過給使用者指定一個空(/dev/null)shell(需要在 /etc/shells 中列出) 來對此作出修正. 如果您想允許使用者訪問系統但要限制其訪問範圍, 則可以使用 /bin/rbash, 這與 bash 加入 -r 選項等效 (RESTRICTED SHELL 參見bash(1)). 請注意即使是受限的shel, 使用者訪問互動式程式(可能允許一個執行 subshell), 也能繞過shell的限制.

Debian 當前的 unstable 版本(也許在下一個穩定版中)提供了 pam_chroot 模組(在libpam-chroot). 除此之外的另一種選擇是對提供遠端登入的服務進行chroot (ssh, telnet). [13]

如果您要對透過ssh訪問你的系統的使用者有所限制, 可以按照自己的需求來編輯 /etc/security/access.conf .

關於 chroot 使用者如何透過 ssh 服務訪問系統的內容參見ref id="chroot-ssh-env">.

4.10.9 手動使用者檢測

如果您是個偏執狂, 也許希望新增一個系統範圍的 /etc/profile檔案, 其設定的環境使得使用者不能繞過shell的認證(將命令放入 $HISTFILE 變數). /etc/profile 可以作如下設定:

HISTFILE=~/.bash_history

HISTSIZE=100000000000000000

HISTFILESIZE=10000000000000000

readonly HISTFILE

readonly HISTSIZE

readonly HISTFILESIZE

export HISTFILE HISTSIZE HISTFILESIZE

這樣, 使用者只能在 .bash_history 中增加附加資訊. 您還需要使用chattr 程式將 .bash_history 設為對所有的使用者都是append-only. [14].

注意可以對每個使用者的 .profile 做如此操作. 但另一方面, 您也要設定合適的許可權: 有的使用者的主目錄並 not 隸屬於使用者, 但是要使他們有讀取 .profile 和對 .bash_history 寫操作的許可權. 為 .profile 檔案設定 inmutable 標誌位(同樣用到 chattr)是個不錯的選擇

如果您非常的偏執, 想要驗證使用者的每個命令, 您可以編輯 bash 的原始碼, 使其將使用者所有的輸入寫入其他的檔案. 或者使用 ttysnoop 頻繁監聽每個新的ttys [15] 並輸入到一個檔案. snoopy(參見 the project page) 是另一個有用的程式, 其對使用者透明,作為一個庫,提供一個execve() 呼叫 wrapper, 任何執行的命令都透過 authpriv 工具被 syslogd 記錄(通常被存放在 /var/log/auth.log).

注意您無法透過指令碼命令來完成, 因為並不是作為shell來執行的(即使您把它加入/etc/shells).

4.10.10 完全的使用者驗證

前邊是一個簡單的配置使用者認證的例子, 對於複雜的系統也許沒有什麼用處. 如果您碰到這種情況, 您需要檢視 acct, 這個記賬程式, 這些會佔用大量磁碟空間來記錄所有使用者執行的命令或系統程式.

啟用記賬程式, 程式和使用者的所有資訊都被儲存在 /var/account/ 目錄下, 更加詳細的在 pacct 中. 記賬軟體包包括一些分析這些資料的工具(sa 和 ac).

4.10.11 檢查使用者的 profile

如果您要檢視使用者通常在做些什麼, 可以在使用者連入時使用包括所有登入資訊的 wtmp 資料庫. 有幾個工具可以處理這個檔案, 其中sac可以對每個使用者產生一個profile 檔案,顯示此使用者經常登入的時間段.

如果您啟用了記賬系統, 您還可以用其提供的工具來確定使用者的登入時間和執行的命令.

4.10.12 設定使用者的umask

根據您的使用者策略, 您也許想修改使用者間分享資訊的方法, 即新建檔案的預設許可權. 這可以透過正確設定所有使用者的 umask 來實現. 您可以在 /etc/limits.conf, /etc/profile, /etc/csh.cshrc, /etc/csh.login, /etc/zshrc 或者其他的配置檔案(依賴與您系統中安裝的shell)中設定 UMASK. 這些檔案最後一個裝載的優先順序最高. 順序是: PAM 的 limits.conf,使用者 shell 的系統預設設定, 使用者的shell(他的 ~/.profile, ~/.bash_profile...)

Debian 的預設 umask 設定是 022, 這意味著, 檔案(和目錄)可由組使用者和系統裡的其他使用者讀取和訪問. 如果您覺得對於系統來說這樣太過寬鬆, 則需要修改所有 shell (和PAM)的 umask 設定, 不要忘記修改 /etc/skel/ 下的檔案, 因為這些是使用adduser建立使用者的預設設定.

注, 然而只要使用者願意, 他們可以修改自己的 umask 設定, 使得限制更寬鬆,或更加苛刻.

4.10.13 限制使用者檢視/訪問的內容

FIXME: 需要豐富內容. 講述升級對於軟體包許可權的影響 (and admin this paranoid should chroot his users BTW).

如果您需要授予使用者透過 shell 訪問系統的許可權, 應該仔細考慮清楚. 一個使用者, 除非是在非常苛刻的環境下(如 chroot jail) ,可以檢視有關您系統的許多資訊,包括:

* /etc 下的一些配置檔案. 然而, Debian 對於一些敏感檔案的預設許可權, 將防止對重要檔案(它們也許, 例如包含密碼)的訪問. 要檢視哪些檔案只允許root使用者訪問, 例如以超級使用者的身份執行 find /etc -type f -a -perm 600 -a -uid 0 .

* 透過檢視軟體包資料庫, 或者檢視/usr/share/doc目錄, 或透過檢視您系統中的二進位制檔案和庫, 來猜測您所安裝的軟體包.

* 一些 /var/log 下的日誌檔案. 注意, 一些日誌檔案只允許root和adm組成員訪問 (試試 find /var/log -type f -a -perm 640),一些甚至只有root有許可權 (試試 find /var/log -type f -a -perm 600 -a -uid 00).

一個使用者在您的系統裡可以看到什麼? 可能許多東西, 試試這個(先做一下深呼吸):

find / -type f -a -perm +006 2>/dev/null

find / -type d -a -perm +007 2>/dev/null

輸出的為使用者可以看到的檔案列表和可以訪問的目錄.

4.10.13.1 限制使用者對於其他使用者資訊的訪問

如果您允許使用者透過 shell 訪問, 但是想限制其對於其他使用者資訊的檢視. 使用者透過 shell 訪問會在其主目錄下產生很多檔案: 郵箱, 個人檔案, X/GNOME/KDE 應用程式的配置檔案...

在Debian中每個使用者建立是都產生一個附加組, 並且沒有兩個使用者屬於同一個組. 這是預設設定: 當userX建立時, 產生一個他所屬的名為userX組. 這樣可以避免因為使用者組的概念, 難以對其他使用者隱藏資訊.

然而, 使用者的 $HOME 目錄建立時的許可權是0775(組成員可讀, 其他成員可讀). 組許可權不會有問題, 因為使用者是這個組的唯一成員, 然而根據您的本地策略, 其他許可權可能(或不)存在問題.

您可以修改規則, 使得建立的使用者 $HOME 許可權不同. 修改這種規則, 改變 /etc/adduser.conf 中變數 DIR_MODE 的值為0750 (其他使用者不可讀)即可.

使用者仍然可以分享資訊, 但不能直接訪問他們的 $HOME 目錄, 除非修改其許可權.

注意, 如果網路伺服器存在的話, 這將會影響使用者設定個人主頁(~userX), 因為網路伺服器將不能讀取 $HOME 目錄, 而 public_html 目錄就在它下面. 如果您想允許使用者在他們的 ~userX/public_html 目錄下發布HTML頁面,則需要將 DIR_MODE 修改為 0751. 這將允許網路伺服器訪問該目錄(其許可權應該是0755)和使用者釋出的內容.

4.10.14 產成使用者密碼

很多情況下, 管理員需要建立多個賬號, 併為其設定密碼. 當然, 管理員可以簡單的將其設為與使用者賬號相同, 但是這是非常不明智的. 一個比較好的辦法是使用密碼生成程式. Debian提供了 makepasswd, apg 和 pwgen 軟體包(程式名與包名相同). Makepasswd 可以產生注重於安全而不是可讀性的真正的隨機密碼, pwgen 則試圖產生無意義但具有可讀性的密碼. Apg 則同時提供了這兩種演算法 (這個程式還有個C/S版本, 但其並不在Debian軟體包中提供).

Passwd 並不允許密碼的非互動式分配(因為它直接透過tty訪問). 當你建立了很多使用者時, 如果要修改其密碼, 可以建立使用 adduser 帶 --disabled-login 選項進行建立, 然後使用 chpasswd [16] (在您已經安裝的 passwd 軟體包中). 如果您要使用一個包含所有資訊的檔案進行批次建立使用者的話, 許使用 newusers 會更好.

4.10.15 使用者密碼檢查

有時使用者密碼可能是一個特定系統的安全中最弱的一環. 這歸結於一些使用者為他們的賬戶選擇了弱密碼 (越弱,則被攻擊的可能性越大). 既使您建立了使用cracklib PAM 模組的檢測和密碼限制,如在 使用者認證: PAM, 第 4.10.1 節 中所述. 使用者仍然可以使用弱密碼. 因為訪問也許包括遠端shell訪問(ssh, 希望是), 一個遠端攻擊(在他們用其他的方法做過使用者列舉之後)無法猜測使用者密碼是非常重要的.

系統管理員必須檢查大數量使用者的密碼是否與本地安全策略相一致. 如何檢查? 就象真正的攻擊者一樣去破解, 如果他可以訪問經過hash的密碼(/etc/shadow 檔案).

管理員可以使用john 或 crack (都是暴力密碼破解器) 和一個合適的字典(wordlist)[17], 來檢測使用者的密碼, 並對檢測出的密碼採取相應的對策.

4.10.16 登出閒置的使用者

閒置使用者通常是一個安全隱患, 使用者閒置, 可能因為他外出午餐, 或遠端連線斷掉, 但是沒有重新建立. 無論什麼原因,閒置使用者可能導致系統受到威脅:

* 因為使用者的控制檯或許沒有鎖定,可能被入侵者所利用.

* 因為攻擊者能重新加入一個關閉的網路連線並把命令傳送到遠端shell (如果遠端shell不是被加密的,如telnet,這相當容易做到).

一些遠端系統甚至因為閒置的(分離的)螢幕而受到威脅.

強制斷開閒置的使用者是本地安全策略的一部分. 有一些幾種方式s:

* 如果使用者使用 bash shell, 系統管理員可以設定 TMOUT 預設值(參見 bash(1)), 使得shell自動斷開遠端的閒置使用者. 注意設定時必需使用 -o 選項, 或者使用者可以自行(或者不)設定.

* 安裝 timeoutd 並根據您的本地安全策略配置 /etc/timeouts. 守護程式將監視閒置使用者,在shell之外對其記時.

* 安裝 autolog 並配置其刪除閒置使用者.

使用 timeoutd 或 autolog 守護程式是不錯的方法, 因為, 終究, 使用者可以修改其預設shell,或執行預設shell以後,切換到其他的(未受控制的)shell.

4.11 使用 tcpwrappers

TCP wrappers 用於滿足當包過濾器不存在時的訪問控制的需求. TCP wrappers 允許你設定對於一個主機或域服務訪問的允許或拒絕和定義一個預設規則。更多資訊見 hosts_access(5).

Debian 中安裝的很多服務可以:

* 透過 tcpwrapper(tcpd)服務載入

* 透過編入libwrapper 來內建支援.

一方面, 如果透過 /etc/inetd.conf配置服務(這包括 telnet, ftp, netbios, swat 和 finger), 則您會看到配置檔案首先執行 /usr/sbin/tcpd. 另一方面, 既使服務沒有透過 inetd 守護程式載入, 仍可將對tcp wrapper 規則的支援編譯進服務. 在 Debian 系統中可以編譯進tcp wrapper 的服務包括ssh, portmap, in.talk, rpc.statd, rpc.mountd, gdm, oaf (GNOME的啟用精靈),nessus 等等很多.

檢視使用tcpwrappers的軟體包:

$ apt-cache showpkg libwrap0 | egrep '^[[:space:]]' | sort -u |

sed 's/,libwrap0$//;s/^[[:space:]]+//'

考慮到 tcpchk 的執行. 您可以在hosts.deny 和 hosts.allow檔案中增加那些與 wrapper庫相連的服務. 但是, 當tcpchk 找不到那些服務時會發出警告, 因為它透過 /etc/inetd.conf 查詢(manpage 不是很準確).

現在, 有一個小小的把戲, 或許可以得到一個最小入侵檢測系統. 通常, 您應當有一條不錯的防火牆規則作為第一行, tcp wrappers 作為防禦的第二行. 這個小把戲就是在 /etc/hosts.deny 中設定一條SPAWN [18] 命令, 每當一個被拒絕的服務觸發wrappers時, 就會傳送郵件給root:

ALL: ALL: SPAWN (

echo -e "

TCP Wrappers: Connection refused

By: $(uname -n)

Process: %d (pid %p)

User: %u

Host: %c

Date: $(date)

" | /usr/bin/mail -s "Connection to %d blocked" root) &

當心: 上邊的例子對於短時間內建立許多連線的Dos攻擊是開放的. 很多郵件就意味著很少的資料包就會浪費大量的檔案I/O.

4.12 日誌與警告的重要性

顯而易見, 日誌和警告對於一個安全的系統非常重要. 假設一個系統配置的非常完美並且99%的安全, 當1%的攻擊發生時, 如果沒有到位的安全工具, 首先, 檢測到, 其次, 發出警告, 那麼這個系統根本就不安全.

Debian GNU/Linux 提供一些完成日誌分析的工具,著名的swatch, [19] logcheck or log-analysis(需要一些相關資訊,並刪除多餘的). 如果系統就在旁邊, 將系統日誌資訊輸出到虛擬終端也非常有用. 這是有用的, 因為您能看到系統是否正常. Debian 的 /etc/syslog.conf 中註釋掉了預設的配置; 去掉註釋, 重起 syslogd, 就可生效了( /etc/init.d/syslogd restart):

daemon,mail.*;

news.=crit;news.=err;news.=notice;

*.=debug;*.=info;

*.=notice;*.=warn /dev/tty8

相關的日誌分析太多, 這裡無法完全涉及,Counterpane 的日誌分析資源是不錯的資料. 無論如何, 沒有任何分析工具可以和最佳的分析工具相媲美: 您的腦子.

4.12.1 使用和定製 logcheck

在 Debian中, logcheck 分為三部分, logcheck(主程式), logcheck-database(程式的正規表示式庫)和 logtail (列印未讀的日誌內容). 在 Debian 中預設(/etc/cron.d/logcheck)logcheck系統空閒時每小說執行一次和系統重起時執行一次.

如果配置合適, 這個工具可能對於管理員發現系統的異常事件相當有用. Logcheck 可以設定為, 從日誌中發現值得注意的事件, 併傳送郵件. 預設安裝的profile忽略事件和違規策略, 分為三種不同的設定(workstation, server, paranoid). Debian的軟體包包括一個/etc/logcheck/logcheck.conf, 源自程式,用於定義檢查給哪些使用者傳送郵件. 它還為軟體包在以下目錄下實現新的策略提供了一種方法: /etc/logcheck/cracking.d/_packagename_, /etc/logcheck/violations.d/_packagename_, /etc/logcheck/violations.ignore.d/_packagename_, /etc/logcheck/ignore.d.paranoid/_packagename_, /etc/logcheck/ignore.d.server/_packagename_, 和 /etc/logcheck/ignore.d.workstation/_packagename_. 但是, 並非當前的包都是如此. 如果您有一種對其他使用者有用的策略. 請將其作為對應軟體包的一個問題報告提交 (作為一個wishlist問題). 更多資訊請參閱/usr/share/doc/logcheck/README.Debian.

最佳的配置 logcheck 的方式是安裝後,編輯其配置檔案/etc/logcheck/logcheck.conf 將預設使用者(root)修改為郵件接收者. 您還需要設定報告級別:logcheck-database有三種報告級別: workstation, server, paranoid. "server" 為預設級別, paranoid只有在執行著儘可能少的服務的高安全性機器上才需要, workstation 使用於,受保護的安全性不高的機器. 如果您想補充日誌檔案, 將其加入/etc/logcheck/logcheck.logfiles即可. It is tuned for default syslog install.

一旦設定完成, 你也許想檢查一下傳送的最初幾 天/周/月 的郵件. 如果您發現傳送了你不希望收到的郵件, 在 /etc/logcheck/ignore.d.reportlevel/local 中新增對應於這些訊息的正規表示式 (參見regex(7) and egrep(1))即可. 在 /usr/share/doc/logcheck-database/README.logcheck-database.gz 中有關於如何編寫規則的解釋. 這是一個不斷調整的過程; 一旦傳送的訊息都是相關的, 即可認為您的調整完成. 注意, 如果 logcheck 沒有在您的系統中發現什麼相關事件它是不會給您傳送郵件的,即使其在執行中(因此您也許只是每週得到一封郵件, 如果您很幸運).

4.12.2 配置警告傳送地

Debian 帶有一個標準的 syslog 配置(in /etc/syslog.conf), 其根據系統配置, 在適當的檔案中寫入日誌資訊. 您應該對此熟悉了; 如果不是, 請瀏覽一下 syslog.conf 檔案和對應文件. 如果要維護一個安全系統, 您應當知道, 日誌資訊傳送到什麼地方才不會被忽視.

例如, 傳送資訊至控制檯就是一個很棒的設定, 對生產系統很有用. 但是為多個這種系統增加一臺裝置作為日誌主機(即從其他系統接收日誌)也是非常重要.

也應當被考慮root的郵件, 許多安全控制檯(象snort) 傳送警告資訊到root的郵箱. 這個郵箱通常是指系統建立的第一個使用者(檢查/etc/aliases). 注意要把root的郵件傳送到他能接收的地方(本地或遠端).

在您的系統裡還有其他的角色賬號和別名. 在一個小型系統裡, 將所有這類別名指向root賬號並將給root的郵件轉送的系統管理員的個人郵箱應當非常簡單.

FIXME: 講述Debian系統接收/傳送與安全相關的SNMP陷阱一定非常有趣. 檢查:snmptraglogd, snmp 和 snmpd.

4.12.3 使用日誌主機

loghost 就是收集網路中的遠端系統日誌的主機. 如果您的一臺機器被攻擊, 入侵者無法消除其痕跡, 除非他也攻佔了日誌主機. 如此, 日誌主機應當是特別安全的. 做一臺日誌主機非常簡單. 只需要以 syslogd -r 方式啟動 syslogd, 一臺新的loghost就建成了. 在Debian系統中, 透過編輯/etc/init.d/sysklogd 並修改一下內容即可完成永久配置:

SYSLOGD=""

改為

SYSLOGD="-r"

其次, 配置其它機器傳送資料到日誌主機. 在/etc/syslog.conf中增加如下類似內容:

facility.level @your_loghost

查詢文獻, 看用什麼可以替代 facility 和 level (它們不應當象這樣逐字輸入). 如果您要紀錄遠端的所有資訊, 僅需這樣寫:

*.* @your_loghost

到您的syslog.conf檔案. 遠端紀錄同本地紀錄一樣是很好的解決方案 (攻擊者也許假定透過刪除本地日誌檔案來掩蓋的它的痕跡). 更多資訊見 syslog(3), syslogd(8) 和 syslog.conf(5) 聯機手冊.

4.12.4 日誌檔案的許可權

不僅確定如何使用警告資訊很重要, 誰對日誌檔案(如果使用遠端日誌主機)有讀取/修改許可也不可忽視. 在入侵事件中攻擊者可以修改和禁用的安全警告沒有什麼價值. 並且, 您必需考慮到也許日誌檔案向攻擊者洩漏了有關您的系統的很多資訊,如果可以對其訪問的話.

系統安裝後, 一些日誌檔案的許可權並不理想(但這當然取決於你的本地安全策略). 首先/var/log/lastlog和/var/log/faillog對於普通使用者不應當是可讀的. 在lastlog檔案中您會看到最近誰登入了, 在faillog中, 您則能看到失敗的登入列表. 作者推薦修改兩個檔案chmod 660. 檢查一下您的日誌檔案,然後謹慎的確定對哪個 UID 不為0且不屬於'adm'或'root'組的使用者設定 可讀/可寫 許可權. 您可以簡單執行下邊的命令, 對您的系統做出檢查::

# find /var/log -type f -exec ls -l {} ; | cut -c 17-35 |sort -u

(檢視/var/log 屬於哪些使用者)

# find /var/log -type f -exec ls -l {} ; | cut -c 26-34 |sort -u

(檢視/var/log 下的檔案屬於什麼組)

# find /var/log -perm +004

(哪些檔案對所有使用者可讀)

# find /var/log ! -group root ! -group adm -exec ls -ld {} ;

(檢視哪些檔案不屬於root 或 adm 組)

為了定製日誌檔案的建立, 您可能需要定製生成它們的程式. 如果日誌檔案是輪換的, 您則需要定製建立和輪換效能.

4.13 增加核心補丁

Debian GNU/Linux 為Linux 核心提供了一些增強其安全性的補丁。 它們包括:

* Linux 入侵監測(在 lids-2.2.19 包中), 由 Huagang Xie 和 Philippe Biondi 製作. 這個核心補丁透過允許您限制, 隱藏, 保護甚至是源自root的程式, 使得加固您的linux系統更加簡單. 還允許您保護或隱藏某些檔案, 這樣即使是root也不能修改它們. 此外, 還能設定對某些特定程式的支援. 這是偏執型系統管理員不可缺少的一個補丁. 主頁:

* Linux版的 POSIX 訪問控制列表 (ACLs) (在 kernel-patch-acl包中). 這個核心補丁增加了訪問控制列表, 一個高階的控制檔案訪問許可權的方法. 允許您控制對檔案和目錄的細粒度訪問. 這個補丁加進了 kernel 2.5 開發版, 並將預設加入 kernel 2.6. 主頁:

* Linux Trustees (在 trustees 包中). 這個補丁為您的核心增加一個不錯的許可權管理系統. 每個檔案或目錄都繫結特定的物件(叫做委託人), 並存放在核心記憶體中, 允許快速查詢所有許可權主頁:

* NSA Enhanced Linux (在 selinux 包中,也可從 開發者的網站處獲得)

* kernel-patch-2.2.18-openwall, Solar Designer 製作. 這是個很有用的核心限制設定, 就象一個限制連線, /tmp 目錄下的 FIFO, 一個受限制的/proc檔案系統, 專用檔案描述處理, 非可執行使用者堆疊區和其他. 主頁:

* kernel-patch-2.4-grsecurity: Grsecurity補丁,僅用於kernel 2.4 [20] , 實現了命令訪問控制, 提供緩衝溢位保護, ACLs, 網路隨機性(使提取作業系統指紋更加困難) 和許多其它特性.

* kernel-patch-2.2.19-harden. FIXME 增加內容.

* IPSEC 核心支援 (在 kernel-patch-freeswan 包中). 如果您想在linux下使用 IPsec 協議, 則需要這個補丁. 有了這個補丁, 您建立VPN相當容易, 即使是對windows計算機, 因為 IPsec 是一個通用標準. kernel 2.5 開發版中加入了對IPSec的支援, 這個特性將在 kernel 2.6 中成為預設. 主頁: FIXME: Debian 提供的最新的 kernel 2.4 包括了從2.5中移植過來的IPSEC程式碼.相關評論.

* cryptoapi-core-source. 這個補丁增加了Linux核心的密碼支援, 如密碼和digest功能. 此功能通常用於檔案系統和交換資料的加密. 注意自 2.5.45 版後, 在官方Linux核心原始碼中加入了相似的功能. 因此在將來的 kernel 2.6 中可能不再需要這個補丁了. 注: 在Debian的先前版本Sarge 中沒有這個補丁. 主頁:

* cryptoloop-source. 這個補丁允許您使用crytoapi-core-source 包的功能建立 loopback 裝置的加密檔案系統.

* kernel-patch-int. 這個補丁也為Linux核心增加了密碼支援, 在Debian的Potato發行版中得到了應用. 在Woody中不支援, 如果使用 Sarge 或更新版本, 您應該使用最新的 cryptoapi-core-source.

FIXME: 增加更多內容, 解釋使用 kernel-2.x.x-patch-XXX 軟體包如何將特定補丁裝入Debian系統.

FIXME: 區分只適用於kernel 2.2 和只適用於 kernel 2.4 的補丁, 以及都適用的.

然而, 一些補丁仍未在Debian中提供. 如果您覺得應該包含其中的一些, 請到Work Needing and Prospective Packages查詢. 其中一些是:

* PaX patch

* HAP patch

* Stealth patch

* SubDomain. 核心外圍設計提供最少特權以減少對不安全程式的引入. SubDomain 完善和擴大本地存取控制. 類似於一個chroot環境, 它聲稱更加容易構建並且比chroot環境更加靈活. 主頁:

* UserIPAcct. 這並不是真正的安全補丁, 但確實允許為您系統上的每個使用者建立流量配額, 並可用於統計使用者的流量. 主頁:

4.14 保護免受緩衝溢位

緩衝溢位 是一種利用程式的邊界檢查缺陷(程式的問題), 透過程式輸入來執行機器程式碼的對軟體[21] 的普通攻擊. 此種攻擊是針對監聽遠端連線的伺服器軟體和針對可以授予使用者更高特權 (setuid 或 setgid) 的本地軟體, 進行指定系統的攻擊.

主要有四中方法保護免受緩衝溢位:

* 給核心打補丁, 以防止堆疊的執行(可以使用 OpenWall 或 Grsecurity 補丁)

* 使用庫, 譬如 libsafe, 重寫易受攻擊的部分, 並引入適當的檢查(安裝libsafe的方法參閱這裡).

* 使用工具查詢原始碼中易受攻擊的片斷, 並修正它.

* 重新編譯原始碼, 引入適當的防止溢位的檢查, 使用, 例如StackGuard StackGuard(通常由Immunix使用) 或者打了Stack Smashing Protector (SSP)補丁的GCC(通常由 Adamantix使用)

Debian GNU/Linux, 如 3.0 發行版, 提供了引入以上方法的軟體, 這不包括對原始碼的保護(但已在 Bug #213994 中提交).

注意既使 Debian 提供了帶有 堆疊/緩衝溢位保護的編輯器,所有的軟體也都要需要重新編譯,才能引入這些特性. 實際上, Adamantix 確實如此(包括其它一些特性). 此特性對於軟體穩定性的影響仍未得到確定(某些程式或處理器構架會因此崩潰).

應當清楚, 在某些情況下, 即使這樣也無法防止快取溢位, 因為有很多方法可以繞過它們, 如 phrack雜誌第58期,或在CORE的 Advisory Multiple vulnerabilities in stack smashing protection technologies 中所描述的.

4.14.1 核心補丁對緩衝溢位的保護

與緩衝溢位有關的核心補丁包括 kernel 2.2 中提到的免受核心溢位的 Openwall 補丁. 至於 kernel 2.4 您則需要Grsecurity補丁(在kernel-patch-2.4-grsecurity包中) 其包括Openwall補丁, 和更多特性 (包括ACLs和網路隨機性使得其使用遠端網路指紋更加困難), 或Linux 安全模組(在 kernel-patch-2.4-lsm 和 kernel-patch-2.5-lsm 包中). 有關使用這些軟體包的更多內容, 參閱增加核心補丁, 第 4.13 節.

4.14.2 Libsafe 保護

使用 libsafe 保護一個 Debian GNU/Linux 系統相當容易. 安裝軟體包和回答 Yes 以預載library即可. 然而, 應當注意, 因為這樣可能會致使軟體崩潰(特別是, 與舊版 libc5連線的程式),因此首先要閱讀錯誤報告, 並使用 libsafe wrapper 程式在您的系統上對關鍵程式進行測試.

重要提示: Libsafe 保護當前也許不再如173227所述有效. 考慮到以前測試使用的執行環境, 並不能完全依賴它來保護您的系統.

4.14.3 程式的溢位測試

使用工具來檢測溢位是有必要的, 不管怎樣, 即使可以依靠來程式設計經驗修正(和重新編譯) 程式碼. Debian 提供, 例如: bfbtester(透過命令列和環境溢位進行暴力檢測的緩衝溢位測試器) 和njamd.

4.15 檔案的安全傳送

在正常系統管理過程中, 通常需要從安裝的系統傳輸檔案. 從一個主機向其他主機複製檔案的安全方式是使用sshd伺服器軟體包. 另一個可能的方式是使用ftpd-ssl, 使用加密套接字協議層加密傳輸的ftp伺服器.

當然, 這些方法都需要特殊的客戶端. Debian提供了這類客戶端,如 ssh 提供了scp. 其使用如rcp, 但是是完全加密的, 因此那些壞傢伙 甚至不能發現您在複製什麼. 還有一個對應的伺服器的ftp-ssl客戶端軟體包. 你可以找到這些軟體的客戶端, 甚至是基於其他作業系統(非Unix), putty和 winscp 是基於微軟作業系統任何版本的安全複製工具.

注意, 使用者可以使用 scp 對所有檔案系統進行訪問, 除非使用瞭如Chrooting ssh, 第 5.1.1 節中描述的chroot. FTP訪問可以設定為chroot,基於您選擇的守護程式或許更容易,如FTP 安全化, 第 5.3 節中所述. 如果擔心使用者瀏覽您的本地檔案, 並想進行加密通訊, 您可以使用帶有SSL支援的ftp守護程式, 或結合明碼通訊的ftp和VPN的設定(參閱 虛擬專用網, 第 8.5 節).

4.16 檔案系統的限制和控制

4.16.1 使用配額

有一個好的配額策略是很重要的,因為它可以防止使用者填滿硬碟.

您可以使用兩個不同的配額系統: 使用者配額和組配額. 就象您所猜到的, 使用者配額是指限制使用者磁碟空間的佔用量, 組配額則是限制組的. 在你設定配額時這一點要記清楚.

在設定配額時有幾個需要考慮的關鍵點:

* 使得配額儘量小, 防止使用者吃光您的硬碟空間.

* 使得配額足夠大,防止使用者抱怨或郵件配額使他們可以長時間的保留郵件.

* 在所有使用者可寫範圍內使用配額, /home 以及 /tmp.

使用者具有完全寫許可權的每個分割槽和目錄都應該啟用配額設定. 結合實用性和安全性, 來計算和分配這些分割槽和目錄的可用配額大小.

那麼, 現在您想使用配額了. 首先, 需要檢查您是否在核心中啟用配額支援. 如果沒有, 您需要重新編譯核心. 然後, 是否安裝了控制quota的軟體包. 如果沒有請安裝.

為每個檔案系統啟用配額非常簡單, 僅需在 /etc/fstab檔案中修改 defaults為 defaults,usrquota 即可. 如果你需要組配額, 用 grpquota 替換usrquota. 也可以同時使用. 然後在要啟用配額的檔案系統的根目錄下建立空檔案 quota.user 和 quota.group (如為 /home 檔案系統 touch /home/quota.user /home/quota.group ).

透過執行/etc/init.d/quota stop;/etc/init.d/quota start重起quota. 現在配額已經執行,可以設定配額大小了.

可以執行edquota -u ref,為一個指定使用者(叫做'ref')設定配額. 可以執行 edquota -g 設定組配額. 然後設定緩衝值和限定值, 和/或 節點值, 如果需要的話.

關於配額的更多資訊, 參閱配額的聯機手冊,和配額的 mini-howto(/usr/share/doc/HOWTO/en-html/mini/Quota.html).

您可能喜歡或者不喜歡lshell, 因為其違背FHS. 並且考慮到 pam_limits.so 能夠提供相同的功能, lshell當前是處於orphaned狀態的.

4.16.2 ext2 檔案系統的特定屬性(chattr/lsattr)

除了通常Unix的許可權, ext2 和 ext3 檔案系統還提供了一套特別的屬性用於控制您的檔案和系統. 不同於基本的許可權, 這些屬性並不能透過 ls -l 命令顯示出來, 也不能使用chmod命令修改, 您需要額外的兩個工具 lsattr 和 chattr (在e2fsprogs 包中)來管理它們. 注意, 這意味著, 您在備份系統時, 通常不能儲存這些屬性, 所以, 如果您對它們做了任何修改, 也許可以將其有價值部分 對應的chattr命令寫入指令碼, 這樣就可以在以後必需恢復系統時重新設定.

在所有的屬性中, 對於增強安全性最有價值的是參考字元 'i' 和 'a', 它們只能由超級使用者設定(或刪除):

* 'i' 屬性 ('immutable'): 帶有此屬性的檔案, 不能被修改, 刪除或重新命名, 建立連線, 即使是超級使用者也不能.

* 'a' 屬性 ('append'): 除了您能以附加的方式開啟此檔案外,此屬性與immutable屬性具有同樣的效果. 這意味著, 您仍可以在檔案中增加更多的內容, 但是不能修改以前的內容. 這個屬性對於儲存於/var/log/ 目錄的日誌檔案特別有用, 儘管應該考慮到有時候根據日誌迴圈指令碼, 它們有可能被移動.

也可以為目錄設定這些屬性, 這樣任何人都沒有修改這個目錄的內容的許可權(即, 重新命名或刪除一個檔案, ...). 當用於目錄時, append 屬性僅允許建立檔案.

很容易看出 'a' 屬性對於系統安全的改善, 給由非超級使用者執行的程式以向檔案中新增內容的許可權, 而不賦予修改以前內容的許可權. 另一方面, 'i' 屬性看上去似乎並不那麼有趣: 終究, 超級使用者已經可以使用基本的 Unix 許可權來限制對於一個檔案的訪問, 入侵者可以獲取超級使用者許可權後總能使用chattr 程式刪除此屬性. 因此, 入侵者當發現不能刪除一個檔案時, 可能有點不知所措, 但是您不應當假設他是個瞎子, 畢竟他進入了您的系統! 一些手冊中(包括本文件的一個早期版本)建議從系統中刪除 chattr 和 lsattr 以增加安全性, 但是這種做法, 也叫做"含糊的安全性(security by obscurity)", 應當絕對避免, 因為它提供的是假安全感.

這個問題一個安全解決方法是使用 Linux 核心能力特徵, 如主動防護, 第 9.4.2.1 節所述. 這裡我們所關心的是CAP_LINUX_IMMUTABLE: 如果您從能力約束集中將其刪除 (例如使用命令lcap CAP_LINUX_IMMUTABLE), 將不再可能更改您系統中的任何 'a' 或 'i' 屬性, 即使是超級使用者! 如下是一個完整的操作:

1. 對您選定的檔案設定 'a' and 'i' 屬性;

2. 在一個啟動指令碼中新增命令 lcap CAP_LINUX_IMMUTABLE (也可以是 lcap CAP_SYS_MODULE, 如在 主動防護, 第 9.4.2.1 節 中所建議的);

3. 為此指令碼和其他配置檔案設定'i'屬性, 包括 lcap 二進位制檔案本身;

4. 手工執行上述命令(或重新起動您的系統確定一切如設想的一樣執行).

現在能力已從系統取消了, 入侵者不改變任何被保護檔案的屬性了, 因此不能更改或刪除這些檔案. 如果他強制機器重起(這是唯一恢復能力約束集的方法), 將很容易被察覺, 並且當系統完成啟動後, 能力將再次被刪除. 唯一更改被保護檔案的方法是以單使用者模式引導系統或者使用其他的引導盤引導, 這兩種方法都需要物理接觸機器 !

4.16.3 檔案系統的完整性檢查

幾個月後, 您能肯定硬碟上的 /bin/login 仍然是您安裝的那個嗎? 如果是一個被黑的版本, 其將輸入的密碼儲存到隱藏的檔案中, 或者以明文方式透過郵件傳送到網上呢?

唯一的方法是選擇一種保護措施, 每 小時/天/月(我推薦每天) 檢查您現在檔案的 md5sum 與以前的是否一致. 兩個檔案不可能有相同的md5sum(MD5為128bit強度, 兩個不同檔案有相同md5sum的機率大概是 1/3.4e3803), 這樣即可確保您的站點安全,除非有人也黑了那臺機器上的生成 md5sum 的演算法. 這非常困難, 幾乎是不可能的. 認真考慮這種對於檔案稽核的方式非常重要, 這是發現您的檔案被修改的非常簡單的辦法. 常用的工具有 sXid, AIDE(高階入侵監測環境), TripWire (non-free;新的版本將是符合GPL), integrit 和 samhain.

安裝 debsums 對檢查檔案系統的完整性很有幫助, 透過比較每個檔案的 md5sum 與對應的debian軟體包中的 md5sum. 但當心, 那些檔案很容易被修改.

此外您可以用slocate替換locate. slocate 是 GNU 的 locate 的安全改進版. 使用 slocate 時, 使用者只能看到他真正可以訪問的檔案, 並且不會顯示系統中其他的檔案和目錄.

FIXME: 加入安裝後的參考截圖.

FIXME: 增加有關軟體包不提供所安裝程式的 debsums 的備註(不是必須的).

4.16.4 設定 setuid 檢查

Debian 在 /etc/cron.daily/standard中提供了一個每日執行 cron 任務. 此 cron 任務將會執行 /usr/sbin/checksecurity 指令碼, 以儲存對應改變的資訊.

您必需在/etc/checksecurity.conf中設定 CHECKSECURITY_DISABLE="FALSE" 才能進行這個檢查. 注意, 這是預設設定, 除非您修改了某些東西, 這選項已經被設為 "FALSE".

預設設定並不給超級使用者傳送郵件, 而是在/var/log/setuid.changes中儲存每日修改的複製. 您應當設定CHECKSECURITY_EMAIL變數(在/etc/checksecurity.conf中)值為 'root', 使得其向root使用者傳送資訊. 更多配置資訊參見checksecurity(8).

4.17 安全的網路訪問

FIXME. 需要更多的(Debian相關)內容

4.17.1 配置核心的網路特性

FIXME: 內容丟失

核心的許多特性都是可以透過回送資訊到 /proc 下的對應檔案或使用sysctl在執行過程中修改的. 透過執行 /sbin/sysctl -A 可以看到可以配置的內容和可以使用的引數, 並可透過/sbin/sysctl -w variable=value(參閱 sysctl(8))修改. 只有在很少的情況下, 需要您編輯對應的東西, 但是這樣可以增加安全性. 例如:

net/ipv4/icmp_echo_ignore_broadcasts = 1

這是一個 Windows emulator 模擬器, 因為如果這個選項設為1, 它的動作就象 Windows 裡的廣播 ping. ICMP_ECHO 將會忽略接收的廣播請求, 即什麼也不做.

如果您想攔截系統裡所有的 ICMP 回送請求, 啟用這個配置選項:

net/ipv4/icmp_echo_ignore_all = 0

記錄您網路中的地址不可用的資料包(由於錯誤路由):

/proc/sys/net/ipv4/conf/all/log_martians = 1

有關對 /proc/sys/net/ipv4/* 操作的更多資訊, 參見 /usr/src/linux/Documentation/filesystems/proc.txt. /usr/src/linux/Documentation/networking/ip-sysctl.txt中有所有選項的詳盡描述 [22].

4.17.2 配置 Syncookies

這個選項是一把雙刃劍. 一方面它保護您的系統免受 syn 湮滅; 另一方面它違背了定義的標準(RFCs).

net/ipv4/tcp_syncookies = 1

如果您想要每次核心執行時都改變這個選項, 則需要在 /etc/network/options 中設定 syncookies=yes. 此設定在 /etc/init.d/networking 再次執行後起作用. 而下邊的設定只對當前執行的核心有效:

echo 1 > /proc/sys/net/ipv4/tcp_syncookies

此選項只有編譯核心時啟用 CONFIG_SYNCOOKIES 才會有效. 所有的 Debian 核心都是內建此選項編譯的, 您可以執行下邊的命令來確認:

$ sysctl -A |grep syncookies

net/ipv4/tcp_syncookies = 1

有關 TCP syncookies 的更多資訊, 參閱

4.17.3 增強啟動時網路的安全性

當設定了您需要的核心網路選項後, 那麼每次重起時這些引數都會被載入. 下邊的例子啟用了很多前邊提到的選項和其他有用的選項.

FIXME 為 sysctl.conf 提供一個例項配置檔案, 而不僅僅是這個指令碼(see: sysctl.conf(5)). 並將此作為字典錯誤提交給 procps 軟體包.

在/etc/network/interface-secure(這個名字僅僅是個例子)中建立此指令碼, 並從 /etc/network/interfaces 中呼叫, 如下:

auto eth0

iface eth0 inet static

address xxx.xxx.xxx.xxx

netmask 255.255.255.xxx

broadcast xxx.xxx.xxx.xxx

gateway xxx.xxx.xxx.xxx

pre-up /etc/network/interface-secure

# Script-name: /etc/network/interface-secure

# Modifies some default behaviour in order to secure against

# some TCP/IP spoofing & attacks

#

# Contributed by Dariusz Puchalak

#

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

# broadcast echo protection enabled

echo 0 > /proc/sys/net/ipv4/ip_forward # ip forwarding disabled

echo 1 > /proc/sys/net/ipv4/tcp_syncookies # TCP syn cookie protection enabled

echo 1 >/proc/sys/net/ipv4/conf/all/log_martians # Log strange packets

# (this includes spoofed Packets, source routed Packets, redirect Packets)

# but be careful with this on heavy loaded web servers

echo 1 > /proc/sys/net/ipv4/ip_always_defrag

# defragging protection always enabled

echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

# bad error message protection enabled

# now ip spoofing protection

echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter

# and finally some more things:

# Disable ICMP Redirect Acceptance

echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects

echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

# Disable Source Routed Packets

echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route

echo 1 > /proc/sys/net/ipv4/conf/all/log_martians

您還可以建立一個 init.d 指令碼, 並使其在系統引導時執行(使用 update-rc.d 建立對應的 rc.d 連結) .

4.17.4 配置防火牆

為了獲得防火牆支援, 保護本地系統或其他處於其後的系統, 您需要在編譯核心將其啟用。標準的 Debian 2.2 kernel(也是 2.2 )提供了過濾資料包的 ipchains 防火牆, 標準的 Debian 3.0 kernel(kernel 2.4) 提供了 stateful 資料包過濾的iptables(netfilter)防火牆. 更舊的 Debian 版本則需要對應的核心補丁(Debian 2.1 使用 kernel 2.0.34).

無論如何, 使用一個與 Debian 提供的不同的核心並不是一件難事. 您可以找到預編譯的核心包, 然後簡單的把它安裝到 Debian 系統中. 您也可以透過下載 kernel-source-X 獲取核心原始碼, 然後使用 make-kpkg 構建核心軟體包.

在增加防火牆, 第 5.14 節處有關於在 Debian 中配置防火牆的更詳細的討論.

4.17.5 禁用弱客戶主機問題

系統可能配置了不止一個介面在不同的網路上提供服務, 因此它們可能繫結到一個指定的IP地址上. 這通常可以防止指定的地址的服務請求. 但是, 這並不意味著(儘管這是普遍的誤解, 包括我在內) 服務繫結到了指定的硬體地址(網路卡). [23]

這不是 ARP 問題, 也不是 RFC 問題(它在 RFC1122, 3.3.4.2部分稱作weak end host). 記住, IP 地址與物理介面無關.

在 2.2 (和更早)的核心中, 可以做如下修正:

# echo 1 > /proc/sys/net/ipv4/conf/all/hidden

# echo 1 > /proc/sys/net/ipv4/conf/eth0/hidden

# echo 1 > /proc/sys/net/ipv4/conf/eth1/hidden

.....

在最新的核心中, 還可以做如下操作:

* iptables 規則.

* 恰當的配置路由. [24]

* 核心補丁. [25]

根據本文, 將會有許多內容描述如何配置一些服務(sshd 服務, apache, 列印服務...), 使其監聽指定的地址, 讀者應該考慮到, 這裡沒有給定修正,修正不會阻止同一(本地)網路內部的訪問. [26]

FIXME: 有關 bugtraq 的評論表明有 某種 Linux 方法可以繫結到一個指定的介面.

FIXME: 提交一個netbas的錯誤, 使得 routing fix 成為Debian標準的動作?

4.17.6 保護系統免受ARP 攻擊

當您不再信任您的區域網內(經常會出現這種情況, 因為這才是安全的態度) 的其他系統時, 您需要保護自己免受各種各樣的 ARP 攻擊.

如您所知, ARP協議用於IP地址和MAC地址的轉換. (更多細節參閱RFC826). 當您向某個IP地址傳送資料包時, arp將其解析(首先查詢本地ARP快取, 如果此IP在快取中不存在, 則進行查詢廣播), 得到其實體地址. 所有的 ARP 攻擊都是試圖欺騙您的主機, 認為主機 B 的 IP 對應於入侵者的主機的MAC地址; 那麼, 所有的您傳送給對應主機 B 的 IP 的資料包都被髮送給入侵者的主機...

這些攻擊(Cache poisonning,ARP 欺騙...)允許攻擊者嗅探資料傳輸即使是在交換網上, 很容易的捕獲連線, 將任何一個主機從網路上斷開... Arp 攻擊強度很高, 並且實施簡單, 有這麼幾個工具: arpspoof (在最近的 dsniff 包中), arpmim, arpoison...

但是, 總有一個解決辦法:

* 使用靜態 arp 快取. 對您的arp快取設定 "static" 選項:

arp -s host_name hdwr_addr

對每個您網路中的重要的主機作如此設定, 確保沒有人會 建立/修改這些主機的一個(假的)記錄(static記錄不會到期, 也不能修改), 這樣arp欺騙就會被忽略.

* 檢查可疑的 ARP 通訊. 您可以使用arpwatch, karpski 或其它的可以監測可疑的 arp 通訊的IDS (snort, prelude...).

* 實行確認主機MAC地址的IP通訊過濾.

4.18 生成系統快照

在系統投入使用以前, 您最好生成系統快照. 此快照可用於系統被攻擊的情況下(參見攻陷之後(事件響應), 第 10 章). 然後您應該重新升級, 不管您是否進行了升級, 特別是如果您升級到了 Debian 新的發行版.

你應該使用可以設為只讀的可寫式移動介質儲存快照, 這可能是軟盤(使用後設定防寫), 或光碟(您可以使用燒錄機, 這樣您就可以備份不同時間的md5sum).

下邊的指令碼將建立這樣的快照:

#!/bin/bash

/bin/mount /dev/fd0 /mnt/floppy

/bin/cp /usr/bin/md5sum /mnt/floppy

echo "Calculating md5 database"

>/mnt/floppy/md5checksums.txt

for dir in /bin/ /sbin/ /usr/bin/ /usr/sbin/ /lib/ /usr/lib/

do

find $dir -type f | xargs /usr/bin/md5sum >>/mnt/floppy/md5checksums-lib.txt

done

/bin/umount /dev/fd0

echo "post installation md5 database calculated"

注意將 md5sum 程式放到軟盤上, 這樣就可用於以後的系統程式的檢查(防止置入木馬)

快照不包括 /var/lib/dpkg/info 下的檔案, 它們的 md5 雜湊值包含在安裝包中 (以.md5sums為副檔名的檔案中). 您也可以複製這些資訊,但是應當注意到:

* Debian 軟體包提供的 md5sums 為其所有檔案的值, 這使資料庫更大 (5Mbs ~600kbs 帶有圖形系統的Debian系統,大約有2.5G的軟體被安裝)

* 不是所有的 Debian 軟體包都為其安裝的檔案提供 md5sums, 因為這不(當前)是代理策略.

一旦生成了快照完, 您應當確保其被儲存於只讀介質上. 您也可以儲存其備份, 將其置於磁碟上,用於每晚的cron檢查比較.

4.19 其它建議

4.19.1 不要使用基於 svgalib 的軟體

SVGAlib 非常受控制檯愛好者的喜愛, 比如我. 但是, 過去它已被多次證明是不安全的. 釋出的基於 zgv 的Exploits, 很容易獲取root許可權. 只要可能儘量避免使用 SVGAlib 程式

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-945934/,如需轉載,請註明出處,否則將追究法律責任。

相關文章