明明白白你的Linux服務器——安全篇
原創【51CTO獨家特稿】安全對于linux/unix生產服務器而言是至關重要的,也是每一個系統管理員的基本功課。本文是《明明白白你的Linux服務器》系列的第四篇,下面所列的一切是關于Linux服務器的基本設置,力求用最簡單的語言來說明Linux服務器的基礎安全設置,尤其適用于新手;如果對Linux服務器的安全有更高要求,建議配合硬件防火墻來進行操作。
一、Linux服務器的硬件防護
我在項目實施中和自己的網站架設中,發現防DDOS攻擊及SQL注入、跨站腳本、蠕蟲、黑客掃描和攻擊等攻擊效果不錯的方案有:
①華賽三層防火墻+天泰web防火墻;
②Juniper系列防火墻;
如果你的Linux或FreeBSD前端無任何硬件防護,一下要記得開啟iptables或ipfw防火墻。雖然它們不能防DDOS攻擊,但在安全防護上或多或少的有所作用;如果是windows2003服務器,建議開啟它自帶的系統防火墻,并禁ping。
建議采用64位的Linux操作系統,如CentOS 5.4;如果是UNIX,建議采用FreeBSD 8.0(也采用64位的)。多關注下服務器的內核漏洞,現在linux很多攻擊都是針對內核的,保證內核版本為2.6.9以上。
二、遠程連接你的Linux服務器
對于遠程連接,建議只允許在內網進行ssh操作,而拒絕外網控制,這樣做是比較安全的(此步操作可能要配合公司的網絡工程師來操作)。
如果非要從外網進行ssh操作,建議正確配置x-shell、Putty等遠程連接工具的公鑰和私鑰。root密碼我一般設置為28位以上,建議用字母+數字的組合,如p@sSw0rdyuhongchun027nagios,而且某些重要的服務器必須只有幾個人知道root密碼,這個根據公司權限來設置,如果有公司的系統管理員離職,root密碼一定要更改;玩linux久了的人都應該知道,更改root密碼不會影響linux的crontab計劃任務(這個在windows2003就不一樣了,如果隨意更改administrator密碼,會直接影響其計劃任務運行)。
三、Linux服務器如何防ssh暴力破解
我的Nagios外網監控服務器,剛開始測試時取的密碼是redhat,放進公網一天就被人改了,郁悶死了;后來環境部署成熟以后發現仍然有不少外網ip在掃描和試探,看來不用點工具不行啊;呵呵,我嘗試使用大家都推薦使用的DenyHosts,它是用Python2.3寫的一個程序,它會分析/var/log/secure等日志文件,當發現同一IP在進行多次SSH密碼嘗試時就會記錄IP到/etc/hosts.deny文件,從而達到自動屏蔽該IP的目的。DenyHosts官方網站為:http://denyhosts.sourceforge.net
①檢查安裝條件
1、首先判斷系統安裝的sshd是否支持tcp_wrappers(默認都支持)
# ldd /usr/sbin/sshd libwrap.so.0 => /usr/lib/libwrap.so.0 (0x0046e000)
2、判斷默認安裝的Python版本
# python -V Python 2.3.4
3、已安裝Python2.3以上版本的情況可以直接安裝DenyHosts
# cd /usr/local/src # wget http://jaist.dl.sourceforge.net/sourceforge/denyhosts/DenyHosts-2.6.tar.gz # tar zxf DenyHosts-2.6.tar.gz # cd DenyHosts-2.6 # python setup.py install
程序腳本自動安裝到/usr/share/denyhosts
庫文件自動安裝到/usr/lib/python2.3/site-packages/DenyHosts
denyhosts.py自動安裝到/usr/bin
②設置啟動腳本
# cd /usr/share/denyhosts/ # cp daemon-control-dist daemon-control # chown root daemon-control # chmod 700 daemon-control
# grep -v "^#" denyhosts.cfg-dist > denyhosts.cfg
# vi denyhosts.cfg
根據自己需要進行相應的修改
denyhosts.cfg
SECURE_LOG = /var/log/secure #RedHat/Fedora Core分析該日志文件 #其它版本linux根據denyhosts.cfg-dist內提示選擇。 PURGE_DENY = 30m #過多久后清除 DENY_THRESHOLD_INVALID = 1 #允許無效用戶(/etc/passwd未列出)登錄失敗的次數 DENY_THRESHOLD_VALID = 5 #允許有效(普通)用戶登錄失敗的次數 DENY_THRESHOLD_ROOT = 3 #允許root登錄失敗的次數 HOSTNAME_LOOKUP=NO #是否做域名反解
如果需要DenyHosts隨系統重啟而自動啟動,還需做如下設置:
# vi /etc/rc.local
加入下面這條命令
/usr/share/denyhosts/daemon-control start
③啟動
# /usr/share/denyhosts/daemon-control start
如果要使DenyHosts每次重起后自動啟動還需做如下設置:
# cd /etc/init.d # ln -s /usr/share/denyhosts/daemon-control denyhosts # chkconfig --add denyhosts # chkconfig --level 345 denyhosts on
然后就可以啟動了:
service denyhosts start
DenyHosts配置文件:
vi /etc/denyhosts.cfg
SECURE_LOG = /var/log/secure #ssh日志文件,它是根據這個文件來判斷的。 HOSTS_DENY = /etc/hosts.deny #控制用戶登陸的文件 PURGE_DENY = 5m#過多久后清除已經禁止的 BLOCK_SERVICE = sshd#禁止的服務名 DENY_THRESHOLD_INVALID = 1#允許無效用戶失敗的次數 DENY_THRESHOLD_VALID = 10#允許普通用戶登陸失敗的次數 DENY_THRESHOLD_ROOT = 5#允許root登陸失敗的次數 HOSTNAME_LOOKUP=NO#是否做域名反解 DAEMON_LOG = /var/log/denyhosts#自己的日志文件 ADMIN_EMAIL = yuhongchun027@163.com#管理員郵件地址,它會給管理員發郵件
下面這個是全自動下載安裝的小腳本(推薦),當然安裝后還得手動調整配置文件。install_denyhosts.sh腳本內容如下:
#!/bin/bash cd /usr/local/src wget http://jaist.dl.sourceforge.net/sourceforge/denyhosts/DenyHosts-2.6.tar.gz tar zxf DenyHosts-2.6.tar.gz cd DenyHosts-2.6 python setup.py install cd /usr/share/denyhosts/ cp daemon-control-dist daemon-control chown root daemon-control chmod 700 daemon-control grep -v "^#" denyhosts.cfg-dist > denyhosts.cfg echo "/usr/share/denyhosts/daemon-control start" >>/etc/rc.local cd /etc/init.d ln -s /usr/share/denyhosts/daemon-control denyhosts chkconfig --add denyhosts chkconfig --level 345 denyhosts on service denyhosts start
下面是hostsdeny的示例:
Connection to 192.168.0.154 closed. [root@autolemp ~]# ssh 192.168.0.154 root@192.168.0.154's password: Permission denied, please try again. root@192.168.0.154's password: Permission denied, please try again. root@192.168.0.154's password: Permission denied (publickey,gssapi-with-mic,password)
出現最后這行表示生效。
#p#
四、用戶管理
服務器上除root外,Linux用戶越少越好,如果非要添加具有root權限的用戶,建議在/etc/sudoer里添加,這樣避免大家都用root用戶在服務器上工作,另外一個作用是規范責任界限,做到有跡可循(我的開發服務器就發生了有人惡意更改root密碼的事情);如果非要添加授權用戶,請給他的登陸shell為nologin;終止未授權用戶,定期檢查系統有無多余的用戶都是sysadmin必要的工作。
五、日志文件
分析系統的日志文件,尋找入侵者曾經試圖入侵系統的蛛絲馬跡。last命令是另外一個可以用來查找非授權用戶登錄事件的工具
lyychee pts/2 54.107.130.61 Mon May 22 14:14 still logged in lyychee pts/2 51.107.130.61 Thu May 18 18:36 - 18:42 (00:05) lyychee pts/2 61.130.107.51 Tue May 16 14:21 - 14:39 (00:18) root pts/2 61.130.107.58 Sat May 13 15:40 - 15:43 (00:02) lyychee pts/2 210.32.178.253 Fri May 12 00:53 - 01:16 (00:23) root pts/2 58.107.130.61.di Wed May 10 15:33 - 15:35 (00:01) root pts/2 61.130.107.58 Tue May 9 14:58 - 15:07 (00:08) root pts/2 59.78.34.62 Sun May 7 07:40 - 07:45 (00:05) lyychee pts/2 59.78.34.62 Sat May 6 23:50 - 00:27 (00:37) lyychee pts/2 222.64.24.144 Sat May 6 10:56 - 10:56 (00:00) root pts/2 192.168.0.111 Sat May 6 00:01 - 00:02 (00:01) lyychee pts/2 222.64.22.144 Thu May 4 12:41 - 12:43 (00:00) root pts/2 59.78.34.62 Tue May 2 06:59 - 07:00 (00:00)
last命令輸入的信息來自/var/log/wtmp。這個文件詳細地記錄著每個系統用戶的訪問活動。但是有經驗的入侵者往往會刪掉/var/log/wtmp以清除自己非法行為的證據,但是這種清除行為還是會露出蛛絲馬跡:在日志文件里留下一個沒有退出操作與之對應的登錄操作(因為在你刪除wtmp的時候,你的登錄記錄就沒有了,但是你待會兒登出,系統還是會把你記下來),不過再高明一點就用at或者cron等自己登出之后再刪文件(但是這種方法也還是可以查,總之linux沒有一種操作是最強的或強到沒有紕漏的)。
六、如何用掃描之王nmap來發現自己的服務器漏洞
以自己的郵件服務器舉例說明,系統的默認策略就為INPUT為DROP,OUTPUT、FORWARD鏈為ACCEPT,定義一個防火墻規則,即/root/firewall.sh,,放進開機腳本里,即目錄/etc/rc.d/rc.local,/root/firewall.sh
腳本如下:
#/bin/bash iptables -F iptables -F -t nat iptables -X iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEP #load connection-tracking modules modeprobe ip_conntrack modprobe iptable_nat modprobe ip_conntrack_ftp modprobe ip_nat_ftp iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp -m multiport --dport80,443,25,465,110,995,143,993,587,465,22 -j ACCEPT
[root@mail postfix]# nmap -P0 -sS 211.143.6.X Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2009-03-29 16:21 CST Interesting ports on 211.143.6.X: Not shown: 1668 closed ports PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 80/tcp open http 110/tcp open pop3 111/tcp open rpcbind 143/tcp open imap 443/tcp open https 465/tcp open smtps 587/tcp open submission 993/tcp open imaps 995/tcp open pop3s 1014/tcp open unknown
lsof -i:1014,發現又是rpc.statd,這東東,每次用的端口都不一樣啊;它不能正確處理SIGPID信號,遠程攻擊者可利用這個漏洞關閉進程,進行拒絕服務攻擊;發現rpc.statd是由服務nfslock開啟,關閉它即可
service nfslock stop && chkconfig nfslock off
七、監控服務
如果是自己的網站服務器,如何即時發現其登陸用戶、系統進程數或系統負載呢,建議可配置Nagios即時監控自己的Linux服務器,開啟郵件或短信報警;有條件的話也可配置cacti,監控自己的服務器的持續時間段的并發數,這樣更能清楚的了解和監控自己的服務器(Nginx自帶的web-status只能反映一個瞬間并發值)。
八、iptables日志
如果開啟了iptables防火墻,建議將其日志不放進/var/log/messages,利用syslog將其日志放進單獨的日志文件,然后在全面分析判斷它;iptables的L是命令,而-v和-n只是作為選項,它們不能進行組合,如-Lvn;如果要列出防火墻詳細規則,可采用iptables -nv -L。
九、網絡監控
可布署TCPDump或Wireshark來監控自己的網絡流量和攻擊檢測,如果是用iptables來作公司的NAT路由器,建議可安裝NTOP來監控網絡流量和分析具體網絡包。
十、Snort
可布署Snort來自動檢測入侵,Snort它是一套免費的小型「IDS-入侵偵察系統」,它的好處是它的入侵偵察規則是完全開放的,也就是說你可以針對自己的網路系統,設計自己的入侵偵察規則;尤其方便的是,它在CentOS系統中是作為附加軟件已包含在其中了。
【編輯推薦】