下面介绍一些可以用于 Linux 的安全工具,这些工具对于固化您的服务器将起到一定的作用,可以解决各方面的问题。我们的重点只是想让您了解这些工具,对安装配置以及使用不会给出很详细的介绍。
介绍这些工具的目的只是给您一个提示的方向,并不是让您拘泥于这些工具。毕竟安全是一个过程,不是一个产品。
sxid 是一个系统监控程序。它可以监视系统中 suid,sgid 文件以及没有属主的变化。并且以可选的形式报告这些改变,你可以在配置文件中设置用 email 的形式通知这些改变,也可以不使用 email 而直接在标准输出上显示这些变化。Suid,sgid 文件以及没有属主的文件很有可能是别人放置的后门程序,这些都是您所要特别注意的。
如果您安装过其他工具,那么您一定也会安装这个工具,它在安装上没有什么特别的地方。
缺省安装的时候,配置文件为 /usr/local/etc/sxid.conf,这个文件中有很明显的注释很容易看懂。在这个文件中定义了 sxid 的工作方式。日志文件缺省为 /var/log/sxid.log,日志文件的循环次数在 sxid.conf 文件中定义。您可以在配置固定后把 sxid.conf 设置为不可改变,把 sxid.log 设置为只可添加(使用 chattr 命令)。
您可以用 sxid -k 加上 -k 选项来进行检查,这时检查很灵活,既不记入日志,也不会发出 email。这样您就可以随时做检查。 但是我还是建议您把检查放入 crontab 中,使用 crontab -e 编辑加入下面的条目:
0 4 * * * /usr/bin/sxid |
表示每天上午 4 点执行这个程序。
如果您还想了解更详细的信息,可以参考:
man sxid man 5 sxid.conf |
您认为您的密码安全吗?即使您的密码很长,有很多特殊字符,解密工具很难破解,但您的密码在网络中传送时是以明文形式的,在以太网中随便一个嗅探器就可以截取您的密码。现在在交换环境中也能实现这种技术。在这种情况下,skey 对您来说是一个选择。
Skey 是一次性口令的一个工具。它是一个基于客户\服务器的应用程序。首先在服务器端可以用 keyinit 命令为每个用户建立一个 skey 客户,这个命令需要指定一个秘密口令,然后就可以为客户端的用户产生一次性口令列表。当用户通过 telnet,ftp 等与服务器进行连接时就可以按照一次性口令列表中的口令顺序输入自己的密码,下次再连接时候密码就换成了列表中的下一个。
skey 的服务器端使用有下面的步骤:
1 使用下面的命令初始化用户 mary:
keyinit mary
keyinit 每次为用户生成 99 个一次性口令,这时就会在 /etc/skeykeys 文件
建立这个用户,该文件中保存了服务器端计算下一个一次性口令的一些信息。用上面的 keyinit 命令时就会在 /etc/skeykeys 中有下面的记录:
mary 0099 to25065 be9406d891ac86fb Mar 11, 2001 04:23:12 |
上面的记录中从左到右依次是用户名,要使用的一次性口令序号,口令的种类,16 进制表示的口令,日期和时间。
2 将一次性口令列表提供给 mary
您可以打印出口令列表然后送给 mary。这样比较安全,密码不会在网络中传递。
3 为 mary 修改缺省的登陆 shell 为 /usr/local/bin/keysh
由于 PAM 的作用,mary 登陆时要输入密码,她输入这个一次性口令后服务器端要对这个口令进行校验,校验通过连接就被许可了。
可能有些用户不喜欢书面的口令列表,用户可以使用 key 命令在自己的客户端得到一次性口令。您可以通过开两个窗口,一个对服务器进行连接获得一次性口令的种类和序号,然后在另一个窗口用 key 命令根据口令的种类和序号获得所要的密码。但是必须提醒您,您这样的方便是以一定的危险性为代价的。
如果您的缺省的 99 个口令用完了,您可以使用 keyinit -s 刷新口令列表。
在 /usr/src/skey/misc 目录中有许多其他的替换 keysh 的提供其他服务的程序,例如:su,login,ftp 等等。这样您可以应付不同的服务的连接请求了。
为了安全,您最好设置一下/etc/skeykeys 文件的属性和权限。
一般的 Linux 发行版中都自带这个工具。日志文件过大如何处理是一个问题。它可以自动使日志循环,删除保存最久的日志。你可以把它放在 crontab 中,每天定期运行。这在很多 linux 发行版中都是缺省设置的。
您可以从下面的网址获得新版本的 logrotate:
ftp://ftp.redhat.com/pub/redhat
它的配置文件是 /etc/logrotate.conf 我们可以在这个文件中设置日志的循环周期,日志的备份数目,以及如何备份日志等等。
在 /etc/logrotate.d 目录下包括一些工具的日志循环设置文件。例如:syslog,samba,cron 等等,在这些文件中指定如何根据 /etc/logrotate.conf 做日志循环,您也可以在这里面添加其他的文件以循环其他服务的日志。
关于配置文件的详细信息您可以参阅 man logrotate。
最后还是提醒您使用 cron 运行 logrotate。
swatch 是一个实时的日志监控工具。您可以设置您所感兴趣的事件,它可以在事件发生的时候告诉您。Swatch 有两种运行方式:一种可以在检查日志完毕退出,另一种可以连续监视日志中的新信息。
Swatch 提供了许多通知方式,例如:email,振铃,终端输出,多种颜色等等。
您可以从下面的站点下载:
ftp://ftp.stanford.edu/general/security-tools/swatch/
swatch 的安装需要一些 perl 库的支持,安装前确信您的系统已经可以支持 perl。
Swatch 可以在命令行中进行一些简单的设置,例如日志循环时告诉 swatch 在循环完毕后重新启动等等。
配置文件 swatchmessage 是 swatch 软件的重点。这个文本文件告诉 swatch 需要监视什么日志,需要寻找什么触发器,和当触发时所要执行的动作。当 swatch 发现到与 swatchmessage 中定义的触发器正则表达式相符时,它将执行在 swatchrc 中定义的通知程序。Swatch 通过使用/usr/bin/tail -f 实时监视日志文件。
在这里我们不想过多的将如何配置,配置 swatch 非常简单,您可以参考 swatch 自带的配置文件。针对每个服务例如:ftp,sendmail 等等,你必须为每个您所关心的服务配置一个 swatchmessage 文件。
Swatch 启动时可以带很多参数,但使用通常如下格式启动它就可以了:
/usr/local/bin/swatch -c /var/log/syslogmessage -t /var/log/syslog -r 06:00&
-c 参数用于指定配置文件,-t 参数指定实时监视的日志文件,-r 指定重起的时间,"&" 使 swatch 在后台运行。启动后,swatch 产生子进程,因此 swatch 是以两个进程运行的,在停止 swatch 时必须杀掉两个进程。
也可以通过 logrotate 配置在日志循环后重起 swatch,可以在 /etc/logrotate.d 建立一个您所要关心的日志的循环文件,其中最关键的是要加入下面这行:
/usr/local/bin/swatch -c /var/log/syslogmessage -t /var/log/syslog -r + 0 |
其他的地方可以仿造别的同目录下的文件。
审核和记录系统的事件是非常重要的。特别是当你的计算机连接到 Internet 上之后,系统管理员如果对"异常"的事件保持警觉,就能防止系统被入侵。在 Unix 系统中如果仅仅把系统事件作为日志记录下来,而不去查看,还是无济于事。logchek 可以自动地检查日志文件,先把正常的日志信息剔除掉,把一些有问题的日志保留下来,然后把这些信息 email 给系统管理员。Logcheck 被设计成自动运行,定期检查日志文件以发现违反安全规则以及异常的活动。logcheck 用 logtail 程序记住上次已经读过的日志文件的位置,然后从这个位置开始处理新的日志信息。
可以在下面的站点获得 logcheck:
http://www.psionic.com/abacus/logcheck/
logcheck 主要由下面几个主要的文件:
1 logcheck.sh
这个是一个可执行的脚本文件,里面记录 logcheck 检查那些日志文件等 logcheck 运作所必须的信息。您可以把它加入 crontab 中定时运行。
2 logcheck.hacking
它和下面的三个文件一样,是 logcheck 检查的模式文件。他们四个文件按从上到下的顺序执行。这个文件表明了入侵活动的模式。
3 logcheck.violations
这个文件表示有问题,违背常理的活动的模式。优先级小于上面的那个模式文件。
4 logcheck.violations.ignore
这个文件和上面的 logcheck.violations 是相对的,是您所不关心的问题的模式文件。
5 logcheck.ignore
这是检查的最后一个模式文件。如果没有和前三个模式文件匹配,也没有匹配这个模式文件的话,则输出到报告中。
6 logtail
这个文件记录日志文件信息。
Logcheck首次运行时读入相关的日志文件的所有内容。Logtail 在日志文件的目录下为每个关心的日志文件建立一个 logfile.offset 的偏移量文件,以便于下次检查时从这个偏移量开始检查。Logcheck 执行时未被忽略的内容通过邮件的形式发送给 logcheck.sh 中 SYSADMIN 指定的用户。
Logcheck 的通知没有那么实时,但是相对于 swatch 它更适合于分布式日志文件系统。因为它不必为每个日志文件建立一个进程。在 Turbolinux 中就集成了 logcheck 工具。
传统的网络服务程序,如:ftp、pop 和 telnet 在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易受到"中间人"(man-in-the-middle)这种方式的攻击。所谓"中间人"的攻击方式,就是"中间人"冒充真正的服务器接收你的传给服务器的数据,然后再冒充你把数据传给真正的服务器。
通过使用 SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止 DNS 和 IP 欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替 telnet,又可以为 ftp、pop、甚至 ppp 提供一个安全的"通道"。
最初 SSH 是由芬兰的一家公司开发的。但是因为受版权和加密算法的限制,现在很多人都转而使用 OpenSSH。OpenSSH 是 SSH 的替代软件,而且是免费的,可以预计将来会有越来越多的人使用它而不是 SSH。
从客户端来看,SSH 提供两种级别的安全验证。
第一种级别是基于口令的安全验证,这种机制就相当于普通的 telnet 等服务的口令认证机制。
第二种级别是基于密匙的安全验证。你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到 SSH 服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在你在该服务器的家目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密"质询"(challenge)并把它发送给客户端软件。客户端软件收到"质询"之后就可以用你的私人密匙解密再把它发送给服务器。
可以在下面的站点下载:
http://violet.ibs.com.au/openssh/
"/etc/ssh/ssh_config" 文件是 OpenSSH 客户端的配置文件,允许你通过设置不同的选项来改变客户端程序的运行方式。这个文件的每一行包含"关键词-值"的匹配,其中"关键词"是忽略大小写的。用 man 命令查看帮助页(ssh (1))可以得到详细的说明。
"/etc/ssh/sshd_config" 是 OpenSSH 的服务器端配置文件,允许设置选项改变这个 daemon 的运行。这个文件的每一行包含"关键词-值"的匹配,其中"关键词"是忽略大小写的。用 man 命令查看帮助页(sshd (8))可以得到详细的说明。
配置 OpenSSH 使其使用 TCP-Wrappers inetd 超级服务器,编辑 "inetd.conf" 文件(vi /etc/inetd.conf)并加入这一行:
ssh stream tcp nowait root /usr/sbin/tcpd sshd -i |
注意:"-i"参数很重要,它说明 sshd 是被 inetd 运行的。
现在我们为本地服务器创建私有和公用密匙,执行下面的命令:
[root@sound]# su username [username@sound]$ ssh-keygen1 |
产生密钥后把本机的公用密匙(identity.pub)拷贝到远程主机的"/home/username/.ssh"目录下,例如,使用"authorized_keys"这个名字。
用加上"-p"参数的"ssh-keygen"命令,在任何时候都可以改变初始的密码。
下面列出的是一些我们经常要用到的命令,当然还有很多其它的命令,更详细的信息可以查看 man 帮助页或其它文档。
1 ssh
ssh(Secure Shell)是用来登录远程计算机和在远程计算机上执行命令的程序。它是用来替代 rlogin 和 rsh,以及在不安全的网络环境下在两台计算机之间提供安全和加密的信息交流。
使用下面的命令可以从客户端连接到远程主机 server:
[root@sound /]# su admin [admin@sound /]$ssh server |
2 scp
可以用这个命令把文件从本地计算机拷贝到远程计算机,或者反之,甚至可以在两台远程计算机之间用 "scp" 命令拷贝文件。
用下面的命令把文件从远程主机拷贝到本地主机上:
[root@sound /]# su admin [admin@sound /]$ scp -p :/dir/for/file localdir/to/filelocation |
用下面的命令把文件从本地主机拷贝到远程主机上:
[root@sound/]# su admin [admin@sound /]$ scp -p localdir/to/filelocation :/dir/for/file |
注意:"-p" 选项表示文件的改变和访问时间属性以及权限,在拷贝过程中被保留。通常是需要这样的。
如果有人侵入了您的系统,在您的系统中放置了木马和后门,您怎么才能知道呢?tripwire 就是这样一个对系统做完整性检查的工具。它是目前最为著名的 unix 下文件系统完整性检查的软件工具,这一软件采用的技术核心就是对每个要监控的文件产生一个数字签名,保留下来。当文件现在的数字签名与保留的数字签名不一致时,那么现在这个文件必定被改动过了。
当Tripwire 运行在数据库生成模式时,会根据管理员设置的一个配置文件对指定要监控的文件进行读取,对每个文件生成相应数字签名,并将这些结果保存在自己的数据库中,在缺省状态下,MD5 和 SNCFRN(Xerox 的安全哈希函数)加密手段被结合用来生成文件的数字签名。除此以外,管理员还可使用 MD4,CRC32,SHA 等哈希函数,但实际上,使用上述两种哈希函数的可靠性已相当高了,而且结合 MD5 和 sncfrn 两种算法(尤其是 sncfrn)对系统资源的耗费已较大,所以在使用时可根据文件的重要性做取舍。当怀疑系统被入侵时,可由 Tripwire 根据先前生成的,数据库文件来做一次数字签名的对照,如果文件被替换,则与 Tripwire 数据库内相应数字签名不匹配, 这时 Tripwire 会报告相应文件被更动,管理员就明白系统不"干净"了。
可以从下面站点获得 tripwire:
http://www.tripwiresecurity.com
"/usr/TSS/policy/twpol.txt" 文件是纯文本的策略文件,设置 Tripwire 需要检测哪些文件和目录(也叫系统对象)。其中有一个规则设定如何检测需要监控的对象,还有一个特性(property)设置如何检测。特性掩码(property mask)设定进行一致性检验的时候单独文件的特性(property)。属性(Attributes)帮助规定成组的策略如何运作。
您可以根据您的需要修改 twpol.txt 这个策略文件,然后当第一次准备使用策略文件的时候,用下面的安装它:
[root@sound]# twadmin --create-polfile /usr/TSS/policy/twpol.txt |
第一次创建基准数据库:用下面的命令
[root@sound]# tripwire { --init } |
一致性检查把当前文件系统中的对象及其属性和 Tripwire 数据库中的进行比较。一旦发现异常情况,就会在标准输出上显示出来,报表文件也会被保存下来,以后可以用 "twprint" 命令查看:
[root@sound]# tripwire { --check } |
用下面的命令进行交互式的检查:
[root@sound]# tripwire --check --interactive |
用下面的命令进行一致性检查并用email发送报表:
[root@sound]# tripwire --check --email-report |
用下面的命令更新数据库:
[root@sound]# tripwire --update -r /usr/TSS/report/sound.openarch.com-200001-021854.twr |
"-r"参数读取指定的报表文件(deep.openarch.com-200001-021854.twr)。因为当前的配置文件的 REPORTFILE 变量使用$(DATE),所以"-r"这个参数是必须的。
用下面的命令更新策略文件:
[root@deep]# tripwire --update-policy /usr/TSS/policy/newtwpol.txt |
在默认情况下,策略更新模式使用"--secure-mode high"。如果文件系统在最近的一次数据库更新之后发生了变化,而且这个变化会违反策略文件中定义的规则,那么在高安全级别的模式下运行你可能会遇到一些问题。例如这种情况:其他的管理员在策略更新的过程中,改变了一些文件。为了解决这个问题,确信在高安全级别的模式下所有的变化都是正常的之后,可以采用低级别的安全模式更新策略文件:
用下面的命令在低级别的安全模式下更新策略文件:
[root@sound]# tripwire --update-policy --secure-mode low /usr/TSS/policy/newtwpol.txt |
如果想查找详细的资料可以用man命令查帮助页,读取相关信息。
我们可以通过防火墙限制自己系统中什么端口开放,什么端口不开放。对于外部的人们来说,这些信息都是保密的。黑客为了得到您机器中开放的端口,往往会进行各种方式的扫描,这样的扫描软件在互联网上也随处都是。一般的扫描活动都是进行入侵的前奏,对安全是极大的危险。
Portsentry 就是一个反扫描工具。它可以实时发现并分析记录对本机的扫描, 它主要做以下工作:
- 通过 syslog 做记录
- 将扫描的主机加入 /etc/hosts.deny
- 马上禁止所有通向扫描主机的网络流量
- 过滤掉所有来自扫描主机的网络流量
您可以从下面的网站获得portsentry:
http://www.psionic.com/abacus/portsentry/
"/usr/psionic/portsentry/portsentry.conf"是 portsentry 的主配置文件。您可以在这个文件中设置您所要监听的端口,以及哪些 ip 地址被拒绝,哪些被忽略等等信息。如果您了解详细的信息,可以查看 "README.install" 文件。
"/usr/psionic/portsentry/portsentry.ignore" 文件定义了在执行端口扫描分析时必须要忽略的主机,也就是说即使这些主机进行了扫描活动,portsentry 也不会采取任何行动。
Portsentry 有以下6种启动方式:
portsentry -tcp (basic port-bound TCP mode) portsentry -udp (basic port-bound UDP mode) portsentry -stcp (Stealth TCP scan detection) portsentry -atcp (Advanced TCP stealth scan detection) portsentry -sudp ("Stealth" UDP scan detection) portsentry -audp (Advanced "Stealth" UDP scan detection) |
建议您可以使用下面两种方式启动 portsentry:
portsentry -atcp (Advanced TCP stealth scan detection) portsentry -sudp ("Stealth" UDP scan detection) |
一种 tcp 启动方式和一种 udp 启动方式可以同时进行。
您可以把下面的两个命令加入 "/etc/rc.d/rc.local" 中,当系统重起时自动启动:
[root@sound /]# /usr/psionic/portsentry/portsentry -atcp [root@sound /]# /usr/psionic/portsentry/portsentry -sudp |
对于更详细的信息您可以查阅 man 手册和 portsentry 自带的帮助文件。
一些服务器端的软件例如:IMAP & POP, Samba, OpenLDAP, FTP, Apache 等等在给用户提供服务的时候要对用户进行认证,只有在认证通过后服务才会被许可。而 client/server 方式的服务客户端和服务端之间通讯都是以明文方式进行的,openssl 正是提供了对传输的数据的一种加密方式。Openssl 可以安装在 Linux 服务器上,它需要一些第三方提供的应用程序来为服务提供加密。
下面看一些使用 openssl 加密能为我们提供的好处:
1 数据的保密性
openssl 实际在真正的数据加密上使用的是对称算法,一个密钥既用来加密也用来解密。我们在公开的网络介质上传输的再不是明文,即使有人能截获这些数据,没有密钥也是很难进行解密的。
2 数据的完整性
openssl 对数据用 hash 算法一个消息文摘,然后用对方的公钥对消息文载做数字签名,消息文摘的加密使用的是非对称算法。然后消息文摘和数据一起传给接收方,接收方用自己的密钥先对数字签名进行解密,这样就保证了数据的完整性。
从下面的站点可以获得 openssl:
http://www.openssl.org/
编译安装以后还要执行下面几个命令:
[root@sound openssl-0.9.5a]# mv /etc/ssl/misc/* /usr/bin/ [root@sound openssl-0.9.5a]# install -m 644 libRSAglue.a /usr/lib/ [root@so. openssl-0.9.5a]# install -m 644 rsaref/rsaref.h /usr/include/openssl/
"/etc/ssl/openssl.cnf"是 openssl 的主配置文件,里面要改动的主要是[CA_default ] 和[ req_distinguished_name ] 两个部分。
如果你想要使用 "openssl ca" 这个命令做 CA 证书时时,你需要建立一个 "sign.sh" 的脚本,这个脚本实际是存在的,在"/usr/bin/sign.sh", 您所要做的是在这个文件中加入一些东西。在 mod_ssl 的发行版中您也可以找到这个脚本。
下面我们举个例子讲述 openssl 的应用,我们用自己的 CA 为自己的 apache web server 做一个证书来签名我们自己的证书签名请求(CSR)。
1 为 apache web server 建立一个有密码保护的RSA私钥
[root@sound ssl]# openssl genrsa -des3 -out server.key 1024
2 用上面的 RSA 私钥产生一个证书签名请求(CSR)
[root@sound ssl]# openssl req -new -key server.key -out server.csr
3 为我们自己的 CA 创建一个 RSA 私钥
[root@sound ssl]# openssl genrsa -des3 -out ca.key 1024
4 用 CA 的 RSA 密钥做一个自签名的 X509 格式的证书
[root@sound ssl]# openssl req -new -x509 -days 365 -key ca.key -out ca.crt
5 将上面产生的私钥和证书移动到合适的目录下
[root@deep ssl]# mv server.key private/ [root@deep ssl]# mv ca.key private/ [root@deep ssl]# mv ca.crt certs/ |
6 最后用我们自己的 CA 对证书签名
[root@sound ssl]# /usr/bin/sign.sh server.csr |
更详细的信息请参考 man 帮助和程序自带的帮助。
对于客户端与服务器之间的通讯用SSL进行加密是一个很好的选择,但是很多情况下需要建立一种企业级的通讯通道。在两个网关之间的 Internet上点到点的传递极其私密的数据,出于这种加密和认证的需要,IPSEC 应运而生。
IPSEC 是 Intenet 协议安全,它使用很强的密码系统提供认证和加密服务。IPSEC 在 IP 层进行加密,所以它对链路层的依赖型不大。它可以工作在各种底层网络上。IPSEC 可以为 IP 层以上的协议提供保护。对于用户来说,这种保护看起来是透明的。
IPSEC 可以提供在两个网关之间的不安全的互联网上的安全通道的这种能力。在这种通道中传送的数据都是要求保密性非常高的数据,数据在发送者的网关处加密,在接收者的网关处解密。这就是 VPN(Virtual Private Network)。Freeswan 就是在 Linux 下实现 IPSEC 的工具。
您可以到下面的站点下载 freeswan:
http://www.freeswan.org/
由于 freeswan 是以内核补丁形式提供的,所以您必须先下载 Linux 内核,再下载对应于内核的 freeswan。 我们先要根据自己的系统情况修改 freeswan 的 Makefile 文件,然后用下面的命令进行编译,并且把 freeswan 加入到 Linux 内核的源代码中:
[root@sound freeswan-1.3]# make insert [root@sound freeswan-1.3]# make programs [root@sound freeswan-1.3]# make install |
然后我们就需要编译内核,这里不想再介绍如何编译内核,只提示要改变的内核选项,下面这些选项您都要确定选"Y":
IPSec options (FreeS/WAN) IP Security Protocol (FreeS/WAN IPSEC) (CONFIG_IPSEC) [Y/n/?] IPSEC: IP-in-IP encapsulation (CONFIG_IPSEC_IPIP) [Y/n/?] IPSEC: PF_KEYv2 kernel/user interface (CONFIG_IPSEC_PFKEYv2) [Y/n/?] IPSEC: Enable ICMP PMTU messages (CONFIG_IPSEC_ICMP) [Y/n/?] IPSEC: Authentication Header (CONFIG_IPSEC_AH) [Y/n/?] HMAC-MD5 authentication algorithm (CONFIG_IPSEC_AUTH_HMAC_MD5) [Y/n/?] HMAC-SHA1 authentication algorithm (CONFIG_IPSEC_AUTH_HMAC_SHA1) [Y/n/?] IPSEC: Encapsulating Security Payload (CONFIG_IPSEC_ESP) [Y/n/?] 3DES encryption algorithm (CONFIG_IPSEC_ENC_3DES) [Y/n/?] IPSEC Debugging Option (DEBUG_IPSEC) [Y/n/?] |
一些内核选项会被 freeswan 自动打开,即使这些选项原来是关闭的。尽管这样还是建议您不要关闭下面的选项:
Kernel/User netlink socket (CONFIG_NETLINK) [Y/n/?] Netlink device emulation (CONFIG_NETLINK_DEV) [Y/n/?] |
Freeswan 的配置文件 "/etc/ipsec.conf" 许可您设定您的 IPSEC 设置,连接类型以及控制信息等。IPSEC 目前支持两种类型的连接:手工连接和自动连接。手工连接需要的密钥保存在 "/etc/ipsec.conf" 文件中,这种连接没有自动连接安全。对于一个商业应用来说,使用手工(固定)密钥是不安全和不可靠的。在自动密钥连接模式下产生一个 256 位共享密钥,将其复制到连接通道的各个节点上后,那些企图截取数据包的网络攻击者将很难攻破这种安全连接。在自动密钥连接模式下,一个密钥的有效期是 8 个小时,这种配置有效地阻止了那些企图用暴力法猜出密钥的攻击者。自动连接的密钥由一个叫 Pluto 的密钥协商守候进程产生,缺省使用叫 IKE 的密钥协商协议。这个协议根据 "/etc/ipsec.secrets" 文件中的信息确定不同的系统。
我们下面举一个例子论述配置和使用的整个过程。假如我们有下面的 VPN 通道:
SubnetDeep===Deep------Deepgate..………....Mailgate-------Mail===SubnetMail Untrusted net 左边子网= SubnetDeep (192.168.1.0/24) 左边的主机 = Deep (deep.openna.com)(202.164.186.1) 左边的网关 = Deepgate (205.151.222.250) Internet = Untrusted net 右边的网关 = Mailgate (205.151.222.251) 右边的主机 = Mail (mail.openna.com)( 208.164.186.2) 右边的子网= SubnetMail (192.168.1.0/24) |
我们要编辑 ipsec.conf 文件来来满足我们的需要。在这个文件中有两大个段落。第一个 "config" 是关于 IPSEC 的一些普通配置信息的,后一个 "conn" 指定特定的 IPSEC 连接通道。具体的配置信息可以参看 man 帮助页。
"ipsec.secrets" 包含 pluto 守候进程认证网关之间通讯的密钥。有两种类型的密钥,一种是共享的密钥,一种是RSA的私人密钥。 下面的命令产生 256 位的共享密钥:
[root@deep /]# ipsec ranbits 256 > temp |
现在这个共享密钥在 temp 文件中,我们要把它复制到 "ipsec.secrets" 文件中。"ipsec.conf" 和 "ipsec.secrets" 都要拷贝到 VPN 通道另一端的网关上。"ipsec.conf" 文件中的 "config setup" 字段可能要根据接口的不同有所改变。
接下来我们要创建 RSA 的密钥对了:
我们在两个网关上都建立密钥对:
[root@deep /]# ipsec rsasigkey --verbose 1024 > deep-keys [root@mail /]# ipsec rsasigkey --verbose 1024 > mail-keys |
然后我们将前面产生的 temp 文件中的共享密钥放在每个网关的 "ipsec.conf" 文件中,在文件中的 "conn" 字段加入下面几行:
authby=rsasig leftrsasigkey=<Public key of deep> rightrsasigkey=<Public key of mail> |
然后在两个网关上处理 deep-keys 和 mail-keys 这两个 RSA 公钥,我们把这个文件中的 "#pubkey=" 部分拷贝到各自的 "ipsec.conf"中去,如下:
authby=rsasig leftrsasigkey=0x010395daee1be05f3038ae529ef2668afd79f5ff1b16203c9ceaef 801cea9cb74bcfb51a6ecc08890d3 eb4b5470c0fc35465c8ba2ce9d1145ff07b5427e04cf4a38ef98a7f29edcb4d7689f 2da7a69199e4318b4c8d0ea25d33e4f 084186a2a54f4b4cec12cca1a5deac3b19d561c16a76bab772888f1fd71aa08f 08502a141b611f rightrsasigkey=0x01037631b81f00d5e6f888c542d44dbb784cd3646f084ed96f 942d341c7c4686cbd405b805dc728f86 97475f11e8b1dd797550153a3f0d4ff0f2b274b70a2ebc88f073748d1c1c8821dc 6be6a2f0064f3be7f8e4549f8ab9af649 44f829b014788dd202cf7d2e320cab666f5e7a197e64efe0bfee94e92ce4dad82d5230c57b89edf |
最后把deep-keys和mail-keys这两个文件中的剩余部分包括(包括私钥)放进"ipsec.secrets"中去。
然后重新启动带有IPSec支持的内核的系统。系统重启时会出现几个错误,这主要是IPSec在缺省情况下使用了实际并不存在的eth999接口。建议你将ipsec程序的路径加入到用户环境变量中。
IPSec的网络设置首先,需要允许网关服务器的TCP-IP转发。在Red Hat Linux系统中的实现方法:
将 FORWARD_IPV4="false" 改为 FORWARD_IPV4="yes" 即可。
另一个方法是直接修改/proc文件系统,执行以下命令即可:
cat 1 > /proc/sys/net/ipv4/ip_forward |
然后我们要重新启动网络:
[root@deep /]# /etc/rc.d/init.d/network restart |
这时pluto守候进程要启动,它尝试去连接另一边的网关上的pluto守候进程,这样一个连接就可以建立了。所以我们要在ipchains的配置文件中加入一些包过滤规则许可以下的协议通过网关通往另一边的网关:
UDP port 500 for IKE implemented by the Pluto daemon Protocol 50 for ESP encryption and/or authentication Protocol 51 for AH packet-level authentication |
必须保证IP欺骗选项没有被打开,可以将下面的命令添加到/etc/rc.d/rc.local文件中:
[root@deep /]# echo 0 > /proc/sys/net/ipv4/conf/ipsec0/rp_filter [root@deep /]# echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter |
最后要注意的是, 任何使用了 IPSec 的内部网络的所有伪装(masquerade),规则都必须在允许 IPSec 的规则之后进行,否则主机将试图伪装 (masquerade) 数据包,而不是将它们传递给 IPSec。所以我们还要在两边网关的 ipchains 配置文件中加入下面的设定来保证能够正常的转发 IPSEC 的数据包:
# Masquerade internal traffic. # All internal traffic is masqueraded externally. ipchains -A forward -i $EXTERNAL_INTERFACE -s $LOCALNET_1 -j MASQ Where EXTERNAL_INTERFACE="eth0" # You external interface to the Internet. Where LOCALNET_1=" 192.168.1.0/24" # whatever private range you use. |
现在可以重启机器了,我们所要做的设置都完成了,一个 VPN 已经构建好了。
详细的信息请参阅 man 帮助和工具自带的帮助文件。
我们所讨论的以上内容都是为了更好的固化我们的 linux 系统,我们讨论了 linux 服务器的安装和安全设置中要注意的问题,我们还谈到了 linux 的日志系统,概要的举出了一些安全工具。由于篇幅所限不可能讲的非常详细彻底,也有很多其他好的安全工具并没有给大家列出。下面给出一个安全工具的列表供大家参考,详细的说明可详见说明文档和 man 文档。
工具名称 | 工具作用 |
Sxid | 检查系统中的 suid,sgid 以及没有主人的文件 |
skey | 一次性口令工具 |
logrotate | 日志循环工具 |
logcheck | 日志管理工具 |
swatch | 日志管理工具,比 logcheck 实时 |
Ssh(openssh) | 提供安全的连接认证 |
openssl | 提供加密的数据传送和认证 |
Portsentry | 反扫描工具,监视自己的udp和tcp端口 |
tripwire | 提供系统完整性检查 |
gnupg | 对单个文件进行加密以及创建数字签名 |
hostsentry | 基于主机的入侵检测,将连接记入日志 |
ipchains | Linux发行版自带的包过滤形防火墙 |
CFS 和 TCFS | 密码文件系统和透明的密码文件系统实现目录下所有文件加密,基于 NFS |
Anti-sniff | 反嗅探工具,检查网络中是否有嗅探器 |
Freeswan | 在 linux 实现 VPN 的工具 |
Syslog-ng | 替代 syslog 的日志文件系统 |
Scandns | 进行 dns 检查追踪的工具 |
Whisker | Cgi 扫描器 |
Snoopy | 通过跟踪 execve 系统调用记录执行的命令 |
Linux kernel patch | 内核的安全补丁,防止缓冲溢出等 |
krnsniff | 一个基于内核的监听模块 |
iptable | 用来替代ipchains的包过滤防火墙 |
Imsafe | 通过跟踪系统调用来检测缓冲溢出等问题 |
Iplog | 对来往的包进行日志记录 |
Solaris designer | 内核补丁,防止缓冲溢出等 |
Stackguard | 作为补丁修补gcc,防止缓冲溢出 |
DTK | Honey port欺骗式防御 |
Antiroute | 阻止和记录基于路由的跟踪 |
安全工具介绍
希望您能经常关心最新的安全漏洞和安全新闻,没有任何系统是完全安全的。这篇文章的目的不过是使大家对安全有一个明确的认识,使安全真正能够得到您的重视,做到深入人心。