|
浅谈Linux安全
摘要
提供给管理员和初学者的快速安装安全设置,希望大家能从中受益(2003-12-06 09:21:51)
By 明明
用了linux也有些时候了,终于决定写一点东西,给大家共勉,起到互相交流之目的。
写这篇文章是针对使用linux的管理员,爱好者,对linux安全性很关心的同僚们,希望对大家有所帮助,废话就不多说了,进入正题吧.
在说安全设置之前,我想先说说关于发行版和安装的问题。对于发行版,我相信大都知道,linux发行版实在是太多了我也不止一次在很多网站的文章,很多书籍上看到过议论那种发行版是最好的,其实我个人认为,在linux世界中,没有最好的这种说法,只要自己习惯,熟悉的一种版本,那么我就可以说他是最好的。写这篇文章,我也试找了很多资料,试图找到一个大家都觉得常用的,熟悉的,最后,我觉得redhat linux真的很不错,虽然它的内核比较庞大,而且效率不使所有发行版中最高的,但是它的普遍性,易用性和软件升级支持,应用软件支持方面是值得提出的,这些方面也正是一个好的linux发行版需要具有的。 这篇文章建立在redhat linux 7.3版之上,所有的软件设置均在这个版本上测试通过。
说到这里,可能大家要问,为什么我要用redhat 7.3?现在不是有很多吗?就redhat来说就有redhat 8.0, redhat 9.0还有什么redhat 高级企业版,等等。这么多新的东西为什么不用呢?这个问题问得很好,这正是我要说的安装和选择发行版是要注意的一点。
1、版本的选择
我使用redhat也有很长时间了,个人认为,redhat的.0版本都属于大版本升级的第一个版本,这个版本往往很多软件包不是很稳定,而且容易出现故障,对于管理员来说linux绝大部分是用来作为服务器使用的,那么要最为服务器,最最大的首要问题就是稳定,其次最重要的也是安全,所以如果你是管理员,而非狂热的爱好者,发烧友,我建议你选择redhat 7.3。redhat 的版本号,后面跟了小版本号的就是软件包有很多更新和修改的,虽然这个更新可能不是最新,但是至少它是这个稳定版本中最新最稳定的,不知大家理解这个问题没有,后面我将详细介绍一下版本的升级问题,那里我将会说明这个理论。
2、安装方式
选择好了安装发行版,那么我们就开始安装了,其实安装的时候只有几个需要注意的地方,其一就是分区,其二就是安装的软件包。
分区的讲究就是你需要针对你的应用来规划分区,过去看过很多论述linux是否有一个最佳的分区方案,虽然很多人也提出了很多优秀的分区方案,但是我觉得还是需要更具自己的应用作的分区才是最佳的分区,下面各个分区方案,但是纯属建议,还是要更具自己的需要来作。
个人认为,标准的服务器,至少扩常用的分区,因此建议将硬盘划分为以下的样子: /boot swap / /var /usr /home /tmp ,大小根据自己的应用来,/不能小于1G,/usr 和 /var都要大一点,因为大部分软件在里面,其他几个更具需要来,说到swap我想关于这个区的大小争议也比较大,我在综合了很多朋友的意见后,总结出一条规则,如果你的内存小于1G那么分为内存的2倍,如果大于1G那么就分最大2G的swap,这样做是为什么呢?因为swap大家都知道,是虚拟内存的空间,小了又不能发挥最好的作用,大了又浪费空间,这个大小是具体的理由就是,内存大的话,那么应用程序占用的虚拟空间就小,但是为了完全满足服务器的内存需要,据很多朋友的经验,还有我切身的体验,这种分法可以说是一个最佳的方案了,特别对于数据库等大型应用程序的内存需要来讲,而且很多服务器的内存都是 1G-2G左右。
安装软件包,讲究的是安装得越少越精越好,但是redhat开始安装的时候,作为一个服务器,下面的几个软件包组需要选择
Networ support(网络支持)
Messaging and web tools(可选择安装,一些联网的工具如ncftp等)
Router/Firewall(防火墙软件,需要安装,但是他有一点不好把ipchian,iptables,ipwf等都安装了,后面将解释如何删除)
Network managed workstation(管理用工具)
Utilities(常用工具,备份工具等)
虽然我们现在安装是简单的选择了这几个软件包组,我们在后面的安全设置时将会删除一些不用的包,这将在后面说。
3、更新软件
虽然redhat 7.3是更新过的版本,但是其中还有很多软件包有漏洞,其中最大的漏洞就是2.4.18的一个漏洞,它会导致ext3文件系统崩溃,我就遇到过很几次(据 ext3开发小组称,这种现象是在特定的操作和条件下才会产生的,一般用户很少出现这种现象),虽然很多现在已近解决这个问题,但是7.3没有更新内核的话还是不稳定的,更新有两种方式,一种时下在更新的软件包手动的用rpm –Uvh 来更新,另外一种也是我推荐的方式,使用up2date来更新,这可是一个好东西,它能很方便的更新你的系统,而且是更具你安装的软件包来更新的,他不会把bind8更新为bind9,不会把redhat 7.3更新到redhat 9.0,这样就确保了你目前使用的版本的稳定性和完整性,它只是针对这个版本的软件包进行了修正,版本号一般就是这样变得,比如iptables ,7.3的rpm 版本是1.2.5那么更新后就是1.2.8修正了很多漏洞错误,但是并没有作大的调整,确保了你的使用和与应用程序的兼容性。
Up2date的使用,在自动升级之前,建议几个操作,
第一个,由于redhat 7.3版自带的up2date有SSL的bug,因此,需要取下在一个最新的up2date来更新,下载地址
https://rhn.redhat.com/errata/RHSA-2003-267.html
第二个,一般来说,我们都不希望up2date自动更新内核,然后内核的更新直接解决很多重大漏洞,特别是新安装的redhat 7.3就有ext3崩溃的漏洞因此,我建议大家自己先手工升级内核,当然使用rpm 包来升级,这样节约很多时间,开始我就说过,虽然redhat不是效率最高的,但是确实做得最普遍的一个系统,rpm的方便就完全体现了这点优势, redhat 7.3内核的下载地址
http://updates.redhat.com/7.3/en ... .4.20-20.7.i386.rpm
http://updates.redhat.com/7.3/en ... .4.20-20.7.i586.rpm
http://updates.redhat.com/7.3/en ... .4.20-20.7.i686.rpm
对于你自己的系统,你可以用uname –a看看目前的是i386还是i686然后根据这个来选择下载的内核升级包。
建议最好使用rpm –ivh 来升级,这样可以保留原来的内核,确保没有问题再将原来内核rpm –e掉,这个rpm包非常简单甚至你不用修改你的lilo.conf或者grub.conf的配置文件,它自动给你加入了,你需要做的就是重起然后选择新的内核启动就行了。
做完了内核的升级,用新内核重起后就是up2date的时候了。
运行rhn_register随便注册一个号码(这个要保密哦,我自己研究的,rhn网络的升级实际上是收费的服务,但是一个邮箱一个账号是免费的,但是一个账号只有一个升级系统的权限,你可以通过rhn的网络来登录修改这个权限给其他的机器,不过这样太麻烦了,而且redhat7.3的升级基本上稳定了,只需要在安装第一次升级一下就行了,所以我们就随便注册帐号来升级下:P)根据提示,它默认选择了你机器上所有的包,为你升级,没关系,一路next 最后finish然后回到控制台,接下来就是激动人心的升级了,运行命令:
up2date –u
就开始升级了,这个过程看你的网络了,大约有1小时左右。
它会自动为你下载安装,虽然不用重起,但是建议你还是重起一下,确保新内核和新的软件包能够正确使用
到此为止,系统更新就做完了,下面就是比较重要的安全设置了。
4、安全设置
其实linux的安全已经比较好了,我们做得初浅的安全讨论,无非就是关闭服务,设置一定的防火墙,如果大家对防黑客和高级的安全设置感兴趣的话,那么请关注我下几篇文章,我将向大家介绍有关简单的IDS等等防黑技术,谢谢。
关闭不用的服务,这个问题,很多文章都提出过,我个人认为最有效的关闭方法如下,大家都知道,linux中控制服务的有chkconfig ,ntsysv等等,其实这些工具控制的服务都是linux已sysV的风格保存的服务启动项目,其实都是/etc/rc.d/下面的东西,已rc3.d 为例,3表示init3时要做的项目,里面的文件都是一些连接,S开头表示启动,K开头表示终止,所以rc0.d里面基本都是K开头的,所以大家不用害怕觉得linux的服务多么神秘,这里介绍两个简单可行的控制服务的办法。
运行ntsysv控制服务
使用ntsysv关闭服务只开
crond 可定义计划任务
network 网络
random 生成随机数,用于ssh的会话对称密钥的生成
sshd ssh服务器端
syslog 系统日志服务
xinetd 超级进程(下面没有服务要用的话,可以关闭)
其实xinetd是类似于init这个超级进程的一个进程,不过可以完全关闭它,因为下面都是些没有用服务监听程序,对于一般的服务器,基本上只需要上面ntsysv所列的服务就行了,其他的都关闭,当然如果你要web当然要开httpd了。
服务关闭完了以后,就是去掉一些不用的用户,用vipw
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#sync:x:5:0:sync:/sbin:/bin/sync
#news:x:9:13:news:/var/spool/news:
#uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
#operator:x:11:0perator:/root:/sbin/nologin
#games:x:12:100:games:/usr/games:/sbin/nologin
#gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
#ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
#vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
#rpc:x:32:32ortmapper RPC user:/:/sbin/nologin
#rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
#nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
#nscd:x:28:28:NSCD Daemon:/:/bin/false
#radvd:x:75:75:radvd user:/:/bin/false
去掉这些用户
上出多余的rpm包
rpm -e softname
rpm -e autofs-3.1.7-28
rpm -e gd-devel-1.8.4-4
rpm -e up2date-2.7.86-7.x.3
rpm -e pump
rpm -e apmd
rpm -e lsapnptools
rpm -e redhat-logos
rpm -e mt-st
rpm -e kernel-pcmcia-cs
rpm -e setserial
rpm -e redhat-release
rpm -e eject
rpm -e kudzu
rpm -e gd
rpm -e raidtools
rpm -e mailcap
rpm -e setconsols
rpm -e gnupg
修改/etc/fstab
只给分区必须的权限
像这样LABEL=/bakups /bakups ext3 nosuid,noexec 1 2
noexec表示不能在这个分区运行程序,nosuid不能使用nosuid的程序,根据情况自行设置其他分区,一般来说/tmp,/usr都要nosuid
到此我们做了一些基本的安全设置,当然你也可以考虑,比如启用wheel组,只能让wheel组的用户能够变为su但是一般来说管理员都不用考虑这些,因为只有你一人能够登录这台机器,:),这些细节的设置我也会在下篇文章详细说明,应为毕竟这不是我这篇文章主要的东西。他们会同IDS等内容在下一篇文章详细呈现给大家。
5、防火墙设置
上面的基本安全设置做完了,那么接下来一个比较主要的安全就是防火墙,这是很重要的,如果你的设置没有作得很好,也许软件还有一些漏洞,但是防火墙设置得好的话,基本上可以帮你弥补这些问题,给大家一个基本的单个服务器的防火墙脚本,里面不包括端口转发,伪装等网关功能的内容,如果大家对这方面有兴趣,欢迎给我来信探讨
#!/bin/bash
#启用转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
#显示开始信息
echo "Start FireWall for this server..."
#清空目前的规则
iptables -F
#编辑默认策略为不能通过,数据接入链
iptables -P INPUT DROP
#转发链默认drop
iptables -P FORWARD DROP
#数据输出链默认drop
iptables -P OUTPUT DROP
#输出链允许源地址是xxx.xxx.xxx.xxx的数据输出,也可以指定网卡例: –i eth0
iptables -A OUTPUT -s xxx.xxx.xxx.xxx -j ACCEPT
#接入链允许端口为15818的源地址为xxx.xxx.xxx.xxx的数据通过
iptables -A INPUT -p tcp -d xxx.xxx.xxx.xxx --dport 15818 -j ACCEPT
#如果需要添加端口就在下面修改,xxx处添加端口号
#iptables -A INPUT -p tcp -d xxx.xxx.xxx.xxx --dport xxx -j ACCEPT
#允许所有udp包通过
iptables -A INPUT -d xxx.xxx.xxx.xxx -p udp -j ACCEPT
#限制ping包每一秒钟一个,10个后开始
iptables -A INPUT -p icmp -d xxx.xxx.xxx.xxx -m limit --limit 1/s --limit-burst 10 -j ACCEPT
#限制IP碎片,每秒钟只允许100个碎片,防止DoS攻击
iptables -A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
恭喜你,到目前为止,你有一个相对安全的系统了,但是记住,最重要还是你要把root的密码记住哦,呵呵,希望写了这么多,对大家有所帮助,这是我最大的愿望,希望大家觉得我写得还行的话任意拷贝,广泛传播,但是不要修改哦,如果觉得有什么问题希望和我探讨的话,我也虚心接受大家的意见和建议,请给我 email:ttii@linuxaid.com.cn,希望和大家成为朋友,共同学习linux探讨问题,为中国的软件事业贡献我的微薄之力,谢谢
注意,如果你需要转贴到你的网站或者论坛,可以随意转贴,也请你发邮件告诉我一声转到什么地方了,谢谢,我的联系方式qq:8537798,email:ttii@sohu.com。 |
|