跳转到内容

LPI Linux 认证/LPIC2 考试 202/系统安全

来自 Wikibooks,开放世界中的开放书籍
 
LPI logo

部分概述

[编辑 | 编辑源代码]
  • 配置路由器
  • 保护 FTP 服务器
  • 安全 Shell (OpenSSH)
  • TCP_wrappers
  • 安全任务

配置路由器

[编辑 | 编辑源代码]

描述:候选人应该能够配置 ipchains 和 iptables 来执行 IP 伪装,并说明网络地址转换和专用网络地址在保护网络中的重要性。这个目标包括配置端口重定向、列出过滤规则,以及编写根据源或目标协议、端口和地址接受或阻止数据报的规则。还包括保存和重新加载过滤配置,使用 /proc/sys/net/ipv4 中的设置来响应 DOS 攻击,使用 /proc/sys/net/ipv4/ip_forward 打开和关闭 IP 转发,以及使用 PortSentry 等工具来阻止端口扫描和漏洞探测。

关键文件术语,以及实用程序包括

/proc/sys/net/ipv4 
/etc/services 
ipchains 
iptables
routed

配置路由器

[编辑 | 编辑源代码]

配置连接到互联网等不安全网络的路由器,您应该采取许多步骤。首先,确定您需要的服务,并制定一个策略来阻止所有其他服务!这样可以最大程度地减少您遭受安全漏洞的风险。

路由器的常见步骤是

记录所有丢弃/拒绝的数据包(并限制记录速率,以避免日志文件大小爆炸)尽可能使用 NAT - 不可路由地址更难被攻击定义 TCP/UDP 的默认策略 - 阻止端口响应:丢弃/拒绝/重置?

丢弃实际上没有帮助,现在的扫描器很容易检测到它。拒绝仍然表明防火墙正在阻止访问,重置就像什么都没有监听一样(即“正常”方式)。

除非您知道需要它,否则丢弃(并记录 + 限制)所有 ICMP 数据包,除了最有用的:目标不可达、时间超过和回声回复

防御已知攻击,即:IP 地址反欺骗、禁用源路由数据包、禁用 icmp_redirect、记录“火星人”IP 地址(即出现在不属于它们的接口上的地址)、禁用 syn_cookies、禁用 ECN(显式拥塞通知)、禁用 TCP 时间戳、ICMP 广播和 ICMP 错误数据包

.

保护 FTP 服务器

[编辑 | 编辑源代码]

描述:候选人应该能够配置匿名下载 FTP 服务器。这个目标包括配置 FTP 服务器以允许匿名上传、列出如果允许匿名上传需要采取的其他预防措施、配置具有 chroot 限制的访客用户和组,以及配置 ftpaccess 以拒绝访问指定的用户或组。

关键文件术语,以及实用程序包括

ftpaccess, ftpusers, ftpgroups 
/etc/passwd 
chroot

保护 FTP 服务器将包括

  • 定制 FTP 警告横幅
  • 定制 FTP 问候横幅
  • 保护、拒绝和限制用户帐户
  • 保护匿名访问
  • 保护匿名上传

FTP 协议

[编辑 | 编辑源代码]

文件传输协议 (FTP) 是一种较旧的 TCP 协议,用于在网络上传输文件。由于与服务器的所有事务(包括用户身份验证)都是未加密的,因此它被认为是不安全的协议,应谨慎配置。

wu-ftpd FTP 服务器

[编辑 | 编辑源代码]

我们将重点关注华盛顿大学的 wu-ftpd FTP 服务器。

Wu-ftpd 的主要配置文件位于 /etc 中:ftpusers、ftpaccess 和 ftpconversions。ftpusers 文件包含所有不允许登录您的 FTP 服务器的用户列表。您可以想象,用户 root 应该列在这里。您还应该确保其他特殊用户帐户(如 lp、shutdown、mail 等)也列在这里。

ftpaccess 文件用于配置安全性、用户定义等问题。它实际上是通用配置文件。您可以在此处设置的一些有趣设置是:loginfails [number]

    where number is a number that stands for the amount of times that a user is allowed to fail to authenticate before being totally disabled.

shutdown [filename]

    where filename is the name of a file that, if it exists, automatically shuts down the FTP server without a need to actually close the port in the /etc/inetd.conf file and then restarting inetd.

最后,ftpconversions 文件用于允许客户端对文件进行特殊的“即时”转换,例如自动解压缩下载的文件。

FTP 警告横幅

[编辑 | 编辑源代码]

在 FTP 客户端连接时向其返回自定义横幅是一个好主意,因为它有助于掩盖 FTP 服务器运行的系统是什么。您可以使用 TCP 包装器或以下描述的方法向传入连接发送横幅。

在 /etc/ftpaccess 的配置文件中添加以下行:banner /etc/banners/warning.msg

横幅文件的内容应该类似于:Hello, all activity on ftp.example.com is logged.

FTP 问候横幅

[编辑 | 编辑源代码]

登录后,所有用户都会看到一个欢迎横幅。默认情况下,此横幅包含版本信息,这些信息对试图识别系统漏洞的黑客很有用。要更改 wu-ftpd 的欢迎横幅,请在 /etc/ftpusers 中添加以下指令:greeting text <insert_greeting_here> Securing FTP servers

由于 FTP 通过不安全的网络传递未加密的用户名和密码进行身份验证,因此建议阻止系统用户从其用户帐户访问服务器。要在 wu-ftpd 中禁用用户帐户,请在 /etc/ftpusers 中添加以下指令:deny-uid * 要在 wu-ftpd 中禁用特定用户帐户,请将用户名添加到 /etc/ftpusers

匿名访问

[编辑 | 编辑源代码]

设置匿名 FTP 的最佳方式是配置一个 chroot 监狱:与其允许完全访问系统,不如将访问权限限制在一个给定的目录中。换句话说,匿名用户登录系统后,只能访问用户 ftp 的主目录,而不能访问其他任何地方。如果用户输入 cd /,在大多数其他情况下,这应该会将用户带到系统的根目录,但它只会将用户带到 /home/ftp(这是用户 ftp 的默认主目录)。

大多数发行版,如 RedHat,都提供了一个匿名 ftp 包,以帮助准备 chroot 监狱。重要的是,要给您的严格 FTP 用户在 Linux 系统上不提供任何真实的 shell 帐户。这样一来,如果有人能够成功地从 FTP chroot 环境中退出(有关定义,请参见下文),由于他们没有 bash shell,因此他们将无法执行任何用户任务。首先,为此目的创建新用户。由于 chroot 环境的工作方式,这必须与具有无限访问权限的常规用户帐户分开。Chroot 会让用户感觉好像他们所在的 文件系统级别是文件系统的顶层。

使用 /dev/null 作为 shell 为这些新用户设置 shell,并在允许的 shell 列表 /etc/shells 中添加 /dev/null。还要确保在 /etc/passwd 中,他们的主目录列为 /home/./ftp(对于用户 ftp),即使实际目录是 /home/ftp

设置一个 chroot 用户环境:您实际上是在创建一个包含足够必要组件(二进制文件、密码文件等)的骨架根文件系统,以允许 Unix 在用户登录时执行 chroot。请注意,wu-ftpd 可能会使用 --enable-ls 选项进行编译,在这种情况下,/home/ftp/bin 和 /home/ftp/lib 目录将不再需要,因为这个新选项允许 Wu-ftpd 使用它自己的 ls 函数。我们仍然会演示旧方法,供那些希望将 /bin/ls 复制到 chroot 的 FTP 目录 /home/ftp/bin 中,并创建相应的库相关工具的人使用。以下是使用 chroot 监狱运行 Wu-ftpd 软件所需的步骤:首先创建所有必要的 chroot 环境目录

[root@deep ] /# mkdir /home/ftp/dev
[root@deep ] /# mkdir /home/ftp/etc
[root@deep ] /# mkdir /home/ftp/bin
[root@deep ] /# mkdir /home/ftp/lib

出于安全原因,将新目录的权限更改为 0511:chmod 命令将使我们的 chroot 的 dev、etc、bin 和 lib 目录可供超级用户 root 读取和执行,并可供用户组和所有用户执行

[root@deep ] /# chmod 0511 /home/ftp/dev/
[root@deep ] /# chmod 0511 /home/ftp/etc/
[root@deep ] /# chmod 0511 /home/ftp/bin
[root@deep ] /# chmod 0511 /home/ftp/lib

将 /bin/ls 二进制文件复制到 /home/ftp/bin 目录,并将 ls 程序的权限更改为 0111。您不希望用户能够修改二进制文件

[root@deep ] /# cp /bin/ls /home/ftp/bin
[root@deep ] /# chmod 0111 /bin/ls /home/ftp/bin/ls

查找 ls Linux 二进制程序的共享库依赖项:

[root@deep ] /# ldd /bin/ls
   libc.so.6 => /lib/libc.so.6 (0x00125000)
   /lib/ld-linux.so.2 =7gt; /lib/ld-linux.so.2 (0x00110000)
         

将上面识别的共享库复制到 /home/ftp 目录下的新 lib 目录

[root@deep ] /# cp /lib/libc.so.6 /home/ftp/lib/
[root@deep ] /# cp /lib/ld-linux.so.2 /home/ftp/lib/ 

创建 /home/ftp/dev/null 文件

[root@deep ] /# mknod /home/ftp/dev/null c 1 3
[root@deep ] /# chmod 666 /home/ftp/dev/null

将 group 和 passwd 文件复制到 /home/ftp/etc 目录。这应该与您的真实文件不同。因此,我们将在这两个文件(passwd 和 group)中删除所有非 FTP 用户,除了超级用户 root。

编辑 passwd 文件,vi /home/ftp/etc/passwd,并删除除超级用户 root 和您的允许 FTP 用户之外的所有条目。chroot 环境中的 passwd 文件必须包含以下条目

root:x:0:0:root:/:/dev/null
ftpadmin:x:502:502::/ftpadmin/:/dev/null

(这里要注意两点:首先,这个修改后的 passwd 文件中所有用户的 home 目录都已更改,以反映新的 chroot FTP 目录,即 /home/ftp/./ftpadmin/ 以 /ftpadmin/ 开头,其次,root 帐户的用户登录 shell 名称已更改为 /dev/null)编辑 group 文件,vi /home/ftp/etc/group,并删除除超级用户 root 和所有允许的 FTP 用户之外的所有条目。group 文件应该与您的常规 group 文件相对应

root:x:0:root
ftpadmin:x:502:              

现在,我们必须将 chroot 监狱目录中的 passwd 和 group 文件设置为不可变,以提高安全性。

[root@deep ] /# cd /home/ftp/etc/
[root@deep ] /# chattr +i passwd

设置 group 文件上的不可变位

[root@deep ] /# cd /home/ftp/etc/
[root@deep ] /# chattr +i group

通过创建 /etc/pam.d/ftp 文件并添加以下行,将 /etc/pam.d/ftp 文件配置为使用 pam 身份验证

#%PAM-1.0
auth    required /lib/security/pam_listfile.so item=user sense=deny \ file=/etc/ftpusers onerr=succeed
auth    required /lib/security/pam_pwdb.so shadow nullok
auth    required /lib/security/pam_shells.so
account required /lib/security/pam_pwdb.so
session required /lib/security/pam_pwdb.so

匿名上传

[编辑 | 编辑源代码]

如果要允许匿名用户上传,建议您在 /var/ftp/pub/ 中创建一个只写目录。为此,请输入以下命令

mkdir /var/ftp/pub/upload

接下来,更改权限,以便匿名用户无法看到目录中的内容,方法是键入以下命令

chmod 744 /var/ftp/pub/upload

该目录的长格式列表应该如下所示

drwxr--r--    2 root     ftp          4096 Aug 20 18:26 upload

=== 练习 ===。

安全 Shell (OpenSSH)

[编辑 | 编辑源代码]

说明:候选人应该能够配置 sshd 以允许或拒绝 root 登录,启用或禁用 X 转发。此目标包括生成服务器密钥、生成用户的公钥/私钥对、将公钥添加到用户的 authorized_keys 文件以及为所有用户配置 ssh-agent。候选人还应该能够配置端口转发以通过 ssh 隧道传输应用程序协议,配置 ssh 以支持 ssh 协议版本 1 和 2,在系统维护期间禁用非 root 登录,为 ssh 登录配置信任的客户端,无需密码,以及从多个主机进行多个连接,以防止在配置更改后连接到远程主机的丢失。

关键文件术语,以及实用程序包括

ssh, sshd
/etc/ssh/sshd_config 
~/.ssh/identity.pub, ~/.ssh/identity
~/.ssh/authorized_keys 
.shosts, .rhosts

OpenSSH 是 SSH (Secure Shell) 协议的免费开源实现。它使用安全、加密的网络连接工具替换 telnet、ftp、rlogin、rsh 和 rcp。OpenSSH 支持 SSH 协议的 1.3、1.5 和 2.0 版本。

如果您使用 OpenSSH 工具,那么您将增强计算机的安全性。所有使用 OpenSSH 工具的通信(包括密码)都已加密。Telnet 和 ftp 使用明文密码,并以未加密的方式发送所有信息。信息可能会被拦截,密码可能会被检索,然后您的系统可能会被未经授权的人员使用拦截的密码之一登录到您的系统。只要有可能,都应该使用 OpenSSH 工具集,以避免这些安全问题。使用 OpenSSH 的另一个原因是,它会自动将 DISPLAY 变量转发到客户端机器。换句话说,如果您在本地机器上运行 X Window 系统,并且您使用 ssh 命令登录到远程机器,那么当您在远程机器上执行需要 X 的程序时,它将在本地机器上显示。如果您更喜欢图形系统管理工具,但并非始终能够访问服务器,那么这将很方便。

ssh 命令是 rlogin、rsh 和 telnet 命令的安全替代方案。它允许您登录到远程机器并执行远程机器上的命令。

使用 ssh 登录到远程机器类似于使用 telnet。要登录到名为 penguin.example.net 的远程机器,请在 shell 提示符处键入以下命令:ssh penguin.example.net

第一次使用 ssh 连接到远程机器时,您会看到类似于以下内容的消息:无法验证主机 'penguin.example.net' 的真实性。

DSA key fingerprint is 94:68:3a:3a:bc:f3:9a:9b:01:5d:b3:07:38:e2:11:0c.
Are you sure you want to continue connecting (yes/no)? 
Type yes to continue. This will add the server to your list of known hosts as seen in the following message:
Warning: Permanently added 'penguin.example.net' (DSA) to the list of known hosts.

接下来,您会看到一个提示,要求您输入远程机器的密码。输入密码后,您将处于远程机器的 shell 提示符处。如果您在没有任何命令行选项的情况下使用 ssh,那么您在本地客户端机器上登录的用户名将传递到远程机器。如果要指定不同的用户名,请使用以下命令

ssh -l username penguin.example.net

您也可以使用语法 ssh [email protected]。ssh 命令可用于在远程机器上执行命令,而不必登录到 shell 提示符。语法是 ssh hostname command。例如,如果要执行远程机器 penguin.example.net 上的命令 ls /usr/share/doc,请在 shell 提示符处键入以下命令

ssh penguin.example.net ls /usr/share/doc

输入正确的密码后,/usr/share/doc 的内容将显示,您将返回到 shell 提示符。

scp 命令可用于通过安全、加密的连接在机器之间传输文件。它类似于 rcp。

将本地文件传输到远程系统的通用语法是 scp localfile user@hostname:/newfilename。localfile 指定源,而 user@hostname:/newfilename 组指定目标。要将本地文件 shadowman 传输到 penguin.example.net 上您的帐户,请在 shell 提示符处键入以下内容(将 user 替换为您的用户名)

scp shadowman [email protected]:/home/user

这将把本地文件 shadowman 传输到 penguin.example.net 上的 /home/user/shadowman。将远程文件传输到本地系统的通用语法是 scp user@hostname:/remotefile /newlocalfile。remotefile 指定源,而 newlocalfile 指定目标。

可以指定多个文件作为源文件。例如,要将 /downloads 目录的内容传输到远程机器 penguin.example.net 上名为 uploads 的现有目录,请在 shell 提示符处键入以下内容

scp /downloads/* [email protected]:/uploads/

sftp 实用程序可用于打开安全、交互式的 FTP 会话。它类似于 ftp,但使用安全的加密连接。通用语法为 sftp 用户名@主机名.com。身份验证后,您可以使用一组类似于 FTP 的命令。有关这些命令的列表,请参阅 sftp 手册页。要阅读手册页,请在 shell 提示符下执行命令 man sftp。sftp 实用程序仅在 OpenSSH 2.5.0p1 及更高版本中可用。

生成密钥对

[编辑 | 编辑源代码]

如果您不想在每次 ssh、scp 或 sftp 到远程机器时输入密码,您可以生成授权密钥对。

注意:单独的授权密钥对您必须为 SSH 协议 1(RSA)和 SSH 协议 2(DSA)拥有单独的授权密钥对。

警告:每个用户都需要自己的密钥对!

必须为每个用户生成密钥。要为用户生成密钥,请以要连接到远程机器的用户身份执行以下步骤。如果您以 root 身份完成以下步骤,则只有 root 才能使用这些密钥。

使用以下步骤生成 DSA 密钥对。DSA 由 SSH 协议 2 使用,并且是 Red Hat 的默认值。1. 要生成用于与协议版本 2.0 配合使用的 DSA 密钥对,请在 shell 提示符下键入以下命令

ssh-keygen -t dsa

接受默认文件位置 ~/.ssh/id_dsa。输入与您的帐户密码不同的密码短语,并通过再次输入确认它。

(密码短语是用于验证用户的一串单词和字符。密码短语与密码的不同之处在于您可以在密码短语中使用空格或制表符。密码短语通常比密码更长,因为它们通常是短语,而不仅仅是一个单词。)

2. 使用命令 chmod 755 ~/.ssh 更改 .ssh 目录的权限。

3. 将 ~/.ssh/id_dsa.pub 的内容复制到要连接到的机器上的 ~/.ssh/authorized_keys2。如果文件 ~/.ssh/authorized_keys2 不存在,您可以将文件 ~/.ssh/id_dsa.pub 复制到另一台机器上的文件 ~/.ssh/authorized_keys2。

使用以下步骤为 SSH 协议的版本 2.0 生成 RSA 密钥对。

1. 要生成用于与协议版本 2.0 配合使用的 RSA 密钥对,请在 shell 提示符下键入以下命令

ssh-keygen -t rsa

接受默认文件位置 ~/.ssh/id_rsa。输入与您的帐户密码不同的密码短语,并通过再次输入确认它。[1]

2. 使用命令 chmod 755 ~/.ssh 更改 .ssh 目录的权限。

3. 将 ~/.ssh/id_rsa.pub 的内容复制到要连接到的机器上的 ~/.ssh/authorized_keys2。如果文件 ~/.ssh/authorized_keys2 不存在,您可以将文件 ~/.ssh/id_rsa.pub 复制到另一台机器上的文件 ~/.ssh/authorized_keys2。

使用以下步骤生成 RSA 密钥对,该密钥对由 SSH 协议的版本 1 使用。

1. 要生成 RSA(用于版本 1.3 和 1.5 协议)密钥对,请在 shell 提示符下键入以下命令

ssh-keygen

接受默认文件位置 (~/.ssh/identity)。输入与您的帐户密码不同的密码短语。通过再次输入确认密码短语。

2. 使用命令 chmod 755 ~/.ssh 和 chmod 644 ~/.ssh/identity.pub 更改 .ssh 目录和密钥的权限。

3. 将 ~/.ssh/identity.pub 的内容复制到要连接到的机器上的文件 ~/.ssh/authorized_keys。如果文件 ~/.ssh/authorized_keys 不存在,您可以将文件 ~/.ssh/identity.pub 复制到远程机器上的文件 ~/.ssh/authorized_keys。

=== 练习 ===。

TCP_wrappers

[编辑 | 编辑源代码]

描述:考生应该能够配置 tcpwrappers 以仅允许从某些主机或子网连接到指定的服务器。

关键文件术语,以及实用程序包括

inetd.conf, tcpd 
hosts.allow, hosts.deny 
xinetd

TCP_wrappers

[编辑 | 编辑源代码]

TCP wrapper 是一个用于控制对网络服务的访问的系统。对于每个受 TCP wrapper 保护的服务,都会使用 tcpd 程序,它会查询两个文件,以按顺序定义访问权限。

/etc/hosts.deny: if a rule here is met, access is denied
/etc/hosts.allow: if a rule here is met, access is allowed

规则被构建为匹配所有服务或特定服务。如果在两个文件中都没有匹配项,则授予访问权限。

通常在 /etc/hosts.allow 中设置特定规则,并在 /etc/hosts.deny 中提供一个全局拒绝(即拒绝所有内容,除非专门允许)。规则格式为

[list of services] : [list of hosts]

即:拒绝所有传入请求,除了来自本地域的 FTP

/etc/hosts.allow :
ftp : LOCAL
/etc/hosts.deny :
ALL : ALL

=== 练习 ===。

安全任务

[编辑 | 编辑源代码]

描述:考生应该能够安装和配置 kerberos 并执行源代码的基本安全审计。该目标包括安排从 Bugtraq、CERT、CIAC 或其他来源接收安全警报,能够测试开放邮件中继和匿名 FTP 服务器,安装和配置入侵检测系统(如 snort 或 Tripwire)。考生还应该能够在发现新的漏洞时更新 IDS 配置,并应用安全补丁和错误修复。

关键文件术语,以及实用程序包括

Tripwire 
nessus
netsaint
snort
telnet 
nmap

安全任务

[编辑 | 编辑源代码]

任务:安装和配置 Kerberos

安装

配置文件

Kerberos 参考

使用 atelnet 客户端测试/调试您的服务器,这意味着您对使用的协议有一些了解:阅读相应的 RFC。定期查看 Bugtraq、CERT 等安全邮件列表。尽快修补您的系统!

定期在您的系统上运行安全扫描程序。网络安全扫描程序 Nessus 和 Netsaint 广泛使用,非常受关注,并且是开源的。Bastille Linux 是一个很棒的基于主机的安全扫描程序。使用一些入侵检测系统 (IDS),包括基于网络的和基于主机的。Tripwire Snort

不要忘记:安全是一个永无止境的进程,而不是一种状态或产品!

华夏公益教科书