FREEBSD SECURITY HOW-TO

出自啟示錄
跳至導覽 跳至搜尋
#
# This HOW-TO is maintained by Jan Koum ([email protected])
# Please mail me any additions, comments, suggestions, etc.
#
# Chinese Version is translated by
# Clive Lin <[email protected]> (isomer as well)
# Thanks for MTV channel when I'm translating, and StarCraft game for giving
# me some entertainment when I'm tired.
# Special thanks to:
# Winggy <[email protected]>
# for translation and correction help.
# $Id: cfbhow2.txt,v 1.1 1999/03/07 04:28:48 clive Exp $
#

                        FREEBSD SECURITY HOW-TO
o 前言
  o 這份 HOW-TO 是必要的嗎?

  FreeBSD 是一個非常安全的作業系統。也正因為它的 source code 是可以免費的取得,
  這個 OS 長久以來不斷的有人改進加強。儘管 FreeBSD 一出廠就非常安全, 但是仍然
  有更多加強安全性的措施, 來滿足"偏執狂"的你 :) 這份 HOW-TO 會教你一些步驟, 以
  更加強你機器的整體安全。

  o 這份文件會說明 tripwire, tcp_wrappers, cops, satan, 和其它的工具嗎?

  除了 SSH 之外, 不會。這是一份針對 FreeBSD 的文件 - 除此之外, 已經有很多文件
  說明上述的工具了。目前呢, 我只想關心的是關於 BSD 的部份。

  o 誰要讀這份 HOW-TO?
  任何想讓他的系統更安全的人。這份 HOW-TO 包含了一些很基本的步驟, 和某些很複雜
  的步驟。如果你有任何的疑問, 或者想要加以補充, 請 eMail 到維護人 [email protected]
  又, 儘管大部份的內容是針對 FreeBSD 的, 但仍然會套用到其它的 Unix OSes 上面。
  (特別是 OpenBSD 和 NetBSD)

  o 這份 HOW-TO 還有其它語言的版本嗎 ?
  就我所知, 有俄語版:
  http://www.etrust.ru/osa/security.html
  和中文版:
  http://water.ite.ntnu.edu.tw/doc/cfbhow2.txt

  o TODO:
  將包含 /etc/login.conf 和 login classes
  將提及使用 X 的場合
  將會有 html 版

o 網路
  o inetd (Inet Daemon)
  網路在系統安全上扮演了一個很重要的角色。FreeBSD 的根基是有著內建網路功能, 且
  具有最穩最快的 TCP/IP stacks 的 4.4BSD。這個 stack 支援了非常多的協定像是
  telnet, ftp, talk, rsh 等... 這些 service 的的主設定檔便是 /etc/inetd.conf。
  要編輯這個檔, 請輸入 "vi /etc/inetd.conf" (在這個例子裡, 我使用 vi 。你可以
  使用其它你較為上手的編輯器。或許你可以試試 pico)。如果你要使用 pico, 請在啟
  動它時加上 -w 選項: 
       -w     關掉自動斷行。(因此可以容許超過 80 字元的行存在)

  這選項在編輯 /etc/inetd.conf 時非常有用。
  當然了, 你也可以使用 ee - 它隨著 FreeBSD 一起 "出廠" 的, 而且也是 root 預設
  的編輯器。不過, 請再 "echo $EDITOR"  確認一次。  開啟了這個檔案後, 你可以看
  到裡面怎麼描述每個 service 怎麼啟動, 要以那位使用者執行等等的資訊。(man 5
  inetd.conf)既然這個檔案是許多 internet service 的主要設定檔, 好好的設定它便
  是一件十分重要的事。你要關掉一個 service的話,只消在那一行前面加個 "#" 符號。
  基本的概念是, 關掉些你不熟悉的 services - 如果你不知道那個 service 是啥, 或
  者不知道它可以幹啥。理想狀態下, 你不須要把所有的 service 都打開。例如, 你的
  器只是要跑 web server。這種情況下, 你只要啟動 ssh 和 httpd 便夠了。關於啥是
  ssh, 下面會說明。如果你啥 service 都不想跑, 最直接乾脆的方法是-關掉 inetd。
  做法很簡單, 只要編輯 /etc/rc.conf 並且把

  inetd_enable="YES"

  改成

  inetd_enable="NO"

  就可以了。
  如此一來沒人可以 telnet, rlogin, 或 ftp 到你的電腦。
  如果你決定要啟動你的 inetd 的話, 記得啟動 log 選項, 並提高一個 service 每分
  鐘啟動的上限數目。(預設值是 256, 我建議提高到 1024-自行參照下面解說調整吧!)
  為什麼要這麼做呢...? 就 modem user 或是低速專線用戶是沒什麼差別。但高速線路
  的人, 上限值太低會蹦出一個 DoS attack(Denial of Service)。某個壞心的人可以簡
  單的用一個 shell script 同時搞出超過 256 個 connections, 這麼一來你的 inetd
  會很不幸的陣亡。換句話說, 如果你想讓每分鐘每個 service 可接受的connection 數
  多點, 記得做如下的設定, 不然來個壞心的人就可以搞垮你的電腦。因此, 在這行

inetd_enable="YES"

  下面的

inetd_flags=""

   要改成:

inetd_flags="-l -R 1024"

  這會將連線的動作都 log 下來(-l 參數)而且將同時最大連線數從預設的 256 增加到
  1024。你還須要對你的 /etc/syslog.conf 作些修改, 這些等會兒會提到。

  o SSH

  在以下提到的案例中, 你完全不須要 run inetd。例如, 如果你只有跑 web, news, 或
  是 nfs server, 那麼就沒有必要在你的機器上再跑其它的services。但是你一定會問,
  "我要怎麼控制我的機器啊!?" 嗯嗯, 所以現在要介紹 SSH。你可以透過 SSH (Secure
  Shell) 來登入你的機器。Secure Shell 當初便是設計來取代 rsh, rlogin 等其它的
  Berkeley r* 命令。相信你很快就會了解 SSH 是如何有用,而且開始使用它,來代替其
  它的程式像是 telnet 和 ftp。SSH 具有很多功能,但是最為人知的是, 它的加密通訊
  方式, 也就是防止你的密碼和資料以明碼的方式在網路上傳輸。如果你使用 telnet,你
  的通訊內容可能會被"竊聽": 傳輸中的資料被改變, 通訊內容被看到。(不是有 S/Key
  可以解決嗎? 很不幸的, 它還是有著插入資料和連接時被破解的問題) 我希望你可以完
  全的關掉 inetd 而使用 SSH。如果你認為完全不靠 inetd 來啟動某些 services,是完
  完全全不可能的事, 那麼希望你至少啟動 log 功能, 而且要增加每分鐘同一個 servi-
  ce 可啟動的次數。 (原因上面有提到)
  你可以從 ftp://ftp.funet.fi/pub/unix/security/login/ssh 下載 SSH。
  若你想要更簡單的方法:

# cd /usr/ports/security/ssh
# make install

  如果你有不是使用 Unix 的使用者, 那麼可以從下面的站台抓到 win32 SSH 程式:
  http://fox.doc.ic.ac.uk/~ci2/ssh/
  http://www.zip.com.au/~roca/ttssh.html
  http://bmrc.berkeley.edu/people/chaffee/winntutil.html
  http://public.srce.hr/~cigaly/ssh
  SecureCRT from http://www.vandyke.com


  o inetd (part II)

    o telnetd

  好吧, 你仍然執意要使用 inetd。那麼我們來看看在 inetd.conf 有那些選項, 可以增
  進你的系統安全。在攻擊某系統之前, 攻擊者都會先收集該系統的相關資訊。就 teln-
  etd 而言, 你可以試試在 telnetd 那行後面加個 -h:

telnet  stream  tcp     nowait  root    /usr/libexec/telnetd    telnetd -h

  從 telnetd 的 man page 可以知道:

  -h      Disable the printing of host-specific information before login
          has been completed.

  當有很多管道可以獲得系統資訊的同時, 這招和下面的那招是個不錯的解決方案。如果
  你認為跑 telnet daemon 是沒有必要的, 那麼只消加個 "#" 在該行的最前面就行了:

#telnet stream  tcp     nowait  root    /usr/libexec/telnetd    telnetd

  有個極不錯的措施是, 你可以拒絕沒有完整 FQDN 的人來連線。要做到這點, 也只要加
  個 -U 選項到 telnetd 後面:

telnet  stream  tcp     nowait  root    /usr/libexec/telnetd    telnetd -h -U

  這是個小動作, 但是對你的系統安全有莫大的助益。

    o ftpd

  現在來看看 ftp。 對於  ftp  FreeBSD  已經做了一些  log  的動作 。 可以看到在
  /etc/inetd.conf 裡面 ftpd 那一行已經加了 "-l"。然而, 你還是要設定你的syslogd
  , 使它可以接受 ftp daemon 產生的 log。從 man page 可以得知:

-l      Each successful and failed ftp(1) session is logged using syslog
        with a facility of LOG_FTP.  If this option is specified twice,
        the retrieve (get), store (put), append, delete, make directory,
        remove directory and rename operations and their filename argu-
        ments are also logged.  Note: LOG_FTP messages are not displayed
        by syslogd(8) by default, and may have to be enabled in syslogd(8)'s
        configuration file.
        每個成功或是失敗的 ftp 登入嘗試, 都會以 LOG_FTP 機制紀錄起來。如
        果這個選項被指定了兩次, 所有的下載 (get), 上載(put), 新增, 刪除,
        建立目錄, 及更名的動作和檔案名字都會被紀錄下來。  又: LOG_FTP 訊
        息預設是不會被 syslogd(8) 紀錄下來的。你還要在 syslogd(8) 的設定
        檔裡面啟動這個功能才行。

  讓我們開啟 syslogd 紀錄 ftpd log 的功能吧~ 這個檔案是 /etc/syslog.conf (別忘
  了順便看看 man 5 syslog.conf)。把下面這一行加到這個設定檔裡:

ftp.*                                           /var/log/ftpd

  也不要忘了執行這個指令 "touch /var/log/ftpdlog", 因為 syslogd 不能寫入到一個
  沒有被開啟過的檔案。如果你想要你的 ftpd 提供你更多的 log 訊息, 那麼就在 ftp
  那一行多加個 "-l" 吧:

ftp     stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -l -l

  如果你想要確定你的使用者們都用 scp (Secure Copy, 附屬在 SSH 裡面), 但是又想
  要提供 anonymous ftp 服務, 也只消加個 "-A" 在 ftp 那行後面就行了:

ftp     stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -l -A

  你也可以編輯 /etc/ftpwelcome, 說明目前接受 anonymous ftp 登入, 但是系統內的
  使用者就得使用 rcp 了。如果你有提供 anonymous ftp, 你可以使用 -S 選項來記錄
  傳輸的情形:

ftp     stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -A -S

    o fingerd

  Finger 服務預設值還算安全: 它不容許不帶 user name 的 query。這是一件不錯的事
  (tm)。然而, 就是有些人無論如何也不想 run fingerd。這種情形下, 你只要簡單的給
  它加個 "#" 在這行的最前面就可以了。又, 你想要 log 住誰來 finger  的話,  加個
  "-l" 也就行了:

finger  stream  tcp     nowait  nobody  /usr/libexec/fingerd    fingerd -s -l

  Fingerd 產生的 log 資訊預設是寫到 /var/log/messages。如果你想要這些資訊寫入
  到特定的檔案裡去, 那麼就在 /etc/syslog.conf 加入這一行:

daemon.notice                                   /var/log/fingerd

/* !fingerd anyone? */

$ man 5 syslog.conf

  除了 ftp, telnet 和 finger 之外, 你實在不須要在 /etc/inetd.conf 中再多啟動任
  何東西了。通常我都會關掉 talk 及 comsat等我個人不須要的東西。如同我之前講的,
  如果你不知到某個 servcie 是幹嘛用的, 而且你也不須要它, 那麼就關掉它。一些和
  網路有關而且很有用的 man page 是: inetd, ftpd, telnetd, fingerd, syslogd,
  comsat, talkd, rshd, rlogind, inetd.conf。並且記得要看 man page 的"SEE ALSO"
  部份, 以獲得更多的相關資訊。

    o ipfw (IP FrewWall)

  IP FireWall 做的是 packet 過濾的工作。沒錯, 就是只有這樣。然而, 你要考慮的事
  是, 你的  kernel  要有支援 ipfw。 通常在我管的機器上, 我都會重編核心使其支援
  ipfw。大概看起來是這樣:

options         IPFIREWALL              #finger the net
options         IPFIREWALL_VERBOSE      #log the net
options         IPFIREWALL_DEFAULT_TO_ACCEPT

  第一行表示最其本的 IP FireWall 支援。第二行讓 ipfw 可以把接受或拒絕  packets
  的紀錄 log 起來。第三行非常重要, 讓 ipfw 預設值是接受任何地方來的 packets 。
  如果你不這樣做, 預設值拒絕任何地方來的 packets。我個比比較喜歡後者, 但我又認
  為在我自己的工作站上, 或一個讓人登入的工作站, 預設拒絕任何 packets 不是一件
  太好的事。

********** NOTE ************
  如果你搞不清楚自己在做啥事, 那就不要用這個選項。
  就設定 firewall 而言, 這是不甚正確的。預設任何東西都該被擋掉才是正確的。如果
  你是要建置一台高安全性的系統, 或一台 firewall 的話,那就千萬不要加入這個選項:

options         IPFIREWALL_DEFAULT_TO_ACCEPT

  記住一件事:  要預設拒絕任接受任何  packets,  然後再加入 rule 來設定你想要接
  受那些 packets。查看 /etc/rc.firewall 以得到更多的資訊。再一次提醒你, 不要使
  用這個 option, 除非你只是想要防止 DoS attacks 或暫時把某些 port/network ban
  掉。
*****************************

    o log_in_vain

  你也可以透過 sysctl 命令, 來改變一些有用的系統變數:

# sysctl -w net.inet.tcp.log_in_vain=1
# sysctl -w net.inet.udp.log_in_vain=1

  這會把嘗試向你的機器要求你沒有的服務的 connections log 起來。例如, 如果你在
  你的機器沒有跑 DNS server, 而又有個人想要向你的機器要求 DNS 服務, 這時候你就
  會看到

Connection attempt to UDP yourIP:53 from otherIP:X
(X 是某個 high port #)

  你用 "dmesg" 命令就可以看到這一行。Dmesg 秀出的是系統的   kernel   message
  buffer。然而, 這個  buffer  的空間是有限的,   所以系統也會把這些訊息寫入到
  /var/log/messages 裡面去:

# tail -1 /var/log/messages
Jun 12 19:36:03 ugh /kernel: Connection attempt to UDP yourIP:53 from otherIP:X

    o final notes
  理論上呢, 你的系統現在已經比你裝好它時更安全些了。你現在可以做一些事來確定你
  目前的更動:

$ netstat -na | grep LISTEN

  這會告訴你那些 service 在那些 port 跑。越少越好 :) 又, 再跑一些其它的 port
  scanners (strobe, nmap) 來找出你開了那些 port。
  而要確要你的 syslogd 已經開始紀下你剛剛想要 log 的事件, 可以這麼做:

# cd /var/log
# tail -10 fingerd ftpd messages

  在 log 檔裡面沒看到任何東西的話, 記得重新啟動 inetd 和 syslogd:

# kill -HUP `cat /var/run/syslog.pig` `cat /var/run/inetd.pid`

o Filesystem

  既然 Unix 把什麼東西都當作檔案來看待, 好好的保護你的檔案系統便是很重要的事。
  有件事是在你安裝作業系統前便要完成的: 必須要計劃並設計好你的 partition 該怎
  麼切割。有幾個很重要的原因讓你要這麼做: 一個是你可以 mount 不同的檔案系統以
  賦與不同的選項 (下面有幾個例子)。別一個是,如果你想要把你的 filesystem export
  出去, 你須要更加細微的控制。如果你是一個從 Linux 轉入 FreeBSD 的使用者, 你會
  發現 Linux 是把任何東西都往 root partition "/" 塞, 而 FreeBSD 預設便要 "/",
  "/usr", 和 "/var"。這也使得要使用如 dump 般的工具較容易。且讓我們來討論 se-
  curity 吧! 有一件事我通常會做的是, 我會把一般 users 可以寫入的 partition 分
  開來割, 而這些 partitons 便可以用 "nosuid" 的方式來 mount。從 mount 的 man
  page 可以知道:

            nosuid  Do not allow set-user-identifier or set-group-identifier
                    bits to take effect.  Note: this option is worthless if a
                    public available suid or sgid wrapper like suidperl is
                    installed on your system.

                    讓 suid 或 sgid bit 失效。又: 對於像 suidperl 這些公開使用
                    的程式, 設這個選項便沒用。

  因此你會有個 partition 給一般使用者使用: /home 或 /usr/home。然後你可以另外
  開個 partion 給 /var/tmp 然後再把你的 /tmp 指到這裡:

# rm -rf /tmp
# ln -s /var/tmp /tmp

  你可以參考這個例子:

# cat /etc/fstab
# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/sd0s1b             none            swap    sw              0       0
/dev/sd0s1a             /               ufs     rw              1       1
/dev/sd0s1g             /usr            ufs     rw              2       2
/dev/sd0s1h             /usr/home       ufs     rw              2       2
/dev/sd0s1f             /var            ufs     rw              2       2
/dev/sd0s1e             /var/tmp        ufs     rw,nosuid       2       2
proc                    /proc           procfs  rw              0       0

  現在你可以確定一般 users 可以寫入的目錄不是以 "-nosuid" 的方式被 mount, 就是
  沒有可以寫入。現在你還要關心的就是 /var/spool/uucppublic"。
  你可以把 "/var" 以 "-nosuid" 的方式來 mount , 或下這個命令:

# chmod o-w /var/spool/uucppublic

  如果你想要找出你所有的可寫入目錄, 下這個命令:

# find / -perm -0777 -type d -ls

  如同 man page 指出的, 具有 suid/sgid 的程式會讓你的 nosuid 失效。找出那些程
  式是 suid 或 sgid 的吧:

# find / -perm -2000 -ls
# find / -perm -4000 -ls

  同時你不止可以用 "-ls" 而只是知道有那些程式。你可以把不是很有用的程式 "chmod
  000"。像是 uustat, uucico 等, 如果你從來不碰 uucp 的話。或是 ppp 和 pppd, 如
  果你絕不會用到他們。又, 你不會去用到印表機的話, 把 lpr lprd 也 chmod 000 吧!
  也許改天會有個人寫個 shell script 來問你那些東西要 chmod 000 掉。

  現在你也許想問, 有什麼方式可以防止攻擊者重新以非 "-nosuid" 的方式 mount 你的
  filesystem ? Well, 沒有, 除非你改變你的 securelevel。

o securelevel

  FreeBSD kernel 有個觀念叫 securelevel。當還有人在爭論這是不是夠完美時,這個
  機制已經夠防止大部份的 "script kiddiez"。Securelevel 是指你的 kernel 在執行時
  的安全等級。每一個等級具有不同的保護和檢查機制。這些是 init(8) 的 man page:

  The kernel runs with four different levels of security.  Any superuser
  process can raise the security level, but only init can lower it.  The
  security levels are:
  Kernel 可以以四種不同的安全等級來執行。任何 superuser process 可以提高安全
  等級, 但是只有 init 可以降低它。這四種等級分別是:

  -1    Permanently insecure mode - always run the system in level 0 mode.
        永遠不安全模式 - 切換到 level 0 吧!

  0     Insecure mode - immutable and append-only flags may be turned off.
        All devices may be read or written subject to their permissions.
        不安全模式 - "不可更動"和"只能附加"這兩個旗標(flag)可以被改變。所有的
	devices 可以照著它們的讀寫權限被讀寫。

  1     Secure mode - the system immutable and system append-only flags may
        not be turned off; disks for mounted filesystems, /dev/mem, and
        /dev/kmem may not be opened for writing.
        安全模式 - "不可更動"和"只能附加" 的旗標不能被取消; mount 上來的檔案系
	統, /dev/mem, 和 /dev/kmem 不能寫入。

  2     Highly secure mode - same as secure mode, plus disks may not be
        opened for writing (except by mount(2))  whether mounted or not.
        his level precludes tampering with filesystems by unmounting them,
        but also inhibits running newfs(8) while the system is  multi-user.
        高安全模式 - 和安全模式一樣, 又多加了不管硬碟有沒有被 mount 起來,
        除了 mount(2) 之外都不能寫入。它防止一個檔案系統在 umount 的時候被
        搞亂。而且在這個等級也禁止在 multi-user 時執行 newfs(8)。

  如果安全等級最初是 -1, 那麼 init 就會保持原狀。否則在 single user mode 時,
  init 會把安全等級調到 0, 而在 multiuser mode 時會以 1 來跑。如果你希望在
  multiuser 模式是以等級 2 在跑, 你可以先進入 single user mode, 編輯 /etc/rc,
  使用 sysctl 來更動。

  若是你的系統只拿來跑 web server 之類的, 你可以放心的將 securelevel調高到2。
  但若是你要跑 X server, 把你的 securelevel 調至 1 或更高會導致一些問題。因為
  X server 必須要寫入 /dev/mem 和 /dev/kmem, 而 securelevel 1 不允許你這麼做。
  有一個解決的方法是, 在啟動 X server 後再調高 securelevel。但我的意見是, 如果
  你跑 X server 的話, 你已經有了其它的安全問題須要考量, 而不止是 securelevel。
  以下這個指令會顯示出你目前的 securelevel 設定值。

# sysctl kern.securelevel


  如果要提高你的 securelevel:
# sysctl -w kern.securelevel=X
  X 可以是 0, 1 或 2。

  又在 securelevel 是 1 的話, 你在 "make world" 時也會有些問題。因為 "make
  install" 時會在 kernel 上加上 immutable flag:

# ls -lo /kernel
-r-xr-xr-x  1 root  wheel  schg 1061679 Jun 30 01:27 /kernel

  "schg" flag 會防止你安裝新的 kernel:

nfr# id
uid=0(root) gid=0(wheel) groups=0(wheel), 2(kmem)

nfr# sysctl kern.securelevel
kern.securelevel: 2

nfr# rm -rf /kernel
rm: /kernel: Operation not permitted

nfr# mv /kernel /tmp/
mv: rename /kernel to /tmp//kernel: Operation not permitted

  如果你在 securelevel 1 或 2, 那麼 schg flag 是不能被改變的。

# chflags noschg /kernel
chflags: /kernel: Operation not permitted

  值得留意的是, /boot.config 可以改變你開機時的系統設定,要預防有心人篡改
  你應該這麼做:

# touch /boot.config
# chflags schg /boot.config

  你可以看看系統預設還有那些執行檔是有 schg flag 的。

# ls -lo /sbin | grep schg
-r-x------  1 bin   bin       schg 204800 Jul 19 20:38 init
# ls -lo /bin | grep schg
-r-sr-xr-x  1 root  bin       schg 192512 Jul 19 20:36 rcp

  再回過頭來談談鎖定系統這件事吧! 既然剛剛談到了 immutable flags, 何不試著把整
  個 /sbin 和 /bin 都設成 schg flag 呢 !? 這會給想 crack你系統的人一點小挫折。
  (假設你的系統也正以適當的 securelevel 運作中)

# chflags schg /bin/*
# chflags schg /sbin/*

  不過 /sbin 可能被改成別的名字,再重新創造一份新的 /sbin ,所以改變 /sbin 與
  /bin 的 schg flag 是很合理的想法,我們可以依照以下的方式改變 /sbin 和 /bin 
  的 schg flag:

# chflags schg /bin/*
# chflags schg /sbin/*

  這些 schg flag 的檔案會讓你在 "make world" 時有問題。
  ("make installworld" 也是)

  無論如何 ,最好是以 single user 模式來 "make world"。有關 "makr world" 的相
  資訊, 還有為什麼要這麼做, 到下面這個網頁來看看:

http://www.nothing-going-on.demon.co.uk/FreeBSD/make-world/make-world.html

  現在你已經適當的鎖定你的系統, 也以只跑必要的的 service, 而檔案系統也適當的
  mount 上來, 且也以適合的 kernel securelevel 運作中。
  與以上所述的相關 man pages 有: init(8), chflags(1), sysctl(8)。

o Logging

  系統紀錄是很重要的。如果你的統被人攻擊, 透過它你可以找到一些蛛絲馬跡。Unix的
  標準 log 動作是透過 syslogd(8) 來達成的。它從 /etc/rc 中被啟動, 一直執行到系
  統關機為止。你可以用以下的方式確定你的系統上是否正在執行 syslogd:

  $ ps -axu | grep syslogd

  Syslogd 會在啟動時讀取 /etc/syslogd.conf。這個檔案很重要, 因為它告訴 syslogd
  要紀錄那些東西, 而這些東西又該放在那裡。你也許想看看  syslod 和  syslod.conf
  的 man pages:

  $ man syslogd ; man 5 syslog.conf

  既然 Unix 當初就是設計作為網路作業系統, syslogd 可以而且預設值也接受其它系統
  的紀錄。它自己也是可以把紀錄透過網路送到其它的電腦去。想當然耳, 它可以紀錄下
  自己系統發生的每件事 - 而這也正是預設值。因為 syslogd 使用  UDP - 所以資料是
  可以被偽造的。你至少可以作一件事: 不要讓你的  syslogd 接受來自其它電腦的紀錄
  訊息。在 /etc/rc.conf 加個 "-s" 就可以了:

  syslogd_flags="-s"              # Flags to syslogd (if enabled).

  如果你有接受特定機器之紀錄的必要 (像是你的  router, 或是  web  server), 使用
  "-a" 來指定特定的 hosts, domains, 或 subnets。
  下次你重新啟動你的系統時, syslogd便會拒絕來自其它地方的紀錄訊息。如果有人嘗
  試送資料進來, syslogd 將會加以紀錄。

  如果你不想重新啟動你的系統, 那麼只要把 syslogd kill -9, 然後再以 root 的身份
  啟動 syslogd 便可以了。記得加上 "-s"這個參數。
  如果有人嘗試攻擊你的系統而且失敗了, 你的系統紀錄便不會被偽造。但如果你的系統
  己經被攻陷了, 而且 /var/log 整個被幹掉了呢 !?還是有方法可以防止的。 其一便是
  在你的網路系統中再架一台機器拿來紀錄整個網路中發生的事, 而且也不要再幹其它的
  事了。除了 UDP port 514 之外, 其它的也都不用再開了。這樣子一來你便可以紀錄下
  所有機器 (routers, firewalls, serves, workstations) 發生的所有事。你可以只送
  敏感的訊息給它, 或者任何你覺得重要的。這台機器可以是老舊 486, 但有顆大大的硬
  碟。記得要設定好正確的 "-a" 選項, 免得搞出沒收到紀錄的烏龍事。你也可以接台老
  舊的點陣印表機給它, 以印出敏感的事件(像是失敗的登入嘗試)。如果你把系統紀錄印
  到紙上, 一位攻擊者要清除它是很困難的(除非有內奸, 哈哈!)。還有其它的方法,例如
  透過 serial port (cuaaN) 或是 parallel port (lpN) 送出紀錄到別台機器上。

  每個人都有不同的記錄需求。但是有一件事我通常會做的是在 /etc/syslog.conf 加入
  這一行:

auth.*                                  /var/log/authlog

  FreeBSD 出廠時便包含了 newsyslog。這玩意會定時壓縮紀錄檔並清除掉舊的紀錄。設
  定檔位於 /etc/newsyslog.conf - 請看一下 man page 以得到更多的資訊:

  % man newsyslog

  不像 syslogd, newsyslog 不是一直都在執行的。它是從 crontab 啟動的:

% grep newsyslog /etc/crontab
0       *       *       *       *       root    /usr/sbin/newsyslog
%

  你可以修改 /etc/newsyslog.conf 以符合你的需求。我通常會改變它預設的檔案模式,
  從 664 改成 660 - 因為沒有必要讓一般的使用者去查看你的系統紀錄。你應該這麼
  做:

  # cd /var/log
  # chmod g-w,o-r * ; chmod a+r wtmp

  這會防止一般使用者讀取紀錄檔, 除非它們在適當的 group (wheel 或之類的)。還有,
  記得把記錄檔的 group 都改成 wheel -- 這純粹只是為了方便: 如果你是在 wheel 這
  個 group; 你當然是可以 su(1) 到 root  然後讀記錄檔。但是這麼做以後你便可以直
  接讀記錄檔了, 豈不方便乎!?
  你還要在 /etc /newsyslog.conf 中加入 "root.wheel":

  /var/log/maillog        root.wheel      640  7     100  *     Z
  /var/log/authlog        root.wheel      640  7     100  *     Z
  /var/log/messages       root.wheel      640  7     100  *     Z

  這會在記錄檔達到  100K  時將它壓縮並加以編號, 將  mode  改成 640,   chown 成
  root.wheel, 並將舊的記錄檔幹掉 - 這就是我們要的。

  當然,標準的 Unix 還有其他不同的 syslog 程式可供選擇,其中之一是 CORE EDI 的
  ssyslog (secure syslog). 可以在以下的地方找到:

  http://www.core-sdi.com/ENGLISH/CoreLabs/ssyslog/download.html

  另外還有 nsyslog (new syslog),這是寫 bpfilter 那一伙人寫出來的,你可以在
  http://cheops.anu.edu.au/~avalon/nsyslog.html 找到這個程式。

  不管你選用那一種程式 (標準的 syslog , ssyslog ,或 nsyslog),你應該也去看看
  一些幫你分析系統 log 的程式,幫你省下去用 grep 查詢 log file 的麻煩。

  其中之一是 logcheck , 可以在這個地方下載:
  http://www.psionic.com/abacus/abacus_logcheck.html

  另外一個類似的程式叫做 logsurfer , 你可以從這個網頁下載: 
  http://www.cert.dfn.de/eng/team/wl/logsurf/


o Misc. hints and tips

  o LKM

  在正式提供服務的系統上, 也許該關掉 LKM。為什麼? 請看:
  Phrack Magazine   Volume 7, Issue 51 September 01, 1997, article 09
  要關掉 LKMs, 在 kernel 設定檔中加入這一行:

  options        NOLKM


  o Portmap

  FreeBSD 出廠的預設值會將 portmap 這項功能打開。如果你不需要它的話,把它關掉。
  如果你沒有跑任何需要呼叫 RPC 的程式的話,你就不需要跑這個程式。如果要關掉
  portmap 這個程式,你可以去修改 /etc/rc.conf ,  把

portmap_enable="YES"             # Run the portmapper service (or NO).

  改成

portmap_enable="NO"             # Run the portmapper service (or NO).


  o Sendmail

  FreeBSD 出廠的預設值也會執行 sendmail 的功能。從很久以前 sendmail 就以不安全
  且漏洞百出聞名。最近人們努力的將 sendmail 中的錯誤清除,但是由於 sendmail是一
  個很肥大的程式,要將所有的錯誤都抓出來相當的困難。換句話說:如果你不需要它的話
  ,最好把它關掉。如果你真的需要它的話,最好到 sendmail 的網站去看看有沒有新的
  patches 或是 hacks, sendmail 的網站在 http://www.sendmail.org 。
  此外,如果你的 sendmail 版本是 8.8 以後的版本,請設定好你的系統,以防止 spammer
  利用你的系統去幹壞事。設定 anti-spam 的資訊可以在
  http://www.sendmail.org/antispam.html 下找到。

  如果你決定要把 sendmail 關掉的話,只要去修改 /etc/rc.conf (沒錯,又是它)中的:

sendmail_enable="YES"   # Run the sendmail daemon (or NO).

  改成

sendmail_enable="NO"   # Run the sendmail daemon (or NO).


  o Ports and Packages

  在一台高安全性的系統上, 最好不要使用 ports 或 packakges。 你不會真正知道是不
  是安裝 suid 的程式進你的系統 -- 而且你不會想再多這些 suid 的東西了, 相信我。
  儘管你在 pkg_add 時可以使用不同的選項(如 "-v" 或 "-n"), 最好還是自己來: 抓回
  它的 source code, 自己 compile, 再手動安裝完成。

  o Filesystem quota

  如果你的系統是 "shell" type server,你可能希望設定使用者的 quota (可用空間)。
  如此一來可以保護你的系統免受 Denial of Service 攻擊方式的侵擾(不論是有意或
  是無意的)。在未設定 quota 的系統上使用者可以隨意的灌爆你的硬碟。要把 quota
  這項功能打開,你可以修改 /etc/rc.conf 中的這項設定:

check_quotas="NO"       # Check quotas (or NO).

  改成

check_quotas="YES"       # Check quotas (or NO).


  請先看看以下的 man page,這些文件說明如何使用 quota 的各項設定,並且有一些設定
  的範例: quotaon, edquota, repquota, quota
  請確定在 /etc/fstab 中有加入 "userquota" , 詳見 man 5 fstab。


  o Crontab
  
  如果你使用了 /etc/crontab 的話,這項功能有可能提供入侵者一些額外的資訊。
  請確定你做過 "chmod 640 /etc/crontab"


  o BPF

  BPF 是 berkeley packet filter 的縮寫,要使用這項功能前你必須修改 kernel,以達
  成監聽網路的目的。像 tcpdump 和 NFR 這些程式都使用 BPF。然而 BSD的監聽程式
  也都透過 BPF 來達成,如果有人拿到你系統的 root 權限的話,在系統上設定 BPF 功
  能反而幫助他們更容易的監聽你的網路。如果沒有必要的話,不要設定 kernel 中 BPF
  的功能。 FreeBSD 出廠的設定值是將這個功能關閉起來的。


  o CVSup, CVS, 等等

  如果你是使用 CD-ROM 安裝你的系統的話,很有可能當你拿到你的 CD-ROM時,已經發現
  某些程式有錯誤存在了。在大部份的情況下(我們希望如此),這些錯誤與系統安全無關
  。然而,我建議你將你的系統升級到最新的 -current (或是 -stable,視你的喜好而定) 
  版本。如此你可以確定你系統上的的是最新版本的系統原始碼。
  你需要的資訊在這邊可以找到:

  http://www.freebsd.org/handbook/handbook264.html#508

  在更新你作業系統的原始碼後你必須去 "make world",詳細的文件在:

  http://www.nothing-going-on.demon.co.uk/FreeBSD/make-world/make-world.html


  
  o SSH

  使用 ssh 以代替 telnet, ftp, rlogin, rsh  等的重要性, 再怎麼強調都是不夠的。
  對於使用慢速線路的人 (dial-up, 56K frame), ssh 有 -C 選項:

     -C     Requests compression of all data (including  stdin,
            stdout,  stderr,  and  data  for  forwarded X11 and
            TCP/IP connections).  The compression algorithm  is
            the  same used by gzip, and the "level" can be con-
            trolled by the CompressionLevel option (see below).
            Compression  is  desirable on modem lines and other
            slow connections, but will only slow down things on
            fast  networks.   The default value can be set on a
            host-by-host basis in the configuration files;  see
            the Compress option below.
            將資料壓縮後再傳出去, 包括了  stdin, stdout, stderr
            還有透過 X11 還有 TCP/IP。壓縮的演算法同 gzip, 而且
            可以指定壓縮的 level。對於 moden users 和使用慢速線
            路的人, 這功能是不錯的。 但有高速線路的人, 這麼搞只
            會拖慢速度。在主機對連時可以設預設值, 請再參照文件。

  這會讓你用起來快一點 :) 總之就是用 SSH 就對了啦! 拜託, 拜託, 使用 ssh。 如果
  你硬是不信邪, 再也沒什麼安全措施可以幫助你了 !!

  o Related URLs

  FreeBSD Hardening Project:
  http://www.watson.org/fbsd-hardening/

  FreeBSD ipfw Configuration Page:
  http://www.metronet.com/~pgilley/freebsd/ipfw

  FreeBSD Security advisories:
  ftp://ftp.freebsd.org/pub/FreeBSD/CERT/advisories/

  FreeBSD Security web page:
  http://www.freebsd.org/security/security.html

  Security tools in FreeBSD:
  http://www.samag.com/archive/0705/feature.html

  o Thanks

  對於這份仍在趕工的文件我有許多的感謝。你的批評, 指教, 才讓這份文件得以問世。