第8章Linux系统安全据预计,2009年全球互联网用户的数量将会超过10亿,可以说,互联网与人们日常生活的联系正变得越来越密切。但与此同时,计算机犯罪和计算机恐怖主义也在不断地泛滥,各种网络攻击手段以及病毒层出不穷。为了保障企业和个人的重要信息及数据的安全,网络安全正受到越来越多人的关注,而作为系统管理员,做好系统的安全防范工作非常重要。本章将介绍黑客的常用攻击手段以及在Linux系统中的防范措施。8.1用户账号和密码安全针对用户账号和密码的攻击是黑客入侵系统的主要手段之一。一个使用了弱密码(容易猜测或破解的密码)或设置了不适当权限的用户账号,将给系统留下重大的安全隐患,入侵者可以通过这些用户账号进入系统并进行权限扩张。所以,管理员应采取必要的技术手段强制用户使用强壮密码并定期更改,定期检查系统中的所有用户账号,删除或禁止不必要的用户、检查超级用户的唯一性等,保证系统用户账号和密码的安全。1删除或禁用不必要的用户管理员应定期检查/etc/passwd文件,以查看主机上启用的用户。对于系统中已经不再使用的用户,应及时将他们清除。许多服务会在安装过程中在系统上创建专门的执行用户,比如ftp、news、postfix、apache、squid等。这类用户一般只是作为服务的执行者,而无需登录操作系统,因此往往会被管理员所忽略。为了防止这一类用户账号被黑客和恶意破坏者利用作为入侵服务器的跳板,可以采用如下方法禁止这些用户登录操作系统。1.锁定用户2.更改用户的Shell可以用下面的命令删除账号。#userdel用户名或者用以下的命令删除组用户账号。#groupdelusername2使用强壮的用户密码密码安全是用户安全管理的基础和核心。但是为了方便,很多用户只是设置了非常简单的密码甚至使用空密码,而入侵者往往利用一些密码破解工具轻松地破解这些薄弱的密码获得用户的访问权限,从而进行系统。用户可以使用以下命令检查系统中使用空密码的用户账号。#cat/etc/shadow|awk-F:'length($2)1{print$1}'guest//guest和kelly用户的口令为空Kelly例如:#passwdbeinan注:更改或创建beinan用户的密码;Changingpasswordforuserbeinan.NewUNIXpassword:注:请输入新密码;RetypenewUNIXpassword:注:再输入一次;passwd:allauthenticationtokensupdatedsuccessfully.注:成功;3设置合适的密码策略随着计算机处理能力的提高,利用暴力破解程序猜测用户密码所需要的时间已经大大地缩短。所以仅仅为用户设置强壮的密码是不够的,用户还应该定期更改自己的密码。但是在实际工作中,很多用户往往由于各种主观的原因延迟甚至拒绝更改密码,从而为系统留下了严重的安全隐患。为此,系统管理员可以使用RedHatLinux5.2中提供的强制更改密码机制,为系统中的用户设置合适的密码更改策略,强制用户更改自己的密码。使用change命令可以管理和查看用户密码的有效期,其命令格式如下:Chage[options]user参数意思:-m密码可更改的最小天数。为零时代表任何时候都可以更改密码。-M密码保持有效的最大天数。-W用户密码到期前,提前收到警告信息的天数。-E帐号到期的日期。过了这天,此帐号将不可用。-d上一次更改的日期-i停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。-l列出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。例如:#chage-M90root4破解shadow口令文件保护好主机上的/etc/shadow文件也是非常重要。shadow文件中的用户密码信息虽然经过加密保存,但如果这些经过加密后信息被入侵者获得,他们就可以通过一些密码破解程序来破解密码散列。chattr命令给下面的文件加上不可更改属性,从而防止非授权用户获得权限。#chattr+i/etc/passwd#chattr+i/etc/shadow#chattr+i/etc/group#chattr+i/etc/gshadow5禁用静止用户长时间不使用的用户账号是一个潜在的安全漏洞,这些用户可能是属于某个已经离开公司的员工,又或者是某些程序被卸载后留下来的用户,因此现在没人使用该用户。如果这些用户账号被入侵或者是文件被篡改,那么可能在很长一段时间内都不会被发现。因此,为用户设置一个静止阀值是一种比较好的解决方法。在RedHatLinux中可以使用带“-f”选项的usermod命令来完成这个功能。命令参数:-c备注修改用户帐号的备注文字。-d登入目录修改用户登入时的目录。-e有效期限修改帐号的有效期限。-f缓冲天数修改在密码过期后多少天即关闭该帐号。-g群组修改用户所属的群组。-G群组修改用户所属的附加群组。-l帐号名称修改用户帐号名称。-L锁定用户密码,使密码无效。-sshell修改用户登入后所使用的shell。-uuid修改用户ID。-U解除密码锁定。5禁用静止用户例如要设置用户sam如果超过10天没有登录系统,则自动禁用该用户,可执行如下命令:#usermod-f10sam如果要取消该功能,则设置值为-1,如下所示。#usermod-f-1sam6保证只有一个root用户root用户是Linux系统的超级用户,拥有系统中最高的权限。默认安装后,Linux系统只会有一个root超级用户。但是,Linux系统是以用户的UID来区分用户,而不是用户名,所以可以通过把一个普通用户的UID更改为0(root用户的UID),即可使该普通用户变为超级用户。例如,下面例子的/etc/passwd文件中,root用户和sam用户都拥有超级用户的操作权限,它们可以在系统中执行任何命令。root:x:0:0:root:/root:/bin/bashsam:x:0:500:sam:/home/sam:/bin/bashvirtual_user:x:501:501::/home/ftpsite:/bin/bashpostfix:x:502:502::/home/postfix:/bin/bash但不建议将普通用户提升为root,不然linux的权限设计就没有意义了。7文件路径中的“.”当用户执行一条命令时,shell会在路径环境变量(PATH)所包含的目录列表中搜索命令所在的位置,然后执行找到的命令,下面是PATH变量值的一个示例。#echo$PATH/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin“.”代表当前目录或文件夹“/”代表操作系统挂载点跟目录“~”代表当前用户的根目录/home/用户名“..”表示当前目录的上一级目录8主机信任关系:host.equiv和.rhosts文件/etc/host.equiv文件中保存了可信任的主机名和用户列表。一些远程服务,如rlogin、rsh、rcp等,就是利用该文件来确定受信任主机的。受信任的主机可以在无需用户名密码验证的情况下调用远程服务。所以,管理员应该定期检查该文件,确保文件中仅保存有受信任的主机和用户。如果没有受信任的主机或用户,可以考虑删除该文件。.rhosts文件实现与/etc/host.equiv文件类似的功能。但是它是存放在每个用户的主目录下,仅对该用户有效。例如,mailserver1主机的sam用户主目录下的.rhosts文件内容如下:$cat.rhostsmailserver28.2网络安全由于Linux系统的安全稳定,所以经常被用做网络应用服务器。但由于程序代码缺陷的难以避免,这些安装在Linux系统上的网络程序往往会存在着各种的漏洞,而入侵者则是利用这些漏洞进行网络攻击,进入系统窃取数据、破坏系统或使系统无法提供正常服务等。本节将介绍入侵者进行网络攻击的常用手段以及在Linux系统中的防范措施,还会介绍一些常用的命令以及工具以帮助系统管理员及早发现系统中的网络安全漏洞。1ping探测入侵者确定主机是否活动的最快、最简单的方法就是使用ping命令进行探测。ping命令会发出一个ICMPecho请求,目标主机接收到请求后会回应一个ICMP应答包。例如,执行ping命令对主机demoserver进行探测,结果如下所示。#pingdemoserverPINGdemoserver(10.0.0.111)56(84)bytesofdata.64bytesfromdemoserver(10.0.0.111):icmp_seq=1ttl=64time=0.127ms//主机demoserver可以访问64bytesfromdemoserver(10.0.0.111):icmp_seq=2ttl=64time=0.062ms64bytesfromdemoserver(10.0.0.111):icmp_seq=3ttl=64time=0.058ms省略部分输出---demoserverpingstatistics---//最后会显示本次ping操作的相关统计信息9packetstransmitted,9received,0%packetloss,time7999msrttmin/avg/max/mdev=0.058/0.069/0.127/0.020ms如果没人能ping通你的系统,安全性自然增加了。为此,可以在/etc/rc.d/rc.local文件中增加如下一行:echo1/proc/sys/net/ipv4/icmp_echo_ignore_all2服务端口TCP/IP的各种应用服务基本上都是采用服务器/客户端的工作模式,这些服务在服务器端会监听一些固定的服务端口,接受来自客户端的请求。而入侵者在发起攻击前,往往会利用各种的端口扫描工具对目标主机的端口进行探测和扫描,收集目标主机的系统以及服务信息,以此制定出具体的攻击方案。netstat-anp“:查看哪些端口被打开。说明:#-a显示所有活动的TCP连接,以及正在监听的TCP和UDP端口#-n以数字形式表示地址和端口号,不试图去解析其名称(number),参数'-n'会将应用程序转为端口显示,即数字格式的地址,如:nfs-2049,ftp-21#-p列出与端口监听或连接相关的进程(有个地方需要注意,下面会提到)(pid)注意:“-p”选项存在权限问题,如果在普通用户登录的shell里面执行netstat命令,那么只能列出拥有该普通用户权限的相关进程,如果想要看到所有的端口情况,最好还是切到root用户进行操作。关闭端口若要关闭某个端口,则有以下两种方法:1)通过iptables工具将该端口禁掉,如:sudoiptables-AINPUT-ptcp--dport$PORT-jDROPsudoiptables-AOUTPUT-ptcp--dport$PORT-jDROP2)关掉对应的应用程序,则端口就自然关闭了,命令如下:如:通过netstat-anp|grepssh有显示:tcp0127.0.0.1:21210.0.0.0:*LISTEN7546/ssh则:kill-97546退出进程ssh.例如要关闭22号端口:$netstat-anp|grep:22tcp000.0.0.0:220.0.0.0:*LISTEN988/sshd如此,知道了22号端口对应的进程ID988,$kill9882服务端口3拒绝攻击拒绝攻击是一种旨在消耗服务器可用资源的攻击方式,这些资源可以是进程、磁盘空间、CPU时间或是网络带宽等,被攻击的服务器将会出现资源被不断消耗的情况,并最终丧失提供服务的能力。例如,可以在/etc/security/limits.conf中添加如下几行:•hardcore0//禁止调试文件hardrss5000//限制内存