暴露在公网环境下主机的安全防护
前言:服务器安全问题是每个运维从事人员不可避免的一部分工作,在linux管理界乃至计算机界也都是一个首要考虑的问题。最近公司的部分机器需要暴露在公网环境下,如果不做安全策略的话,可能睡到半夜就会被叫起来处理问题,为睡眠安稳计,为工作质量计,特整理下关于基本安全防护的注意点与可操作点:
公司的部分主机需要能够与公网通信,相应的,远程连接安全是肯定需要做加固的,而一台主机基本的安全策略应包括但不限于以下几点:
1.禁止主机被ping:如果能够ping通某个主机或者IP,那么攻击者就认为此系统处于活动状态,继而进行攻击或破坏。如果没有人能ping通机器并收到响应,那么就可以大大增强服务器的安全性,在linux下可以执行如下设置,来禁止ping请求:
[root@localhost ~]#echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
可以加上面的一行命令到/etc/rc.d/rc.local文件中,以使每次系统重启后自动运行。
2.禁止系统被重启:在linux的默认设置下,同时按下Control-Alt-Delete键,系统将自动重启,这种情况下很容易被重启,从而导致不可预知的问题,而禁止Control-Alt-Delete组合键重启系统,需修改/etc/inittab文件:
[root@localhost ~]#vi /etc/inittab 找到:ca::ctrlaltdel:/sbin/shutdown -t3 -r now 在之前加上"#"或者删除此行,即可,然后 [root@localhost ~]#telinit q
3.限制shell history所记录的命令:默认情况下,bash shell会在文件$HOME/.bash_history中存放多达1000条命令记录,攻击者可以根据这些命令来判断出主机的关键文件以及其他的关键信息,那就减少它所记录的命令或者关闭它:
[root@localhost ~]#vi /etc/profile 找到:HISTSIZE=1000 表示在文件$HOME/.bash_history中记录最近的1000条历史命令。将其修改为合适的值,如果将“HISTSIZE”设置为0, 则表示不记录历史命令,那么也就不能用键盘的上下键查找历史命令了。
4.删除系统默认的不必要用户和组:Linux提供了各种系统账户,在系统安装完毕,如果不需要某些用户或者组,就要立即删除它,因为账户越多,系统就越不安全,越容易受到攻击,具体的话根据实际情况,一般Linux系统中可以删除的默认用户和组分别为删除的用户,如adm,lp,sync,shutdown,halt,news,uucp,operator,games,gopher等。删除的组,如adm,lp,news,uucp,games,dip,pppusers,popusers,slipusers等。根据自己的需要进行操作。具体的命令为
[root@localhost ~]# userdel username
[root@localhost ~]# groupdel groupname
5.限制ssh访问IP:基于ssh的连接本质上来说是安全的,连接被监听是一般不用考虑的安全问题,但非法连接却是一个极大的安全隐患,但是我们可以于hosts.allow和hosts.deny文件允许或禁止ssh或telnet操作,降低系统被暴力破解的可能,具体的操作如下:
[root@localhost ~]#vi /etc/hosts.allow或者hosts.deny ssh允许/禁止单个ip sshd:192.168.220.1 ssh允许/禁止ip段 sshd:192.168.220. telnet允许/禁止单个ip in.telnetd:192.168.220.1 telnet允许/禁止ip段 in.telnetd:192.168.221. 值得一提的是,hosts.allow的优先级高于hosts.deny,所以呢,甚至可以将host.deny设置为ALL,拒绝所有ssh或telnet连接,在hosts.allow文件中配置业务IP,以实现最高的安全需求。
本条策略可以基于脚本来进行,可以使用脚本对安全日志进行过滤,将多次尝试进行ssh连接的IP信息写入hosts.deny文件中,直接拒绝它的请求,具体的操作方法如下:
#!/bin/bash num=10 #连接上限 for i in `awk '/Failed/{print $(NF-3)}' /var/log/secure|sort|uniq -c|sort -rn|awk '{if ($1>$num){print $2}}'` do echo "sshd:$i" >> /etc/hosts.deny done
对secure文件做日志分割后,可以每天执行一次脚本,写入定时任务即可。如果觉得这样做比较麻烦,可以参照我的博客/系统安全/防止ssh暴力破解的小工具denyhosts中的介绍,使用denyhosts工具来进行防爆破安全加固,而且使用denyhosts可以更细致的根据需求完成拒绝请求。
6.修改ssh端口,禁止root用户远程登陆:所有的ssh非法连接都是基于指定端口与指定账户密码的,如果修改了默认的端口并禁止root用户远程登陆,那么安全性无疑是进一步的加强了:
PS:如果公司的上下班是非常规律的,甚至可以设置ssh服务的服务时间为9:00-18:00,这样的话,所有的问题都将不是问题,但同样的,如果在这个时间段之外需要远程处理,那就比较麻烦了,这条策略仅作参考。
[root@localhost ~]#vi /etc/ssh/sshd_config
ssh默认的端口是22,修改的话,直接添加Port XXXX就可以了,这样就完成了修改,将其改为了XXXX(最好选择大于10000的不常用高位端口)
将sshd_config文件中PermitRootLogin yes改为PermitRootLogin no,这样root用户就不能远程登陆了(修改后,reload sshd服务,不要restart ssh服务,防止出现问题,无法远程连接,就尴尬了)
7.限制账户登陆错误登陆次数:基于PAM模块来进行,功能为:任意账户登陆错误次数后,一定时间内拒绝再登陆,类似与支付密码与手机解锁的错误登陆限制,与之前的基于安全日志分析进行拒绝登陆的策略相比,前者是针对连接IP,后者是针对可连接账户。例:以三次为限,错误三次后五分钟内不能登陆,实现步骤如下:
[root@cinder ~]# echo "auth required pam_tally.so deny=3 unlock_time=5" >> /etc/pam.d/sshd
8.釜底抽薪——禁止使用密码登陆ssh:root账户的失守基本都是基于ssh的口令,而基于ssh免密码验证的方法,无疑是从根本上解决了这个问题,如果说使用复杂密码是使服务器被破解的可能降到极低的话,而禁止使用密码则从根本上解决了这个问题,使暴力破解的可能性降低为0。方法如下:
使用ssh-keygen生成私钥公钥对,一直输入回车即可,下载私钥,发送给运维人员,然后修改/etc/ssh/sshd_config如下:
PasswordAuthentication no #禁用密码登陆
RSAAuthentication yes #使用密钥
PubkeyAuthentication yes #使用密钥
9.设置一个简单的蜜罐:本条策略适用于容易被针对性攻击的主机,实现思路如下:
在高位端口启动一个不常用的服务,使用脚本检测其访问IP,并将其加入防火墙的拒绝策略,拒绝来自该IP的所有数据包。众所周知,在入侵系统时,首先做的就是扫描,这样的话,就可以先敌一步,相对安全可靠,至于所启服务与脚本的编写就非常的宽广了,根据需求自行收集。
10.隐藏服务器的版本信息:这条策略主要针对的是web服务,如果对方访问了不存在资源,服务器404时,顺带给了对方web服务器的版本信息,这就相当危险了,对方拿着指定版本的服务器信息,就可以做针对性的攻击,十发九中。具体的隐藏办法根据服务器版本自行百度,不安全的设置如下图:
11.至少打开防火墙和设置一个复杂的密码:做了一大堆的安全策略,最后设置了123456的密码,防火墙也没有打开,这可能是一个笑话,而设置密码的时候需要注意:含有数字,大小写字母,特殊符号,尽可能的长,至少不少于10个字符。
12.为操作系统与所运行的应用安装更新:本条策略无具体方法,根据自己的操作系统版本与所运行应用的版本,在开源社区或者付费服务的提供商那里会有不断更新的补丁,及时对服务器或者应用打补丁。
13.关闭端口:通过修改/etc/services文件中的内容来对端口进行安全配置,可以关闭不需要的端口,只留下业务端口。
水为之而寒于水:以上基本的安全策略可以完成对服务器的基本安全优化,针对当前业界服务器集群化的应用场景,集群所提供的服务往往只需要使用有限的几个端口,与有限的几个IP进行数据交互,那么我们可以这样做:指定一台服务器做服务跳板机,将其端口映射到其他服务器的业务端口,其他服务器的只允许跳板机的数据包进来,然后对跳板机做全部的安全策略(毕竟ping的安全策略也不适合对所有的服务器做),还有就是关于堡垒机的问题,堡垒机的概念和这个方案的思想差不多,但堡垒机能够更细化的解决这些问题,而且还可以记录子账号的操作,方便查出导致问题的人。
结语:通用的基本安全策略就是这些,如果阅读中发现不够全面,欢迎指出补充,如果需要对指定功能的服务器做安全,那肯定需要在此基础上继续完善,但可以肯定的是:没有永远完备无患的安全策略,只有不断升级完善的安全策略,最好的安全策略就是多看安全日志,根据不同的应用场景制订出相应的安全策略,才能在日益严峻的安全环境下安全无虞。