前言
讲到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 用户,创建一个文件后,将该文件的所有者,所属主都设置为该用户,或者 root 用户,并且所有者和所属主都具备读,写,执行的权限(即 770 ),然后尝试向该文件写入数据,系统会提示
failed: permission denied
在检查所有与该文件相关的目录,其属主属组权限都正确后,还是不能读写,那么唯一的可能就是因为开启了 SELinux 而禁止读写;
SELinux 的初衷是,即便不安全的 Linux 主机在被入侵后,攻击者取得 root 权限,也不能随意读写删除数据,但是这里却阻碍了我们的工作,
(例如阻止我们用工具创建并写入某些服务进程的配置文件)
在刚安装完成系统的初次配置时刻,如果把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
要查看当前的 SELinux 状态,执行下面命令:
[root@centos6-5vm 桌面]# getenforce
另外一种关闭的办法是:在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秒的时间来处理尚未发送的数据包。
内核参数中与网络安全,系统优化相关的还有很多,后面会陆续介绍,作为运维人员,应该充分理解这些系统底层的参数是如何影响你的应用层业务,用户体验,服务器高可用,稳定,以及安全的,这对提升自身核心竞争力无疑有极大帮助。