欢迎光临
我们一直在努力

Linux安全指南-网管专栏,安全与管理

建站超值云服务器,限时71元/月

系列之一:开始的考虑
此文写给关注linux安全的读者。假定读者管理基于linux的网络,且此网络和internet相连。如有不足及错误之处,敬请批评指正。

一:考虑安全性能的需求
请记住,维护计算机安全绝对不是一劳永逸的活计。它贯穿网络管理员工作的始终。
还有,你需要考虑,目前情况下究竟需要多高程度的安全性?因为往往安全性很高的系统会带来很多额外开销,这里面还有经济的制约。
再者,没有系统是绝对安全的。如果管理员能让那些不怀好意的家伙费尽心机得到的价值远远小于他付出的代价,那么可以说目的就达到了。
二:影响计算机安全的因素
影响安全的因素实际上很多。
例如:你的计算机是否和互联网相接?是当做工作站还是服务器?做服务器时开放了哪些服务?用户以怎样的方式使用这些服务?……
请记住下面几条一般性的准则:
1:单独保护服务器,不要让用户接近。除非绝对必要,不要开放用户交互登录服务。
2:要假定用户会有意无意的破坏系统。
3:对敏感信息要注意加密防护。如:用户账号,密码,信用卡号码等等。
4:定期扫描检查开放的端口,安装的软件。对比一下,看看它们是否和以前相比有突然的变化。有些自动化的工具可以做这些事情。
5:备份(简直是最佳手段 ^!^)
要知道,用户往往不懂也不想懂在他摆弄计算机时,后面使用了什么技术。他只关心:自己的邮件是否可以正常收发?文件是否可以正常打印?
往往这些家伙还喜欢在工作站上安装许多杂七杂八的东东。ftp软件,聊天,甚至一些黑客工具!
所以,如果可能,在你管理的局域网里面,也要限制工作站的使用。因为“堡垒最容易从内部攻破”。要是因为这个原因造成服务器出问题,可够你懊恼的。
更进一步,下面所列的要求如果适合你,就做好。
1:给做工作站的计算机加上bios密码,并只告诉某些人。
2:限制计算机,让这些计算机只能从特殊的硬盘启动。
3:给lilo(linux的启动器)加上密码。
4:使用防火墙。
5:禁止用户直接使用“root”登录。
6:给用户可以完成工作的最小权限。
……
linux下的软件发展非常快,新版本的软件曾出不穷。但是小心,尽管一般来说新的软件会更好,修正了很多错误。 可以经常检查网上的消息,看看是否有漏洞补丁出现。
要是没有新的漏洞被发现,你的系统运行一切正常,并没有不可忍受的麻烦。如果你非要试试新鲜的版本的话,我怀疑你有毛病。^!^ 不要做毫无意义的事情。
在升级软件时,请先测试,再付诸行动。

三:安装和启动安全
1:选择合适的安装方案。
适当的安装是得到稳定、安全的系统的第一步。
市场上有为数众多的linux发行版本。随着技术的发展,linux变得越来越好安装了。但这不意味着你可以随意选择而不加以考虑。
许多linux厂商都推出了面向不同场合的发行版。如turbolinux服务器版本,xteamlinux服务器版本,redhat linux for oracle等等。可以想象,这些版本和普通的桌面版本相比,肯定经过了更多的测试、考验。在特定的场合更值得信赖。
还有,系统下面有许多功能相似或相同的软件。考虑自己的需要,选择合适的产品。有时,还可以跑到网上去“取经”,问问有经验的朋友,哪些版本合适,或者,完成同样的工作哪套软件包最为可靠。当然,漏洞多多的软件要小心使用。
四:系统物理保护和启动安全
1:想象一下,尽管你做的很好,软件运行平稳,一切正常,可是,一个该挨刀的家伙跑到机器面前,手按了一下电源键……要不趁你不备,让机器重新从软盘启动……。
防备措施:让这些人离机器远点,或者把机器锁住。要是有条件,单独为机器腾出个小房间。钥匙有两把,“头”一把,你一把。
2:bios的设置也是很重要的,特别是你没有很好的条件保护机器时。要知道,许多老版本的bios有后门,有通用的密码。注意升级。
把bios设置成从c:或第一个硬盘驱动器启动。屏蔽掉平时不需要的设备,如软驱,串口、并口等等。
设置合适的bios密码,这里就不废话了。
3:lilo是最典型的linux启动器。功能强大,非常灵活。但技术往往是双刃剑,这里潜在的安全问题也有不少。因为你可以向核心传递参数。最典型的就是:single
使用这个参数可以直接进入root用户模式,你所做的一切都成了玩具和摆设。
使用现有的一些技术可以减少这些危险。
/etc/lilo.conf文件中有许多可以设置的参数,如:

delay=x

告诉lilo在启动的时候等待x/10秒钟,接受用户输入。
c2级别的安全认证要求时间是0,可以想象,所有的双启动的机器都违反了要求。如果你的机器不要求双启动,或不要输入参数,把delay设为0。

prompt

强制用户输入才能启动系统。可以避免系统自动启动。但是,如果还有timeout参数,则达到了timeout参数规定的时间后,系统仍然自行启动默认的系统。

restricted
要求用户传递密码参数给启动器,即使使用“ linux single”也是如此。如果你不要求远程重起动机器,则要求启动时敲入密码是个不错的办法。

password=xxxxxxxxxxxx

此参数要求和上面的restricted参数一起使用。等号后面是密码。注意,lilo.conf必须加以控制,不能随便让人读出内容。否则一切都白搭。
下面是lilo.conf的示例:

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=100
#你有10秒钟的输入时间
default=linux
image=/boot/vmlinuz-2.2.5
label=linux
root=/dev/hda1
read-only
restricted
password=s0m3_passw0rd_h3r3

在bios里面设为c:启动,保护好lilo.conf和你的密码。现在,你的启动安全性应该是不错的。

系列之二:用户认证
一:密码问题
一个网络里面通常会有许多用户,通常,这些用户都需要在使用服务时提供密码。系统中都有passwd实用程序,可以用来修改密码。
在unix类的操作系统中,有很多作法是相同的。比如,用户名和密码均存储于/etc/passwd文件之中。linux是克隆又重新书写的unix,自然也不例外。出此之外,此文件还存储有其它重要信息,如:uid、gid等等。这个文件中的信息对维护系统正常运行是必不可少的。如用户认证,权限赋予等。
问题是,怎么保持文件是文本可读的,又有安全性保证?你不能让用户相互间知道密码。
这个问题早就考虑过了。
/etc/passwd文件中存储的是加密的密码字串。你在修改密码时,程序使用某种算法(hash)加密输入的字符,再存入文件。这样即使人看见了,也绝对不知道密码是什么内容。在登录时,系统把你输入后加密的字符串和存储的密码串比较,如果一致,则认为通过。
哈希算法是不可逆的。即,你无法从加密后的字串反推回明文密码。这是不可能的。
但是,cracker(攻击者)可以先取得密码文件,再使用推测、穷举的笨办法强行“猜出”密码。即,使用程序加密字串,不断和文件里面的密文对比,如果相同,则就找到了密码。现在,计算机技术一日千里,计算能力提高得非常迅速。所以,不好的密码就有较大的可能性被干掉。(据测试显示25%的密码可以在不到一个小时的时间内破解。4%的用户选择用户名或变体作为密码)
什么才是好的密码?相信很多朋友早就知道了。大小字母和数字、特殊字符混合书写,长度足够。如:
s0m3_passw0rd_h3r3 这样的密码,可以相信打开它的时间在现在的条件下是无法忍受的。而study这样的密码只会让攻击者他们笑掉大牙。由此可见密码选择的重要。
一般在你使用passwd程序修改密码时,如果输入的密码安全性不够,系统会给你警告,说明密码选择很糟糕。这时,最好再换一个。
绝对避免使用用户名或者其变化形式,有的破解程序可是上来就使用用户名来回变换测试的。而糟糕的是,相当多的用户就喜欢这样——好记!可是这样安全性仍然不够,有没有更好的办法呢?
有,使用更好的加密算法,如-md5(有的linux发行版安装时可以选择此项);或者把密码放在其它地方。
二:关于pam
linux的解决方案类似于第二个方案,叫做shadow password。在/etc/passwd文件中的密码串被替换成了’x’,组密码也一样处理。系统在使用密码文件时,发现标记会寻找shadow 文件,完成相应的操作。而shadow 文件只有root用户可存取。
这个办法真是既简单又可靠。但是,问题还没有完,许多程序在运行时都需要用户认证,必须修改所有这些程序,再次编译,以便支持这项技术。还有新的、更安全可靠和经济的认证技术不断出现,如果想使用这些技术,仍然需要修改许多程序。这简直是一场恶梦。
为了达到更经济合理的目的,我们的另一个重要伙伴应邀登场了:pam “pluggable authentication modules “ 可插入认证模块.
它在需要认证的程序和实际认证机制之间引入中间件层。一旦程序是基于pam发行的,那么,任何pam支持的认证方法都可以用于程序!!这样就没有重新编译所有程序的麻烦了,只要pam发展了新技术,如数字签名,基于pam的程序可以马上使用它。
这种强大的灵活性能是企业级应用所不可或缺的。
更进一步,普通认证手段难以完善的管理用户、会话数据等工作还可以交给pam来做。比如,你可以非常容易的禁止某些用户在特定的时间段登录,或要求他们登录时使用特别的认证方式。
你甚至还可以把linux工作站绑定到基于microsoft nt的网络中,在nt域下使用你的linux工作站,完成认证工作。可是你并不需要买额外的软件。
看来pam真是好处多多!大名鼎鼎的redhat linux默认就是基于pam发行的。他的风行和这种技术不无关系。linux的发行版如果不是基于pam方式发行的,那你做的工作会多一些,比如安装pam套件,编译相应程序。
下面的列表描述了常见的发行版对pam的支持情况:
red hat 5.0, 5.1, 5.2, 6.x completely
debian 2.1 yes
caldera 1.3, 2.2 completely
turbolinux 3.6 completely
suse 6.2 yes

下面是一些关于pam的网址:
pam cryptocard module
http://www.jdimedia.nl/igmar/pam/

pam smart card module
http://www.linuxnet.com/applications/applications.html

pam module for smb
http://rpmfind.net/linux/rpm/pam_smb.html

http://www.csn.ul.ie/~airlied/pam_smb/
有兴趣可以去看看。
三:一个小问题
可能这个问题很多人都不在意。这就是,你的密码怎么记住?当然最好的办法就是记在脑子里面。可如果你管理数十个站点呢?好的密码一般都在8位以上,而且各种字符相互混合,当然特别难记。怎么办?有人想出了“好主意”,所有的站点密码都一样!!
还有,可以把密码写下来呀,但是别人发现怎么办?一个比较好的办法是,使用加密的方法书写密码,你只要记住相应规则。或者用加密软件存储在计算机里面,只要大脑记住一个开锁密码就行。

系列之三:文件和文件系统的安全
一:综述
“盖房子先要打好地基”。这个“地基”对于linux来讲,就是ext2(extended, version 2)文件系统。
ext2文件系统性能优良,支持文件权限控制(读、写、执行等)和属主控制等特性。但是它到现在为止,还缺乏良好的日志系统。而这一点对于应用来说,越来越重要。不过,据说下一代的ext3文件系统会很好的弥补这个缺撼。“存取控制列表”会替代现有的文件权限机制,设置起来更加灵活方便。ext2文件系统还拥有优秀的software raid的能力。从0级到5级都支持。这些技术可以大大增加系统的稳定性。
二:文件系统的划分。
实际上这是应该在安装linux,划分硬盘分区时做的工作。
在linux下,我们常用的操作文件的命令有: ls、ln、cp、chown、chmod、find、fdisk、find……等等。
如何保证他们不被非法使用?或者禁止进行未允许的操作?
举个例子,许多程序产生的临时文件都放在“/tmp”,攻击者做个硬连接,指向/etc/passwd,当你的程序执行时,它并不检查这里面的问题。结果,呵呵,这个文件就被破坏了。你的系统很可能就此瘫痪掉。
如何预防这类问题的发生呢?像刚才这类问题,只要把“/tmp”“/home”这两个普通用户有写权限的目录单独划分为一个分区就可以避免。
简单的讲,在你安装linux的时候,需要正确的划分文件系统。许多linux爱好者在自己的pc机上安装linux时,一般只划分两个分区:native和swap。除了交换分区,其它的所有东西都化在“/”下面。当然,这最省事了。如果是自己玩玩,没有什么大不了的。
但是,真要是应用于商业环境,你就将冒很大风险。只有一个“/”真是糟的不能再糟了。最好把 /usr、/var、/etc、/boot等重要目录单独划分成分区。像各个分区的大小,有的是有系统限制的,如/boot分区最大16mb。有的则是经验数值,如交换分区可以设置成小于等于内存值。像/usr分区因为要安装很多软件,所以要尽可能的大些。其它的分区容量设置则要看具体情况了。下面给出一个示例:
/boot sda1 5m 5m linux native
/usr sda5 1000m 1000m linux native
/home sda6 500m 500m linux native
/chroot sda7 400m 400m linux native
/cache sda8 400m 400m linux native
/var sda9 200m 200m linux native
sda10 150m 150m linux swap
/tmp sda11 100m 100m linux native
/ sda12 316m 315m linux native

drive geom [c/h/s] total (m) free (m) used (m) used (%)
sda [3079/64/32] 3079m 1m 3078m 99%

三:文件的安全删除
有很多人会忽略一件事情,就是在删除文件的时候,文件的内容实际上并未真正擦除。即使你覆盖了文件或者重新安装了系统,仍然有可能被特殊的技术发现痕迹。真的,只有你想象不到的事情,discovery节目还曾经报道过挽救被撕成碎片的软磁盘内的信息。以前的dos版本诺顿工具diskedit也是威力不小。这样一来,对于重要的、敏感的文件,这又成了隐患。
但是,不要忘了,计算机内所有存储的东西都是由0/1组成的。如果删除文件时,使用特殊的工具软件同时破坏文件内容,把它全部清为0或1,那么即使被人读出来又有什么意义呢?
从下列地址可以下载相应的软件工具,专门干这种事情。
http://gsu.linux.org.tr/wipe/.
http://users.erols.com/thomassr/zero/download/wipe/.
不过,在使用这些工具擦除文件之前,一定要小心确认。否则,呵呵,叫天也没有用。
四:重要的系统文件
1:/etc/passwd
这是linux系统中最重要的文件之一。保存有关用户的相关重要资料。必须是文本可读的。否则,可能连基本的ls命令都无法运行。
文件内容每行格式如下:
username:encrypted_password:uid:gid:gecos_field:home_directory:login_shell
例如:
root:x:0:0:root:/root:/bin/bash

前面已经提到,用户名后面的密码一般都是加密存储或者shadow处理过(显示的密码变成了x)。后面存储的是用户id、组id、用户私人信息域、默认home目录、使用的shell程序等。
注意,普通注册用户的uid都在500以上,而root用户则是0,如果把普通用户的id改成0,则这个用户则具有了相当于root的权力。
2:/etc/shadow
实际的密码就存储在这里。除了用户名、密码外,还有用户账号的相关信息。如:账号的过期时间等等。
例如:
root:$1$6uvicnvh$wtr0zpmek41kmzd0z1ddv1:11194:0:99999:7:-1:-1:134622596

这个文件必须实行极为严格的保护,只能允许root用户读取它。否则后果可想而知。(不信你到linux下面看一下,默认的权限属性就是设置成只允许root读取的。)
3:/etc/groups
包含了用户组的信息。可以把工作性质相近或根据具体需要把用户分在不同的组内,赋予不同的权限。这样可以更好管理系统。netware、nt都有这种概念。
这个文件的内容类似如下格式:
groupname:encrypted_password:gid:member1,member2,member3
组名 密码 id 成员1 成员2 ……

这里密码、成员都可以是空的。
4:/etc/gshadow
和/etc/shadow文件作用相似。
5:/etc/login.defs
文件内定义了许多默认值或属性供程序使用。比如:useradd。各种版本的linux或许有不同之处,但是文件内容有良好的注释。修改相应属性可以更好的适应自己的环境。
6:/etc/shells
这个文件列出了可供用户使用的shell程序(命令解释器)。注意,如果规定用户使用的shell不在这里,用户可能无法正常登录。
7:/etc/securetty
规定了root用户可以从什么tty登录系统。一般从tty1~tty6。建议只保留tty1。

系列之四:网络安全概述
linux的网络能力是不用说的。看看每年linux在服务器市场的增长率就能明白了。强大的网络性能是linux崛起的重要因素和保证。而网络安全涉及的范围则相当广泛。
一:ppp连接安全
ppp使用调制解调器通过串口提供tcp/ip和其它协议的连接。大多数人都使用ppp协议和互联网相连。
ppp本身没有安全性能。你的用户名和密码通常都是明文传送到服务器的。而且,通常需要在服务器开通和你用户名一致的账号。
这样一来,又给系统带来了隐患。弄不好会有别有用心之人使用“嗅探器”专门拦截探测它。
使用pap(password authentication protocol)协议,可以加密用户信息,尽管仍然是明文传送,但是传送的用户名和服务器实际的用户名并不一样。这样,安全性高了一些。
另外一个方法是使用chap (challenge handshake authentication protocol)协议。它使用公共密钥交换机制,在认证过程中加密传送用户信息。这个办法是目前最好的。但由于微软在软件中使用des加密方法,而linux使用md5方法,这样,linux终端登录运行微软的软件的服务器时,可能会出问题。你需要给linux内核打上补丁。
二:tcp/ip安全
tcp/ip协议产生之初,安全问题并没有得到人们的注意。应该说,那时候还没有这个需要。相互联系的主机很少,会话的用户都知道对方。所以尽管tcp/ip协议运行非常稳健可靠,但是基本没有提供诸如认证之类的安全保证。所以,现在在互联网上,使用黑客工具可以很容易的做到探测、截取数据包,伪装等。现在最常用的攻击方式就是“拒绝服务”,就是使用某些手段使服务失效。这种办法很容易实现又很难防范。这些事实和tcp/ip本身的安全弱点不无关系。以前据称新浪的邮件服务器也遭到过此方式的攻击。
基于主机名称的认证是不可靠的。“dns毒药”很容易使dns的cache中毒,从而搞乱主机名称和ip地址的对应关系。而现有的机制无法知道数据报是从哪里发出,谁接受的。ipv6和vpn已经采取了一些技术来提高安全性。如ipv6整合了ipsec。有了这些技术,攻击者发动袭击就不会像现在这么容易了。linux可以很好的支持ipv6。你应该在局域网上严格限制保留的ip地址的使用。这些地址常常被攻击者使用(在发出的数据报上打上此类ip)。如127.*/10.*等等。如果你使用了地址转换协议,而没有很好的配置防火墙,那么你就有可能被攻击或者被攻击者利用。建议考虑vpn技术。
三:常见的几个配置文件
1: /etc/inetd.conf
文件内容是系统提供哪些服务。举例如下:
……
#
# these are standard services.
#
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
#
# shell, login, exec, comsat and talk are bsd protocols.
#
shell stream tcp nowait root /usr/sbin/tcpd in.rshd
login stream tcp nowait root /usr/sbin/tcpd in.rlogind
#exec stream tcp nowait root /usr/sbin/tcpd in.rexecd
#comsat dgram udp wait root /usr/sbin/tcpd in.comsat
talk dgram udp wait root /usr/sbin/tcpd in.talkd
ntalk dgram udp wait root /usr/sbin/tcpd in.ntalkd
#dtalk stream tcp waut nobody /usr/sbin/tcpd in.dtalkd
#
# pop and imap mail services et al
#
#pop-2 stream tcp nowait root /usr/sbin/tcpd ipop2d
#pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d
#imap stream tcp nowait root /usr/sbin/tcpd imapd
#
# the internet uucp service.
#
#uucp stream tcp nowait uucp /usr/sbin/tcpd /usr/lib/uucp/uucico -l
#
# tftp service is provided primarily for booting. most sites
# run this only on machines acting as “boot servers.” do not uncomment
# this unless you *need* it.
#
#tftp dgram udp wait root /usr/sbin/tcpd in.tftpd
#bootps dgram udp wait root /usr/sbin/tcpd bootpd
#
# finger, systat and netstat give out user information which may be
# valuable to potential “system crackers.” many sites choose to disable
# some or all of these services to improve security.
#
finger stream tcp nowait root /usr/sbin/tcpd in.fingerd
#cfinger stream tcp nowait root /usr/sbin/tcpd in.cfingerd
#systat stream tcp nowait guest /usr/sbin/tcpd /bin/ps -auwwx
#netstat stream tcp nowait guest /usr/sbin/tcpd /bin/netstat -f inet
#
# authentication
#
auth stream tcp nowait nobody /usr/sbin/in.identd in.identd -l -e -o
#
# end of inetd.conf

linuxconf stream tcp wait root /bin/linuxconf linuxconf –http
#swat stream tcp nowait.400 root /usr/sbin/swat swat

上面的内容没有经过修改。
使用#号注释掉不需要的服务。在修改过后,使用killall -hup inetd使更改生效。
2:/etc/services
文件里罗列出了端口号、协议和对应的名称。
格式是:service-name port/protocol aliases # optional comment
例如:
tcpmux 1/tcp # tcp port service multiplexer
echo 7/tcp
echo 7/udp
discard 9/tcp sink null
discard 9/udp sink null
systat 11/tcp users
daytime 13/tcp
daytime 13/udp
netstat 15/tcp
qotd 17/tcp quote
msp 18/tcp # message send protocol
msp 18/udp # message send protocol

运行命令netstat -a,就可以使用文件中的配置。’netstat -an’停止。

3:tcp_wrappers
tcp_wrappers由如下两个文件控制。
/etc/hosts.allow
/etc/hosts.deny
它可以使你很容易的控制哪些ip地址禁止登录,哪些可以。加入服务限制条件,可以更好的管理系统。系统在使用它们的时候,先检查前一个文件,从头到尾扫描,如果发现用户的相应记录标记,就给用户连接他要求的服务。如果没有找到记录,就像刚才一样扫描hosts.deny文件,查看是否有禁止用户的标记。如果发现记录,就不给用户提供相应服务。如果仍然没有找到记录,则使用系统默认值—-开放服务。
如果在hosts.deny里面加入这一行:
all: 0.0.0.0/0.0.0.0
则意味着所以未经hosts.allow文件明确指明的用户都不能使用所要求的服务。也就是改变了系统默认值。举例来说,如果你想限制telnet登录和开放ftp,可以这样修改hosts.allow和hosts.deny:
请注意,这些配置对ssh,nfs等服务影响很大,千万小心。
hosts.allow文件内容:

in.telnetd: 10.0.0.0/255.255.255.0 # 限制telnet登录只能在此地址范围
in.ftpd: 0.0.0.0/0.0.0.0 # 谁都可以使用ftp服务,不管地点
hosts.deny文件内容:

in.telnetd: 0.0.0.0/0.0.0.0 # 如果telnet登录不在规定地址范围,一律禁止!

更进一步,可以使用下面的配置
all: 0.0.0.0/0.0.0.0 # 禁止所有未经允许的请求,不过,如果你安装了新的软件供用户使用,而恰恰忘记了把他们的对应标记放入允许的文件,你的用户就会冲你发火。但是,更重要的是保证系统的安全可靠,用户毕竟容易安抚。
使用‘man hosts.allow ’或者‘man hosts.deny’可以查看详细的使用说明。
还有一个小小的问题请注意,系统在解释文件内容时候,会剥离所有‘\’,(因为把它看成了续行符)并把每行补齐。
如下面的例子:

#这里面有小问题!
# in.ftpd: 1.1.1.1 \
in.telnetd: 1.1.1.1

实际上in.telnetd: 1.1.1.1这一行也被注释掉了。

4:监测系统
如果你连系统运行着什么服务都不知道,怎么保证它的安全?
有两个非常有用的工具:ps和netstat。运行他们可以使你知道系统在提供、运行哪些服务。
使用‘ps -xau’可以输出大量的有关系统运行的信息。
例如:
user pid %cpu %mem size rss tty stat start time command
bin 320 0.0 0.6 760 380 ? s feb 12 0:00 portmap
daemon 377 0.0 0.6 784 404 ? s feb 12 0:00 /usr/sbin/atd
named 2865 0.0 2.1 2120 1368 ? s 01:14 0:01 /usr/sbin/named -u named -g named -t /home/named
nobody 346 0.0 18.6 12728 11796 ? s feb 12 3:12 squid
nobody 379 0.0 0.8 1012 544 ? s feb 12 0:00 (dnsserver)
nobody 380 0.0 0.8 1012 540 ? s feb 12 0:00 (dnsserver)
nobody 383 0.0 0.6 916 416 ? s feb 12 0:00 (dnsserver)
nobody 385 0.0 0.8 1192 568 ? s feb 12 0:00 /usr/bin/ftpget -s 1030
nobody 392 0.0 0.3 716 240 ? s feb 12 0:00 (unlinkd)
nobody 1553 0.0 1.8 1932 1200 ? s feb 14 0:00 httpd
nobody 1703 0.0 1.8 1932 1200 ? s feb 14 0:00 httpd
root 1 0.0 0.6 776 404 ? s feb 12 0:04 init [3]
root 2 0.0 0.0 0 0 ? sw feb 12 0:00 (kflushd)
root 3 0.0 0.0 0 0 ? sw feb 12 0:00 (kswapd)
root 4 0.0 0.0 0 0 ? sw feb 12 0:00 (md_thread)
root 64 0.0 0.5 736 348 ? s feb 12 0:00 kerneld
root 357 0.0 0.6 800 432 ? s feb 12 0:05 syslogd
root 366 0.0 1.0 1056 684 ? s feb 12 0:01 klogd
root 393 0.0 0.7 852 472 ? s feb 12 0:00 crond
root 427 0.0 0.9 1272 592 ? s feb 12 0:19 /usr/sbin/sshd
root 438 0.0 1.0 1184 672 ? s feb 12 0:00 rpc.mountd
root 447 0.0 1.0 1180 644 ? s feb 12 0:00 rpc.nfsd
root 458 0.0 1.0 1072 680 ? s feb 12 0:00 /usr/sbin/dhcpd
root 489 0.0 1.7 1884 1096 ? s feb 12 0:00 httpd
root 503 0.0 0.4 724 296 2 s feb 12 0:00 /sbin/mingetty tty2
root 505 0.0 0.3 720 228 ? s feb 12 0:02 update (bdflush)
root 541 0.0 0.4 724 296 1 s feb 12 0:00 /sbin/mingetty tty1
root 1372 0.0 0.6 772 396 ? s feb 13 0:00 inetd
root 1473 0.0 1.5 1492 1000 ? s feb 13 0:00 sendmail: accepting connections on port 25
root 2862 0.0 0.0 188 44 ? s 01:14 0:00 /usr/sbin/holelogd.named /home/named/dev/log
root 3090 0.0 1.9 1864 1232 ? s 12:16 0:02 /usr/sbin/sshd
root 3103 0.0 1.1 1448 728 p1 s 12:16 0:00 su -root 3104 0.0 1.3 1268 864 p1 s 12:16 0:00 -bash
root 3136 0.0 1.9 1836 1212 ? s 12:21 0:04 /usr/sbin/sshd

需要注意的是,telnet, ftpd等信息没有在上面列出。因为他们由/etc/inetd.conf负责启动。你可以使用命令‘netstat –vat’来查看相应信息。它会列出所有和网络相关的信息。
例如:
active internet connections (including servers)
proto recv-q send-q local address foreign address state
tcp 0 0 24.108.11.200:80 205.253.183.122:3661 established
tcp 0 0 0.0.0.0:1036 0.0.0.0:* listen
tcp 0 0 0.0.0.0:80 0.0.0.0:* listen
tcp 0 0 10.0.0.10:53 0.0.0.0:* listen
tcp 0 0 28.208.55.254:53 0.0.0.0:* listen
tcp 0 0 127.0.0.1:53 0.0.0.0:* listen
tcp 0 0 0.0.0.0:139 0.0.0.0:* listen
tcp 0 0 0.0.0.0:25 0.0.0.0:* listen
tcp 0 0 0.0.0.0:2049 0.0.0.0:* listen
tcp 0 0 0.0.0.0:635 0.0.0.0:* listen
tcp 0 0 0.0.0.0:22 0.0.0.0:* listen
tcp 0 0 0.0.0.0:21 0.0.0.0:* listen
tcp 0 0 0.0.0.0:111 0.0.0.0:* listen
udp 0 0 127.0.0.1:1031 0.0.0.0:*
udp 0 0 0.0.0.0:1029 0.0.0.0:*
udp 0 0 0.0.0.0:800 0.0.0.0:*
udp 0 0 0.0.0.0:1028 0.0.0.0:*
udp 0 0 10.0.0.10:53 0.0.0.0:*
udp 0 0 28.208.55.254:53 0.0.0.0:*
udp 0 0 127.0.0.1:53 0.0.0.0:*
udp 0 0 10.1.0.1:138 0.0.0.0:*
udp 0 0 10.1.0.1:137 0.0.0.0:*
udp 0 0 10.0.0.10:138 0.0.0.0:*
udp 0 0 10.0.0.10:137 0.0.0.0:*
udp 0 0 0.0.0.0:138 0.0.0.0:*
udp 0 0 0.0.0.0:137 0.0.0.0:*
udp 0 0 0.0.0.0:2049 0.0.0.0:*
udp 0 0 0.0.0.0:635 0.0.0.0:*
udp 0 0 0.0.0.0:514 0.0.0.0:*
udp 0 0 0.0.0.0:111 0.0.0.0:*
raw 0 0 0.0.0.0:1 0.0.0.0:*
raw 0 0 0.0.0.0:6 0.0.0.0:*

标记有‘established ’的那一行表明有用户正在和主机会话。可以看到端口号和相应的ip地址。而samba(139),mail(25),nfs(2049)等服务正处于监听等待状态。

系列之五:防火墙的应用
一:概述
防火墙通常处于和其它网络连接的边界。使用特定的信息过滤方法,让内外网络隔离。限制各种服务,屏蔽阻挡攻击。但是,它不能成为你安全工作的最后手段,也就是说,恶意的攻击者破坏了你的防火墙,还需要继续面对更进一步的安全措施。还有,小心内部网络的问题。比如,某些使用者没有通过使用防火墙上网,而绕过了它来连接互联网。这样,网络安全就受到了威胁。
linux拥有很好的防火墙能力。从内核2.1版本开始,ipchains就开始作为一套成熟的组件替代以前的ipfwadm开始应用了。而据称在2.4版本的内核里面还会有更好的软件替代现在的软件。独立性能、过滤特性更好。
两种最普通的防火墙用法是:
a:允许所有服务,除非他们被明确的拒绝。
b:拒绝所有服务,除非他们被明确的允许。
一般第二种办法较好,因为它可以防止新发展的协议和应用程序轻易的突破防火墙。所有未知的协议都设置为拒绝。还有,它还可以防止因为你的疏忽造成的危险。比如:你在一台通过防火墙运行的www服务器上又安装了ftp软件,可以让用户上传下载软件。但你忘记了在防火墙配置文件里面加入相应的条目。如果默认值是允许通过,那么你的防火墙对ftp来说就形同虚设了。但是要是默认值是拒绝,则就没有此危险了。当然,麻烦没有完,你的用户会冲你大叫,怎么搞的?不是已经开通了服务吗?你就得马上修改配置,安抚他们的怒气。怎么说这也比忘记配置强,好歹有人告诉你有问题。不然,除非你想起来没有加入ftp限制,否则恐怕没有人理你。
二:常用的防火墙软件
1:ipchains
ipchains功能强大,性能可靠,管理方便。它比以前的ipfwadm要强的多。你可以设定六条规则来守护系统的安全。他们是 accept, deny, reject, masq, redirect, return举例来说,使用redirect可以让发往80端口的数据报重新导向其它端口,如:squid 代理服务器端口。你甚至还可以规定不同服务的优先级别。你还可以自己定义自己的规则。
下面是一个网关的例子:
#!/bin/bash
#
# this script sets up firewall rules appropriate for a server with 2 interfaces
# running as a gateway
# this script needs to be edited if you plan to use it.
# we assume the internal machines call all talk to the gateway, so no rules block
# internal traffic
#
# a couple of variables
#
# eth0 is the ip address on eth0 (the external interface)
# eth0net is the network
# eth0netmask is the network mask
# trustedhost1 is a trusted host (for webmin/ssh)
# trustedhost2 is a trusted host (for webmin/ssh)
# eth1ip is the ip address on eth1 (internal interface)
# eth1net is the network
# eth1netmask is the network mask
#
eth0ip=1.1.1.1
eth0net=1.1.1.0
eth0netmask=24
trustedhost1=1.5.1.1
trustedhost2=1.5.1.2
eth1ip=10.0.0.1
eth1net=10.0.0.0
eth1netmask=24
#
path=/sbin
# flush all rules
ipchains -f input
ipchains -f output
ipchains -f forward
# anti-spoofing
ipchains -a input -p all -j deny -s 10.0.0.0/8 -i eth0 -d 0.0.0.0/0
ipchains -a input -p all -j deny -s 127.0.0.0/8 -i eth0 -d 0.0.0.0/0
ipchains -a input -p all -j deny -s 192.168.0.0/16 -i eth0 -d 0.0.0.0/0
ipchains -a input -p all -j deny -s 172.16.0.0/16 -i eth0 -d 0.0.0.0/0
ipchains -a input -p all -j deny -s $eth0ip -i eth0 -d 0.0.0.0/0
# icmp first
ipchains -a input -p icmp -j accept -s $eth0net/$eth0netmask -i eth0 -d 0.0.0.0/0
ipchains -a input -p icmp -j deny -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0
# ssh
ipchains -a input -p tcp -j accept -s $trustedhost1 -i eth0 -d 0.0.0.0/0 22
ipchains -a input -p tcp -j accept -s $trustedhost2 -i eth0 -d 0.0.0.0/0 22
# blocking 1:1023
ipchains -a input -p tcp -j deny -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 1:1023
ipchains -a input -p udp -j deny -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 1:1023
# blocking other things
ipchains -a input -p tcp -j deny -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 1109
ipchains -a input -p tcp -j deny -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 1524
ipchains -a input -p tcp -j deny -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 1600
ipchains -a input -p tcp -j deny -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 2003
ipchains -a input -p udp -j deny -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 2049
ipchains -a input -p tcp -j deny -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 2105
ipchains -a input -p udp -j deny -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 3001
ipchains -a input -p tcp -j deny -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 3001
ipchains -a input -p udp -j deny -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 3128:3130
ipchains -a input -p tcp -j deny -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 3128:3130
ipchains -a input -p tcp -j deny -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 3306
ipchains -a input -p udp -j deny -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 3306
ipchains -a input -p tcp -j deny -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 4444
ipchains -a input -p tcp -j deny -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 6000:6100
ipchains -a input -p udp -j deny -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 6000:6100
ipchains -a input -p tcp -j deny -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 6667
ipchains -a input -p tcp -j deny -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 7000
# webmin
ipchains -a input -p tcp -j accept -s $trustedhost1 -i eth0 -d 0.0.0.0/0 10000
ipchains -a input -p tcp -j accept -s $trustedhost2 -i eth0 -d 0.0.0.0/0 10000
ipchains -a input -p tcp -j deny -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 10000
# forward rules
ipchains -p forward deny
ipchains -a forward -p all -j masq -s $eth1net/$eth1netmask -d 0.0.0.0/0

在设定好规则后,你应该把ipchains加入守护程序自动运行,并且先于其它网络程序。建议除非必要,不要为其设定log,因为每个数据报都有记录,磁盘空间消耗很快。使用‘man ipchains’可以查看详细的资料及其论述。
开发ipchains的网址是:http://netfilter.kernelnotes.org/
2:其它软件网址
netfilter
http://netfilter.kernelnotes.org/
ipf
http://coombs.anu.edu.au/~avalon/
sinus firewall
http://www.sinusfirewall.org/
phoenix adaptive firewall
商业软件,可以完全替代ipchains,更加智能化,并且通过了icsa的认证。
http://www.progressive-systems.com/products/phoenix/

fireplug edge
http://edge.fireplug.net
mason
这是一个防火墙规则脚本产生器,ipchains的好搭档。不仅可以设计规则,还可以监视数据报的流通。
http://users.dhp.com/~whisper/mason/
firewall scripts
red hat linux使用的防火墙规则脚本产生器。
http://www.webideal.de/rh-isdn/downloads/

系列之六:ipsec-加密传输的数据
一:概述
ipsec是指在传输ip数据包时加密其中的数据段,当然,ip报头和循环冗余校验码是不能加密的。加密发生在ip层,这样可以带来更高层次的安全性能。可以想象,即使截获了数据报,也很难知道数据的内容。因为数据本身还是加密的。
linux的ipsec功能现在仍处于测试阶段,但是已经发布了一些比较稳定的版本。应用于win95/win98/winnt的ipsec软件已经在市场上出售了。实际上ipsec本身是ipv6标准协议的一部分。
在linux下使用ipsec功能必须得到内核的支持。但是,基本上,市场上的各个发行版本都没有把此功能包含进来。或者做的不够。所以,必须重新编译内核。而内核版本应该使用2.2.13以上。ipsec软件包的最新版本可以从http://www.freeswan.org 得到

二:使用ipsec举例
假设有两个网络需要相互连接,安全的传递数据。配置如下图所示:

 

 

 

 

 

服务器a、b均使用redhat6.1 linux操作系统。默认的内核版本是2.2.12。
1:安装内核源文件、编译工具和ipchains,重新编译内核:
cd /usr/src/linux
make menuconfig
make dep
make bzimage
make modules
make modules_install
cp /usr/src/linux/arch/i386/boot/bzimage /boot/newimage

使用任何一种软件工具修改/etc/lilo.conf。
加入新内核启动项目。如果嫌麻烦或怕出错,使用“linuxconf”工具来添加新核心。不过,修改后千万不要忘记,使用“lilo ”命令使修改生效。否则,就会出错。
2:修改a b两台服务器的防火墙设置
server a:

ipchains -p forward deny
ipchains -a forward -p all -j masq -s 10.0.0.0/24 -d 0.0.0.0/0

server b:

ipchains -p forward deny
ipchains -a forward -p all -j masq -s 192.168.0.0/24 -d 0.0.0.0/0

修改每台机器的/etc/sysconfig/network文件,将下面一行:
forward_ipv4=”no”
替换成
forward_ipv4=”yes”
如果网络正常的话,ping 5.6.7.8或ping 1.2.3.4应该没有错误出现。
3:给服务器安装ipsec
下载最新的ipsec软件包,使用root进入linux环境。
参照下面的命令序列进行安装。
cd /usr/local/src/
tar –zvvxf /path/to/tarball/snapshot.tar.gz
chown –r root:root freeswan-snapxxxxxx14b
cd freeswan-snapxxxxxx14b
make menugo
一般2.2.x以上内核都比较庞大,所以,如果出错,最后你还需要使用下面的指令编译内核:
cd /usr/src/linux
make bzimage
cp /usr/src/linux/arch/i386/boot/bzimage /boot/vmlinuz-2.2.x-ipsec

4:修改两台服务器的lilo.conf文件

文件内容类似如下:
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=100
image=/boot/vmlinuz-2.2.x-ipsec
label=linux-ipsec
root=/dev/hda1
read-only
image=/boot/vmlinuz-2.2.10
label=linux
root=/dev/hda1
read-only
重新使用“lilo”命令使修改生效。使用新的内核启动系统。进行下一步的调制。
5:网络环境配置
把目录“/usr/local/lib/ipsec”加入你的系统环境。系统需要它的支持。
修改ipsec.conf文件,默认的内容如下:
conn sample
type=tunnel
# left security gateway (public-network address)
left=
# next hop to reach right
leftnexthop=
# subnet behind left (omit if there is no subnet)
leftsubnet=
# right s.g., subnet behind it, and next hop to reach left
right=
rightnexthop=
rightsubnet=
#
spibase=0x200
# (manual) encryption/authentication algorithm and parameters to it
esp=3des-md5-96
espenckey=
espauthkey=

修改成如下内容:
conn my-tunnel
type=tunnel
# left security gateway (public-network address)
left=1.2.3.4
# next hop to reach right
leftnexthop=1.2.3.1
# subnet behind left (omit if there is no subnet)
leftsubnet=10.0.0.0/24
# right s.g., subnet behind it, and next hop to reach left
right=5.6.7.8
rightnexthop=5.6.7.1
rightsubnet=192.168.0.0/24
#
spibase=0x200
# (manual) encryption/authentication algorithm and parameters to it
esp=3des-md5-96
#下面的密钥使用ranbits工具软件生成的
espenckey=some_auth_key_here (ranbits 192)
espauthkey=some_other_key_here (ranbits 128)

6:修改防火墙
服务器a的防火墙配置文件里面加入下面内容:
ipchains -a forward -p all -j accept -s 10.0.0.0/24 -d 192.168.0.0/24
ipchains -a forward -p all -j accept -s 192.168.0.0/24 -d 10.0.0.0/24

结果则应该像下面这样:

# forward rules
#
ipchains -p forward deny
#
ipchains -a forward -p all -j accept -s 10.0.0.0/24 -d 192.168.0.0/24
ipchains -a forward -p all -j accept -s 192.168.0.0/24 -d 10.0.0.0/24
ipchains -a forward -p all -j masq -s 10.0.0.0/24 -d 0.0.0.0/0
确保新加入的两行在“伪装规则”一行之前。

服务器b的防火墙配置文件里面加入下面内容:
ipchains -a forward -p all -j accept -s 192.168.0.0/24 -d 10.0.0.0/24
ipchains -a forward -p all -j accept -s 10.0.0.0/24 -d 192.168.0.0/24

结果则应该像下面这样:

# forward rules
#
ipchains -p forward deny
#
ipchains -a forward -p all -j accept -s 192.168.0.0/24 -d 10.0.0.0/24
ipchains -a forward -p all -j accept -s 10.0.0.0/24 -d 192.168.0.0/24
ipchains -a forward -p all -j masq -s 192.168.0.0/24 -d 0.0.0.0/0

确保新加入的两行在“伪装规则”一行之前。

7:启动ipsec
在每台服务器上输入命令:
“ipsec manual –up my-tunnel ”

应该产生类似下面的输出:
/usr/local/lib/ipsec/spi: message size is 36
/usr/local/lib/ipsec/spi: message size is 132
/usr/local/lib/ipsec/spi: message size is 132

尝试从一个子网中的机器“ping”另一个子网中的机器。如果成功,则证明ipsec可以使用了。
三:其它的ipsec软件
i-data
http://www.i-data.com/networks/

windows客户端的ipsec产品
pgp vpn
http://www.pgpi.com/
http://www.nai.com/asp_set/products/tns/pgp_vpn.asp

ire
http://www.ire.com/

系列之七:linux的管理工具
一:本地工具
1:webmin
webmin是一个基于web的管理工具,主要由perl写成。
通过它,可以设置用户不同的级别,不同的权限。比如只给张三开机的权限,给李四增加用户、删除用户的权限,如此等等。管理很方便。
它的问题是:在有些需要认证的场合,密码仍是明文传输,文档也不够详细。
默认使用的端口是10000,所以防火墙还需要设置。
例如:
ipchains -a input -p all -j accept -s 10.0.0.0/8 -d 0.0.0.0/0 10000
ipchains -a input -p all -j accept -s some.trusted.host -d 0.0.0.0/0 10000
ipchains -a input -p all -j deny -s 0.0.0.0/0 -d 0.0.0.0/0 10000

网址是:http://www.webmin.com/webmin/

2:linuxconf
linuxconf是一个非常好的工具,可以通过命令行、x窗口环境、web等方式运行。界面非常友好,而且几乎linux里面需要配置的东西在这里面都可以找到相应的项目。
本地的管理有磁盘装卸、系统启动、守护程序、内核调整、用户增删等等。网络管理有smb配置、ppp设置、网关、dns等。
不过,通过命令行方式运行,鼠标不起作用,只能使用键盘操作。而使用x窗口运行,则更加方便。
通过网络方式运行则需要你先在本地开启linuxconf,然后加入需要连接的网络和主机(conf > misc > linuxconf
network access)。退出。重新进入并且连接需要管理的机器。输入用户名和密码即可进入(默认是root用户!)。由于linuxconf自身不支持任何加密措施,所以如果你没有使用ip级别的加密措施,如ipsec,千万不要使用这个功能!除非想自找麻烦。另外,它的文档也太可怜了点。连man页也没有。
linuxconf一般和redhat捆绑,网址是http://www.solucorp.qc.ca/linuxconf/

3:其它工具的网址
runas
http://www.mindspring.com/~carpinello/runas/index.htm
super
ftp://ftp.ucolick.org/pub/users/will/
coas
http://www.coas.org/
webrat
http://hq.hellug.gr/~webrat/
pikt
http://pikt.uchicago.edu/pikt/
vnc
http://www.uk.research.att.com/vnc/

二:远程管理
远程管理几乎对每个管理员来讲都特别重要。原因很简单,现实、经济因素。我们几乎不可能天天坐在终端前面登录、管理系统。如果机器离自己比较远则更不可能。而远程管理比较起来则非常经济。但是远程管理必然有更多的风险。
1:telnet
telnet是最先在internet上面使用的服务之一。它允许你远程进入系统,交互式的登录,运行必要的命令并查看相应结果。但是它几乎也是最不安全的协议了。使用明码认证和运行命令,非常容易受到探测和攻击。
如果实在需要使用此项服务,就使用防火墙和tcp_wrappers(前面提到过)来严格限定允许登录的范围。
如下:
ipchains规则里面加入
ipchains -a input -p all -j accept -s 10.0.0.0/8 -d 0.0.0.0/0 23
ipchains -a input -p all -j accept -s “可以信赖的主机” -d 0.0.0.0/0 23
ipchains -a input -p all -j deny -s 0.0.0.0/0 -d 0.0.0.0/0 23
修改下列文件:
/etc/hosts.allow
in.telnetd: 10.0.0.0/255.0.0.0, “可以信赖的主机”

/etc/hosts.deny:
in.telnetd: all

还有一种情况是isp,需要允许用户远程登录来修改密码。可以这样解决:
在/etc/shells列表里面加入
/usr/bin/passwd
然后修改/etc/passwd,把用户的shell改成:
username:x:1000:1000::/home/username:/usr/bin/passwd

这样就可以了。用户可以远程登录系统,会提示用户名、密码,修改后马上就断开了。如:
trying 1.2.3.4…
connected to localhost.
escape character is ^].

red hat linux release 5.2 (apollo)
kernel 2.2.5 on an i586

login: tsjjjil
password:
changing password for tsjjjil
(current) unix password:
new unix password:
retype new unix password:
passwd: all authentication tokens updated successfully
connection closed by foreign host.

上面的方法还有一点问题,就是输出了不必要的提示信息,如操作系统、内核版本等等。如果用户众多,这是非常危险的。这是因为rc.local输出了/etc/issue和其它信息。所以需要修改/etc/rc.d/rc.local,把不必要的东西注释掉。
如:
# this will overwrite /etc/issue at every boot. so, make any changes you
# want to make to /etc/issue here or you will lose them when you reboot.
#echo “” > /etc/issue
#echo “$r” >> /etc/issue
#echo “kernel $(uname -r) on $a $(uname -m)” >> /etc/issue
#cp -f /etc/issue /etc/issue.net
#echo >> /etc/issue
或者再加上一些警告的语句,提示非法进入会受到惩罚。
但是最佳的解决方案是关掉这项服务,使用基于ssl的telnet或ssh。特别是管理员需要的时候。
2:ssh
ssh协议在开始设计时的目的就是:提供尽可能安全的远程存取方式。它可以用来进行任何基于网络的信息传递,而且适应性很强。linux,unix,nt等系统都可以使用。由于在和远程交互时,传递的密钥,认证信息等都是加密的,所以安全性能很好。但是,它现在还不是自由软件,(尽管已经有了相应项目,但还没有正式发布)免费使用只限于非商业环境ssh以守护程序方式运行,而且可以配合tcp_wrappers或防火墙使用,从而达到更好限定的目的。
从下面网址可以找到此rpm版本: ftp://ftp.zedz.net/
从下面地址可以获取代码:ftp://ftp.yellowdoglinux.com/pub/yellowdog/install-ssh/

与防火墙配合使用,修改ipchains规则,如下:
ipchains -a input -p tcp -j accept -s 10.0.0.0/8 -d 0.0.0.0/0 22
ipchains -a input -p tcp -j accept -s isp.dial.up.pool/24 -d 0.0.0.0/0 22
#上面规则允许你透过防火墙ssh上远程主机
ipchains -a input -p tcp -j deny -s 0.0.0.0/0 -d 0.0.0.0/0 22

与tcp_wrappers配合使用,如下:
hosts.allow:
sshd: 10.0.0.0/255.0.0.0, isp.dial.up.pool/255.255.255.0

hosts.deny:
sshd: 0.0.0.0/0.0.0.0

除此之外,ssh还有自己的配置文件,可以加强安全性。文件是/etc/sshd/sshd_config,典型配置如下:
port 22
# runs on port 22, the standard
listenaddress 0.0.0.0
# listens to all interfaces, you might only want to bind a firewall
# internally, etc
hostkey /etc/ssh/ssh_host_key
# where the host key is
randomseed /etc/ssh/ssh_random_seed
# where the random seed is
serverkeybits 768
# how long the server key is
logingracetime 300
# how long they get to punch their credentials in
keyregenerationinterval 3600
# how often the server key gets regenerated
permitrootlogin no
# permit root to login? no
ignorerhosts yes
# ignore .rhosts files in users dir? yes
strictmodes yes
# ensures users dont do silly things
quietmode no
# if yes it doesnt log anything. yikes. we want to log logins/etc.
x11forwarding no
# forward x11? shouldnt have to on a server
fascistlogging no
# maybe we dont want to log too much.
printmotd yes
# print the message of the day? always nice
keepalive yes
# ensures sessions will be properly disconnected
syslogfacility daemon
# whos doing the logging?
rhostsauthentication no
# allow rhosts to be used for authentication? the default is no
# but nice to say it anyways
rhostsrsaauthentication no
# is authentication using rhosts or /etc/hosts.equiv sufficient
# not in my mind. the default is yes so lets turn it off.
rsaauthentication yes
# allow pure rsa authentication? this one is pretty safe
passwordauthentication yes
# allow users to use their normal login/passwd? why not.
permitemptypasswords no
# permit accounts with empty password to log in? no

其它有用的规则:
allowgroups –显式规定允许使用ssh登录的组(/etc/group)
denygroups – 显式规定禁止使用ssh登录的组(/etc/group)
allowusers – 显式规定允许使用ssh登录的用户
denyusers – 显式规定禁止使用ssh登录的用户
allowhosts – 允许的主机,其余禁止。
denyhosts – 禁止的主机,其余开放。
idletimeout time – 规定的超时时间(minutes/hours/days/), 超时则强行发送sighuping信号退出处理过程。

系列之八:限制用户对主机的使用
有时,你不得不在主机上建立用户账号,开放交互登录。如果对用户使用主机不加限制,用户做的不少事情会给你造成麻烦。比如:linux默认没有磁盘限额控制,任何一个用户都有可能把你的磁盘空间用光!再如,运行高计算强度的软件,把你的主机cpu处理时间通通耗光。诸如此类的事情绝对不能发生。
一:内存及cpu使用的限制
现在几乎所有的linux都绑定了pam,这套组件可以用来限制用户使用的内存数量。在redhat linux系统下的
/etc/security/limits.conf文件,可以用来做此类控制。(如果没有的话,恐怕需要你再找出安装盘,把组件安装上去)
此配置文件的格式是:

—用户名、组名(以@开头)或“*”表示所有用户
——“soft”或“hard”,soft表示限制不严格,需要时可以超过此值,但会有
警告, hard表示严格限制,不能超过此值。
—–cpu->占用的处理时间片单位、 maxlogins->允许此用户同时登录的个数 、
nproc->最大进程数 等等
—–对应的数字值
举例如下:
* soft core 0
* hard rss 10000
@student hard nproc 20
@faculty soft nproc 20
@faculty hard nproc 50
ftp hard nproc 0
@student – maxlogins 4

二:磁盘使用的限制
quota是用来限制用户使用磁盘数量的。绝大多数linux发行版本都绑定了它,但是默认状态是关闭的。
如果不确定核心对quota的支持,就重新编译内核,在相应选项里面选择quota的支持。然后
1:修改启动脚本/etc/rc.d/rc.sysinit文件,在最后面加入下面的脚本:

# check quota and then turn quota on.
if [ -x /usr/sbin/quotacheck ]
then
echo “checking quotas. this may take some time.”
/usr/sbin/quotacheck -avug
echo ” done.”
fi

if [ -x /usr/sbin/quotaon ]
then
echo “turning on quota.”
/usr/sbin/quotaon -avug
fi
需要注意的是必须在/etc/fstab里面的文件系统装载后再打开quota,否则quota不起作用。
2:修改/etc/fstab文件
一般没有加入quota时像这样:
/dev/hda5 / ext2 defaults 1 1
/dev/hda7 /usr ext2 defaults 1 1

在包含 “defaults” 这个字的第四个栏位加上 “usrquota” 。

/dev/hda5 / ext2 defaults 1 1
/dev/hda7 /usr ext2 defaults,usrquota 1 1

如果需要在一文件系统中开启群组 quota 支持,将 “usrquota” 改为
“grpquota”.

/dev/hda5 / ext2 defaults 1 1
/dev/hda7 /usr ext2 defaults,grpquota 1 1

如果要同时支持使用者 quota 与群组 quota 的话

/dev/hda5 / ext2 defaults 1 1
/dev/hda7 /usr ext2 defaults,usrquota,grpquota 1 1

3:建立相应配置文件
在加入了quota的分区根目录下使用下列命令创建文件。这些文件只能允许root用户读写,其他用户没有任何权限。
touch /partition/quota.user
touch /partition/quota.group
chmod 600 /partition/quota.user
chmod 600 /partition/quota.group
4:重新启动并编辑用户限额
使用edquota命令。
edquota -u xxx (xxx指用户名称) 或edquota -g xxx (xxx指组名称)会带你进入vi编辑器,编辑相应内容即可。
“man edquota”可以查看细节内容。
系列之九:检查入侵
计算机安全是持续不断的战斗,绝对不是一劳永逸的工作。即使你感觉做的不错,那也未必。正所谓“道高一尺,魔高一丈”,你在明处,鬼才知道哪些心怀叵恻的家伙找到了什么漏洞闯进来。
一:文件监测
一般入侵者在进入时常常修改某些文件,给自己留下“后门”,以便再次使用。如果我们使用文件监测的办法,在安装配置好后给软件做个不可伪造的记号,经常对比文件是否改变。如果发行不正常马上使用备份修正,这样就可以有效的抵挡破坏。
下面是可供linux使用的软件包。
1:tripwire
有rpm包供linux使用。商业软件。
http://www.tripwiresecurity.com/
2:aide
aide是gpl软件,代码公开,从安全角度来看,比起商业软件来更值得信赖。而且aide也试图超越tripwire。它支持多种哈希算法。
http://www.cs.tut.fi/~rammer/aide.html
3:l5
自由软件,监测文件的有效工具。
ftp://avian.org/src/hacks/
4:gog&magog
http://www.multimania.com/cparisel/gog/
5:sentinel
图形界面,使用检查点技术
http://zurk.netpedia.net/zfile.html
6:viperdb
http://www.resentment.org/projects/viperdb/
7:sxid
ftp://marcus.seva.net/pub/sxid
8:confcollect
http://www.skagelund.com/confcollect
应用于网络监测的工具
9:dtk
http://all.net/dtk
10:psionic portsentry
http://www.psionic.com/abacus/portsentry

二:系统安全探测工具和黑客工具
上网随便一搜,就可以找到大量的黑客工具。在市场上居然也可以看到“linux黑客工具大全…”。人家可以用,管理员怎么不可以呢? :->
未雨绸缪,自己做做攻击者,使用这些家伙看看自己的机器有无漏洞。发现了赶紧改正。
还有一些系统安全探测工具,执行时自动操作,判断系统漏洞。
1:check.pl
perl程序,检查文件和目录的权限设置是否合适。
http://opop.nols.com/proggie.html
2:nmap
新的探测工具,有许多不错的特性。
http://www.insecure.org/nmap/index.html
3:portscanner
自由软件,小巧好用。
http://www.ameth.org/~veilleux/portscan.html
4:nessus
有200多种攻击方法。
http://www.nessus.org
5:ftpcheck / relaycheck
ftp/mail
http://david.weekly.org/code
6:sara(security auditor’s research assistant)
速度快,易于使用
http://home.arc.com/sara
7:firewalk
检测防火墙安全的工具。
http://www.packetfactory.net/firewalk

之十:备份
曾经有位著名的计算机安全专家说过:“有人问我,保护计算机的最好办法是什么?我的回答是:
backup,backup,backup…”记住,人会犯错误,也许你不加思索的 rm -f 掉了一堆文件,而它们恰恰不能删除。计算机会死机,磁盘会失效,软件有bug,防范不当会有人捣蛋。如果一切从头再来,可能耗费你几天的时间才能重新配置好大量的东西。而要是有备份呢?这一切,最后的杀手锏就是使用备份恢复。
linux下有很多备份程序,自由软件、商业软件都有。
1:tar and gzip
最古老、最通用、系统支持最多的两个程序。几乎在所有的unix类系统中都能看到它们的身影。尽管速度比较差,但是用途依然很大。大量的应用软件使用它们打包发行。
使用如下命令:
tar -cvf archive-name.tar dir1 dir2 dir3….
把重要的目录(/etc、/usr等等)全部打包。
然后使用:
gzip -9 archive-name.tar
“-9”参数可以使压缩包尽可能的小。然后你可以把此文件拷贝或转移到安全的地方。当然,如果有磁带机,就直接输出到机器。tar本来就是为磁带设备设计的,具体命令请查看相应参数。
2:rsync
一个富有特色的工具。可以跨越网络使用。rsync是镜像文件最有效的工具之一。它同时可以保持文件原有的状态,如权限、链接等等。它还支持所谓的“anonymous”匿名模式,既可以从服务器也可以从远程客户机允许程序。使用客户机运行时不必使用root用户,可以匿名工作。需要使用注册用户时,自动加密认证信息(128位!)。安全有保证。功能十分强大,使用起来得心应手。
下面网址可以得到:http://rsync.samba.org/
安装后会在/etc/目录下生成rsyncd.conf文件,可以按照自己的需求配置。如下所示:
motd file = /etc/rsync.motd # specifies a file to be displayed, legal disclaimer, etc.
max connections = 5 # maximum number of connections so you dont get flooded
[pub-ftp]
comment = public ftp area # simple comment
path = /home/ftp/pub # path to the directory being exported
read only = yes # make it read only, great for exported directories
chroot = yes # chroot to /home/ftp/pub
uid = nobody # explicitly set the uid
gid = nobody # explicitly set the gid
[secret-stuff]
comment = my secret stuff
path = /home/user/secret # path to my stuff
list = no # hide this module when asked for a list
secrets file = /etc/rsync.users # password file
auth users = me, bob, santa # list of users i trust to see my secret stuff
hosts allow = 1.1.1.1, 2.2.2.2 # list of hosts to allow

使用man rsyncd.conf可以查看详细资料。
和防火墙合用时,需要修改ipchains,rsyncd使用tcp,873端口。

ipchains -a input -p tcp -j accept -s 10.0.0.0/8 -d 0.0.0.0/0 873
ipchains -a input -p tcp -j accept -s some.trusted.host -d 0.0.0.0/0 873
ipchains -a input -p tcp -j deny -s 0.0.0.0/0 -d 0.0.0.0/0 873

3:其它商业软件
bru (backup and restore utility)
http://www.estinc.com/features.html
quickstart
http://www.estinc.com/qsdr.html
backup professional
http://www.unitrends.com/bp.html
ctar
http://www.unitrends.com/ctar.html
ctar:net
http://www.unitrends.com/ctarnet.html
pc parachute
http://www.unitrends.com/pcpara.html

4:备份介质
好像使用硬盘的越来越多了。因为几十gb的大硬盘实在是便宜,速度又是一流。另外,cdr/cdrw也是不错的选择,但是多了刻盘的时间,速度不及硬盘,倒是毕竟便宜。另外常用的介质就是磁带了。流式读写,不能随机存取。便宜稳定是其优点。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » Linux安全指南-网管专栏,安全与管理
分享到: 更多 (0)