快捷搜索:   nginx

网站主机安全档案全集(2)


1) 禁止root从网络直接登陆:修改/etc/default/login文件,确保CONSOLE=/dev/console被设置,该行只允许root从控制台登陆。将root用户加入/etc/ftpusers,保证root不可以远程使用ftp。 
2) 禁止rlogin和rsh访问:删除/etc/hosts.equiv和/.rhosts文件,从/etc/inetd.conf文件里注释掉所有以r打头的服务。 
3) 帐号控制:删除、锁定或注释掉不必要的系统帐号,包括sys/uucp/nuucp/listen等 
4) 改变/etc目录的访问权限:该目录下文件不应该对同组用户可写,执行:chmod –R g-w /etc (不推荐) 
5) 在solaris2.5 以上版本的系统中,创建/etc/notrouter文件来关闭solaris默认的路由转发。 
6) 禁止automounter:删除/etc/auto_*配置文件,删除/etc/init.d/autofs 
7) 禁止NFS服务:删除/etc/dfs/dfstab,重命名/etc/rc3.d/S15nfs.server,重命名/etc/rc2.d/S73nfs.client (不要再以S打头) 
8) 禁止rpc服务:重命名/etc/rc2.d/S71RPC 
9) 修改/etc/inetd.conf文件,注释掉大部分不必要服务,只保留telnet和ftp服务,然后重启inetd进程。 
10) 给系统打补丁:包括各版本Solaris通用补丁和单个补丁集合。 
11) 将如下三行加进/etc/init.d/inetinit文件: 
ndd -set /dev/ip ip_forward_directed_broadcasts 0 
ndd -set /dev/ip ip_forward_src_routed 0 
ndd -set /dev/ip ip_forwarding 0 
这样在系统启动后就关闭了IP转发和IP源路由。 
四. 服务器安全管理 
4.1 安全管理应做的事 
安全管理是站点安全中最重要的一环,离开了管理,安全将变得不切实际。以下也许是Windows系统安全管理员每天应做的事: 
1. 检查系统有无新增帐户,并了解其来源及用途;查看管理员组里有无新增帐户,该组的帐户除系统最初设置外,以后不应该增加帐户; 
2. 在命令行状态下,运行netstat –an命令查看当前连接及打开的端口,查找可疑连接及可疑的端口; 
3. 查看“任务管理器”,查找有无可疑的应用程序或后台进程在运行,并观察CPU及内存的使用状态; 
4. 运行注册表编辑器,查找有无可疑的程序被加到windows的启动项里,并查看有无新增的可疑服务; 
5. 使用 Windows事件查看器查看“系统日志”“安全日志”和“应用程序日志”,以发现有无可疑的事件或影响系统性能的事件; 
6. 检查共享目录,不应有对所有用户可写的目录存在; 
7. 如果运行Microsoft IIS,查看C:\WINNT\system32\LogFiles\下的WEB 服务器日志,以发现是否有试图攻击WEB的行为; 
8. 不定期运行杀毒软件查杀病毒; 
9. 经常浏览微软的网站,保持服务器的补丁同步更新,留意微软发布的安全公告。以下是Unix系统安全管理员应经常做的事: 
1. 以root运行last,查看用户在过去一段时间内所发生的事件; 
2. 查看/etc/passwd和/etc/shadow文件,以发现是否有新增用户,并追查用户来源及用途;保证这两个文件中的系统用户(如Daemon bin sys adm lp uucp nuucp listen noaccess、mysql、sshd、nobody等)没有自己的shell;检查有无帐户被提升到root权限(UID 0); 
3. 运行netstat –an |grep LISTEN查看有无可疑的打开的端口; 
4. 使用ps命令查看系统进程,保证只有必要的进程在运行; 
5. 检查被cron运行的程序,Solaris一般在/var/spool/cron目录里,Freebsd一般在/var/cron里,初始化的crontable除root外,其他用户不应拥有;仔细查看root的crontable; 
6. 使用vmstat和top查看系统资源占用状况,对高资源占用的系统进程要做谨慎处理; 
7. 查看系统日志,包括Solaris下的/var/adm/messages和Freebsd下的/var/log/messages,以发现有无可疑的事件发生; 
8. 查看系统安全日志,包括用户登陆尝试、验证失败、可疑的IP地址登陆等,在solaris下是/var/log/authlog,freebsd下是/var/log/auth.log; 
9. 运行chkrootkit,以检查系统是否被植入木马程序; 
10. 安装了Apache的主机,不定期查看Apache的访问日志和错误日志, 以发现是否有试图攻击WEB的行为。 
4.2 系统及服务的稳定性 
一些重要的服务器是片刻也不能停的,一旦发生服务器down机事故,而你又没有及时发现和恢复,那么你面对的将是铺天盖地的指责。系统安全管理的任务也许不是很重,但责任却并不轻。因此,你有必要时刻了解服务器的存活状况,一旦发生down机事件,你应在第一时间知道。 
有些好的IDC机房有服务器监控系统,一旦某台机器down掉,它会发出警报。然后机房的值班人员会电话通知你,这样你就能从容的处理事故。然而,并非所有的机房都有这样的措施,很多时候还得依靠自己的小心。 
在机房网络中,应该有一它网管机器,这台机器最好是Unix系统,因为你可以在上面编写脚本来监控网络,并通过sendmail发送邮件给自己。这台机器可以是一台服务器,象前面讲过的登陆入口服务器,就完全可以充当网管机;也可以是一台配置很低的普通PC,能运行Linux或Freebsd就可以了。有必要在上面运行sendmail,因为它要对外发送邮件。当然,sendmail有一些安全问题,因此在运行它之前,你必须确认服务器处于安全的网络:在防火墙之后,且同一网段中没有其他公司的服务器。否则,就不要运行它。当然,你也可以配置sendmail绑定在127.0.0.1端口,不接受网络请求(在Linux默认安装的sendmail不接受网络请求,Freebsd中可以在rc.conf文件中设置使sendmail绑定在127.0.0.1端口),这样的sendmail会安全很多。 
然后你可以写一个简单的脚本来监控网络主机生存状况。在Unix主机上,使用shell或perl都很容易编写脚本,但是,shell脚本用于系统管理更简单明了,除非你要进行复杂的数学计算或文本处理。如下这个shell脚本很简单,却很实用: 
#!/bin/sh 
# script name:nping 
# use this script to confirm the hosts are alive or not 
HOST01="xxx.xxx.xxx.xxx" 
HOST02="xxx.xxx.xxx.xxx" 
HOST03="xxx.xxx.xxx.xxx" 
HOST04="xxx.xxx.xxx.xxx" 
HOST05="xxx.xxx.xxx.xxx" 
HOST06="xxx.xxx.xxx.xxx" 
HOST07="xxx.xxx.xxx.xxx" 
HOST08="xxx.xxx.xxx.xxx" 
HOST09="xxx.xxx.xxx.xxx" 
HOST10="xxx.xxx.xxx.xxx" 
for LOOP in $HOST01 $HOST02 $HOST03 $HOST04 $HOST05 $HOST06 $HOST07 $HOST08 $HOST09 $HOST10 
do 
if !/sbin/ping -c 2 $LOOP >/dev/null 2>&1;then 
echo "Warning:The host $LOOP seems down" >> error.log 
fi 
done 
if [ -f error.log ];then 
cat error.log |mail -s "Warning:Host Down" yourname@yourmail.com 
rm –rf error.log 
fi 
该脚本执行一个简单的ping操作,以判断目标主机是否存活,如果目标主机停止响应,则向管理员发送邮件报警。 你可以在任务里设定每隔一段时间执行一次该脚本,由于ping对内网的影响很小,因此这个时间可以短一些,我把它设为1小时。 
然而,有的时候,你可能关心的不止是服务器是否存活,更想了解它的服务状态是否正常,这个时候,你可以使用一个工具来判断服务器的开放服务状态,这个工具就是被Unix系统管理员广泛使用的网络端口扫描工具Nmap(可以从http://www.insecure.org/nmap/ 下载最新版本)。它的使用很简单,安装完成后直接在命令行下执行:nmap IP,就可以得到目标主机的开放TCP端口状况。当然,Nmap的功能远不止如此,它还可以执行UDP、SYN、FIN、RPC等扫描,它的半开放扫描可绕过防火墙的过滤,并可根据操作系统指纹判断目标系统类型。在这里只要利用到Nmap的TCP扫描就够了。然后,你可以编写一个脚本来定期检测服务器的开放端口状况,并将结果Email给管理员。我编写的如下: 
#!/bin/sh 
# script name:nscan 
# use this script to check the services status on local servers 
HOST01="xxx.xxx.xxx.xxx" 
HOST02="xxx.xxx.xxx.xxx" 
HOST03="xxx.xxx.xxx.xxx" 
HOST04="xxx.xxx.xxx.xxx" 
HOST05="xxx.xxx.xxx.xxx" 
HOST06="xxx.xxx.xxx.xxx" 
HOST07="xxx.xxx.xxx.xxx" 
SQL_PORT="2433/tcp" 
MSRDP_PORT="3389/tcp" 
PCANYWH_PORT="5631/tcp" 
for LOOP in $HOST01 $HOST02 $HOST03 $HOST04 $HOST05 $HOST06 $HOST07 
do 
nmap -sT $LOOP >nmap.tmp 2>&1 
for PORT in $SQL_PORT $MSRDP_PORT $PCANYWH_PORT 
do 
if ! grep $PORT nmap.tmp >/dev/null 2>&1;then 
echo “Warning:The port $PORT is seem to down on $LOOP” >>$LOOP.error 
fi 
done 
if [ ! -f $LOOP.error ];then 
echo "The services running on $LOOP are nomal!" 
else 
cat $LOOP.error >>nscan.err 2>&1 
rm -rf $LOOP.error 
fi 
rm -rf nmap.tmp 
done 
if [ -f nscan.err ];then 
cat nscan.err |mail –s “Host Services Down” yourname@yourmail.com 
rm –rf nscan.err 
fi 
该脚本只是判断MS SQL Server、MS终端服务和Pcanywhere服务是否正常,如果不正常,就向管理员发送邮件报警。如果你需要检查其他的服务端口,修改该脚本即可。 
你也可以配置任务来定期执行该脚本,不过请注意,Nmap扫描会影响网络,因此检测的时间间距不要太小。当然,在Unix系统下,有好些方法可以判断目标系统的开放端口状况,但使用Nmap扫描看起来也不错。 
4.3 日志管理 
不管是Windows系统还是Unix系统,都有自己的事件日志。在Windows下使用事件查看器可以清楚的了解系统运行的各项状态,它包括应用程序日志、安全日志和系统日志。你应经常阅读这些日志,尤其是一些红色标记的错误信息。根据这些错误提示发现问题和解决问题是Windows系统管理员应做的事。 
如果服务器不加入域,那么一般来说系统错误信息很少;如果在机房的服务器组成一个域,那么从日志里可能会经常看到各种错误提示,尤其是在域控制器有问题的时候。管理好一个域不是一件太容易的事,它凭空给系统管理员增加很多困难。如果你真碰到这样的问题,建议你到google上面去查找答案,一般来说,你碰到的问题别人肯定也遇见过了,因特网上有很多热心的人愿意解答困难者的问题(尤其是国外的技术站点)。 
读Windows的日志不浪费你太多精神,因为它都分门别类整理得很清楚,有什么错误能一目了然的看出来。每天快速翻一下它的日志是可行的,如果你的服务器磁盘有坏道,也能从日志里体现出来,为你及早更换磁盘、避免数据灾难赢得了时间。 
在Unix系统下,读日志要费劲一些,因为Unix系统通常把一些通用的日志信息写到messages文件里,导致这个文件里杂七杂八什么都有,包括应用程序信息、用户验证信息、网络连接信息、内核信息等等,在浏览它们时比较费劲。然而,这不意味着你可以不管它们。实际上,日志文件是系统侦错时的唯一依据。某天你的Unix系统崩溃了,在居丧之余,不要忘了去分析它的日志,或许可以为你找到原因。 
在Unix系统下,有一个日志分析软件叫Swatch,它能很好的帮你裁减和分析日志,减轻系统管理员的负担。关于它的安装和使用我不在这里详叙,因为我自己并没有使用它。我自己编写脚本用于查看日志,使用awk语句照样能将日志文件裁减到合理的程度。这个脚本的样式我不在这里描述,因为不同的系统和网络环境所产生的条件并不一样。 
在UNIX系统下,另外一个日志文件也很值得关注,它记载了用户的登陆和验证信息,该文件一般位于/var/log下,名为authlog或者auth.log,只有root才可以对它进行读写。 
如果系统中安装了Apache,那么经常查看Apache的错误日志和访问日志也值得推荐。从这两个日志里,你可以发现很多有趣信息,因特网上对WEB站点的攻击从来没有终止过(从这里也可以找到大量试图攻击IIS的信息)。 
4.4 用户管理 
用户管理通常是指系统的用户帐户管理,不管是UNIX系统还是Windows系统,帐户安全是系统安全的关键。系统中应保持固定数量的用户帐户,作为系统管理员,应清楚每一个帐户的使用者和用途。用户新申请帐户应该有个流程,规范的管理总比不规范好。 
在Unix系统上,大多数系统帐户平时是没什么用的,包括:bin daemon adm lp mail news uucp operator games gopher rpc等,如果你不把它们删除,那么也不要让它们拥有真正的shell,检查/etc/passwd文件,看看这些帐户的最后一个域(shell)是否被置/sbin/nologin或/bin/false。经常检查帐户的权限,普通帐户不应该在root组(gid=0),更不应拥有root权限(uid=0)。可以写一个脚本来替你检查,如下所示: 
#!/bin/sh 
# script name:checkuser 
# check if there is any user who have real shell or have root id/gid 
FILE=/etc/passwd 
NUM=0 
while read LINE 
do 
NUM=`expr $NUM + 1` 
if [ $NUM -lt 3 ];then 
continue 
fi 
USER=`echo $LINE |cut -d: -f1` 
USER_SHELL=`echo $LINE |cut -d: -f7` 
USER_UID=`echo $LINE |cut -d: -f3` 
USER_GID=`echo $LINE |cut -d: -f4` 
if [ "$USER_SHELL" != "/sbin/nologin" ];then 
echo -e "\n$USER has one real shell:$USER_SHELL" 
fi 
if [ $USER_UID -eq 0 ];then 
echo "$USER has the root uid(uid 0)" 
fi 
if [ $USER_GID -eq 0 ];then 
echo "$USER has the root gid(gid 0)" 
fi 
done <$FILE 
这个脚本运行在Freebsd下,Freebsd的/etc/passwd文件前两行是版本说明,所以在程序里把它跳过,从第三行起挨个检查用户帐号,它将每一个拥有真正shell或者拥有root用户ID或组ID的帐号在屏幕上打印出来。 
同样,在Windows服务器上,如果不运行IIS服务,那么把IIS相关的帐号禁止掉,把终端服务帐号禁止掉,把guest帐号禁止掉。Windows系统的管理员组除了Administrator外不要有其他帐号,甚至应该把Administrator帐号改名。每一个帐号在帐号描述里说明它的用途。如果Windows服务器采用域的方式,那么应确保域中有尽可能少的用户。一般域中两个用户就够了,一个Administrators组的用户,一个普通用户。请记住,域的Administrators组的用户(通常是administrator)对你的每一台加入域的服务器都有生死控制权,所以你应绝对保证这个帐户的安全。 
不管是系统的root密码还是普通用户密码,都应定期更改。我一般每两个月更改一次系统root密码。当然,如发现系统有被入侵迹象,应马上更改密码。对于用户密码,不管在什么系统中,都可以设置密码过期期限,用户使用一段时间后必须更改密码。有的用户安全意识并不强烈,他们使用自己容易记住的词汇作为口令,例如自己的英文名或者生日。这些都容易被猜测,你可以使用工具破解这些简单口令。Unix下的John和Windows下的LC3都是非常好的密码破解工具,在系统上运行它们几分钟就可以破解出一堆弱口令。口令过于简单的用户,一定要强制他们更改口令,否则后患无穷。如果用户拒绝更改口令,那就删除他们,我就做过这样的事。 
4.5 安全巡检 
最后要讲的是安全巡检,有时间就跑到机房看看去吧,看看服务器运行的环境,检查一下电源和网线,摸摸机表的温度,跟机房的值班人员聊聊天,都对你有好处。一般来说,就算服务器正常运行,每月也应去机房两次。当然,来去打车的费用,希望你的公司给你报销。
顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论