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)設置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,一個是新近
的xinetd中的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

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

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

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

ii)訂閱security bugtraq了解安全動態。

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

arrow
arrow
    全站熱搜

    bubble727 發表在 痞客邦 留言(0) 人氣()