密码安全性及加密

[Note]

以下讨论的大多数加密程序已包含在您的 Mandrakelinux 发行版中。

当今,最重要的一个安全措施是使用密码。使用安全的,不可猜测的密码对您和您的用户都十分重要。在您的 Mandrakelinux 发行版中包含的 passwd 程序不允许您使用易于猜测的密码。请确认您的 passwd 程序已被更新。

对加密技术的深入讨论超出了本章范围。本章只提供一个简要介绍。加密非常有用,在当今甚至可以说是必须的。有各种各样加密数据的方法,他们各有其特点。

大多数 UNIX 系统(包括 GNU/Linux)基本都使用一个单向加密算法 -- DES (Data Encryption Standard -- 数据加密标准)来加密您的密码。加密后的密码存储在 /etc/shadow 文件中。当您登录时,您输入的密码被再次加密,并同保存密码的文件中的相应条目比较。如果它们匹配,就表示两者相同,您就被允许访问。虽然 DES 是一种双向加密算法(对于给定密钥,您既能够对消息编码也能够解码),但是大部分 Unix 系统使用的是其变体。这意味着不能逆转加密过程从 /etc/shadow 文件中破解出密码。

除非您的密码足够随机,使用暴力攻击法(brute force attack),比如"Crack"或"John the Ripper"(参见"Crack 和 John the Ripper")经常能够猜测出密码。PAM 模块(见下文)允许您使用不同的加密例程对您的密码加密(诸如 MD5)。不过,您也能够利用 Crack。可以定期对您自己的密码数据库执行 Crack 以找出不安全的密码。然后联系那个倒楣的用户,教他怎样换个好密码。

请访问 CERN 网站以了解关于如何选择一个良好密码的知识。

PGP 和公钥密码技术

公钥密码技术(比如为 PGP 而使用的)用一个密钥加密,另一个解密。相反,传统密码技术使用一把密钥加密和解密。双方都必须知道这一密钥,因此它必须通过某种安全途径从一方传送到另一方。

为减轻对安全传送密钥的需求,公钥加密技术使用两把分离的密钥:公钥和私钥。每个人的公钥都可以被其他人用来加密,同时他自己保存自己的私钥来解密使用正确公钥加密的信息。

使用公钥和私钥密码技术各有其优点。您可以在本节底部列出的 RSA 密码学 FAQ 中找到它们的差别。

PGP (Pretty Good Privacy -- 良好隐私)在 GNU/Linux 上的支持十分优秀。已知 2.6.2 和 5.0 版均工作正常。要了解如何使用 PGP 的基础知识,请查看 Internet FAQ 存档网站上关于 PGP 各种不同的 FAQ

请确认使用适用于贵国的版本。由于美国政府的出口限制,禁止在其国外传送强加密的电子数据。

美国出口控制现遵从 EAR (Export Administration Regulations -- 出口管制法规)管制,而不再受 ITAR 管制。

LinuxFocus 上也有一篇有关如何一步步地在 GNU/Linux 上配置 PGP 的向导。它是为 PGP 国际版本所撰写的,但是也可容易地改编到美国版上。您可能还需要为某些最新的 GNU/Linux 版本打补丁;这些补丁可在 metalab 找到。

有一个开放源代码的项目重新实现了 PGP。GnuPG 是 PGP 的完全且免费的替代品。由于它没有使用 IDEA 或者 RSA 加密算法,它可以不被限制地使用。GnuPGOpenPGP 兼容。详情请参见 GNU 隐私卫士网页

有关密码学更多详情请参见 RSA 密码学 FAQ。在那里您会找到关于"Diffie-Hellman"、"公钥密码技术(public-key cryptography)"、"数字认证(digital certificates)"等术语的信息。

SSL、S-HTTP 和 S/MIME

用户经常会询问有关各种不同的安全和加密协议的不同之处,以及如何使用它们。虽然本文并非为专门讨论加密而写,却不妨简单谈谈每个协议是什么,以及到哪里可以找到更多信息。

  • SSL: - SSL,或称为安全套接字层(Secure Sockets Layer),是由网景公司(Netscape)开发的为 Internet 提供安全性的加密措施。它支持几个不同的加密协议,并提供客户端和服务器端认证。SSL 在一个透明层操作,并为数据建立一个安全的加密的信道,因此可以无缝地对许多种类的数据加密。一般可以在使用 Communicator 浏览某个安全网站的安全在线文档时见到这种情况。而且它也是 Communicator 以及其他许多网景公司加密数据安全通讯的基础。进一步的信息请参见 OpenSSL 网站。有关网景公司的其他安全性实现技术以及理解这些协议的起点请参见网景安全中心。还请注意,为了安全 SSL 协议能被用于"包裹"其他常见的协议。请参见 sslwrap 网页

  • S-HTTP: - S-HTTP 是另一个在 Internet 上提供安全服务的协议。它被设计用来提供保密性、认证、完整性、和不可抵赖性[不可能误认为其他人],并同时通过在参与传送的各方之间协商来支持多重密钥管理和密码技术。S-HTTP 受实现它的特定软件的限制,而且它独立地加密每一条消息。[见 RSA 密码学常见问题(RSA Cryptography FAQ),138页]

  • S/MIME: - S/MIME,或称为安全多目的 Internet 邮件扩展(Secure Multipurpose Internet Mail Extension),是用来在 Internet 上加密电子邮件及其他类型消息的加密标准。它是由 RSA 开发的一个开放标准,因此很有可能在某一天会在 GNU/Linux 上出现。有关 S/MIME 详情请参见 rfc2311

IPSEC 实现

CIPE 以及其它数据加密形式一样,GNU/Linux 上的 IPSEC 有好几个实现。IPSEC 是一项由 IETF 开发的用来在 IP 网络层上建立密码安全的通讯,以及提供认证、完整性、访问控制、和保密性的一项成果。有关 IPSEC 及 Internet 草案详情请参见 ipsec 许可证。其中,您也会找到有关密钥管理的其他链接,以及一个 IPSEC 邮件列表及其存档。

由亚利桑那大学(University of Arizona)开发的 x-kernel GNU/Linux 实现使用一个称为 x-kernel 的面向对象的框架实现网络协议。简单来说,x-kernel 是一种在内核级传递消息的方法,这使得实现更为简单。该项目现已关闭,但是可在 x-Kernel 项目网站找到其联系方式。

另一个可以自由使用的 IPSEC 实现是 GNU/Linux FreeS/WAN IPSEC。他们的网页声明:"这些服务让您能够在不受信任的网络上建立安全的隧道。任何穿越不受信任网络的数据都会在一端由 IPSEC 网关计算机加密,并由另一端的网关解密。其结果是 VPN (虚拟私有网络)。这是一个能够有效地保护隐私的网络,即使它包括一些使用不安全 Internet 连接的位于不同站点的计算机。"

它可以从 Linux FreeS/WAN 站点下载。

同其他形式的密码技术一样,由于受出口限制,它不能够默认同内核一起分发。

ssh (Secure SHell -- 安全 SHell)和 stelnet

sshstelnet 是两套让您使用加密连接登录到远程系统的程序。

openssh 是一套用来作为 rloginrshrcp 的安全替代的程序。它使用公钥密码技术来加密两个主机间的通讯,以及认证用户。可以用它来安全地登录到远程主机或者在主机间复制数据,并同时避免中间人攻击(session hijacking -- 会话拦截)以及假冒 DNS (DNS spoofing)。它将在您的连接上执行数据压缩,并保护主机间的 X11 通讯。

现已有好几个 ssh 实现。可在 Datafellows 网站ssh 主页上找到由 Data Fellows 开发的最初的商业实现。

优秀的 OpenSSH 实现基于 DataFellows ssh 的一个早期版本,并被整个重写以免包含任何专利部分。它是免费的并以 BSD 许可协议发布。可在 OpenSSH 网站找到。

还有一个开放源代码项目 "lsh" 从头开始重新实现了 ssh。详情请参见 LSH 网站。

您也可以从您的 Windows 工作站使用 ssh 连接到 GNU/Linux ssh 服务器。有好几个免费可用的 Windows 客户端,包括 PuTTY 以及 DataFellows 开发的 Datafellows 网站上的商业实现。

SSLeay (已过时,见下述 OpenSSL)是网景公司Secure Sockets Layer (安全套接字层)的一个免费实现。它由 Eric Young 开发。它包含了一些程序,比如:"Secure telnet"、Apache 的一个模块、一些数据库、以及一些算法(包括DESIDEA 和 "Blowfish")。

使用该库可以建立一个安全的 telnet (在 telnet 上提供加密)。不同于 SSHstelnet 使用 SSL (由 网景公司开发的安全套接字层协议(Secure Sockets Layer protocol))。循着 SSLeay 和 SSLapps FAQ 链接下去,您能够了解 Secure telnet 和 Secure FTP。

[Note]

OpenSSL 项目以 SSLeay 为基础,并期望开发一个健壮的、商业级的、全功能的、和开放源代码的工具集,以实现安全套接字层(SSL v2/v3)和传输层安全性(TLS v1)协议以及一个全能的通用的密码技术库。有关该项目的详情请咨询 OpenSSL 主页。在 OpenSSL-相关的应用程序网站上列举了众多基于 OpenSSL 的应用程序。

SRP 是另一个安全 telnet/ftp 的实现。参见其网页:

"SRP 项目正在开发安全的 Internet 软件让全世界免费使用。从一个完全安全的 TelnetFTP 发行版起,我们希望改善脆弱的网络认证系统,而不为了安全性牺牲用户友好性。安全性应该是默认的,而非可选的。"

详情请访问斯坦佛大学(Stanford University)网站

PAM - 可插入认证模块(Pluggable Authentication Modules)

您的 Mandrakelinux 随带一个统一的认证方案,它称为PAMPAM 让您能随时改变您的认证方法以及需求,并且不需要重新编译任何代码就封装了所有本地认证方法。对 PAM 的配置超出了本章讨论范围,但是请您一定要浏览 PAM 网站

对于 PAM 您只需要做:

  • 对您的密码采用不同于 DES 的加密方式(让它们面对暴力解码(brute-force decode)时更为坚固)。

  • 对您所有用户使用资源限额,以防止他们进行拒绝服务(denial-of-service)攻击(进程数、占用内存量等等)。

  • 随时启用 shadow password (见下文)

  • 只在特定的时间允许特定的用户从特定的地方登录

只需要几小时安装并配置您的系统,您就可以避免许多攻击,甚至在它们发生之前。例如:使用 PAM 禁用整个系统上对用户主目录(home directory)中 .rhosts 文件的使用,这只需要在 /etc/pam.d/rlogin 中添加以下几行:

#
# Disable rsh/rlogin/rexec for users
#
login auth required pam_rhosts_auth.so no_rhosts

加密IP封装(Cryptographic IP Encapsulation -- CIPE)

该软件主要的目的是为了对在不安全的分组交换网络(例如 Internet)上建立安全的子网提供帮助(对付窃听,包括流量分析和假冒消息进入时间)。

CIPE 在网络级别上加密数据,加密在主机间传送的数据包。加密引擎被直接置于发送及接收数据包的驱动程序上。

这与 SSH 在套接字级别使用连接加密数据不同。在不同主机上运行的程序间的逻辑连接被加密。

CIPE 能被用于加密隧道,以建立虚拟私有网络(Virtual Private Network)。低层加密优点在于它能在使用 VPN 连接的两个网络中间透明地运行而不用改变应用软件。

CIPE 的文档中,其总结道:

"IPSEC 标准定义了一系列协议以(同其他东西一起)用于建立加密的 VPN。然而,IPSEC 是一个重量级的复杂的包括很多选项的协议集合。对这一协议集合的完整的实现仍很少被使用,并且一些问题(比如密钥管理)仍未能全部解决。CIPE 使用简单的方法,其中许多东西(比如对于实际使用的加密算法的选择)可被作为参数在安装的时候固定下来。这虽然限制了灵活性,但却可以简单(因而有效地、易于纠错地等等)地实现。"

详情请参见 CIPE 项目网站。

同其他形式的密码技术一样,由于受出口限制,它不能够默认同内核一起分发。

Kerberos

Kerberos 是一个由 MIT雅典娜项目组(Athena Project)开发的认证系统。当用户登录时,Kerberos (使用密码)对该用户进行认证,并为该用户提供一种在分布于网络各处的服务器和主机上证明其身份的方式。

这一认证机制随后被诸如 rlogin 等程序使用,让用户在登录到其他主机时不必再次输入密码(替代 .rhosts 文件的作用)。这一认证方法也能被邮件服务器使用,来确保邮件被递送到正确的收件人,并同时确保发件人的身份同他自称的一样。

Kerberos 及其他程序能协同运作以防止用户欺骗系统相信他是另外某人。不幸的是,Kerberos 的安装非常具有侵入性,它需要修改或替换一大堆标准的程序。

有关 Kerberos 更多信息请浏览 Kerberos FAQ,其源代码在 Kerberos 网站上。

[源自:Stein、Jennifer G.、Clifford Neuman、和 Jeffrey L. Schiller。 "Kerberos:开放网络系统的一项认证服务。" USENIX 会议论文汇编,达拉斯市,德克萨斯州,1998年冬。]

Kerberos 不应该是您改善您的主机安全性的第一步。它非常需要手工干预,并不如 SSH 那样被广泛使用。

Shadow Passwords

使用 Shadow password 是一种保护您的加密密码信息不为普通用户所知的方法。您的 Mandrakelinux 系统默认使用 shadow password。但是在其他的系统中,加了密的密码保存在 /etc/passwd 以允许所有人阅读。任何人可以对其运行密码猜测程序以尝试确定那些密码是什么。相反,shadow password 保存在 /etc/shadow 文件中,只有被授权的用户可以阅读。如果需要,请参阅 Shadow-Password HOWTO。它已经过时,对于支持 PAM 的发行版(例如您的 Mandrakelinux 系统)也不需要。

"Crack" 和 "John the Ripper"

如果由于某种原因,您的 passwd 程序并不强制使用难于猜测的密码,您可能想要运行某个密码攻击程序来确认您的用户的密码是安全的。

密码攻击程序使用简单的逻辑:他们尝试字典中每一个单词及其变体,将其加密后同您已加密的密码进行比较。如果匹配的话,它们就知道您的密码了。

有许多密码攻击程序,其中最值得注意的两个是:CrackJohn the Ripper (参见 OpenWall)。它们会占用大量 CPU 时间,但是您应该首先亲自使用它们以确定是否某个攻击者能用它们攻进来,并提醒您的用户不要使用脆弱的密码。请注意,攻击者可能会首先使用另外的某些漏洞以便能够阅读您的 /etc/shadow 文件。不过这些漏洞比您想的要普遍得多。

因为整个网络的安全性相当于其中最不安全的那台主机的安全性,如果在您的网络中存在 Windows 计算机,您应该用 L0phtCrack (Windows 下的一个 Crack 的实现)来检查一下。请浏览 @stake LC 4 网站

CFS –– 加密文件系统(Cryptographic File System)和 TCFS –– 透明加密文件系统(Transparent Cryptographic File System)

CFS 是一种用来加密整个目录树并允许用户在其中保存加密文件的方法。它使用在本地计算机上运行的 NFS 服务器。详情及源代码请参见 AT&T 网站

TCFS 通过加入与文件系统更好的集成性改善了 CFS。因此,当文件系统加密后,它对用户是透明的。详情请参见 TCFS 网站

它也不需要用于整个文件系统。它对目录树也起作用。

X11、SVGA 和屏幕安全性

X11

保护你的图形屏幕显示对您来说很重要。它可以阻止攻击者在您输入密码的时候窃取它们,或是当您在屏幕上阅读信息的时候偷看,甚或通过某个安全漏洞得到 root 访问权限。跨越网络远程运行 X 应用程序也会隐藏危险。它能让窃听者看到您对远程系统的所有操作。

X 有许多访问控制机制。其中最简单的是基于主机的:使用 xhost 来指定被允许访问您屏幕显示的主机。这并不十分安全,因为如果某人能够访问您的计算机,他就可以执行 xhost + 它的计算机 从而方便地进入。同样,如果您不得不允许某个不被信任的计算机访问,那里的任何人都能够攻破您的屏幕显示。

如果您正在使用 xdm (X 显示管理器)或是与其对应的 KDE 程序 KDM 来登录,您就能获得一个更好的访问方式:MIT-MAGIC-COOKIE-1。它将会生成一个 128 位的 "cookie" 并将其保存于您的 .Xauthority 文件中。如果您需要允许某个远程计算机访问您的屏幕显示,您可以使用 xauth 命令和您的 .Xauthority 文件中的信息来只对那个连接提供访问权限。请参见 Linux 文档项目组网站上的 Remote-X-Apps mini-howto 一文。

您也能使用 ssh (参见"ssh (Secure SHell -- 安全 SHell)和 stelnet")来允许安全的 X 连接。其优点在于既对最终用户透明,又意味着网络上没有未被加密的数据流。

您也可以对您的 X 服务器使用 -nolisten tcp 选项来禁止一切远程连接。这会阻止任何通过 tcp 套接字到您服务器的连接。

有关 X 安全性的详情请参见 Xsecurity(7x)。最安全的方式是使用 xdm 登录到您的终端,然后使用 ssh 连接到您希望运行 X 程序的远端站点。

SVGA

SVGAlib 中的程序一般具有 suid-root 属性,以便访问您 GNU/Linux 计算机的视频硬件设备。这令它们非常危险。如果它们崩溃,一般您需要重新启动您的计算机以重新得到一个可用的终端。请确定您在运行的所有 SVGA 程序是可靠的,并至少能够获得某种程度的信任。最好是不要运行它们。

GGI (Generic Graphics Interface Project -- 通用图形接口项目)

GNU/Linux GGI 项目是为了解决一些 GNU/Linux 上视频接口的问题。GGI 将把一小段视频代码插入 GNU/Linux 内核,然后控制对视频系统的访问。这意味着 GGI 能够随时将您的终端恢复到某个已知的良好状态下。它们也允许使用安全注意密钥(secure attention key),因此您就能够确定您的终端上运行的 login 程序不是一个特洛伊木马。详情请参见 GGI 项目网站。