作者:丁玮
正如没有牢不可破的盾一样,没有任何的系统是绝对安全的。同样在安全领域中,也没有谁可以说自己是高手。系统的安全是靠很多前辈的汗水和智慧来换取的。系统的安全涉及方方面面。无论是银行还是电话系统,无论是MS Windows还是大众认为保险的Unix系统,无一例外都有安全问题。安全唯一的重点是系统有多少人在使用。系统的使用者越多,安全问题就越关键,其安全漏洞发现的速度也就需要越快。另外,系统的可伸缩性越好,支持的应用服务越多,安全问题也就越多。在MS Windows系统下会用鼠标的人参考网上的资料就可以设置系统的安全或者破坏系统。安全设置是一把双刃剑,一边是可以撕破不设防的系统、毁掉数据,一边是阻挡非法的入侵、保护数据。这个边界就是Nuker和Hacker的区别。
Linux是开放源码的系统,安全可以从代码级加强,但是对于刚接触Linux系统的人来讲,这就太复杂了。企业要想把Linux作为桌面操作系统来使用,设置就一定和服务器不同。服务器可能是使用在Internet上,不论是其防火墙、代理服务器还是其他应用,安全设置着重在关键应用上,而桌面的应用重点就不一样了。
针对市面上常见的Mandrake、Red Hat、SuSE、Debian,安全设置的方式不尽相同,但是方法是一致的。基于中国市场用户很多的Red Hat为例,下面将以200~300人规模的公司使用Red Hat Linux为桌面操作系统为环境,一步步地设置系统安全,其中也会提及周边资源的配置。
硬件的安全
机箱需要上锁。任何系统一旦在物理上有所接触,安全性至少降低一半。因为任何人都可以把硬盘卸下来,到其它的系统上读取数据,破坏安全防护。因此桌面机和服务器一样,要尽可能的避免物理接触。
BIOS的安全
虽然有很多种工具可以读取BIOS的密码,并且也有很多的BIOS有通用密码,但是设置BIOS的密码保护是必要的步骤。使用的密码尽量符合8位以上,数字、符号和字母的大小写组合,并且不要和任何系统密码相同。如果担心被窃取后导致全部机器降低安全性,可以考虑加入个性化密码位。比如:用该机器的人的姓名缩写或机器的唯一编号组合前面的密码,就可以成为较为好记忆,且满足复杂性和唯一性要求的密码。
启动设置
一旦系统安装完毕,除了硬盘启动外,软盘、光盘、甚至是USB闪存的启动都可能带来安全的问题。因此需要禁止BIOS中除硬盘以外的任何设备的启动。
系统分区
目前的硬盘都可以满足Linux对容量的要求。以20~40GB硬盘为例,不需要额外的分区方法,使用Red Hat的自动分区可以满足要求。具体分区方法为40MB的启动分区(/boot),2倍于内存的交换分区(swap),剩余为根分区(/)。不将/home目录和/var目录分出来的原因是:因为是单用户使用,系统分区过多会增加管理复杂度,比如/var分区满导致系统异常。简单分区可以满足用户使用。
安装
请避免完全安装,即Everything选项。前面提到过系统提供的服务越多,漏洞越多,安全越差。安装尽可能使用非交互式安装,比如制作安装软盘、通过NFS或安装脚本。用户直接参与的越少,可管理性越强。主机命名使用统一规则,比如公司的E-mail地址和分机编号,这样便于排错和定位。IP地址也尽量使用静态地址或使用MAC地址绑定的DHCP,这样任何的异常都可以很快排除符合要求的机器。注意使用ext3文件系统,可以减少因为掉电导致的硬盘丢失数据而无法启动。
账号和中心控制
进行账号和中心控制使用NIS也许是不错,但也是增加管理复杂度的选择。如果使用环境是单一用户登录,文件由服务器共享,那么不使用NIS而使用单一用户本机登录也是一个好选择。当然,现在不仅仅是NIS一种中心账号管理方式可以选择。本机的账号需要使用用户的公司E-mail地址为登录名,当然还要有管理员的账号,但是不要将本地账号加入本地管理员组。有多个本机root权限账号本身就是危险的行为。
启动加载程序
启动加载程序尽量使用GRUB而不使用LILO。原因是:虽然它们都可以加入启动口令,但是LILO在配置文件中是使用明文口令,而GRUB是使用md5算法加密的。加密码保护后可以防止使用被定制的内核来启动系统,并且在没有其他操作系统的情况下,将启动等待时间设为0。LILO的配置在/etc/lilo.conf文件中,GRUB的配置文件在/boot/grub/grub.conf中:
/etc/lilo.conf
image=/boot/2.4.18-vmlinuz
label=Linux
read-only
# 口令为明文
password=Clear-TextPassword
# 加入保护
restricted
/boot/grub/grub.conf
# 修改启动时间为0,即直接启动
timeout 0
# 可以使用grub-md5-crypt来生--md5后的加密口令
password --md5 $1$LS8eV/$mdN1bcyLrIZGXfM7CkBvU1
使用sudo
用户有时会使用一些需要root权限的命令,这时需要使用sudo。sudo是一种以限制在配置文件中的命令为基础,在有限时间内给用户使用并且记录到日志中的工具。其配置在/etc/sudoers文件中。当用户使用sudo时,需要输入自己的口令以验证使用者身份,随后的一段时间内可以使用定义好的命令,当使用配置文件中没有的命令时,将会有报警的记录。
/etc/sudoers
sudo [-bhHpV] [-s ] [-u ] [指令] 或sudo [-klv]
-b 在后台执行命令
-h 显示帮助
-H 将HOME环境变量设为新身份的HOME环境变量
-k 结束密码的有效期,即下次将需要输入密码
-l 列出当前用户可以使用的命令
-p 改变询问密码的提示符号
-s 执行指定的shell
-u 以指定的用户为新身份,不使用时默认为root
-v 延长密码有效期5分钟
-V 显示版本信息
限制su用户个数
前面提到本机的新建用户没有root权限,因此需要使用su切换用户,Linux可以增加对切换到root用户的限制。使用PAM (Pluggable Authentication Modules)可以禁止除在wheel组以外的任何人su成root,修改/etc/pam.d/su文件,除去屏蔽标识#。使用/usr/sbin/usermod G10 bjecadm将bjecadm这个账号加入gid为10的组,就是wheel组。
/etc/pam.d/su
# 使用密码验证
auth sufficient /lib/security/pam_wheel.so debug
# 限制wheel组用户才可以切换到root
auth required /lib/security/pam_wheel.so use_uid
加强登录安全
通过修改/etc/login.defs文件可以增加对登录错误延迟、记录日志、登录密码长度限制、过期限制等设置。
/etc/login.defs
#登录密码有效期90天
PASS_MAX_DAYS 90
#登录密码最短修改时间,增加可以防止非法用户短期更改多次
PASS_MIN_DAYS 0
#登录密码最小长度8位
PASS_MIN_LEN 8
#登录密码过期提前7天提示修改
PASS_WARN_AGE 7
#登录错误时等待时间10秒
FAIL_DELAY 10
#登录错误记录到日志
FAILLOG_ENAB yes
#当限定超级用户管理日志时使用
SYSLOG_SU_ENAB yes
#当限定超级用户组管理日志时使用
SYSLOG_SG_ENAB yes
#当使用md5为密码的加密方法时使用
MD5_CRYPT_ENAB yes
限制root登录的终端窗口
修改/etc/securetty文件,用来防止通过登录穷举法突破安全防线。一旦root不能直接登录,只能通过su来切换用户,并且受到pam.d的限制,即将通过该方式的突破几率降低。
/etc/securetty
vc/1
vc/2
vc/3
vc/4
vc/5
vc/6
vc/7
vc/8
vc/9
vc/10
vc/11
#屏蔽终端窗口的root登录,并可以限制同时打开终端的个数。
#tty1
#tty2
#tty7
#tty8
#tty9
另外,还应该限制终端窗口中的历史记录。修改/etc/profile文件,必要时需更改用户目录下的profile文件。
/etc/profile
#限制键入命令的历史记录在20条内,这是类似doskey的功能
HISTSIZE = 20
#限制记录键入命令历史的文件大小
HISTFILESIZE = 20
#设定终端窗口无任何操作时600秒后退出,该设置不适用于所有窗口
TMOUT =600
备份重要的文件
很多木马、蠕虫和后门都会用替换重要文件的办法隐藏自己,将最重要和常用的命令备份是好习惯。准备一套只读介质,光盘或者优盘,甚至放到网上下载都可以。总之是在必要时使用原始的命令而不是系统中可能被感染的命令。需要注意备份的如下:
/bin/su
/bin/ps
/bin/rpm
/usr/bin/top
/sbin/ifconfig
/bin/mount