Linux安全之步步设防
2010-01-15 10:46:31 阿炯

正如没有牢不可破的盾一样,没有任何的系统是绝对安全的。同样在安全领域中,也没有谁可以说自己是高手。系统的安全是靠很多前辈的汗水和智慧来换取的。系统的安全涉及方方面面。无论是银行还是电话系统,无论是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/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

使用一种远程管理工具
建议使用远程管理软件Webmin,目前的版本是1.020-1,可以到http://www.Webmin.com下载。为保证安全的使用,需要下载并安装openSSL(目前版本是0.96g,在http://www.openssl.org下载)和Net_SSLeay.pm(目前版本是1.20,在http://www.Webmin.com下载)。Webmin 是使用http或者https的浏览器通过访问以http://IP:10000或者https://IP:10000来管理系统的工具。其中openSSL和Net_SSLeay.pm是保证Webmin使用SSL加密方式,即使用非明文传输的https来通讯。
#安装Webmin
rpm Uvh Webmin-1.020-1.noarch.rpm
#编译openSSL 0.9.6g
tar xfz openssl-0.9.6g.tar.gz
cd openssl-0.9.6g
./config >> /root/install.log
make
make install
#编译Net_SSLeay.pm模块
tar xzf Net_SSLeay.pm-1.20.tar.gz
cd Net_SSLeay.pm-1.20
perl Makefile.PL
make install

关闭一些服务
关闭不必要使用的服务进程以减少漏洞。全部安装Red Hat Linux后会有100多种服务进程,虽然没有都加载,但是毕竟容易产生问题。因为是桌面机应用,因此只保留必要的服务就可以了。下面是一个例子,基本上可以满足用户需要。

#可以使用chkconfig --list来查看系统打开的服务进程
#使用chkconfig --del可以删除指定的服务进程
#可以将/etc/init.d和/etc/xinet.d下的对应脚本移到安全的目录下
#更改脚本运行权限
#建议保留的服务进程
anacron
autofs
#用来启动自动运行任务
crond
gpm
ipchains
iptables
keytable
#类似PnP的硬件检测程序
kudzu
netfs
network
nfs
nfslock
portmap
random
rawdevices
#建议替换telnet的安全登录,使用加密通道
sshd
#日志监视进程
syslog
telnet
xfs
#超级守护进程
xinetd
还应该删除不必要的用户和组。使用userdel和groupdel删除用户和组。
#可以删除的用户
news
uucp
gopher
#可以删除的组
news
uucp
dip
#局域网环境下禁止用户使用拨号连接
pppusers
popusers
slipusers
还要关闭IP伪装和绑定多IP功能。修改/etc/host.conf文件。
/etc/host.conf
#多IP绑定
multi off
#IP伪装
nospoof on
按照需要禁止通过Ctrl+Alt+Del键关机。修改/etc/inittab文件可以禁止该功能,同时可以加强终端窗口的安全。
/etc/inittab
#使用Ctrl+Alt+Del三间关闭系统,也可以增加延长时间并通知管理员
#ca::ctrlaltdel:/sbin/shutdown t3 r now
增加超级守护进程的限制。修改/etc/xinetd.conf文件,可以增加远程连接的时间,访问网段等限制等安全设置。这些修改将对telnet等由xinetd管理的所有服务进程生效。
/etc/xinetd.conf
defaults{
instances   = 60
log_type    = SYSLOG authpriv
log_on_success        = HOST PID
log_on_failure        = HOST
cps            = 25 30
#限制仅有200.10.2和200.10.5网段允许访问,可根据具体情况调整
only_from        =200.10.5.0 200.10.2.0
#禁止其他网段访问
no_access = 0.0.0.0
#限制访问时间在7:00到24:00,可以根据上班时间限制
access_times     = 7:00-24:00
}
includedir /etc/xinetd.d

NFS服务
网络文件系统是构成Unix世界文件共享访问的基础。如果希望禁止用户任意的共享目录,可以增加NFS限制,比如锁定/etc/exports文件,并事先定义共享的目录。如果不希望用户共享,只限制用户访问,就需要修改NFS的启动脚本。编辑/etc/init.d/nfs文件,找到守护进程一行并注释掉。
/etc/init.d/nfs
# daemon rpc.nfsd $RPCNFSDCOUNT
系统中的很多配置文件和命令是很敏感的,修改权限和增加只读属性可以在一定程度上避免安全问题。
chmod 700 /bin/rpm
#NFS共享目录配置文件
chmod 600 /etc/exports
#主机访问控制文件
chmod 600 /etc/hosts.*
chmod R 751 /var/log
chmod 644 /var/log/messages
#系统日志配置文件
chmod 640 /etc/syslog.conf
chmod 660 /var/log/wtmp
chmod 640 /var/log/lastlog
chmod 600 /etc/ftpusers
#用户口令文件
chmod 644 /etc/passwd
chmod 600 /etc/shadow
#校验模块配置文件目录
chmod R 750 /etc/pam.d
chmod 600 /etc/lilo.conf
#终端配置文件
chmod 600 /etc/securetty
chmod 400 /etc/shutdown.allow
#系统访问安全配置文件
chmod 700 /etc/security
#网络系统配置文件
chmod R 751 /etc/sysconfig
#超级守护进程配置文件
chmod 600 /etc/xinetd.conf
chmod 600 /etc/inetd.conf
chmod R 750 /etc/rc.d/init.d/
chmod 750 /etc/rc.d/init.d/*
#自动运行程序控制文件
chmod 600 /etc/crontab
chmod 400 /etc/cron.*
#SSH配置文件
chmod 750 /etc/ssh
#内核控制配置文件
chmod 400 /etc/sysctl.confg

chattr +i /etc/services
chattr +i /etc/group
chattr +i /etc/gshadow
chattr +i /etc/hosts.*
chattr +i /etc/xinetd.conf
chattr +i /etc/exports
chattr +i /bin/login
chattr +a /var/log/message

关注日志
首先要使用日志服务器。将客户机的日志信息保存副本是好主意,创建一台服务器专门存放日志文件,可以通过检查日志来发现问题。修改/etc/sysconfig/syslog文件加入接受远程日志记录。
/etc/sysconfig/syslog
SYSLOGD_OPTIONS="-m r  0"
还应该设定日志远程保存。修改/etc/syslog.conf文件加入日志服务器的设置,syslog将保存副本在日志服务器上。
/etc/syslog.conf
*.*    @log_server_IP
可以使用彩色日志过滤器。彩色日志loco过滤器,目前版本是0.32。使用loco /var/log/messages | more可以显示出彩色的日志,明显标记出root的位置和日志中异常的命令。这样可以减少分析日志时人为遗漏。
还要进行日志的定期检查。Red Hat Linux中提供了logwatch工具,定期自动检查日志并发送邮件到管理员信箱。需要修改/etc/log.d/conf/ logwatch.conf文件,在MailTo = root参数后增加管理员的邮件地址。Logwatch会定期检查日志,过滤有关使用root、sudo、telnet、ftp登录等信息,协助管理员分析日常安全。

检查本机具有suid和sgid的文件。具有suid和sgid的文件具有相当的危险性。简单说就是普通用户使用这些命令时可以具有超级用户的权限,用户就直接进入超级用户环境。有很多命令是需要suid和sgid的。在系统安装时就把这些命令找到,并作为标准以比较出现问题的机器就可以发现安全问题。除了suid和sgid外,如果发现有些文件不属于任何用户,也可能是安全出现漏洞。下面的命令可以将以上的文件列表保存到文件中,备份这些文件,以后用来方便比较。
find / -xdev -type f -perm +6000 2> /dev/null > /root/backup/audit/suid.log
find / -xdev -nouser -o -nogroup > /dev/null > /root/backup/audit/nouser.log
find / -xdev -type f -perm -2 > /dev/null > /root/backup/audit/other.log

使用SSH
当管理员远程管理客户机时,除了Webmin方便通过浏览器管理外,命令行的使用更加快捷。而telnet是明文传输的,为了防止被嗅探器捕捉敏感信息,使用SSH是最好的选择。SSH会在第一次连接时在通讯的两台机器之间生成密钥,随后的通讯是通过加密方式传输的,嗅探器将无法有效地分析信息。如果是Linux直接使用SSH命令将可以连接到对方主机,如果是从Windows连接,则需要软件的支持,推荐使用PuTTY,SSH使用的是TCP端口22。注意不要使用任何r进程,比如rlogin、rcp等。

使用更安全的文件传输
除非需要FTP传输大量文件,不然可以使用SCP来代替。同SSH一样,SCP是通过密钥来创建加密通道的。在Windows上的WinSCP。但是如果需要传输大量的文件,SCP会导致处理器在处理加密上耗费过多的资源,可以使用proftp来代替。

使用系统快照
系统快照是利用对系统文件编排数据库来定期发现系统的变化。推荐使用tripwire,目前的版本是2.3.1-10。需要注意的是,tripwire的配置文件很全面,但是不一定适合你的系统,因此需要定制twpol.txt文件。定制的原则是首先安装完整的系统,随后安装tripwire,使用缺省的配置文件制作系统快照。根据提示的错误信息,用#屏蔽掉多出来的配置信息,随后重新生成数据库。
rpm ivh tripwire-2.3.1-10.i386.rpm
#修改twpol.txt文件,屏蔽掉系统中不存在的文件,随后开始安装
/etc/tripwire/twinstall.sh
#安装会要求输入生成密钥的密码和更新数据库的密码
#注意复制密钥的操作,不然会在初始化中提示文件不存在的错误
cp /etc/tripwire/$HOSTNAME-local.key /etc/tripwire/localhost-local.key
#初始化tripwire,生成数据库,其中会要求输入密钥的密码
tripwire --init
#通过系统快照判断系统的变化,并且发送邮件到指定用户
tripwire --check -M

使用基于主机的入侵检测
IDS可以帮助管理员发现突破安全的企图。在企业中基于主机的入侵防御比基于网络的更重要,毕竟企业的网络是在防火墙后,建议使用snare,其中snare-core是核心的守护进程。snare是图形界面的显示程序。安装完毕后会产生名为audit的守护进程。snare关心的是以root操作或修改文件权限,以及访问敏感数据的日志。因此可以通过配置文件来定义适合自己系统的入侵检测日志系统。缺省的安装已经提供了完整的配置,可以满足一般的需求。

其它安全工具

使用Bastille工具
Bastille是一组安全设置脚本的集合,前面的很多设置可以使用Bastille来自动完成。首次安装完Bastille后,BastilleBackEnd可以使用以前设置好的配置文件。配置/etc/Bastille/config文件就可以完成安全脚本的定制。Bastille的一般配置中没包括防火墙等参数。如果需要,可以在安装完后使用InteractiveBastille.pl交互安装。Bastille将会启动向导窗口,只要选择是或者否就可以生成适合自己系统的配置文件。Bastille的配置方案略。

使用木马检查工具
chkrootkit就是通过校验系统中重要的命令,来判断是否被替换,因为是根据已出现的木马与后门工具编写的,要注意经常更新。

使用自动运行程序
使用crontab可以减少管理员的工作强度。比如加入定期的tripwire校验、chkrootkit校验,并发送结果到管理员的制定信箱。

提醒大家注意:至少应有一台日志服务器,并且使用不同类型的Linux版本或者操作系统;所有的桌面机需在防火墙内,并且禁止使用调制解调器连接互联网;至少有一个入侵检测系统,多个传感器分布在网络中;至少有2名系统管理员互为备份;不要使用root直接登录;不要使用telnet远程登陆;任何的系统更改需要文档化;毕竟一分预防胜于十分的治疗。

以上仅仅是简单的说明了企业中Linux安全的基本设置。如果连基本设置都没有达到,安全问题将会困扰系统管理员。还有很多更复杂的安全设置没有介绍,比如限制网络的交互、限制资源等。因为介绍的是防火墙内的桌面机,所以防火墙、邮件服务器、文件和Web服务器的安全设定也都没加以描述,但是决不是说安全照这样做了,就可以高枕无忧。这些只是入门,还远远不够。很多具体使用情况和更深入的配置欢迎关心Linux安全的管理员交流。


Linux服务器安全加固建议

1、使用秘钥登录服务器

2、设置复杂密码
以大小写、特殊字符、数字组成的12-16位的复杂密码,如果没有1中的秘钥登录方式。

3、设置密码策略
修改文件/etc/login.defs

PASS_MAX_DAYS    90    密码最长有效期
PASS_MIN_DAYS    10    密码修改之间最小的天数
PASS_MIN_LEN    8    密码长度
PASS_WARN_AGE    7    口令失效前多少天开始通知用户修改密码

4、设置密码强度
修改文件/etc/pam.d/password-auth

password    requisite    pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=  difok=1 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1

difok= 定义新密码中必须要有几个字符和旧密码不同
minlen=新密码的最小长度
ucredit= 新密码中可以包含的大写字母的最大数目。-1 至少一个
lcredit=新密码中可以包含的小写字母的最大数
dcredit=定新密码中可以包含的数字的最大数目
注:这个密码强度的设定只对"普通用户"有限制作用,root用户无论修改自己的密码还是修改普通用户的时候,不符合强度设置依然可以设置成功

5、限制用户的登录次数
编辑文件/etc/pam.d/sshd

auth required pam_tally2.so deny=3 unlock_time=300 even_deny_root root_unlock_time=300

多次输入密码失败后会有提示信息

查看被锁定的用户
pam_tally2

将被锁定的用户解锁
pam_tally2 --reset -u username

Linux PAM 模块提供了许多额外的加固功能:cracklib

6、禁止root用户远程登录
打开/etc/ssh/sshd_config

解除注释,设定为将no设置为yes
#PermitRootLogin   no

7、更改ssh默认端口
编辑/etc/ssh/sshd_config,更改Port或追加Port

重启sshd进程服务后生效。

8、设置账户保存历史命令条数与终端超时时间
打开/etc/profile,添加或修改如下
export TMOUT=300
HISTSIZE=100

Ssh客户端5分钟未与服务器交互,服务器超时断开与客户端的链接。

9、定期查看查看系统日志
对重新日志专项查看处理
/var/log/messages
/var/log/secure
重要服务器可以将日志重定向传输到指定服务器进行分析处理。


云平台主机通过设置安全组的ACL来实现访问控制