一些FreeBSD相關的安全問題

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
   一些FreeBSD相關的安全問題

by xundi@xfocus.org
http://xfocus.org
2001/08/07

==========================================================================


FreeBSD的日誌安全
--------------------
I)如果你安裝了sshd(也強烈建議安裝sshd,因為默認的telnetd程序存在嚴重
的安全問題)。請編輯你的/etc/syslog.conf文件,一般修改
security.* /var/log/security條目內容如下:

security.*;auth.info /var/log/security

原因很簡單,這樣syslogd就把連接到sshd的日誌信息記錄下來。

當然如果你願意,也可以建立其他的日誌文件,不過如果你建立新的日誌文件,
你必須檢查更新/etc/newsyslog.conf是否建立相關條目,如:

/var/log/auth 600 10 100 * Z

其中/var/log/auth表示日誌文件名,600是日誌文件指定的屬性,10表示包括
要歸檔的文件數,100表示文件位元組大小,以K為單位,*表示間隔時間或者指定
時間,其中*表示日誌歸檔是以位元組(size)來判斷的。最後一個Z表示指定歸檔
要處理的格式,Z表示使用gzip(1)來壓縮歸檔日誌來節約空間,具體更多信息
你可以使用man newsyslog來獲得。

這裡建立你修改newsyslog.conf中的一些全局可讀屬性,如maillog和messages
log,一般把它們的屬性設置為600。如下所示:

/var/log/messages 600 5 100 * Z
/var/log/maillog 600 7 * @T00 Z

當然如果你要把信息記錄到其他主機上更好,你可以修改/etc/syslog.conf中的
如下條目,把其中的註釋去掉,並修改loghost為要記錄的機器名字:

#*.* @loghost

最後你防止任意用戶讀取這些文件,你使用下面命令修改文件屬性:

# chmod 600 /etc/syslog.conf
# chmod 600 /etc/newsyslog.conf

=========================================================================

關於SSH配置
-------------

就象上面所說的,telnetd守護程序存在嚴重的緩衝溢出可以導致遠程ROOT SHELL
的獲得,這裡強烈建議你如果需要遠程控制的話,就使用SSH工具,並且保證是最
新的版本,至少目前為止還沒有很嚴重的漏洞出現(當然也有幾個漏洞大家可以參考
一些安全資料)。

sshd控制文件是/etc/ssh/sshd_config,如果你沒有使用SSH protocol 1的機會,
這裡建議你關閉protocol 1的使用,因為ssh protocol 1不如protocol 2安全,
還可以有效的阻止攻擊者通過修改包攜帶的版本banner來劫持(hijacking)啟動
會話進程並降級你到protocol 1,理論上可以迫使使用ssh 1 協議來通信。你
必須註釋掉Protocol 2,1而使用下面的一行來代替:

Protocol 2

第二,SSH在運行的時候消耗比較多的內存,是個"耗糧"大戶,這也是cisco產品
近來發現有關SSH存在拒絕服務攻擊的原因。每一個連接使用一大塊可觀的內存,
FreeBSD默認使用"MaxStartups"來管理,默認的值是一個比較健康的值,如:

MaxStartups 5:50:10

因為一個系統你除非有很多人管理系統或者提供SHELL服務,一般情況下這個值
是足夠了,MaxStartups不是意味著總的連接數,只是指還沒有認證的連接數,
這意味著,在任一(意)時刻, 多達5人可以(能)同時喚起登陸進程。

默認情況下,FreeBSD的OpenSSH配置關閉了遠程ROOT登陸和空密碼登陸,這裡還
建議里關閉X11Forwarding,你可以把X11Forwarding 這行改為:

X11Forwarding no

如果你的機器作為伺服器在運行,就不需要安裝X服務程序,因為使用了
X11Forwarding on,就可能被受控制了的遠程主機發送進程把自己attach你的
X11會話進程,從而可以記錄擊鍵記錄,顯示一些雜亂信息和捕獲你的顯示內容。

強烈建議不使用靜態密碼,而使用DSA或者RSA KEY,你修改如下內容就可以關閉
使用密碼認證:

PasswordAuthentication no

因為使用密碼驗證畢竟不是一種安全的方法,存在著社會工程,猜測,竊取
的可能性。

對於sshd,你可以通過下面的方法來限制組用戶或者光是單獨用戶來訪問SHELL:

AllowGroups shellusers
或者
AllowGroups wheel
或者
AllowUsers xundi

當然你如果要改變原來的用戶訪問SHELL屬性,如要把用戶改變成/sbin/nologin
而不讓它訪問shell,你可以使用下面的命令直接改變:

chsh -s /sbin/nologin user

最後你最好使用tcpwrappers來限制一些訪問,你修改/etc/hosts.allow文件,註釋
掉"ALL : ALL : allow", 去掉其他無關控制訪問,增加如下內容:

sshd : localhost : allow
sshd : friendlycomputer : allow
sshd : all : deny

FreeBSD默認情況下不把ssh登陸失敗的內容記錄下來,你需要對/etc/security
進行修改,下面的補丁只檢測密碼無效的登陸並記錄下來,你可以增加對dsa/rsa
key登陸失敗或者不合法用戶登陸的檢測:

--- /etc/security Mon Jun 11 15:45:02 2001
+++ /etc/security Mon Jun 11 15:48:29 2001
@@ -44,6 +44,7 @@
sort -t. -r -n +1 -2 |
xargs zcat -f
[ -f $LOG/messages ] && cat $LOG/messages
+ [ -f $LOG/security ] && cat $LOG/security
}

sflag=FALSE ignore=
@@ -188,6 +189,12 @@
separator
echo "${host} login failures:"
n=$(catmsgs | grep -i "^$yesterday.*login failure" | tee /dev/stderr | wc -l)
+[ $n -gt 0 -a $rc -lt 1 ] && rc=1
+
+# Show "${host} SSH login failures:"
+separator
+echo "${host} login failures:"
+n=$(catmsgs | grep -i "^$yesterday.*failed password" | tee /dev/stderr | wc -l)
[ $n -gt 0 -a $rc -lt 1 ] && rc=1

# Show tcp_wrapper warning messages

====================================================================

網路部分

---------

默認情況下FreeBSD和許多操作系統在關閉的埠上接受到TCP SYN段的時候,會
發送RST信息包,也就是告訴攻擊者這個埠關閉了,導致攻擊者繼續掃描下一個
埠,一般情況下我們都不願意使埠掃描簡單化,和不想浪費過多的CPU時間
在DoS攻擊上。因此我們可以使用FreeBSD系統中叫blackhole的特徵,blackhole
sysctl(8) MIB用來控制當對一些沒有socket監聽的TCP或者UDP埠接收到連接
請求時所操作的行為,你可以使用man blackhole獲得詳細的信息,當設置這個
選項后,對那些連接沒有socket監聽的TCP或者UDP埠的連接,系統將馬上丟棄
這個包而不發RST包。連接端將看到"Connection reset by peer".下面的操作
將激活這個特徵:

sysctl -w net.inet.tcp.blackhole=2
sysctl -w net.inet.udp.blackhole=1

你可以通過下面的操作馬上啟動實現這個特徵:

# /bin/sh /etc/rc.sysctl

當然這個特徵不能作為ipfw(8)工具的替代品來防衛系統,要建立更高安全的
系統,你當然需要使用Ipfw(8)或者Ipfilter工具實現。

修改/etc/rc.conf,把不需要的服務關閉,i)portmap服務,如果你沒有NFS, NIS
等需要。再/etc/rc.conf中加入:

portmap_enable="NO"

你可能經常發現有人討厭的掃描你整個網路,目標埠為111的信息,這是有人
想查找是否有rpc服務漏洞的掃描,你可以在你的邊緣路由器中丟棄dstport為
111的信息包。

ii)除非你運行mail伺服器或者mail網關,這裡建議你把sendmail置於queueing only
模式,如果你確實需要SMTP網關,建議你安裝postfix.

sendmail_flags="-q1m"

iii)建議你丟棄icmp重定向,可以防止Dos攻擊或劫持進程(hijack sessions),
你也可以記錄icmp重定向,不過這裡你要區分一些信息,因為有的時候Cisco
路由器也會產生重定向而不是攻擊信息,要記錄這些信息,使用如下條目:

icmp_log_redirect="YES"

當然你要完全去掉不確定信息記錄,你可以在你的CISCO路由器上關閉重定向:

"no ip send-redirects"

(IV)你可以設置系統丟棄SYNFIN信息包,不過這個你可以更好的通過IPFW來過濾
這種信息包,但是你也可以在/etc/rc.conf中增加如下條目來激活這種選項:

tcp_drop_synfin="YES"

當然你需要在kernel配置中增加如下配置:

options TCP_DROP_SYNFIN

v)關閉對廣播類型的響應

#sysctl -w net.inet.icmp.bmcastecho=0

過濾icmp響應這后,伺服器無法ping通,這有助提高部份安全性能。

vi)對udp包的校驗和計算

#sysctl -w net.inet.udp.checksum=1

可以防止不正確的udp包的攻擊。

vii)設置rc.sysctl, rc.conf 和 sysctl.conf 許可權:

# chmod 600 /etc/rc.sysctl
# chmod 600 /etc/rc.conf
# chmod 600 /etc/sysctl.conf

===================================================================

Crontab和at問題

----------------

crontab是一個比較強大的服務,有不少漏洞在cron發現過,普通用戶最起碼
也可以浪費資源等操作,這裡建議'www', 'nobody' 和 'bind' 不能使用crontab.

建立一/etc/cron/allow文件並把需要使用的用戶放進去,如:

# echo root > /var/cron/allow
# chmod 600 /var/cron/allow

並設置許可權crontab不能由其他用戶任意訪問:

# chmod 600 /etc/crontab

不過你如果不需要使用'at'命令,就關閉這個服務,因為安全的原則始終是"
你不許它,丟掉它",在/etc/crontab文件中註釋掉下面一行:

# */5 * * * * root /usr/libexec/atrun

===================================================================

inetd和rate限制問題
---------------------

Inetd默認情況下是啟用的,它控制了不少不安全的服務,如:telnet, ntalk
和finger。檢查你所有/etc/inetd.conf中的服務,關閉任何你不需要的服務。
如果沒有一個用戶需要,請在/etc/rc.conf中關閉inetd啟動:

inetd_enable="NO"

如果你要使用FreeBSD的inetd.你可以通過inent請求來控制rate的資源,如:

auth stream tcp nowait/10/10 root internal auth -r -f -n -o UNKNOWN -t 30

第一個10表示我們允許的最大子進程數量,第二個值是每一個IP每一分鐘連接的
最大數量,一般10/10的值是健康的,不過你一般不要使用這個ident,我們一般也只在IRC里看到這個服務。

=======================================================================、

Securelevel 問題
=================

FreeBSD內核有一個安全級別(securelevel)的概念,這是指系統內核運行使用
的安全等級,不同的等級具備不同的保護和檢查機制。一般工作站運行在securelevel
0級別,因為他們可能需要運行X11,而伺服器一般運行在2或者1級別上,關於
內核安全級別的詳細資料中文你可以參看王波的"FreeBSD使用大全連載 "。

如果你要改變級別系統為2,你可以在/etc/rc.conf中增加如下條目:

kern_securelevel_enable="YES"
kern_securelevel="2"

你可以重新去啟動,或者使用

# sysctl -w kern.securelevel=2

來激活。

=====================================================================

一些本地安全tip
---------------

i)編輯/etc/ttys,把下面的一行的secure改為insecure:

console none unknown off secure

這樣用戶進入單用戶模式時會要求輸入ROOT密碼,當然這樣也使你忘記ROOT密碼
時恢復存在一定難度了。

ii)修改一些計算機相關設置,如BIOS,不允許軟盤啟動,CDROM啟動等,即在裝載
硬碟驅動以前不允許其他媒介啟動。設置BIOS密碼,保護機器物理安全(如果人家
帶著榔頭,炸彈,一盆水來那就沒辦法了)。

iii)關於虛擬終端和虛擬終端緩衝,虛擬終端緩衝中的內容在你logoff以後並
不刷新,所有你在機器來操作的活動可以被複查。你可以重新配置內核參數如:

SC_NO_HISTORY #取消歷史記錄

SC_DISABLE_DDBKEY # 取消debug鍵
SC_DISABLE_REBOOT # 取消clt-alt-del 鍵

iv)對/bin,/sbin進行安全保護。

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

======================================================================

信息過濾問題
--------------

FreeBSD的包過濾工具具有強大的規則設置來過濾你想阻塞的信息,你可以使用
ipfw來實現,不過你需要在內核中有一定的選項設置,如:

需要在編譯內核時打開下面選項重新定製內核。

options IPFIREWALL
options IPFIREWALL_VERBOSE
options 「IPFIREWALL_VERBOSE_LIMIT=100」
options IPFIREWALL_DEFAULT_TO_ACCEPT

options IPDIVERT

其中第一項設置IPFIREWALL是用於打開基本的包過濾支持的,只有使用它才能
在內核中支持包過濾。IPFIREWALL_VERBOSE 和IPFIREWALL_VERBOSE_LIMIT設
置記錄過濾日誌,及日誌記錄的限制。IPFIREWALL_DEFAULT_TO_ACCEPT是設置
IPFIREWALL的預設行為,在數據包不符合所有的過濾規則的情況下進行轉發,
顯然這是一種寬鬆的限制,此時系統主要用於屏蔽特定地址和特定服務,而提
供其他的預設網路能力。如果沒有定義這個選項,系統就只能允許符合已定義
規則的數據包通過,而屏蔽其他任何數據包,這樣在沒有定義過濾規則的情況
下,系統不能和其他計算機相互通信。最後一個選項IPDIVERT是用於定義
IPFIREWALL與natd的介面(摘自王波-FreeBSD使用大全連載)。

你可以建立/etc/firewall.rules建立自己的規則,並把文件設置為600屬性,
下面的規則僅供參考:

ipfw -q -f flush
ipfw -q add 00100 allow ip from any to any via lo0
ipfw -q add 00220 deny log ip from me to any in
#syn fin組合的包一般來說是nmap和queso掃描器使用,所以過濾
ipfw -q add 00225 deny log tcp from any to any in tcpflags syn,fin

# 檢查通信狀態
ipfw -q add 00230 check-state
ipfw -q add 00235 deny tcp from any to any in established
ipfw -q add 00240 allow ip from any to any out keep-state

# 控制icmp包,只能通過icmp類型來限制
ipfw -q add 00300 allow icmp from any to any icmptype 3
ipfw -q add 00301 allow icmp from any to any icmptype 4
ipfw -q add 00302 allow icmp from any to any icmptype 11

# 允許DHCP通過
ipfw -q add 00401 allow udp from 192.168.2.1 67 to any 68
ipfw -q add 00402 allow udp from 192.168.1.1 67 to any 68

# allow ident requests
ipfw -q add 00500 allow tcp from any to any 113 keep-state setup

# log anything that falls through
ipfw -q add 09000 deny log ip from any to any

其實關於規則有很多文章可以參考,這裡就不在敘述。

你可以使用下面命令馬上激活規則:

# sh /etc/firewall.rules

如果你要在你日誌里查看有關丟棄包的記錄,你需要如下設置:

# sysctl -w net.inet.ip.fw.verbose=1

如果你要所有這些設置在機器啟動時候激活,編輯/etc/rc.conf增加如下條目:

firewall_enable="YES"
firewall_logging="YES"
firewall_script="/etc/firewall.rules"

最好你如果要記錄這些信息進行調試,不要忘了在/etc/syslog.conf中增加如下
條目:

!ipfw
*.* /var/log/ipfw.log

記得在/etc/newsyslog.conf中設置如下選項:

/var/log/ipfw.log 600 3 100 * Z

=========================================================================

用戶資源限制問題
---------------

從 4.3 BSD Net/2開始,BSD Unix引入了登錄類別這種分類機制來管理用戶使用的資源、記賬和環境設置。FreeBSD系統使用/etc/login.conf中描述的數據來將用戶按照登錄環境、強制性的資源限制以及記賬管理等分為不同的登錄類別,每個用戶的登錄類別記錄在/etc/master.passwd中的該用戶的設置中。以下是一個預設安裝的/etc/login.conf的部份內容。
bash-2.03# cat login.conf

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


#
# A collection of common class names - forward them all to 'default'
# (login would normally do this anyway, but having a class name
# here suppresses the diagnostic)
#
standard:\
:tc=default:
xuser:\
:tc=default:
staff:\
:tc=default:
daemon:\
:tc=default:
news:\
:tc=default:
dialer:\
:tc=default:

#
# Root can always login
#
# N.B. login_getpwclass(3) will use this entry for the root account,
# in preference to 'default'.
root:\
:ignorenologin:\
:tc=default:
---------------------snip----------------------

利用login.conf可以方便地對用戶的登錄環境和資源許可進行設置,預設的設置對用戶所能使用的資源幾乎沒有限制,可以把login.conf改為如下內容:

---------------------snip----------------------
default:\
  :cputime=infinity:\
  :datasize-cur=64M:\
  :stacksize-cur=64M:\
  :memorylocked-cur=10M:\
  :memoryuse-cur=100M:\
  :filesize=infinity:\
  :coredumpsize=infinity:\
  :maxproc-cur=64:\
  :openfiles-cur=64:\
  :priority=0:\
  :requirehome@:\
  :umask=022:\
  :tc=auth-defaults:
---------------------snip----------------------

上面設置了default登錄類別中的幾個參數,如果沒有在master.passwd文件中明確指定用戶的登錄類別,就使用這個預設類別來作為用戶的登錄類別。

cputime設置了用戶的每個進程可以使用的CPU時間,預設是無限制(infinity)。如果加以限制,有些需要大量CPU時間進行運算的進程就不能正常執行到結束。

datasize-cur設置了用戶使用的數據段最大為64M,但-cur設置不是強制的,用戶實際使用的數據有可能超過這個值,但最大不能超過datasize-max設置的值(預設沒有設置)。如果沒有-cur和-max 後綴,僅僅定義datasize,則表示datasize-cur和datasize-max同樣都為datasize 設置的值。同樣stacksize定義了對棧的限制。

memorylocked-cur設置了用戶每進程可以鎖定的最大內存。

memoryuse-cur設置了每進程使用的最大內存。

filesize-cur設置了用戶產生的文件大小。

coredumpsize設置了在應用程序發生問題時產生的core dump文件的大小。

maxproc-cur設置了用戶可以同時執行的最大進程數。

openfiles-cur設置了每進程最多打開的文件數。

priority設置用戶進程的優先順序。

requirehome設置用戶登錄時是否需要主目錄,@符號表示不需要主目錄。

umask項設置預設的umask,用於用戶創建文件的屬性。

tc設置系統認證策略為使用預設的認證策略。

如果要創建新類別,並不需要對每個值都重新設置,系統預設先應用default類別的設置,然後再應用具體類別的設置,因此只需要設置與default類別不同的項就可以了。

---------------------snip----------------------
  users:\
  :manpath=/usr/share/man /usr/X11R6/man /usr/local/man:\
  :cputime=4h:\
  :openfiles=32:\
  :maxproc=48:\
  :tc=default:
---------------------snip----------------------

上面是設置了一個新類users,可以看出它為用戶設置了環境變數MANPATH,並重置了cputtime 、openfile、maxproc和tc的值。每次更改login.conf之後,都要進行更新登錄類別資料庫的操作。

bash-2.03# cap_mkdb /etc/login.conf

由於登錄類別保存在master.passwd文件中,通常在使用adduser添加用戶的時候設置用戶的登錄類別。如果要進行更改,必須使用vipw來修改/etc/master.passwd文件的第5個域。下面為master.passwd 中的一行,該行指定這個用戶的登錄類別為user:
預設為:
bash-2.03# cat master.passwd
# $FreeBSD: src/etc/master.passwd,v 1.25 1999/09/13 17:09:07 peter Exp $
inburst:TioxhDpCtDaRE:1004:0::0:0:stardust:/home/stardust:/usr/local/bin/bash

改為:

inburst:TioxhDpCtDaRE:1004:0:users:0:0:stardust:/home/stardust:/usr/local/bin/bash

設定系統中用戶的可用空間也是系統免受本地拒絕服務攻擊重要的一方面,在未設定 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。--感謝QUACK

=========================================================================

一些管理員日常操作
------------------

i)經常查看http://www.freebsd.org/security/index.html的安全公告

ii)訂閱security bugtraq和FreeBSD官方安全郵件列表了解安全動態。

iii)每天檢查系統日誌,關於檢查系統日誌,你可以通過其他工具增加多信息的捕獲,
如snort可以比較完全的記錄信息。

iv)如果你硬碟夠大,信息處理夠快,定時使用netstat -an >> /.../.../netstat.log來
記錄信息,當然你也可以建立更詳細的腳本,因為netstat能記錄連接信息,所以如有些
後門日誌不能記錄,但netstat卻在一定時間裡總有連接記錄。

v)如果你對你的文件系統有原始的記錄,你可以定時使用一些系統完整性檢查工具進行
檢驗。

vi)如果你有防火牆,那更好,經常查看防火牆信息。

===============================================================================

FreeBSD近來比較嚴重的一些安全漏洞
-------------------------------------

遠程漏洞
--------

i)目前出現的最嚴重的漏洞,telnetd守護程序存在遠程溢出漏洞,可以讓攻擊者遠程
獲得Root shell,目前已經有telnetd exploit code推出,包括windows。詳細資料
請查看:

ftp://ftp.freebsd.org/pub/FreeBSD/CERT/advisories/FreeBSD-SA-01:49.telnetd.v1.1.asc

ii)FreeBSD的ftp也存在遠程溢出,可以讓攻擊者最終獲得Root shell.詳細資料請看:

ftp://ftp.freebsd.org/pub/FreeBSD/CERT/advisories/FreeBSD-SA-01:33.ftpd-glob.v1.1.asc

iii)FreeBSD如果使用BIND服務(操作系統附帶),如果BIND服務版本小於8.2.3-RELEASE,
在處理TSIG問題上存在單位元組溢出問題,可以獲得遠程的ROOT SHELL。詳細資料請查看:

ftp://ftp.freebsd.org/pub/FreeBSD/CERT/advisories/FreeBSD-SA-01:18.bind.asc

另外關於應用程序的還有wu-ftp,qmail中的vcheckpasswd也存在遠程緩衝溢出,還有其他
其他的。不在詳舉。


本地漏洞
--------

i)FreeBSD的內核對信號處理不正確,可以導致本地用戶獲得ROOT SHELL。詳細信息請看:

ftp://ftp.freebsd.org/pub/FreeBSD/CERT/advisories/FreeBSD-SA-01:42.signal.asc

ii)FreeBSD的procfs文件系統存在漏洞,可以導致本地用戶獲得超級管理
員許可權。具體信息可以查看:

ftp://ftp.freebsd.org/pub/FreeBSD/CERT/advisories/FreeBSD-SA-00:77.procfs.v1.1.asc

iii)因為好多FreeBSD安裝了Mysql資料庫,而低於3.23.22版本的mysql都有
一個漏洞可以寫信息到敏感文件,如寫信息到/etc/passwd或者/etc/shadow中,
也可以說是一個比較嚴重的漏洞

上面幾個本人認為必須重視的幾個漏洞,然後你需要打上補丁,或者使用最新的
程序,然後相關的應用程序看你是否安裝,你可以在如下地址找到相應漏洞信息:

http://www.freebsd.org/security/index.html

===================================================================================

有錯誤難免,以後有關安全tip也會不斷整理加上,謝謝!









[火星人 ] 一些FreeBSD相關的安全問題已經有443次圍觀

http://coctec.com/docs/unix/show-post-73955.html