系统安全及应用
了解这些教程可以教给您什么以及如何从中获得最大收益。
Linux Professional Institute (LPI)在两个级别上对Linux系统管理员进行认证: 初级 (也称为“认证级别1”)和中级 (也称为“认证级别2”)。 要获得1级认证,您必须通过101和102考试; 要达到2级认证,您必须通过201和202考试。
developerWorks提供了教程,以帮助您为四门考试中的每门考试做准备。 每个考试涵盖几个主题,并且每个主题在developerWorks上都有一个相应的自学教程。 对于LPI 202考试,这七个主题和相应的developerWorks教程为:
LPI考试202主题 | developerWorks教程 | 教程总结 |
---|---|---|
主题205 | LPI 202考试准备(主题205): 网络配置 |
了解如何从硬件层(通常是以太网,调制解调器,ISDN或802.11)到网络地址的路由配置基本的TCP / IP网络。 |
主题206 | LPI 202考试准备(主题206): 邮件和新闻 |
了解如何将Linux用作邮件服务器和新闻服务器。 了解有关NNTP协议的邮件传输,本地邮件筛选,邮件列表维护软件和服务器软件的信息。 |
主题207 | LPI 202考试准备(主题207): 域名解析 |
了解如何主要使用BIND将Linux用作DNS服务器。 了解如何执行基本的BIND配置,管理DNS区域以及保护DNS服务器。 |
主题208 | LPI 202考试准备(主题208): 网页服务 |
了解如何安装和配置Apache Web服务器,并了解如何实现Squid代理服务器。 |
主题210 | LPI 202考试准备(主题210): 网络客户端管理 |
了解如何配置DHCP服务器,NIS客户端和服务器,LDAP服务器以及PAM身份验证支持。 请参阅下面的详细目标 。 |
主题212 | LPI 202考试准备(主题212): 系统安全 |
(本教程)了解如何配置路由器,保护FTP服务器,配置SSH以及执行其他各种安全管理任务。 请参阅下面的详细目标 。 |
主题214 | LPI 202考试准备(主题214): 网络故障排除 |
快来了 |
要开始准备1级认证,请参阅LPI 101考试的developerWorks教程 。 要准备认证级别2的其他考试,请参阅LPI考试201的developerWorks教程 。 阅读有关整个developerWorks LPI教程的更多信息。
Linux Professional Institute不特别认可任何第三方考试准备材料或技术。 有关详细信息,请联系[email protected] 。
欢迎来到“系统安全”,这是涵盖Linux上的中间网络管理的七个教程中的第六个。 在本教程中,您将学习与使用Linux作为具有安全意识的网络服务器有关的广泛主题。 涵盖了诸如路由,防火墙和NAT转换(以及用于管理它们的工具)之类的问题,以及为FTP和SSH设置安全策略。 您还将了解与tcpd,hosts.allow和朋友进行的常规访问控制(重新访问LPI 201考试准备(主题209:文件和服务共享 )中的讨论)。 最后,您将了解一些基本的安全监视工具,以及在哪里可以找到安全资源。
与developerWorks 201和202系列中的其他教程一样,本教程旨在作为学习指南和考试准备的切入点,而不是作为该主题的完整文档。 鼓励读者查阅LPI的详细目标清单,并根据需要用其他材料补充此处提供的信息。
本教程根据该主题的LPI目标进行组织。 粗略地说,对于体重较高的目标,应在考试中提出更多问题。
LPI考试目标 | 客观体重 | 客观总结 |
---|---|---|
2.212.2 配置路由器 |
重量2 | 配置系统以执行网络地址转换(NAT,IP伪装),并说明其在保护网络中的重要性。 此目标包括配置端口重定向,管理过滤器规则和避免攻击。 |
2.212.3 保护FTP服务器 |
重量2 | 配置FTP服务器以进行匿名下载和上传。 此目标包括在允许匿名上传和配置用户访问权限时应采取的预防措施。 |
2.212.4 安全外壳(SSH) |
重量2 | 配置SSH守护程序。 此目标包括管理密钥,为用户配置SSH,通过SSH转发应用程序协议以及管理SSH登录。 |
2.212.5 TCP_包装器 |
重量1 | 配置tcpwrappers以仅允许从某些主机或子网连接到指定的服务器。 |
2.212.6 安全任务 |
重量3 | 安装并配置安全的身份验证系统; 进行源代码的基本安全审核; 从各种来源接收安全警报; 审核开放式电子邮件中继的服务器和匿名FTP服务器; 安装,配置和运行入侵检测系统; 并应用安全补丁和错误修复。 |
为了从本教程中获得最大收益,您应该已经具有Linux的基本知识和一个运行中的Linux系统,您可以在该系统上练习本教程中介绍的命令。
与大多数Linux工具一样,检查所讨论的任何实用程序的手册页总是很有用的。 版本和开关可能会在实用程序或内核版本之间或使用不同的Linux发行版进行更改。 有关更深入的信息,Linux文档项目提供了许多有用的文档,尤其是其HOWTO。 另外,已经出版了许多有关Linux系统安全性的书籍。 我发现Craig Hunt撰写的O'Reilly的TCP / IP网络管理非常有帮助。 请参阅“ 相关主题”部分以获取链接。
Linux内核包括“ netfilter”基础结构,该基础结构使您可以过滤网络程序包。 通常,此功能已编译到基本内核中,但可能需要内核模块。 无论哪种方式,模块加载都应该是无缝的(例如,运行iptables
将在需要时加载iptables_filter.o
)。
包过滤由现代Linux系统中的实用程序iptables
控制。 旧系统使用ipchains
。 在此之前,它是ipfwadm
。 如果需要向后兼容,虽然仍然可以将ipchains
与最新的内核结合使用,但是您几乎总是会喜欢iptables
的增强功能和改进的语法。 也就是说, iptables
中的大多数概念和开关都是对ipchains
兼容增强。
根据过滤的确切情况(防火墙,NAT等),过滤和地址转换可能在路由自身之前或之后进行。 在任何一种情况下都使用相同的ipchains
工具,但是在这种情况下使用不同的规则集(“链”)-在base, INPUT
和OUTPUT
。 但是,过滤也会通过在FORWARD
链上进行过滤来影响路由决策。 这可能导致丢弃数据包而不是路由数据包。
除了使用iptables
(或旧式ipchains
过滤)外,Linux内核还执行其接收到的IP数据包的路由 。 路由是一个比过滤更简单的过程,尽管两者在概念上是相关的。
在路由过程中,主机仅查看目标IP地址,然后决定是否知道如何将数据包直接传送到该地址,或者是否有网关知道如何传送到该地址。 如果主机本身既不能传递数据包又不知道将其转发到哪个网关,则该数据包将被丢弃。 但是,典型的配置包括处理所有其他未指定地址的“默认网关”。
路由信息的配置和显示是通过实用程序route
执行的。 但是,路由可以是静态的也可以是动态的 。
对于静态路由,传递由路由表确定,该路由表是通过调用route
命令及其add
或del
命令显式配置的。 但是,使用将路由信息广播到相邻路由守护程序的routed
或gated
守护程序配置动态路由通常更有用。
routed
守护程序支持路由信息协议(RIP); gated
守护程序增加了对许多其他协议的支持,并且可以一次使用多种协议,例如:
让我们看一个相当典型的静态路由表:
% /sbin/route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 66.98.217.0 * 255.255.255.0 U 0 0 0 eth0 10.10.12.0 * 255.255.254.0 U 0 0 0 eth1 66.98.216.0 * 255.255.254.0 U 0 0 0 eth0 169.254.0.0 * 255.255.0.0 U 0 0 0 eth1 default ev1s-66-98-216- 0.0.0.0 UG 0 0 0 eth0
这意味着66.98.217 / 24和66.98.216 / 23范围内的地址将直接通过eth0
传递。 地址范围10.10.12 / 23和169.254 / 16将在eth1
上传递。 剩下的所有内容都将发送到网关ev1s-66-98-216-1.ev1servers.net
(该名称在route
显示中被切断;您也可以使用route -n
来查看该名称为IP地址66.98.216.1 )。 如果要为其他地址范围添加其他网关,则可以运行以下命令:
% route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.2.1 dev eth0
对于本身充当网关的机器,通常需要使用routed
或gated
守护程序来运行动态路由,这可能会补充少量的静态路由。 routed
守护程序由/ etc / gateways的内容配置。 gated
守护程序更现代,具有更多功能(如所示); 它由/etc/gated.conf配置。 通常,如果您使用其中任何一个,则将需要在启动脚本中启动它们。 您不得在同一台计算机上同时运行routed
和gated
,因为结果将是不可预测的,几乎可以肯定是不可取的。
Linux内核为构成某种状态机的IP数据包存储了一个过滤规则表。 按顺序处理的规则集称为“(防火墙)链”。 当一条链满足条件时,可能的动作之一是将控制转移到处理另一条链,如在状态机中一样。 在添加任何规则或状态之前,会自动显示三个链: INPUT
, OUTPUT
和FORWARD
。 INPUT
链是发往主机的数据包传递的地方,并且有可能从那里传递到本地应用程序进程。 在FORWARD
链是其中一个数据包发往不同的机器传球,假设转发并启用路由系统知道如何转发数据包。 在本地主机上生成的数据包被发送到OUTPUT
链中进行过滤-如果它通过OUTPUT
链(或任何链接的链)中的过滤器,则会通过其网络接口路由出去。
一个动作,一个规则可以是DROP
数据包; 在这种情况下,将不再对该数据包进行任何规则处理或状态转换。 但是,如果未丢弃数据包,则会检查链中的下一个规则以查看其是否与数据包匹配。 在某些情况下,对规则的满足会将流程分支到不同的链及其规则集。 使用工具iptables
执行,删除或修改规则以及其中存在规则的链。 在较旧的Linux系统中,使用ipchains
来完成相同的功能。 这两个工具甚至古老的ipfwadm
背后的概念都相似,但是这里讨论了iptables
语法。
规则指定了数据包可能满足的一组条件,以及如果数据包确实满足该条件则应采取的措施。 如上所述,一种常见的操作是DROP
数据包。 例如,假设您想要(由于某种原因)在回送接口(ICMP接口)上禁用ping
。 您可以通过以下方法实现此目的:
% iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP
当然,这是一个愚蠢的规则,我们可能希望在测试之后将其删除,如下所示:
% iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP
使用-D
选项删除规则需要使用与添加时指定的选项完全相同的选项,或者按规则编号( 必须首先确定)指定规范,如下所示:
% iptables -D INPUT 1
一个更有趣的规则可能是查看数据包中的源地址和目标地址。 例如,假设有问题的远程网络正在尝试利用网络特定子网中的服务。 您可以使用以下命令在网关/防火墙计算机上阻止此操作:
% iptables -A INPUT -s 66.98.216/24 -d 64.41.64/24 -j DROP
这样做将阻止来自66.98.216.*
IP块的任何内容与本地64.41.64.*
子网中的任何内容进行通信。 当然,出于保护目的,将特定的IP块选出列入黑名单是相当有限的。 一种更可能的情况是仅允许特定的IP块访问本地子网:
% iptables -A INPUT -s ! 66.98.216/24 -d 64.41.64/24 -j DROP
在这种情况下, 只有 66.98.216.*
IP块可以访问指定的子网。 此外,您可以为地址使用符号名,并可以指定要过滤的特定协议。 您还可以选择一个特定的网络接口(例如eth0
)进行过滤,但这不太常用。 例如,要仅允许特定的远程网络访问本地Web服务器,可以使用:
% iptables -A INPUT -s ! example.com -d 64.41.64.124 -p TCP -sport 80 -j DROP
您可以使用iptables
指定许多其他选项,例如,包括将允许的数据包数量的速率限制或根据TCP标志进行过滤。 有关详细信息,请参见iptables
的联机帮助页。
您已经了解了向自动链添加规则的基础。 但是iptables
许多可配置性来自添加用户定义的链,如果模式匹配则分支到它们。 新链用-N
选项定义; 您已经看到使用特殊目标DROP
分支。 ACCEPT
也是具有明显含义的特殊目标。 此外,还提供特殊目标RETURN
和QUEUE
。 第一种方法是停止处理给定链并返回其父/调用方。 使用QUEUE
处理程序,您可以将数据包传递到用户空间进程以进行进一步处理(可能是日志记录,数据包修改或比iptables
支持的过滤更为精细)。 Rusty Russell的“ Linux 2.4 Packet Filtering HOWTO”中的简单示例是添加用户定义的链的一个很好的示例:
# Create chain to block new connections, except established locally % iptables -N block % iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT % iptables -A block -m state --state NEW -i ! ppp0 -j ACCEPT % iptables -A block -j DROP # DROP everything else not ACCEPT'd # Jump to that chain from INPUT and FORWARD chains % iptables -A INPUT -j block % iptables -A FORWARD -j block
注意,在有限的情况下, block
链ACCEPT
最终规则DROP
是先前未ACCEPT
的所有东西。
一旦建立了一些链,无论是将规则添加到自动链还是添加用户定义的链,都可以使用-L
选项查看当前规则。
我们看过的示例大部分在防火墙规则类中。 但是,网络地址转换(NAT)也由iptables
配置。
基本上,NAT是一种使用连接跟踪来伪装来自本地子网地址的数据包作为外部WAN地址,然后再“通过有线”(在OUTPUT
链上)发送数据包的方法。 执行NAT的网关/路由器需要记住哪个本地主机连接到哪个远程主机,并在数据包从远程主机返回时反转地址转换。
但是,从过滤的角度来看,您只是假装NAT不存在。 您指定的规则应该只使用“真实”本地地址,而不管NAT如何将其伪装到外界。 启用伪装(例如在基本NAT中)仅使用以下iptables
命令。 要使用此功能,您需要确保已加载内核模块iptables_nat并打开IP转发:
% modprobe iptables_nat # Load the kernel module % iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE % echo 1 > /proc/sys/net/piv4/ip_forward # Turn on IP forwarding
此功能称为源NAT-传出数据包的地址已修改。 还存在目标NAT (DNAT)以启用端口转发,负载共享和透明代理。 在那些情况下,将修改传入的数据包以到达相关的本地主机或子网。
但是,在大多数情况下,当用户或管理员谈论NAT时,它们是指源NAT。 如果要配置目标NAT,则应指定PREROUTING
而不是POSTROUTING
。 对于DNAT,数据包在路由之前先经过转换。
Linux提供了许多不同的FTP服务器,并且不同的发行版提供了不同的服务器。 自然,不同服务器的配置会有所不同,尽管大多数服务器倾向于遵循类似的配置指令。
流行的FTP服务器是vsftpd(非常安全的FTP守护程序)。 ProFTP以及wu-ftpd和ncftpd也被广泛使用。
对于许多目的,根本不需要FTP。 例如,通常可以使用scp
(安全副本)来完成在服务器计算机上具有帐户的用户的安全传输,该操作依赖于基础SSH安装,但在其他方面大多模仿了熟悉的cp
命令。
vsftpd的配置文件是/etc/vsftpd.conf。 其他FTP服务器使用类似的文件。
在/etc/vsftpd.conf中可能要记住以下几个选项(如果使用其他端口,则可能在服务器中):
anonymous_enabled
:让匿名用户使用用户名“ anonymous”或“ ftp”登录。 anon_mkdir_write_enable
:允许匿名用户创建目录(可在世界范围内写入父目录中)。 anon_upload_enable
:允许匿名用户上传文件。 anon_world_readable_only
:默认为“是”; 很少有改变它的好主意。 仅允许匿名FTP访问世界可读的文件。 chroot_list_enable
:登录后,在其主目录的“ chroot jail”中指定一组用户(在/etc/vsftpd.chroot-list中列出)。 ssl_enable
:支持SSL加密的连接。 阅读FTP服务器的联机帮助页以获得更完整的选项。 通常,运行FTP服务器就像调整配置文件并在初始化脚本中运行服务器一样简单。
大多数每台Linux机器(以及大多数其他操作系统)都应具有安全外壳(SSH)客户端。 通常,会使用OpenSSH版本,但有时会使用各种兼容的SSH客户端。 尽管SSH客户端对于连接主机至关重要,但在正确配置SSH服务器时会出现较大的安全问题。
由于客户端启动与服务器的连接,因此客户端正在主动选择信任服务器。 只要有一个SSH客户端不允许任何形式的接入到一台机器; 因此,它不会暴露漏洞。
配置服务器也不是特别复杂。 服务器守护程序旨在启用和实施良好的安全性惯例。 但显然,这是一台服务器,它根据服务器决定接受的来自客户端的请求与客户端共享资源。
SSH协议具有版本1和版本2两个版本。在现代系统中,始终首选使用协议版本2,但是通常客户端和服务器都与版本1保持向后兼容性(除非使用配置选项禁用了此功能)。 这使您可以连接到越来越不常见的仅版本1的系统。
版本1和版本2协议中使用了一些不同的配置文件。 对于协议版本1,客户端首先使用ssh-keygen创建RSA密钥对,并将私钥存储在$ HOME / .ssh / identity中,将公钥存储在$ HOME / .ssh / identity.pub中。 该相同的identity.pub应该附加到远程$ HOME / .ssh / authorized_keys文件中。
显然,这里存在一个鸡与蛋的问题:如何在访问之前将文件复制到远程系统? 幸运的是,SSH还支持一种后备身份验证方法,用于发送通过常规远程系统登录测试评估的加密的在线加密密码(例如,用户帐户必须存在,并且必须提供正确的密码)。
协议2同时支持RSA和DSA密钥,但是RSA身份验证在某种程度上有所增强,而不是与协议1中的相同。对于协议2,私钥存储在$ HOME / .ssh / id_rsa和$ HOME / .ssh / id_dsa中。 协议2还支持许多额外的机密性和完整性算法:AES,3DES,Blowfish,CAST128,HMAC-MD5,HMAC-SHA1等。 可以针对首选算法和后备顺序配置服务器。
对于常规配置选项而不是密钥信息,客户端将其密钥存储在/ etc / ssh / ssh_config中(或者如果可用,则存储在/$HOME/.ssh/config中)。 客户端选项也可以使用-o
开关进行配置。 -X
或-x
是一个特别常见的开关,用于启用或禁用X11转发。 如果启用,则X11端口通过SSH隧道传输以启用加密的X11连接。
诸如scp
工具也可以通过SSH使用类似的端口转发。 例如,在我正在使用的本地计算机上,我可以在本地显示器上启动仅远程存在的X11应用程序(在这种情况下,在我的本地子网中):
$ which gedit # not on local system $ ssh -X [email protected] Password: Linux averatec 2.6.10-5-386 #1 Mon Oct 10 11:15:41 UTC 2005 i686 GNU/Linux No mail. Last login: Thu Feb 23 03:51:15 2006 from 192.168.2.101 dqm@averatec:~$ gedit &
sshd
守护程序(特别是OpenSSH版本)可通过不安全的网络在两个不受信任的主机之间进行安全的加密通信。 基本sshd
服务器通常在初始化期间启动,并侦听客户端连接,为每个客户端连接派生一个新的守护程序。 分叉的守护程序处理密钥交换,加密,身份验证,命令执行和数据交换。
与客户端工具一样, sshd
服务器在命令行上可以接受各种选项,但是通常由文件/ etc / ssh / sshd_config进行配置。 还使用了许多其他配置文件。 例如,使用访问控制/etc/hosts.allow和/etc/hosts.deny。 密钥以与客户端类似的方式存储在/ etc / ssh / ssh_host_key(协议1),/ etc / ssh / ssh_host_dsa_key,/ etc / ssh / ssh_host_rsa_key和/ etc / ssh / ssh_host_rsa_key中。和朋友。 另外,与客户端一样,您将首先使用ssh-keygen生成密钥。 有关配置文件以及将生成的密钥复制到适当文件的详细信息,请参见sshd
和ssh-keygen
的手册页。
/ etc / ssh / sshd_config中有许多配置选项,并且默认值通常是明智的(并且明智地是安全的)。 几个选项值得一提:
AllowTcpForwarding
启用或禁用端口转发(隧道),默认情况下设置为“是”。 Ciphers
控制要使用的加密算法的列表和顺序。 AllowUsers
和AllowGroups
接受通配符模式,并允许您控制哪些用户甚至可以尝试进一步的身份验证。 DenyGroups
和DenyUsers
像您期望的那样对称地工作。 PermitRootLogin
允许根用户SSH进入计算机。 Protocol
允许您指定是否接受两个协议版本(如果不接受,则选择哪个版本)。 TCPKeepAlive
。 如果启用了此功能,则会发送“ keepalive”消息来检查连接,但是如果路由中发生瞬时错误,则可能导致断开连接。 OpenSSH使您可以创建隧道,以将另一个协议封装在加密的SSH通道中。 默认情况下,此功能在sshd
服务器上启用,但可以通过命令行或配置文件选项禁用。 假设已启用该功能,客户端可以轻松模拟他们希望用于连接的任何端口/协议。 例如,要为telnet创建隧道:
% ssh -2 -N -f -L 5023:localhost:23 [email protected] % telnet localhost 5023
当然,该示例毫无意义,因为SSH命令外壳程序与telnet外壳程序具有相同的作用。 但是您可以以类似的方式创建POP3,HTTP,SMTP,FTP,X11或其他协议连接。 基本概念是,特定本地主机端口的行为就好像它是远程服务一样,实际的通信数据包以加密形式通过SSH连接传输。
我们在示例中使用的选项是:
-2
(使用协议2), -N
(仅无命令/隧道), -f
(后台使用SSH),以及 -L,
(将隧道描述为“ localport:remotehost:remoteport”)。 还指定了服务器(带有用户名)。
关于TCP_wrappers的第一件事是您不应该使用它,并且它没有得到积极维护。 但是,您可能会发现仍在旧系统上运行的TCP_wrappers中的tcpd守护程序。 在当时,这是一个很好的应用程序,但其功能已被iptables和其他工具取代。 TCP_wrappers的一般用途是监视和筛选SYSTAT,FINGER,FTP,TELNET,RLOGIN,RSH,EXEC,TFTP,TALK和其他网络服务的传入请求。
可以通过两种方式配置TCP_wrapper。 一种是用tcpd替代其他服务器,一旦tcpd完成其日志记录和过滤,则提供参数以将控制权传递给特定服务器。 另一种方法是单独保留网络守护程序,然后修改inetd配置文件。 例如,一个条目,例如:
tftp dgram udp wait root /usr/etc/tcpd in.tftpd -s /tftpboot
使传入的tftp请求通过进程名为in.tftpd
的包装程序(tcpd)运行。
这个目标是各种各样的任务-所有这些对于维护安全的网络都很重要-我不希望在本教程的范围内对此公义。 我建议您花一些时间来熟悉本节中列出的资源和工具。
值得监视安全性问题和补丁的网站包括:
您可能考虑运行的监视安全性的工具包括:
scanlogd
:TCP端口扫描检测工具。 翻译自: https://www.ibm.com/developerworks/linux/tutorials/l-lpic2212/index.html
系统安全及应用