> CentOS > CentOS安全 >

CentOS系统简易安全加固方案

讲到linux系统账户的管理以及安全,就必须涉及 /etc/passwd   /etc/shadow  这2个文件
这里以截图中文字说明的方式,来分析这2个文件的内容,并且给出一些实用的安全加固方案

注意,本文会持续更新,后续加入的内容都以直接上传截图的形式呈现,希望这样能更贴近实际运维环境工作者的需求。

 

 

 

                《删除或锁定系统内建的用户账户,组账户》

 

系统内建的一些账户可能会让入侵变得更容易,因为这些账户扩大了系统的受攻击面。可以通过删除,锁定,或者注释的方法来加固账户安全。

操作涉及的文件有:

 /etc/passwd

 /etc/shadow

 /etc/group

在修改之前,建议对上面3个文件作备份,而且尽量将文件副本存储在移动存储设备如U盘,移动硬盘,或者网络云盘上面。一旦系统出现和账户相关的故障,将副本替换原有的文件,这样就能恢复:

 

 
[root@centos6-5vm 桌面]# mkdir /backup
[root@centos6-5vm 桌面]# cp -p /etc/passwd /backup/passwd_backup
[root@centos6-5vm 桌面]# cp -p /etc/shadow /backup/shadow_backup
[root@centos6-5vm 桌面]# cp -p /etc/group /backup/group_backup

将本地文件系统的 /backup/ 目录下的这三个副本存储到上面提及的各种存储介质中,记住,不要把鸡蛋放在同一个篮子里。

后续的修改都是对原有文件进行的,需要从副本还原时,执行下面操作:

 
[root@centos6-5vm 桌面]# mv /backup/passwd_backup /etc/passwd
[root@centos6-5vm 桌面]# mv /backup/shadow_backup /etc/shadow
[root@centos6-5vm 桌面]# mv /backup/group_backup /etc/group

 

这会替换掉存在错误配置的原有文件。举个例子来验证:

 

 

 

有了上面的测试保证,我们就可以继续进行和用户账户相关的安全设置:

批量删除 passwd 文件前4~10行的用户,这些通常很少用到:

 

 
[root@centos6-5vm 桌面]# for i in adm lp sync shutdown halt mail  uucp operator games gopher ftp ;do userdel $i ;done

其末尾有个 ftp 账户,如果日后有搭建FTP服务器的需求,如vsftpd等,可以将该账户保留下来,不要删除。

 

要批量删除 group 文件中的多余用户组,使用和上面类似的单行shell脚本:

 
[root@centos6-5vm 桌面]# for i in adm lp mail news uucp games dip pppusers pop users slipusers ;do groupdel $i ;done

 

注意,取决于你的系统环境,有些用户和组或许初始就没有创建,这里仅是给出所有可能存在并且需要删除的用户和组。

如果你不想删除这些用户以及组,然后在必要时用备份文件来还原,那么至少,要在原来的文件中,注释掉,或者锁定这些账户和组。对于注释,大家都会,下面主要说一下如何锁定:

锁定: passwd -l [用户名]

解锁: passwd -u [用户名]

也可以把这个命令替换掉前面单行shell脚本中的 userdel命令,实现批量锁定和解锁。

最后提醒一下,处于锁定状态的账户,在 shadow 文件的第二列,会显示 !!  ,表明其处于锁定状态,解锁后才能登录系统。

并且,只有根用户(root)才有权限执行锁定和解锁操作。

 

                              《关闭SELinux》

 

在刚安装完成系统的初次配置时刻,如果把SELinux设置成“开启”或着“强制”,可以通过如下办法来禁用:

 
[root@centos6-5vm 桌面]# ls -ail /etc/selinux/config 
262465 -rw-r--r--. 1 root root 458 6月  25 16:58 /etc/selinux/config
[root@centos6-5vm 桌面]# vim /etc/selinux/config

 

将 SELINUX=  一行后面的值设为 disable,保存退出vim,重启系统后设置永久生效。

 

在不修改  /etc/selinux/config 的前提下,要立即生效不重启(重启失效),执行下面命令:

该命令把SELlinux设置为 Permissive 模式,等于暂时关闭

 
[root@centos6-5vm 桌面]# setenforce 0

 

要暂时开启SELlinux(等于设置为 Enforcing 模式),执行下面命令:

 
[root@centos6-5vm 桌面]# setenforce 1

 

另外一种关闭的办法是:在GRUB(引导加载程序)的启动参数后添加  selinux=0

     

                              《修改内核参数加固系统》

 

默认情况下,对于其它机器发送的带icmp回显请求的ping数据包,centos返回带icmp回显应答的数据包,但是这种做法会导致安全隐患,因为网络上的恶意攻击者可以根据ping返回的信息判断目标机器是否在线上,进而采取后续的端口扫描等攻击。

因此,我们需要修改linux内核的TCP/IP协议堆栈的参数,禁止向其它机器返回icmp回显应答数据包,从而缓解基于主机发现的盲目ping踩点,至于为什么仅是“缓解”,后文我们会提到。

修改相关配置文件:

 
[root@centos6-5 桌面]# vim /etc/sysctl.conf

在文件中加入下面内容:

 
net.ipv4.icmp_echo_ignore_all = 1

 

 

根据该文件首行的注释说明,可以了解到,二进制值为1,表示激活某项特性;二进制值为0,表示禁用某项特性。上面就是激活“忽略所有远程的icmp回显请求”特性。

这种修改配置文件的方式,需要在重启系统后才能生效,但是对于在线上生产环境的服务器而言,是不能随意重启的,会导致业务中断,甚至丢失用户正在发送过来的数据。

因此,使用下面的命令来让对配置文件的修改立即生效:

 
[root@centos6-5 桌面]# sysctl -p

 

 

 

验证一下参数是否生效,下面执行测试的虽然是虚拟机,但是结果与真实环境的机器并无二致。

centos机器的IP地址是192.168.1.20

发送ping数据包的windows xp机器IP地址是192.168.1.30

可以看到,windows xp发送的4个ping数据包均返回了请求超时的结果,丢包率100%。

 

 

再以渗透测试业界著名的 BackTrack 5 平台进行检测:

当然,任何稍微有经验的渗透测试师或者黑客,都不会使用BT5的ping工具,因为它

不能正确反映出一个目标机器的安全性,相反,被广泛使用的Nmap,可以揭露出目标机器的安全级别仍旧有待加强:

 

 

上面的例子仅仅是抛砖引玉,希望各位大牛能举一反三。

另外提一下,对于 /etc/sysctl.conf  中的内核参数,如果是开启和关闭性质的,最好不要通过“注释”的方式来禁用或激活,因为这样要重启系统,比较麻烦,应该使用该文件官方推荐的办法:将其值设为0或1,保存退出vim,

然后以命令 sysctl -p 让配置立即生效即可。还是以上面为例子:

 

继续前面的话题:在没有打开防火墙的情况下,仅仅是在 /etc/sysctl.conf 中添加了禁止本机回应远程ping数据包的参数,那么攻击者可以直接以 Nmap 运行端口扫描来枚举服务版本。

因此,必须开启centos6.5的iptables防火墙。

下面我们将看到,只要开启iptables,采用其默认规则:允许所有入站方向对本地开启的服务监听端口的套接字发起的连接,那么即便没有关闭相应服务,Nmap 的扫描也不会得到可利用的信息:

首先,根据Nmap的扫描结果,我们知道本机上开放了 TCP 111,443,902等端口和相应服务(请参考上面截图),可以用 lsof 配合 netstat 命令确认:

 
[root@centos6-5 桌面]# lsof -i:111
[root@centos6-5 桌面]# netstat -antupeo | grep 111
[root@centos6-5 桌面]# lsof -i:902
[root@centos6-5 桌面]# netstat -antupeo | grep 902
[root@centos6-5 桌面]# lsof -i:443

 

 

注意,我们不使用 service [service] stop 和 

ps -ef | grep [PID] && kill -9 [PID]

等类似命令来关闭服务和端口,而是直接启动 iptables 防火墙:

 

 

没有特别修改 iptables 防火墙的规则,使用默认策略的情况下,阻止了nmap的各种基于设置了TCP分段标志位的探测数据包:

 

 

对于那些直接曝露在因特网上对用户提供特定服务(HTTP/S,FTP等)的linux主机来讲:正确的,健壮的,可操作性强的 iptables 防火墙安全策略规则设置,显得非常关键;

但是现在多数组织企业使用自带防火墙的路由器

(例如各种类型的 cisco IOS防火墙,ASA,PIX防火墙,其它厂商的硬件防火墙,硬件负载均衡等设备),放置在用于公网访问的服务器前端,并且还划分出DMZ(所谓的非军事防御区),来与内网机器隔离,设置区域之间的安全级别。。。种种加固手段让在linux主机上开启 iptables的做法显得多余(除非内网已被渗透,开启iptables 可以防止攻击者的“横向”提权入侵),而且会影响服务器性能,因此,建议执行如下命令将其关闭:

 

 
[root@centos6-5 桌面]# service iptables stop && chkconfig --level 2345  iptables off


重启系统后,无论进入带x-window 的多用户模式,还是shell终端的多用户模式,

iptables都不会启动。

 

可以将下面这些内核参数添加到 /etc/sysctl.conf 文件中,需要强调的是,其中部分参数,我没有做过测试,建议慎用,部分对该参数的解释援引互联网上被广泛转载的文章,这里不对其滥用造成的,包括但不限于业务损失,数据丢失等,负任何法律上的责任。

和特定参数解释相关的背景知识,参考这篇博文:

http://shayi1983.blog.51cto.com/4681835/1434989

 

最好先在虚拟机环境中对这些参数进行性能,基准测试,仔细评估后,再把它添加到实际的生产服务器上:

 

net.ipv4.tcp_fin_timeout = 30

#当本地发送(发送端)带FIN标识位的TCP分段,要求关闭连接时,如果接收端还有数据要传给发送端,那么发送端应该保持开启用于接收对方数据的TCP通信管道(套接字)的时间(TCP有限状态机保持在FIN-WAIT-2,即处于半关闭状态的时间),

这里将其设置为 30秒,超时后,发送端将关闭连接,此时从对方传输过来的数据会丢失。

对于邮件服务器,这个值设为30秒是合适的,因为此时要求关闭的是服务器,而通常客户端不会有还未传完的数据要传,而且服务器要并发支持多个客户端,因此,在内核层面,只给每个客户端30秒的时间来处理尚未发送的数据包。

 

内核参数中与网络安全,系统优化相关的还有很多,后面会陆续介绍,作为运维人员,应该充分理解这些系统底层的参数是如何影响你的应用层业务,用户体验,服务器高可用,稳定,以及安全的,这对提升自身核心竞争力无疑有极大帮助。

(责任编辑:IT)