安全是 IT 行业一个老生常谈的话题了,从之前的“棱镜门”事件中折射出了很多安全问题,处理好信息安全问题已变得刻不容缓。
因此做为运维人员,就必须了解一些安全运维准则,同时,要保护自己所负责的业务,首先要站在攻击者的角度思考问题,修补任何潜在的威胁和漏洞。
本文主要分为如下五部分展开:
· 账户和登录安全
· 远程访问和认证安全
· 文件系统安全
· Linux 后门入侵检测工具
· 服务器遭受攻击后的处理过程
账户和登录安全
账户安全是系统安全的第一道屏障,也是系统安全的核心,保障登录账户的安全,在一定程度上可以提高服务器的安全级别,下面重点介绍下 Linux 系统登录账户的安全设置方法。
①删除特殊的账户和账户组
Linux 提供了各种不同角色的系统账号,在系统安装完成后,默认会安装很多不必要的用户和用户组。
如果不需要某些用户或者组,就要立即删除它,因为账户越多,系统就越不安全,很可能被黑客利用,进而威胁到服务器的安全。
Linux系统中可以删除的默认用户和组大致有如下这些:
可删除的用户,如 adm,lp,sync,shutdown,halt,news,uucp,operator,games,gopher 等。
可删除的组,如 adm,lp,news,uucp,games,dip,pppusers,popusers,slipusers 等。
②关闭系统不需要的服务
Linux 在安装完成后,绑定了很多没用的服务,这些服务默认都是自动启动的。
对于服务器来说,运行的服务越多,系统就越不安全,越少服务在运行,安全性就越好,因此关闭一些不需要的服务,对系统安全有很大的帮助。
具体哪些服务可以关闭,要根据服务器的用途而定,一般情况下,只要系统本身用不到的服务都认为是不必要的服务。
例如:某台 Linux 服务器用于 www 应用,那么除了 httpd 服务和系统运行是必须的服务外,其他服务都可以关闭。
下面这些服务一般情况下是不需要的,可以选择关闭:
anacron、auditd、autofs、avahi-daemon、avahi-dnsconfd、bluetooth、cpuspeed、firstboot、gpm、haldaemon、hidd、ip6tables、ipsec、isdn、lpd、mcstrans、messagebus、netfs、nfs、nfslock、nscd、pcscd portmap、readahead_early、restorecond、rpcgssd、rpcidmapd、rstatd、sendmail、setroubleshoot、yppasswdd ypserv
③密码安全策略
在 Linux 下,远程登录系统有两种认证方式:
· 密码认证
· 密钥认证
密码认证方式是传统的安全策略,对于密码的设置,比较普遍的说法是:至少 6 个字符以上,密码要包含数字、字母、下划线、特殊符号等。
设置一个相对复杂的密码,对系统安全能起到一定的防护作用,但是也面临一些其他问题,例如密码暴力破解、密码泄露、密码丢失等,同时过于复杂的密码对运维工作也会造成一定的负担。
密钥认证是一种新型的认证方式,公用密钥存储在远程服务器上,专用密钥保存在本地,当需要登录系统时,通过本地专用密钥和远程服务器的公用密钥进行配对认证,如果认证成功,就成功登录系统。
这种认证方式避免了被暴力破解的危险,同时只要保存在本地的专用密钥不被黑客盗用,攻击者一般无法通过密钥认证的方式进入系统。
因此,在 Linux 下推荐用密钥认证方式登录系统,这样就可以抛弃密码认证登录系统的弊端。
Linux 服务器一般通过 SecureCRT、Putty、Xshell 之类的工具进行远程维护和管理,密钥认证方式的实现就是借助于 SecureCRT 软件和 Linux 系统中的 SSH 服务实现的。
④合理使用 su、sudo 命令
su 命令:是一个切换用户的工具,经常用于将普通用户切换到超级用户下,当然也可以从超级用户切换到普通用户。
为了保证服务器的安全,几乎所有服务器都禁止了超级用户直接登录系统,而是通过普通用户登录系统,然后再通过 su 命令切换到超级用户下,执行一些需要超级权限的工作。
通过 su 命令能够给系统管理带来一定的方便,但是也存在不安全的因素,例如:系统有 10 个普通用户,每个用户都需要执行一些有超级权限的操作,就必须把超级用户的密码交给这 10 个普通用户。
如果这 10 个用户都有超级权限,通过超级权限可以做任何事,那么会在一定程度上对系统的安全造成了威协。
因此 su 命令在很多人都需要参与的系统管理中,并不是最好的选择,超级用户密码应该掌握在少数人手中,此时 sudo 命令就派上用场了。
sudo 命令:允许系统管理员分配给普通用户一些合理的“权利”,并且不需要普通用户知道超级用户密码,就能让他们执行一些只有超级用户或其他特许用户才能完成的任务。
比如:系统服务重启、编辑系统配置文件等,通过这种方式不但能减少超级用户登录次数和管理时间,也提高了系统安全性。
因此,sudo 命令相对于权限无限制性的 su 来说,还是比较安全的,所以 sudo 也被称为受限制的 su,另外 sudo 也是需要事先进行授权认证的,所以也被称为授权认证的 su。
sudo 执行命令的流程是:将当前用户切换到超级用户下,或切换到指定的用户下,然后以超级用户或其指定切换到的用户身份执行命令。
执行完成后,直接退回到当前用户,而这一切的完成要通过 sudo 的配置文件 /etc/sudoers来进行授权。
sudo 设计的宗旨是:赋予用户尽可能少的权限但仍允许它们完成自己的工作,这种设计兼顾了安全性和易用性。
因此,强烈推荐通过 sudo 来管理系统账号的安全,只允许普通用户登录系统,如果这些用户需要特殊的权限,就通过配置 /etc/sudoers 来完成,这也是多用户系统下账号安全管理的基本方式。
⑤删减系统登录欢迎信息
系统的一些欢迎信息或版本信息,虽然能给系统管理者带来一定的方便,但是这些信息有时候可能被黑客利用,成为攻击服务器的帮凶。
为了保证系统的安全,可以修改或删除某些系统文件,需要修改或删除的文件有四个,分别是:
· /etc/issue
· /etc/issue.net
· /etc/redhat-release
· /etc/motd
/etc/issue 和 /etc/issue.net文件都记录了操作系统的名称和版本号,当用户通过本地终端或本地虚拟控制台等登录系统时,/etc/issue 的文件内容就会显示。
当用户通过 ssh 或 telnet 等远程登录系统时,/etc/issue.net 文件内容就会在登录后显示。
在默认情况下 /etc/issue.net 文件的内容是不会在 ssh 登录后显示的,要显示这个信息可以修改 /etc/ssh/sshd_config 文件,在此文件中添加如下内容即可:Banner /etc/issue.net。
其实这些登录提示很明显泄漏了系统信息,为了安全起见,建议将此文件中的内容删除或修改。
/etc/redhat-release 文件也记录了操作系统的名称和版本号,为了安全起见,可以将此文件中的内容删除。
/etc/motd 文件是系统的公告信息。每次用户登录后,/etc/motd 文件的内容就会显示在用户的终端。
通过这个文件系统,管理员可以发布一些软件或硬件的升级、系统维护等通告信息,但是此文件的最大作用就是可以发布一些警告信息,当黑客登录系统后,会发现这些警告信息,进而产生一些震慑作用。
看过国外的一个报道,黑客入侵了一个服务器,而这个服务器却给出了欢迎登录的信息,因此法院不做任何裁决。
远程访问和认证安全
①远程登录取消 telnet 而采用 SSH 方式
telnet 是一种古老的远程登录认证服务,它在网络上用明文传送口令和数据,因此别有用心的人就会非常容易截获这些口令和数据。
而且,telnet 服务程序的安全验证方式也极其脆弱,攻击者可以轻松将虚假信息传送给服务器。
现在远程登录基本抛弃了 telnet 这种方式,而取而代之的是通过 SSH 服务远程登录服务器。
②合理使用 Shell 历史命令记录功能
在 Linux 下可通过 history 命令查看用户所有的历史操作记录,同时 shell 命令操作记录默认保存在用户目录下的 .bash_history 文件中。
通过这个文件可以查询 shell 命令的执行历史,有助于运维人员进行系统审计和问题排查。
同时,在服务器遭受黑客攻击后,也可以通过这个命令或文件查询黑客登录服务器所执行的历史命令操作。
但是有时候黑客在入侵服务器后为了毁灭痕迹,可能会删除 .bash_history 文件,这就需要合理的保护或备份 .bash_history 文件。
③启用 Tcp_Wrappers 防火墙
Tcp_Wrappers 是一个用来分析 TCP/IP 封包的软件,类似的 IP 封包软件还有 iptables。
Linux 默认都安装了 Tcp_Wrappers。作为一个安全的系统,Linux 本身有两层安全防火墙,通过 IP 过滤机制的 iptables 实现第一层防护。
iptables 防火墙通过直观地监视系统的运行状况,阻挡网络中的一些恶意攻击,保护整个系统正常运行,免遭攻击和破坏。
如果通过了第一层防护,那么下一层防护就是 Tcp_Wrappers 了。通过 Tcp_Wrappers 可以实现对系统中提供的某些服务的开放与关闭、允许和禁止,从而更有效地保证系统安全运行。
文件系统安全
①锁定系统重要文件
系统运维人员有时候可能会遇到通过 Root 用户都不能修改或者删除某个文件的情况,产生这种情况的大部分原因可能是这个文件被锁定了。
在 Linux 下锁定文件的命令是 Chattr,通过这个命令可以修改 ext2、ext3、ext4 文件系统下文件属性,但是这个命令必须有超级用户 Root 来执行。和这个命令对应的命令是 lsattr,这个命令用来查询文件属性。
对重要的文件进行加锁,虽然能够提高服务器的安全性,但是也会带来一些不便。
例如:在软件的安装、升级时可能需要去掉有关目录和文件的 immutable 属性和 append-only 属性,同时,对日志文件设置了 append-only 属性,可能会使日志轮换(logrotate)无法进行。
因此,在使用 Chattr 命令前,需要结合服务器的应用环境来权衡是否需要设置 immutable 属性和 append-only 属性。
另外,虽然通过 Chattr 命令修改文件属性能够提高文件系统的安全性,但是它并不适合所有的目录。Chattr 命令不能保护 /、/dev、/tmp、/var 等目录。
根目录不能有不可修改属性,因为如果根目录具有不可修改属性,那么系统根本无法工作:
· /dev 在启动时,syslog 需要删除并重新建立 /dev/log 套接字设备,如果设置了不可修改属性,那么可能出问题。
· /tmp 目录会有很多应用程序和系统程序需要在这个目录下建立临时文件,也不能设置不可修改属性。
· /var 是系统和程序的日志目录,如果设置为不可修改属性,那么系统写日志将无法进行,所以也不能通过 Chattr 命令保护。
②文件权限检查和修改
不正确的权限设置直接威胁着系统的安全,因此运维人员应该能及时发现这些不正确的权限设置,并立刻修正,防患于未然。下面列举几种查找系统不安全权限的方法。
查找系统中任何用户都有写权限的文件或目录:
1. 查找文件:find / -type f -perm -2 -o -perm -20 |xargs ls -al
2. 查找目录:find / -type d -perm -2 -o -perm -20 |xargs ls �Cld
查找系统中所有含“s”位的程序:
1. find / -type f -perm -4000 -o -perm -2000 -print | xargs ls �Cal
含有“s”位权限的程序对系统安全威胁很大,通过查找系统中所有具有“s”位权限的程序,可以把某些不必要的“s”位程序去掉,这样可以防止用户滥用权限或提升权限的可能性。
检查系统中所有 suid 及 sgid 文件:
1. find / -user root -perm -2000 -print -exec md5sum {} ;
2. find / -user root -perm -4000 -print -exec md5sum {} ;
将检查的结果保存到文件中,可在以后的系统检查中作为参考。
检查系统中没有属主的文件:
1. find / -nouser -o �Cnogroup
没有属主的孤儿文件比较危险,往往成为黑客利用的工具,因此找到这些文件后,要么删除掉,要么修改文件的属主,使其处于安全状态。
③/tmp、/var/tmp、/dev/shm 安全设定
在 Linux 系统中,主要有两个目录或分区用来存放临时文件,分别是 /tmp 和 /var/tmp。
存储临时文件的目录或分区有个共同点就是所有用户可读写、可执行,这就为系统留下了安全隐患。
攻击者可以将病毒或者木马脚本放到临时文件的目录下进行信息收集或伪装,严重影响服务器的安全。
此时,如果修改临时目录的读写执行权限,还有可能影响系统上应用程序的正常运行,因此,如果要兼顾两者,就需要对这两个目录或分区进行特殊的设置。
/dev/shm 是 Linux 下的一个共享内存设备,在 Linux 启动的时候系统默认会加载 /dev/shm,被加载的 /dev/shm 使用的是 tmpfs 文件系统,而 tmpfs 是一个内存文件系统,存储到 tmpfs 文件系统的数据会完全驻留在 RAM 中。
这样通过 /dev/shm 就可以直接操控系统内存,这将非常危险,因此如何保证 /dev/shm 安全也至关重要。
对于 /tmp 的安全设置,需要看 /tmp 是一个独立磁盘分区,还是一个根分区下的文件夹。
如果 /tmp 是一个独立的磁盘分区,那么设置非常简单,修改 /etc/fstab 文件中 /tmp 分区对应的挂载属性,加上 nosuid、noexec、nodev 三个选项即可。
修改后的 /tmp 分区挂载属性类似如下:
1. LABEL=/tmp /tmp ext3 rw,nosuid,noexec,nodev 0 0
其中,nosuid、noexec、nodev 选项,表示不允许任何 suid 程序,并且在这个分区不能执行任何脚本等程序,并且不存在设备文件。
在挂载属性设置完成后,重新挂载 /tmp 分区,保证设置生效。
对于 /var/tmp,如果是独立分区,安装 /tmp 的设置方法是修改 /etc/fstab 文件即可。
如果是 /var 分区下的一个目录,那么可以将 /var/tmp 目录下所有数据移动到 /tmp 分区下,然后在 /var 下做一个指向 /tmp 的软连接即可。
也就是执行如下操作:
1. [root@server ~]# mv /var/tmp/* /tmp
2. [root@server ~]# ln -s /tmp /var/tmp
如果 /tmp 是根目录下的一个目录,那么设置稍微复杂,可以通过创建一个 loopback 文件系统来利用 Linux 内核的 loopback 特性将文件系统挂载到 /tmp 下,然后在挂载时指定限制加载选项即可。
一个简单的操作示例如下:
1. [root@server ~]# dd if=/dev/zero of=/dev/tmpfs bs=1M count=10000
2. [root@server ~]# mke2fs -j /dev/tmpfs
3. [root@server ~]# cp -av /tmp /tmp.old
4. [root@server ~]# mount -o loop,noexec,nosuid,rw /dev/tmpfs /tmp
5. [root@server ~]# chmod 1777 /tmp
6. [root@server ~]# mv -f /tmp.old/* /tmp/
7. [root@server ~]# rm -rf /tmp.old
最后,编辑 /etc/fstab,添加如下内容,以便系统在启动时自动加载 loopback 文件系统:
1. /dev/tmpfs /tmp ext3 loop,nosuid,noexec,rw 0 0
Linux 后门入侵检测工具
Rootkit 是 Linux 平台下最常见的一种木马后门工具,它主要通过替换系统文件来达到入侵和和隐蔽的目的,这种木马比普通木马后门更加危险和隐蔽,普通的检测工具和检查手段很难发现这种木马。