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
- Jun 13 Wed 2007 13:12
[Unix]FreeBsd 安全設定
全站熱搜
留言列表