pkg://Shadow-Password-HOWTO-html.tar.gz:25518/Shadow-Password-HOWTO-2.html
downloads
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
<META NAME="GENERATOR" CONTENT="ZH-SGML-Tools 1.0.9">
<TITLE>如何取得,安装,设定 shadow 密码: 为何 shadow 你的 passwd 档?</TITLE>
<LINK HREF="Shadow-Password-HOWTO-3.html" REL=next>
<LINK HREF="Shadow-Password-HOWTO-1.html" REL=previous>
<LINK HREF="Shadow-Password-HOWTO.html#toc2" REL=contents>
</HEAD>
<BODY>
<A HREF="Shadow-Password-HOWTO-3.html">Next</A>
<A HREF="Shadow-Password-HOWTO-1.html">Previous</A>
<A HREF="Shadow-Password-HOWTO.html#toc2">Contents</A>
<HR>
<H2><A NAME="s2">2. 为何 shadow 你的 passwd 档?</A></H2>
<P>大部分目前 Linux 发行版本预设值并未包含<EM>Shadow Suite</EM> 安装。
这些版本包括 Slackware 2.3, Slackware 3.0 和其他受欢迎的发行版本。
主要原因之一是在原始<EM>Shadow Suite</EM>版权声明中并未很清楚的描述该软体是
否需使用者付费。 Linux 使用 GNU 版权通常允续使用者可免费且任意使用相关套件。
<P>
<P><EM>Shadow Suite</EM>现在维护人员
<A HREF="mailto:marekm@i17linuxb.ists.pwr.wroc.pl">Marek Michalkiewicz <marekm@i17linuxb.ists.pwr.wroc.pl></A>
已经可以从在 BSD 样式允需再使用版权之原始作者那接收原始码。 目前版权发行已
解决,因此可以预期在未来版本之预设值将包括 password shadowing。 即使如此,
你仍需要自行安装。
<P>
<P>如果你的版本是从 CD-ROM 安装。你可能发现即使目前版本并未有<EM>Shadow Suite</EM>
安装,但你仍然可以在该片 CD-ROM 找到你需要安装的<EM>Shadow Suite</EM>。
<P>
<P><EM>然而,所有Shadow Suite 3.3.1, 3.3.1-2 版本和 shadow-mk 伴随签入(login)程式和
其他<EM>suid root</EM>程式均有安全上问题,因此不应该使用太久。</EM>
<P>
<P>所有必要档案均可以透过匿名 FTP 站或网站找到。
<P>在没有安装<EM>Shadow Suite</EM>的 Linux 系统,包括密码的帐号使用者资讯通常储存在
<CODE>/etc/passwd</CODE> 档。
储存的密码为 <EM>加密(encrypted)</EM>格式。 然而,如果你问一个密码专家,他/她将
告诉你真正的密码档只是<EM>编码(encoded)</EM>而不是<EM>加密</EM>格式,因为当使用
crypt(3) 时,文字档倍设为 null 且密码是键值(key)。 因此,接下来我将在这篇文件中使用
<EM>编码</EM>。
<P>
<P>使用在密码栏位编码的演算法於技术上是使用<EM>one way hash function</EM>。这是一个
在单一方向计算简单但逆向计算非常困难的演算法。关於这正确的演算法可以在 2.4 节或
於 crypt(3) 操作手册找到。
<P>
<P>当使用者挑选或指定一个密码,系统将随机产生一个值,叫做<EM>salt</EM>,将密码进行
编码。 这表示任何特定的密码可以 4096 中不同方法储存。 <EM>salt</EM> 值将储存被编
码的密码 。
<P>当使用者签入或提供一个密码, <EM>salt</EM> 首先接收欲储存编码密码。然後这提供密码
会和 <EM>salt</EM> 值一起<EM>编码</EM>,且比较已经<EM>编码</EM>密码。如果有 match
,该使用者通过权限检查。
<P>
<P>随机<EM>编码</EM>和复原原始密码是有计算复杂度的(但不是不可能的)。然而,在某些系统
很多使用者的密码都设为一般文字(或是一般文字的简单变化)
<P>
<P>系统骇客知道这件事,且将简单的加密文字和一般使用4096 <EM>salt</EM> 值密码之目录。然
後他们将比较在资料库之 <CODE>/etc/passwd</CODE> 档之编码密码,只要他们找到一个比对,他们
可以找到一个帐号之密码。这和<EM>dictionary attack</EM>有关,且用於未经许可存取系统取
得和展开常用的方法之一。
<P>
<P>如果你想过一个 8 码的密码编码成 4096 * 13 码的字串,那麽一个用在描述 400,000 一般文字
、名字、密码和简单变化的字典将需要 4GB 硬碟存取空间。 骇客需要做的只是分类字串跟检查
比对结果。 自从 4GB 硬碟可以以美金 1000.00 以下买到後,对大多数系统骇客的意义可想而
知 。
<P>如果骇客首先发现你的 <CODE>/etc/passwd</CODE> 档,他们只需要将真正包含在
<CODE>/etc/passwd</CODE> 档 <CODE>salt</CODE> 值的字典编码,这方法可由拥有486级电脑或几个有
几百 MB 硬碟空间的十来岁的小孩适用。
<P>
<P>即使没有很大的磁碟空间,像 crack(1) 的工具程式通常可以在足够使用者系统中至少破解一对
密码(假设系统使用者倍允许挑选他们想要的密码)。
<P>
<P><CODE>/etc/passwd</CODE> 档也包括一些相关资讯,像使用者 ID 和群组 ID所使用的系统程式;因此
<CODE>/etc/passwd</CODE> 档 <EM>必须</EM> 保持全世界可读性. 如果你改变 <CODE>/etc/passwd</CODE>
档以致於没有人可以读取,你将发现的第一件事是 <CODE>ls -l</CODE> 命令将取代名称而显示使用者 ID
。
<P><EM>Shadow Suite</EM> 透过将密码存至另一个档(通常是 <CODE>/etc/shadow</CODE> 档)来解决该
问题。 <CODE>/etc/shadow</CODE> 档对任何人设定可读档,只有 <EM>root</EM> 权限可以读写
<CODE>/etc/shadow</CODE> 档。某些程式(像 xlock)不需要改变密码,只需要确认密码即可。这些程式
可以以 <EM>suid root</EM> 执行或者你可以设定一个群组 <EM>shadow</EM> 用来唯读
<CODE>/etc/shadow</CODE> 档,然後这些程式可以执行 <EM>sgid shadow</EM>。
<P>透过移动密码至 <CODE>/etc/shadow</CODE> 档,我们可以有力的备有骇客从存取编码密码到执行
<EM>dictionary attack</EM> 的证据。
<P>除此之外, <EM>Shadow Suite</EM> 新增许多特色:
<UL>
<LI>设定档於设定为签入时预设(<CODE>/etc/login.defs</CODE>)</LI>
<LI>新增、修改和删除使用者帐号群组之工具程式</LI>
<LI>密码寿命计算及到期日</LI>
<LI>帐号到期日跟锁死</LI>
<LI>隐藏群组密码 (可选择的)</LI>
<LI>两倍长度密码 (16 字元密码) [不建议使用]</LI>
<LI>针对使用者密码选择有较好的控制</LI>
<LI>可拨接密码</LI>
<LI>备用有效权限程式 [不建议使用]</LI>
</UL>
<P>安装 <EM>Shadow Suite</EM> 贡献为有更安全系统,但是还有其他方法可以改善 Linux 系统的安全
,且最终将有一系列的 Linux 安全 HOWTO's 将讨论其他安全基准和相关文件版本.
<P>
<P>针对目前其他 Linux 安全文件资讯,请参照网址:
<A HREF="http://bach.cis.temple.edu/linux/linux-security/">Linux Security home page.</A><P>
<P>
<H2><A NAME="ss2.1">2.1 为何您不要 shadow 你的 passwd 档</A>
</H2>
<P>有一些状况跟设定运用在安装 <EM>Shadow Suite</EM> 将 <EM>不是</EM> 好主意:
There are a few circumstances and configurations in which installing the
<EM>Shadow Suite</EM> would <EM>NOT</EM> be a good idea:
<UL>
<LI>主机没有包含使用者帐号。</LI>
<LI>主机是在 LAN 上跑且使用网路资讯服务(Network Information
Services, NIS)得到或供应使用者名称和密给网路上的其他机器使用(事实上这还是
可以执行,但是实际上并不能增加任何安全)。</LI>
<LI>机器是使用终端主机来验证使用者经由 NFS(Network File System), NIS 或
某些其他方法。</LI>
<LI>机器跑其他软体验证使用者且没有任何 shadow 版本或原始码可获得。</LI>
</UL>
<P>
<P>
<H2><A NAME="ss2.2">2.2 格式化 /etc/passwd 档</A>
</H2>
<P>一个 non-shadowed <CODE>/etc/passwd</CODE> 档格式如下所示:
<BLOCKQUOTE><CODE>
<PRE>
username:passwd:UID:GID:full_name:directory:shell
</PRE>
</CODE></BLOCKQUOTE>
其中
<DL>
<DT><B><CODE>username</CODE></B><DD><P>使用者(签入)名称
<DT><B><CODE>passwd</CODE></B><DD><P>编码密码
<DT><B><CODE>UID</CODE></B><DD><P>使用者编号
<DT><B><CODE>GID</CODE></B><DD><P>预设存组编号
<DT><B><CODE>full_name</CODE></B><DD><P>使用者全名 - 事实上这个栏位称作 GECOS (General
Electric Comprehensive Operating System) 栏位且可以储存全名外的资讯。Shadow
commands and manual pages refer to this field as the comment field.
<DT><B><CODE>directory</CODE></B><DD><P>使用者根目录 (绝对路径)
<DT><B><CODE>shell</CODE></B><DD><P>使用者签入的环境 (绝对路径)
</DL>
举例说明:
<BLOCKQUOTE><CODE>
<PRE>
username:Npge08pfz4wuk:503:100:Full Name:/home/username:/bin/sh
</PRE>
</CODE></BLOCKQUOTE>
中,<CODE>Np</CODE> 是 salt 且 <CODE>ge08pfz4wuk</CODE> 是<EM>编码</EM>密码。
已编码的 salt/password 就像 <CODE>kbeMVnZM0oL7I</CODE> 且这两个字串是一样的密码。对相同
密码可能有 4096 种可能的编码。(本□例的密码是 "passwaor",这是比较 <EM>不好</EM> 的密码)。
<P>
<P>只要 shadow suite 已经安装, <CODE>/etc/passwd</CODE> 档将被替代成:
<BLOCKQUOTE><CODE>
<PRE>
username:x:503:100:Full Name:/home/username:/bin/sh
</PRE>
</CODE></BLOCKQUOTE>
本□例之第二栏位 <CODE>x</CODE> 现在只是一个 place holder。 <CODE>/etc/passwd</CODE>档的格式
并未真的改变,只是不再包含 <EM>编码</EM>密码。这表示任何程式可以读取 <CODE>/etc/passwd</CODE>
档,但并不真的需要确认密码是不是正确地运作。
<P>
<P>这些密码现在被重新放在 shadow 档(通常是在 <CODE>/etc/shadow</CODE> 档)。
<P>
<H2><A NAME="ss2.3">2.3 格式化 shadow 档</A>
</H2>
<P><CODE>/etc/shadow</CODE> 档包括下列资讯:
<BLOCKQUOTE><CODE>
<PRE>
username:passwd:last:may:must:warn:expire:disable:reserved
</PRE>
</CODE></BLOCKQUOTE>
其中
<DL>
<DT><B><CODE>username</CODE></B><DD><P>使用者名称
<DT><B><CODE>passwd</CODE></B><DD><P>编码密码
<DT><B><CODE>last</CODE></B><DD><P>密码上次更动日期,以从1970年1月1日算起的天数代表
<DT><B><CODE>may</CODE></B><DD><P>密码改变前天数
<DT><B><CODE>must</CODE></B><DD><P>密码最常使用天数
<DT><B><CODE>warn</CODE></B><DD><P>代表期限前几天就事先警告使用者
<DT><B><CODE>expire</CODE></B><DD><P>超过密码过期天数後,就关闭该帐号
<DT><B><CODE>disable</CODE></B><DD><P>帐号关闭,以从1970年1月1日算起的天数代表
<DT><B><CODE>reserved</CODE></B><DD><P>预备栏位
</DL>
依照之前□例将变成:
<BLOCKQUOTE><CODE>
<PRE>
username:Npge08pfz4wuk:9479:0:10000::::
</PRE>
</CODE></BLOCKQUOTE>
<P>
<H2><A NAME="ss2.4">2.4 回顾 crypt(3).</A>
</H2>
<P>从 crypt(3) 使用者文件得到:
<P>"<EM>crypt</EM> 是密码加密方程式。
It is based on the <EM>Data Encryption Standard</EM> algorithm with variations
intended (among other things) to discourage use of hardware implementations of
a key search.
<P>[The] key 是使用者输入的密码。 [编码字串全是 NULLs]
<P>[The] <EM>salt</EM> 是从 [a-zA-Z0-9./] 集合中选出的两个位元字串。
该字串是用於扰乱在 4096 种不同方法之一个演算法。
<P>透过得到 key 的每个位元的最低 7 bit[s],可以建立 56-bit key 。 这56-bit key
是用在重复加密一个常数字串(通常是包含所有灵的字串)。 传回值指到加密密码是一连串
可印出之13个 ASCII 字元(最前面的一两个字元表示 salt 本身)。 透过每次的呼叫可将
传回直指到静态资料。
<P>
<P>
<B>警告讯息:</B> Key space 包括 2**56 即等於 7.2e16 可能的值。与用重大的平行电脑
将 Key space 极尽的搜寻<B>是可能</B>。像 <CODE>crack(1)</CODE> 软体用来搜寻部分的由人
产生之密码的 key space 是可获得的。因此,密码的选择至少应该避免使用一般字及名字。
一个用来检查解开密码选择的 <CODE>passwd(1)</CODE> 程式使用是值得推荐的。
<P>
<P>DES 演算法本身有一些使 <CODE>crypt(3)</CODE> 在任何其他密码权限区隔介面很差选择的使用
方面剧变。如果你计画使用 <CODE>crypt(3)</CODE> 介面来加密计画,以下描述千万别这麽作:
得要一本加密好书和广泛获得 DES 程式库 ." 一起使用。
<P>大多 <EM>Shadow Suites</EM> 包括 16 位元的密码长度两倍之原始码。 在 <CODE>des</CODE> 专
家建议避免使用当开始对较常密码先简单的编码左半然後右半。由於 <CODE>crypt</CODE> 运作方法
,这将造成 <EM>较差的</EM> 安全编码密码。除此之外,使用者有可能记住 16 位元密码是
一件比较差的事情。
<P>
<P>目前有允许权限理论用以取代某些更安全和支援较长密码(例如 MD5 演算法)且保有和
<CODE>crypt</CODE> 方法相容的发展工作正在进行。
<P>
<P>如果你正在寻找一本加密的好书,建议如下:
<PRE>
"Applied Cryptography: Protocols, Algorithms, and Source Code in C"
by Bruce Schneier <schneier@chinet.com>
ISBN: 0-471-59756-2
</PRE>
<P>
<P>
<HR>
<A HREF="Shadow-Password-HOWTO-3.html">Next</A>
<A HREF="Shadow-Password-HOWTO-1.html">Previous</A>
<A HREF="Shadow-Password-HOWTO.html#toc2">Contents</A>
</BODY>
</HTML>