发新话题
打印

[转载]FREEBSD SECURITY HOW-TO(2)

[转载]FREEBSD SECURITY HOW-TO(2)

  信息来源:邪恶八进制信息安全团队

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

# 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.demo ... rld/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.demo ... rld/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

  對於這份仍在趕工的文件我有許多的感謝。你的批評, 指教, 才讓這份文件得以問世。
曾几何时,有人对我说:装B遭雷劈。我说:去你妈的。于是,这个人又对我说:如果再说脏话,上帝会惩罚你的。我说:我操上帝。结论:彪悍的人生不需要上帝。

TOP

发新话题