如何取得,安装,设定 shadow 密码 <author>作者: Michael H. Jackson, <tt><htmlurl url="mailto:mhjack@tscnet.com" name="mhjack@tscnet.com"></tt><newline> 译者: Sung Min-Ju, <tt><htmlurl url="mailto:songmj@ms1.hinet.net" name="songmj@ms1.hinet.net"></tt> <date>v1.3, 3 April 1996 翻译日期: 15 MAY 2000 <abstract> 这份文件主要描述如何取得,安装和设定 <em>Shadow Suite</em> 密码。 它也描述取得和安装需要存取使用者密码之其他软体和网路监控程式(network daemons)。 这些其他软体不是 Shadow Suit 的真实部分,但是这些程式将需要被重新编译用以支援 <em>Shadow Suite</em> 。这份文件亦包括一个程式□例:对程式加入 shadow 支援。 本文结尾部分为常问问题及答案。 </abstract> <!-- Table of contents --> <toc> <!-- Begin the document --> <sect><heading>简介 <p> 这篇文章为 Linux Shadow-Password-HOWTO。 主要是在描述为何及如何於 Linux 系统加入 shadow 密码支援。 其亦包括如何使用 <em>Shadow Suite's</em> 某些□例。 <p> 当进行 <em>Shadow Suite</em> 安装及使用许多的 utility 程式时.你必须以 <em>root</em> 权限签入。 且进行 <em>Shadow Suite</em> 安装时,系统软体将被改变,因此强烈的建议 您照说明档备分程式。在此强调在您开始作业前需先阅读及了解所有的说明书。 <sect1><heading>更改上一版本部分 <p> <verb>新增: 新增一个子节:为何您不要安装 shadow 新增一个子节:修改 xdm 程式 新增一节:为何您不要安装 shadow 新增一节:如何於未来运作 Shadow Suite 新增一节:常问问题及答案 更正/修改: 更正在 Sunsite 的 html 参考资料 更正在 wu-ftp 节在 Makefile 新增 -lshadow 更正较不严重拼音和措词错误 更改 wu-ftp 节用以支援 ELF 修改在不同签入(login)程式安全问题 修改 Linux Shadow Suite 建议为 Marek Michalkiewicz </verb> <sect1><heading>新版文件 <p> 您可利用匿名档进入该 FTP 站下载最新版文件: <bf>sunsite.unc.edu</bf> <verb>/pub/Linux/docs/HOWTO/Shadow-Password-HOWTO</verb> or: <verb>/pub/Linux/docs/HOWTO/other-formats/Shadow-Password-HOWTO{-html.tar,ps,dvi}.gz</verb> 或透过网站: <url url="http://sunsite.unc.edu/mdw/linux.html" name="Linux Documentation Project Web Server">,网页: <url url="http://sunsite.unc.edu/linux/HOWTO/Shadow-Password-HOWTO.html" name="Shadow-Password-HOWTO"> 或与我联络: <tt><mhjack@tscnet.com></tt>. 亦可透过新闻群组张贴: <tt>comp.os.linux.answers</tt> <p> 这些文件现在已经包於 Shadow-YYDDMM 套件中。 <sect1><heading>回覆 <p> 请将任何评语、修改或建议寄至: <htmlurl url="mailto:mhjack@tscnet.com" name="Michael H. Jackson <mhjack@tscnet.com>"> 我会尽快回覆并更正该文件。 如果你发现任何问题,请直接 email 给我,我会将此最新技术张贴於新闻群组。 <sect><heading>为何 shadow 你的 passwd 档? <p> 大部分目前 Linux 发行版本预设值并未包含<em>Shadow Suite</em> 安装。 这些版本包括 Slackware 2.3, Slackware 3.0 和其他受欢迎的发行版本。 主要原因之一是在原始<em>Shadow Suite</em>版权声明中并未很清楚的描述该软体是 否需使用者付费。 Linux 使用 GNU 版权通常允续使用者可免费且任意使用相关套件。 <p> <em>Shadow Suite</em>现在维护人员<htmlurl url="mailto:marekm@i17linuxb.ists.pwr.wroc.pl" name="Marek Michalkiewicz <marekm@i17linuxb.ists.pwr.wroc.pl>"> 已经可以从在 BSD 样式允需再使用版权之原始作者那接收原始码。 目前版权发行已 解决,因此可以预期在未来版本之预设值将包括 password shadowing。 即使如此, 你仍需要自行安装。 <p> 如果你的版本是从 CD-ROM 安装。你可能发现即使目前版本并未有<em>Shadow Suite</em> 安装,但你仍然可以在该片 CD-ROM 找到你需要安装的<em>Shadow Suite</em>。 <p> <em>然而,所有Shadow Suite 3.3.1, 3.3.1-2 版本和 shadow-mk 伴随签入(login)程式和 其他<em>suid root</em>程式均有安全上问题,因此不应该使用太久。 </em> <p> 所有必要档案均可以透过匿名 FTP 站或网站找到。 <p> 在没有安装<em>Shadow Suite</em>的 Linux 系统,包括密码的帐号使用者资讯通常储存在 <tt>/etc/passwd</tt> 档。 储存的密码为 <em>加密(encrypted)</em>格式。 然而,如果你问一个密码专家,他/她将 告诉你真正的密码档只是<em>编码(encoded)</em>而不是<em>加密</em>格式,因为当使用 crypt(3) 时,文字档倍设为 null 且密码是键值(key)。 因此,接下来我将在这篇文件中使用 <em>编码</em>。 <p> 使用在密码栏位编码的演算法於技术上是使用<em>one way hash function</em>。这是一个 在单一方向计算简单但逆向计算非常困难的演算法。关於这正确的演算法可以在 2.4 节或 於 crypt(3) 操作手册找到。 <p> 当使用者挑选或指定一个密码,系统将随机产生一个值,叫做<em>salt</em>,将密码进行 编码。 这表示任何特定的密码可以 4096 中不同方法储存。 <em>salt</em> 值将储存被编 码的密码 。 <p> 当使用者签入或提供一个密码, <em>salt</em> 首先接收欲储存编码密码。然後这提供密码 会和 <em>salt</em> 值一起<em>编码</em>,且比较已经<em>编码</em>密码。如果有 match ,该使用者通过权限检查。 <p> 随机<em>编码</em>和复原原始密码是有计算复杂度的(但不是不可能的)。然而,在某些系统 很多使用者的密码都设为一般文字(或是一般文字的简单变化) <p> 系统骇客知道这件事,且将简单的加密文字和一般使用4096 <em>salt</em> 值密码之目录。然 後他们将比较在资料库之 <tt>/etc/passwd</tt> 档之编码密码,只要他们找到一个比对,他们 可以找到一个帐号之密码。这和<em>dictionary attack</em>有关,且用於未经许可存取系统取 得和展开常用的方法之一。 <p> 如果你想过一个 8 码的密码编码成 4096 * 13 码的字串,那麽一个用在描述 400,000 一般文字 、名字、密码和简单变化的字典将需要 4GB 硬碟存取空间。 骇客需要做的只是分类字串跟检查 比对结果。 自从 4GB 硬碟可以以美金 1000.00 以下买到後,对大多数系统骇客的意义可想而 知 。 <p> 如果骇客首先发现你的 <tt>/etc/passwd</tt> 档,他们只需要将真正包含在 <tt>/etc/passwd</tt> 档 <tt>salt</tt> 值的字典编码,这方法可由拥有486级电脑或几个有 几百 MB 硬碟空间的十来岁的小孩适用。 <p> 即使没有很大的磁碟空间,像 crack(1) 的工具程式通常可以在足够使用者系统中至少破解一对 密码(假设系统使用者倍允许挑选他们想要的密码)。 <p> <tt>/etc/passwd</tt> 档也包括一些相关资讯,像使用者 ID 和群组 ID所使用的系统程式;因此 <tt>/etc/passwd</tt> 档 <em>必须</em> 保持全世界可读性. 如果你改变 <tt>/etc/passwd</tt> 档以致於没有人可以读取,你将发现的第一件事是 <tt>ls -l</tt> 命令将取代名称而显示使用者 ID 。 <p> <em>Shadow Suite</em> 透过将密码存至另一个档(通常是 <tt>/etc/shadow</tt> 档)来解决该 问题。 <tt>/etc/shadow</tt> 档对任何人设定可读档,只有 <em>root</em> 权限可以读写 <tt>/etc/shadow</tt> 档。某些程式(像 xlock)不需要改变密码,只需要确认密码即可。这些程式 可以以 <em>suid root</em> 执行或者你可以设定一个群组 <em>shadow</em> 用来唯读 <tt>/etc/shadow</tt> 档,然後这些程式可以执行 <em>sgid shadow</em>。 <p> 透过移动密码至 <tt>/etc/shadow</tt> 档,我们可以有力的备有骇客从存取编码密码到执行 <em>dictionary attack</em> 的证据。 <p> 除此之外, <em>Shadow Suite</em> 新增许多特色: <itemize> <item>设定档於设定为签入时预设(<tt>/etc/login.defs</tt>) <item>新增、修改和删除使用者帐号群组之工具程式 <item>密码寿命计算及到期日 <item>帐号到期日跟锁死 <item>隐藏群组密码 (可选择的) <item>两倍长度密码 (16 字元密码) [不建议使用] <item>针对使用者密码选择有较好的控制 <item>可拨接密码 <item>备用有效权限程式 [不建议使用] </itemize> <p> 安装 <em>Shadow Suite</em> 贡献为有更安全系统,但是还有其他方法可以改善 Linux 系统的安全 ,且最终将有一系列的 Linux 安全 HOWTO's 将讨论其他安全基准和相关文件版本. <p> 针对目前其他 Linux 安全文件资讯,请参照网址:<url url="http://bach.cis.temple.edu/linux/linux-security/" name="Linux Security home page."> <sect1><heading>为何您不要 shadow 你的 passwd 档 <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: <itemize> <item>主机没有包含使用者帐号。 <item>主机是在 LAN 上跑且使用网路资讯服务(Network Information Services, NIS)得到或供应使用者名称和密给网路上的其他机器使用(事实上这还是 可以执行,但是实际上并不能增加任何安全)。 <item>机器是使用终端主机来验证使用者经由 NFS(Network File System), NIS 或 某些其他方法。 <item>机器跑其他软体验证使用者且没有任何 shadow 版本或原始码可获得。 </itemize> <sect1><heading>格式化 /etc/passwd 档 <p> 一个 non-shadowed <tt>/etc/passwd</tt> 档格式如下所示: <tscreen><verb>username:passwd:UID:GID:full_name:directory:shell</verb></tscreen> 其中 <descrip> <tag/<tt>username</tt></tag> 使用者(签入)名称 <tag/<tt>passwd</tt></tag> 编码密码 <tag/<tt>UID</tt></tag> 使用者编号 <tag/<tt>GID</tt></tag> 预设存组编号 <tag/<tt>full_name</tt></tag> 使用者全名 - 事实上这个栏位称作 GECOS (General Electric Comprehensive Operating System) 栏位且可以储存全名外的资讯。Shadow commands and manual pages refer to this field as the comment field. <tag/<tt>directory</tt></tag> 使用者根目录 (绝对路径) <tag/<tt>shell</tt></tag> 使用者签入的环境 (绝对路径) </descrip> 举例说明: <tscreen><verb>username:Npge08pfz4wuk:503:100:Full Name:/home/username:/bin/sh</verb> </tscreen> 中,<tt>Np</tt> 是 salt 且 <tt>ge08pfz4wuk</tt> 是<em>编码</em>密码。 已编码的 salt/password 就像 <tt>kbeMVnZM0oL7I</tt> 且这两个字串是一样的密码。对相同 密码可能有 4096 种可能的编码。(本□例的密码是 "passwaor",这是比较 <em>不好</em> 的密码)。 <p> 只要 shadow suite 已经安装, <tt>/etc/passwd</tt> 档将被替代成: <tscreen><verb>username:x:503:100:Full Name:/home/username:/bin/sh</verb></tscreen> 本□例之第二栏位 <tt>x</tt> 现在只是一个 place holder。 <tt>/etc/passwd</tt>档的格式 并未真的改变,只是不再包含 <em>编码</em>密码。这表示任何程式可以读取 <tt>/etc/passwd</tt> 档,但并不真的需要确认密码是不是正确地运作。 <p> 这些密码现在被重新放在 shadow 档(通常是在 <tt>/etc/shadow</tt> 档)。 <sect1><heading>格式化 shadow 档 <p> <tt>/etc/shadow</tt> 档包括下列资讯: <tscreen><verb>username:passwd:last:may:must:warn:expire:disable:reserved</verb></tscreen> 其中 <descrip> <tag/<tt>username</tt></tag> 使用者名称 <tag/<tt>passwd</tt></tag> 编码密码 <tag/<tt>last</tt></tag> 密码上次更动日期,以从1970年1月1日算起的天数代表 <tag/<tt>may</tt></tag> 密码改变前天数 <tag/<tt>must</tt></tag> 密码最常使用天数 <tag/<tt>warn</tt></tag> 代表期限前几天就事先警告使用者 <tag/<tt>expire</tt></tag> 超过密码过期天数後,就关闭该帐号 <tag/<tt>disable</tt></tag> 帐号关闭,以从1970年1月1日算起的天数代表 <tag/<tt>reserved</tt></tag> 预备栏位 </descrip> 依照之前□例将变成: <tscreen><verb>username:Npge08pfz4wuk:9479:0:10000::::</verb></tscreen> <sect1><heading>回顾 crypt(3). <p> 从 crypt(3) 使用者文件得到: <p> &dquot;<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> <bf>警告讯息:</bf> Key space 包括 2**56 即等於 7.2e16 可能的值。与用重大的平行电脑 将 Key space 极尽的搜寻<bf>是可能</bf>。像 <tt>crack(1)</tt> 软体用来搜寻部分的由人 产生之密码的 key space 是可获得的。因此,密码的选择至少应该避免使用一般字及名字。 一个用来检查解开密码选择的 <tt>passwd(1)</tt> 程式使用是值得推荐的。 <p> DES 演算法本身有一些使 <tt>crypt(3)</tt> 在任何其他密码权限区隔介面很差选择的使用 方面剧变。如果你计画使用 <tt>crypt(3)</tt> 介面来加密计画,以下描述千万别这麽作: 得要一本加密好书和广泛获得 DES 程式库 .&dquot 一起使用。 <p> 大多 <em>Shadow Suites</em> 包括 16 位元的密码长度两倍之原始码。 在 <tt>des</tt> 专 家建议避免使用当开始对较常密码先简单的编码左半然後右半。由於 <tt>crypt</tt> 运作方法 ,这将造成 <em>较差的</em> 安全编码密码。除此之外,使用者有可能记住 16 位元密码是 一件比较差的事情。 <p> 目前有允许权限理论用以取代某些更安全和支援较长密码(例如 MD5 演算法)且保有和 <tt>crypt</tt> 方法相容的发展工作正在进行。 <p> 如果你正在寻找一本加密的好书,建议如下: <verb> "Applied Cryptography: Protocols, Algorithms, and Source Code in C" by Bruce Schneier <schneier@chinet.com> ISBN: 0-471-59756-2 </verb> <sect><heading>取得 Shadow Suite. <sect1><heading>Shadow Suite for Linux 的历史(暂不翻译) <sect1><heading>History of the Shadow Suite for Linux <p> <em>DO NOT USE THE PACKAGES IN THIS SECTION, THEY HAVE SECURITY PROBLEMS</em> <p> The original <em>Shadow Suite</em> was written by <tt>John F. Haugh II</tt>. <p> There are several versions that have been used on Linux systems: <itemize> <item><tt>shadow-3.3.1</tt> is the original. <item><tt>shadow-3.3.1-2</tt> is Linux specific patch made by <htmlurl url="mailto:flla@stud.uni-sb.de" name="Florian La Roche <flla@stud.uni-sb.de>"> and contains some further enhancements. <item><tt>shadow-mk</tt> was specifically packaged for Linux. </itemize> <p> The <tt>shadow-mk</tt> package contains the <tt>shadow-3.3.1</tt> package distributed by <tt>John F. Haugh II</tt> with the <tt>shadow-3.3.1-2 patch</tt> installed, a few fixes made by <htmlurl url="mailto:magnus@texas.net" name="Mohan Kokal <magnus@texas.net>"> that make installation a lot easier, a patch by <tt>Joseph R.M. Zbiciak</tt> for <tt>login1.c</tt> (login.secure) that eliminates the -f, -h security holes in /bin/login, and some other miscellaneous patches. <p> The <tt>shadow.mk</tt> package was the <em>previously</em> recommended package, but should be replaced due to a <em>security problem</em> with the <tt>login</tt> program. <p> There are <em>security problems</em> with Shadow versions 3.3.1, 3.3.1-2, and shadow-mk involving the <tt>login</tt> program. This <tt>login</tt> bug involves not checking the length of a login name. This causes the buffer to overflow causing crashes or worse. It has been rumored that this buffer overflow can allow someone with an account on the system to use this bug and the shared libraries to gain <em>root</em> access. I won't discuss exactly how this is possible because there are a lot of Linux systems that are affected, but systems with these <em>Shadow Suites</em> installed, and most pre-ELF distributions <em>without</em> the <em>Shadow Suite</em> are vulnerable! <p> For more information on this and other Linux security issues, see the <url url="http://bach.cis.temple.edu/linux/linux-security/Linux-Security-FAQ/Linux-telnetd.html" name="Linux Security home page (Shared Libraries and login Program Vulnerability)"> <sect1><heading>如何取得 Shadow Suite? <p> 目前建议 <em>Shadow Suite</em> 版本目前还是 BETA 测试版,然後,最近版本在生产环境 是安全的且没有包含易受攻击的 <tt>签入(login)</tt> 程式。 <p> 该套件(package)使用惯例命名为: <tscreen><verb>shadow-YYMMDD.tar.gz</verb></tscreen> 其中 <tt>YYMMDD</tt> 是Suite 的发行日期。 <p> 目前 BETA 测试版本是 <em>Version 3.3.3</em> ,且由<htmlurl url="mailto:marekm@i17linuxb.ists.pwr.wroc.pl" name="Marek Michalkiewicz <marekm@i17linuxb.ists.pwr.wroc.pl>"> 维护。 还可以从该处得到: <url url="ftp://i17linuxb.ists.pwr.wroc.pl/pub/linux/shadow/shadow-current.tar.gz" name="shadow-current.tar.gz">. <p> 下列网站也可以找到相关资讯: <itemize> <item><htmlurl url="ftp://ftp.icm.edu.pl/pub/Linux/shadow/shadow-current.tar.gz" name="ftp://ftp.icm.edu.pl/pub/Linux/shadow/shadow-current.tar.gz"> <item><htmlurl url="ftp://iguana.hut.fi/pub/linux/shadow/shadow-current.tar.gz" name="ftp://iguana.hut.fi/pub/linux/shadow/shadow-current.tar.gz"> <item><htmlurl url="ftp://ftp.cin.net/usr/ggallag/shadow/shadow-current.tar.gz" name="ftp://ftp.cin.net/usr/ggallag/shadow/shadow-current.tar.gz"> <item><htmlurl url="ftp://ftp.netural.com/pub/linux/shadow/shadow-current.tar.gz" name="ftp://ftp.netural.com/pub/linux/shadow/shadow-current.tar.gz"> </itemize> <p> 你应该可以获得目前最新的版本。 <p> 你应该不要是用比 <tt>shadow-960129</tt> <em>更旧</em>版本,因为它们有 <tt>签入</tt> 的安全问题。 <p> <p> 於参考资料方面,我用 <tt>shadow-960129</tt> 档进行安装介绍。 <p> 如果你之前使用 <tt>shadow-mk</tt> ,你应该更信这个版本且重建编译。 <sect1><heading>Shadow Suite包含什麽? <p> <em>Shadow Suite</em> 包括对下列功能之替代程式: <p> <tt>su, login, passwd, newgrp, chfn, chsh, and id</tt> <p> 该套件还包括新程式: <p> <tt>chage, newusers, dpasswd, gpasswd, useradd, userdel, usermod, groupadd, groupdel, groupmod, groups, pwck, grpck, lastlog, pwconv, and pwunconv</tt> <p> 除此之外,函式库: <tt>libshadow.a</tt> 也包括需要存取使用者密码之写和编译程式。 <p> 程式之操作手册也包含在其中。 <p> 也有对签入程式的 configuration file ,它将被安装在 <tt>/etc/login.defs</tt> 档。 <sect><heading>编译程式 <sect1><heading>解压缩 <p> 在接收套件後第一个步骤就是 unpacking。该套件是 tar 档案格式使用 gzip 压缩 ,所以首先将该档案移到 <tt>/usr/src</tt> ,然後输入: <tscreen><verb>tar -xzvf shadow-current.tar.gz</verb></tscreen> <p> 这将会 unpack 到一个目录:<tt>/usr/src/shadow-YYMMDD</tt> <sect1><heading>设定 config.h 档 <p> 第一件事是你需要复制 <tt>Makefile</tt> 和 <tt>config.h</tt> 档: <tscreen><verb>cd /usr/src/shadow-YYMMDD cp Makefile.linux Makefile cp config.h.linux config.h</verb></tscreen> <p> 然後你应该留意 <tt>config.h</tt> 档。 该档案包括某些设定选项的定义。如果你使用 <em>建议</em> 套件,我建议你在第一次设定关掉 group shadow support。 <p> shadowed group passwords 预设值是开启的。 在 <tt>config.h</tt> 档关到这个设定, 且改变 <tt>#define SHADOWGRP</tt> 变成 <tt>#undef SHADOWGRP</tt>。我建议您一开始 关掉它们,然後如果你真的需要 group passwords 和 group administrators 时你在 开启它们和重新编译。 如果你开启它, 你 <em>必须</em> 建立 <tt>/etc/gshadow</tt> 档。 <p> 开启长密码的选项也不建议使用。 <p> <em>不要</em> 改变 <tt>#undef AUTOSHADOW</tt> 的设定。 <p> <tt>AUTOSHADOW</tt> 选项初始设计是用以让 shadow 可以像 function 一样执行。理论上 听起来不错,但是没办法正确的运作。 如果你开启这个选项,且这个程式以 root 权限在执 行, 它会像 root 权限执行一项呼叫 <tt>getpwnam()</tt> ,然後变更 <tt>/etc/passwd</tt> 档 (有<em>no-longer-shadowed 密码</em>)。 这类程式包括 chfn 和 chsh。(如果 root 在呼叫 <tt>getpwnam()</tt> 之前使用 chfn 和 chsh,使用者帐号将 没有办法真实且有效交易。) <p> 如果你要建立 libc,同样的警告也有效,它有个 <tt>SHADOW_COMPAT</tt> 作相同的事。 它 <em>不应该</em>被使用!如果你开始从你的 <tt>/etc/passwd</tt> 档撷取编码密码, 这会是个问题。 <p> 如果你正使用比 4.6.27 还高的 <tt>libc</tt> 版本,你将需要在 <tt>config.h</tt> 和 <tt>Makefile</tt>两个档做很多改变。 在 <tt>config.h</tt> 档的编辑和改变: 从: <tscreen><verb>#define HAVE_BASENAME</verb></tscreen> 到: <tscreen><verb>#undef HAVE_BASENAME</verb></tscreen> 然後在 <tt>Makefile</tt> 档的改变: <tscreen><verb>SOBJS = smain.o env.o entry.o susetup.o shell.o \ sub.o mail.o motd.o sulog.o age.o tz.o hushed.o SSRCS = smain.c env.c entry.c setup.c shell.c \ pwent.c sub.c mail.c motd.c sulog.c shadow.c age.c pwpack.c rad64.c \ tz.c hushed.c </verb></tscreen> <tscreen><verb>SOBJS = smain.o env.o entry.o susetup.o shell.o \ sub.o mail.o motd.o sulog.o age.o tz.o hushed.o basename.o SSRCS = smain.c env.c entry.c setup.c shell.c \ pwent.c sub.c mail.c motd.c sulog.c shadow.c age.c pwpack.c rad64.c \ tz.c hushed.c basename.c </verb></tscreen> 这些包含在 <tt>basename.c</tt> 程式码的改变均需倍包括在 <tt>libc 4.6.27</tt> 内。 <sect1><heading>备份原始程式 <p> 在 shadow suite 要更新时,制作程式备份将是一个很好的点子。在 Slackware 3.0 系统中, 这些档案是: <itemize> <item>/bin/su <item>/bin/login <item>/usr/bin/passwd <item>/usr/bin/newgrp <item>/usr/bin/chfn <item>/usr/bin/chsh <item>/usr/bin/id </itemize> <p> 这 BETA 套件已经有个 <em>储存</em> 在 Makefile 的目的档,但是 因为不同的版本通常将程式放在不同的地方,因此常被人评论。 <p> 你应该备份你的 <tt>/etc/passwd</tt> 档,但是你要很小心地命名,不然如我你将它放在 相同目录,你将无法重写 <tt>passwd</tt> 命令。 <sect1><heading>执行 make <p> <em>你需要以 root 权限签入以执行安装程序</em>. <p> 执行 make 来编译套件中的执行档: <tscreen><verb>make all</verb></tscreen> <p> 你可能会看到警告语: <tt>rcsid defined but not used</tt>. 这没关系, 因为作者使用版本控制套件才会发生。 <sect><heading>安装 <sect1><heading>手边准备一个开机片 <p> 如果真的发生严重错误,有个开机磁片之有用的。如果你要 boot/root 合并的安装,你可以 参考<url url="http://sunsite.unc.edu/mdw/HOWTO/Bootdisk-HOWTO.html" name="Bootdisk-HOWTO"> 以制作 root 开机之开机片。 <sect1><heading>移除复制的 man pages <p> 你也应该将操作手册更新,即使你很厉害到足以不用备份安装 Shadow Suite,你仍然要将 将旧的操作手册移除,因为新版的操作手册无法正常的覆盖旧版本。 <p> 你可以使用一个组合: <tt>man -aW 命令</tt> 和 <tt>locate 命令</tt> 寻找需备移除 的操作手册。在你执行 <tt>make install</tt> 前找出较旧版本比较容易。 <p> 如果你使用 Slackware 3.0 版本,然後你要移除的操作手册是: <itemize> <item>/usr/man/man1/chfn.1.gz <item>/usr/man/man1/chsh.1.gz <item>/usr/man/man1/id.1.gz <item>/usr/man/man1/login.1.gz <item>/usr/man/man1/passwd.1.gz <item>/usr/man/man1/su.1.gz <item>/usr/man/man5/passwd.5.gz </itemize> <p> 在 <tt>/var/man/cat[1-9]</tt> 次目录也有相同的名字需要被删除。 <sect1><heading>执行 make install <p> 现在你已经准备要输入: (以 root 权限执行) <tscreen<verb>make install</verb></tscreen> <p> 这将安装最新和更新程式且修复档案许可权。它也会安装操作手册。 <p> 这也将在安装时考虑将 Shadow Suite 包含档案放在正确的位置 <tt>/usr/include/shadow</tt> 。 <p> 使用 BETA 套件,你需要手动复制 <tt>login.defs</tt> 这个档到 <tt>/etc</tt> 这个目录下, 而且要确认只有 <em>root</em> 权限可以改变它。 <tscreen><verb>cp login.defs /etc chmod 700 /etc/login.defs</verb></tscreen> <p> 这个档案是 <em>签入</em> 程式的 configuration file。 你应该检查跟确定这个档的改变状况。 这是你决定哪个 tty 的 root 可以从哪里签入和设定其他安全方针的地方(像预设密码的到期日)。 <sect1><heading>执行 pwconv <p> 接下来的步骤是执行 <tt>pwconv</tt>。 这也需以 <em>root</em>执行且最好在 <tt>/etc</tt> 目录下执行: <tscreen><verb>cd /etc /usr/sbin/pwconv</verb></tscreen> <p> <tt>pwconv</tt> 撷取你的 <tt>/etc/passwd</tt> 档且删除某些栏位为了建立两个档案: <tt>/etc/npasswd</tt> 和 <tt>/etc/nshadow</tt>. <p> 一个 <tt>pwunconv</tt> 也提供你建立一个 <tt>/etc/passwd</tt> 和 <tt>/etc/shadow</tt> 组合的正常 <tt>/etc/passwd</tt> 档案。 <sect1><heading>重新命名 npasswd 和 nshadow <p> 现在你已经执行 <tt>pwconv</tt> ,而且你已经建立 <tt>/etc/npasswd</tt> 和 <tt>/etc/nshadow</tt> 档案。这需要复制到 <tt>/etc/passwd</tt> 和 <tt>/etc/shadow</tt> 档。 我们也需要复制原始 <tt>/etc/passwd</tt> 档,而且确定只有 root 可以读它。 我们将该档案放在 root 得根目录: <tscreen><verb>cd /etc cp passwd ~passwd chmod 600 ~passwd mv npasswd passwd mv nshadow shadow</verb></tscreen> <p> 你也应该确定档案的拥有者跟存取权限是正确的。 如果你将要使用 <em>X-Windows</em> , <tt>xlock</tt> 和 <tt>xdm</tt> 可能需要读取 <tt>shadow</tt> 档(但需不要写入该档)。 <p> 有两个方法可以做。 你可以设定 <tt>xlock</tt> 的 suid 是 root (<tt>xdm</tt> 通常以 root 权限执行)。 或者你可以使 root 成为 <tt>shadow</tt> 的群组可以拥有 <tt>shadow</tt> 档 ,但是在作这之前,要确定你已经有个 shadow group (可以在 <tt>/etc/group</tt> 档看到)。 不应改有任何使用者真的在 shadow group 。 <tscreen><verb>chown root.root passwd chown root.shadow shadow chmod 0644 passwd chmod 0640 shadow</verb></tscreen> <p> 你的系统现在有 shadow 的密码档罗。 你现在 <em>应该</em> 重开一个终端机视窗和确认你 可以签入(login)。 <p> <em>请马上确实的作这件事!</em> <p> 如过你不能,可能某些事情有错误罗! 为了要回到 to a non-shadowed 状态,请作下列步骤: <tscreen><verb>cd /etc cp ~passwd passwd chmod 644 passwd</verb></tscreen> <p> 你将重新储存这些档案到先前你储存它们的正确位置。 <sect><heading>其他你需要升级(upgrade)或补强(patch)程式 <p> 即使 shadow suite 对大部分需要存取密码档的程式可以包含更新程式,但是仍有一些需要 存取密码档的额外程式在系统中。 <p> 如果你正执行 <em>Debian 版本</em> (或者即使你不是),你可以找到 Debian 需要 rebuild 的原始码: ftp://ftp.debian.org/debian/stable/source/ <p> 这节剩馀的部分在讨论更新 <tt>adduser</tt>, <tt>wu_ftpd</tt>, <tt>ftpd</tt>, <tt>pop3d</tt>, <tt>xlock</tt>,<tt>xdm</tt> 和 <tt>sudo</tt> 程式以便於让这些程式支援 shadow suite。 <p> 请看 <ref id="sec-adding" name="Adding Shadow Support to a C program"> 这节,主要是在 讨论如何将 shadow 支援放到其他需要程式(虽然这些程式需要以 SUID root 执行或 SGID shadow 需正确存取 shadow 档)。 <sect1><heading>Slackware adduser 程式 <p> Slackware 版本包含一个新增使用者的交互程式叫做 <tt>/sbin/adduser</tt>。该程式的 shadow 版本可以在 <htmlurl url="ftp://sunsite.unc.edu/pub/Linux/system/ Admin/accounts/adduser.shadow-1.4.tgz" name="ftp://sunsite.unc.edu/pub/Linux/system/ Admin/accounts/adduser.shadow-1.4.tar.gz">找到。 <p> 我很鼓励你使用 <em>Shadow Suite</em> 供应的程式(例如<tt>useradd</tt>, <tt>usermod</tt>, 和 <tt>userdel</tt>) 来取代 slackware 的<tt>adduser</tt> 程式。 它们只需花一点时间学习 ,但是它将值得的,因为你可以看到更多控制和在正确展现锁住 <tt>/etc/passwd</tt> 和 <tt>/etc/shadow</tt> 的档案(<tt>adduser</tt> 就没有办法罗)。 <p> 参考<ref id="sec-work" name="Putting the Shadow Suite to use"> 该节得到更多相关资讯。 <p> 但是如果你已经拥有罗,接下来是你要做的部分: <tscreen><verb>tar -xzvf adduser.shadow-1.4.tar.gz cd adduser make clean make adduser chmod 700 adduser cp adduser /sbin</verb></tscreen> <sect1><heading>wu_ftpd Server <p> 大部分的 Linux 系统都有 <tt>wu_ftpd</tt> server。 如果你的版本没有附带 shadow 安装, 那麽你的 <tt>wu_ftpd</tt> 就没有办法对 shadow 编译。 <tt>wu_ftpd</tt> 是从 <tt>inetd/tcpd</tt> 开始且以 <em>root</em> 权限执行的程式。 如果你正在跑一个旧版的 <tt>wu_ftpd</tt> daemon, 无论如何你将要更新它因为较旧版本有 bug 将危及 <em>root</em> 权限。(参考 <url url="http://bach.cis.temple.edu/linux/linux-security/Linux-Security-FAQ/Linux-wu.ftpd-2.4-Update.html" name="Linux security home page"> 得到更多相关资讯)。 <p> 幸运的是你只需要取的有嵌入 shaow 的原始码和重新编译就可以罗! <p> 如果你不是正在执行 ELF 系统, <tt>wu_ftp</tt> server 可以从 Sunsite 网址 <url url="ftp://sunsite.unc.edu/pub/Linux/system/Network/file-transfer/wu-ftpd-2.4-fixed.tar.gz" name="wu-ftp-2.4-fixed.tar.gz"> 找到。 <p> 当你获得这个 server,把它放在 <tt>/usr/src</tt>目录,然後输入: <tscreen><verb>cd /usr/src tar -xzvf wu-ftpd-2.4-fixed.tar.gz cd wu-ftpd-2.4-fixed cp ./src/config/config.lnx.shadow ./src/config/config.lnx</verb></tscreen> <p> 然後编辑 <tt>./src/makefiles/Makefile.lnx</tt>,和改变 <tscreen><verb>LIBES = -lbsd -support</verb></tscreen> 这一行到: <tscreen><verb>LIBES = -lbsd -support -lshadow</verb></tscreen> <p> 现在你已经准备好执行 script 建立跟安装: <tscreen><verb>cd /usr/src/wu-ftpd-2.4-fixed /usr/src/wu-ftp-2.4.fixed/build lnx cp /usr/sbin/wu.ftpd /usr/sbin/wu.ftpd.old cp ./bin/ftpd /usr/sbin/wu.ftpd</verb></tscreen> <p> 这是用在 Linux shadow configuration file、编译和安装 server。 <p> 在我的 Slackware 2.3 系统,我也需要在执行前作下列步骤: <tt>build</tt>: <tscreen><verb>cd /usr/include/netinet ln -s in_systm.h in_system.h cd -</verb></tscreen> <p> 在 ELF 系统下会有编译问题的报告,但是下一版的 Beta 版则可以正确的执行。 可以从 <url url="ftp://tscnet.com/pub/linux/network/ftp/wu-ftpd-2.4.2-beta-10.tar.gz" name="wu-ftp-2.4.2-beta-10.tar.gz"> 找到。 <p> 当你获得这个 server,把它放在 <tt>/usr/src</tt>目录,然後输入: <tscreen><verb>cd /usr/src tar -xzvf wu-ftpd-2.4.2-beta-9.tar.gz cd wu-ftpd-beta-9 cd ./src/config</verb></tscreen> <p>然後编辑 <tt>config.lnx</tt>,和改变: <tscreen><verb>#undef SHADOW.PASSWORD</verb></tscreen> 这一行到: <tscreen><verb>#define SHADOW.PASSWORD</verb></tscreen> 然後, <tscreen><verb>cd ../Makefiles</verb></tscreen> 且编辑 <tt>Makefile.lnx</tt> 档和改变 <tscreen><verb>LIBES = -lsupport -lbsd # -lshadow</verb></tscreen> 这一行到: <tscreen><verb>LIBES = -lsupport -lbsd -lshadow</verb></tscreen> 然後建立(build)和安装(install): <tscreen><verb>cd .. build lnx cp /usr/sbin/wu.ftpd /usr/sbin/wu.ftpd.old cp ./bin/ftpd /usr/sbin/wu.ftpd</verb></tscreen> <p> 注:你应该检查你的 <tt>/etc/inetd.conf</tt> 档来确认你的 wu.ftpd server 是不是真的活著。 有些版本可能将 server daemons 放在不同的地方或用不同的名字表示。 <sect1><heading>标准 ftpd <p> 如果你正在执行标准的 <tt>ftpd</tt> server,我将建议你更新 <tt>wu_ftpd</tt> server。 离开上述的 bug ,系统会比较安全。 <p> 如果你坚持在标准模式,或者你需要 <em>NIS</em> 支援,在 Sunsite <url url="ftp://sunsite.unc.edu/pub/Linux/system/Network/file-transfer/ftpd-shadow-nis.tgz" name="ftpd-shadow-nis.tgz"> 有参考资料。 <sect1><heading>pop3d (Post Office Protocol 3) <p> 如果你需要支援第三版 <em>Post Office Protocol (POP3)</em>,你将需要重新编译 <tt>pop3d</tt> 程式。 <tt>pop3d</tt> 可以透过 <tt>inetd/tcpd</tt> 以 <tt>root</tt> 权限正常的执行。 <p> 从 Sunsite 有两个版本可以获得: <url url="ftp://sunsite.unc.edu/pub/Linux/system/Mail/pop/pop3d-1.00.4.linux.shadow.tar.gz" name="pop3d-1.00.4.linux.shadow.tar.gz"> 和 <url url="ftp://sunsite.unc.edu/pub/Linux/system/Mail/pop/pop3d+shadow+elf.tar.gz" name="pop3d+shadow+elf.tar.gz"> <p> 这两个都很简单可以安装。 <sect1><heading>xlock <p> 如果你安装 shadow suite,然後执行 <em>X Windows System</em> 和 lock 萤幕没以更新你的 <tt>xlock</tt> 档, 你将必须使用 <tt>CNTL-ALT-Fx</tt> 去切换 另一个 <em>tty</em>,签入(login)和杀掉(kill) <tt>xlock</tt> process (或使用 <tt>CNTL-ALT-BS</tt> 杀掉 X server)。 很幸运的这也很容易可以更新你的 <tt>xlock</tt> 程式。 <p> 如果你正执行 XFree86 Versions 3.x.x,且正正确使用 <tt>xlockmore</tt> (是一个很棒的萤幕保护程式). 这个套件支援 <em>shadow</em>,只要重新编译即可。如果你有任何较老的 <tt>xlock</tt> 版本,我建议你更新下列版本: <p> <tt>xlockmore-3.5.tgz</tt> 可以从 <url url="ftp://sunsite.unc.edu/pub/Linux/X11/xutils/screensavers/xlockmore-3.7.tgz"> 网站获得。 <p> 基本上这是你所要的。 <p> 撷取 <tt>xlockmore-3.7.tgz</tt> ,并将它放在 <tt>/usr/src</tt> 目录并解压缩: <tscreen><verb>tar -xzvf xlockmore-3.7.tgz</verb></tscreen> <p> 编辑这个档: <tt>/usr/X11R6/lib/X11/config/linux.cf</tt>, 和改变 <tscreen><verb>#define HasShadowPasswd NO 这一行到: #define HasShadowPasswd YES</verb></tscreen> <p> 然後建立可执行档: <tscreen><verb>cd /usr/src/xlockmore xmkmf make depend make</verb></tscreen> <p> 然後搬移所以档案到正确目录且更新档案拥有者及执行权限: <tscreen><verb>cp xlock /usr/X11R6/bin/ cp XLock /var/X11R6/lib/app-defaults/ chown root.shadow /usr/X11R6/bin/xlock chmod 2755 /usr/X11R6/bin/xlock chown root.shadow /etc/shadow chmod 640 /etc/shadow</verb></tscreen> <p> 你的 xlock 将可以正确的运作罗! <sect1><heading>xdm <p> <tt>xdm</tt> 是一个可以表示在 X-Windows 签入画面的程式。某些系统开始 <tt>xdm</tt> 当系统被告知道一个特定的执行水准(参考 <tt>/etc/inittab</tt>)。 <P> 伴随著 <em>Shadow Suite</em> 安装, <tt>xdm</tt> 需要被更新。 很幸运的这也很容易可以更新你的 <tt>xdm</tt> 程式。 <p> <p> <tt>xdm.tar.gz</tt> 可以从下列网址获得: <url url="ftp://sunsite.unc.edu/pub/Linux/X11/xutils/xdm.tar.gz"> <p> 撷取 <tt>xdm.tar.gz</tt> 档并将它放在 <tt>/usr/src</tt>目录然後解压缩: <tscreen><verb>tar -xzvf xdm.tar.gz</verb></tscreen> <p> 编辑这个档: <tt>/usr/X11R6/lib/X11/config/linux.cf</tt>,且改变 <tscreen><verb>#define HasShadowPasswd NO 这一行到: #define HasShadowPasswd YES</verb></tscreen> <p> 然後建立可执行档: <tscreen><verb>cd /usr/src/xdm xmkmf make depend make</verb></tscreen> <p> 然後搬移所有档案正确目录: <tscreen><verb>cp xdm /usr/X11R6/bin/</verb></tscreen> <p> <tt>xdm</tt> 以 <em>root</em> 权限在执行,所以你不需要改变档案存取权限。 <sect1><heading>sudo <p> <tt>sudo</tt> 程式允许系统管理员让使用者可以以 root 权限正常的执行程式。 这是非常方便的因为它可以限制管理者执行 root 帐号本身权限,还可以允许使用者作 像 mounte drives 的事情。 <p> <tt>sudo</tt> 需要读取密码因为在执行时需确认使用者密码。 <tt>sudo</tt> 已经执行 SUID root, 所以存取 <tt>/etc/shadow</tt> 党不是问题。 <p> <tt>sudo</tt> 支援 shadow suite 可在下列网址取得: <url url="ftp://sunsite.unc.edu/pub/Linux/system/Admin/sudo-1.2-shadow.tgz"> <p> <em>警告</em>:当你安装 <tt>sudo</tt> 你的 <tt>/etc/sudoers</tt> 档将取代预设值,所以你 需要备份原始程式。如果你有家任何设定在预设程式,你可能要编辑 Makefile 且移除复制该档到 <tt>/etc</tt> 的这行。 <p> 该套件已经对 shadow 进行设定,所以只要重新编译该套件即可 (把它放在 <tt>/usr/src</tt> 目录): <tscreen><verb>cd /usr/src tar -xzvf sudo-1.2-shadow.tgz cd sudo-1.2-shadow make all make install</verb></tscreen> <sect1><heading>imapd (E-Mail [pine package]) <p> <tt>imapd</tt> 是一个像 <tt>pop3d</tt> 的 email server。 <tt>imapd</tt> 随著 <em>Pine E-mail</em> 套件发生。 其操作手册在介绍该套件时即包含 shadow 支援。然而,我发现这不全然正确。 再加上在编译时加上 <tt>libshadow.a</tt> 函式库 和该套件结合 build script / Makefile 是非常不容易的。所以对 <tt>imapd</tt> 加入 shadow 支援是不太可能的。 <p> 如果有任何答案,可以 Email 给我,我会将该解答放到这里。 <sect1><heading>pppd (Point-to-Point Protocol Server) <p> pppd server 可以使用几种权限设定: <em>Password Authentication Protocol</em> (PAP) 和 <em>Cryptographic Handshake Authentication Protocol</em> (CHAP)。 pppd server 从 <tt>/etc/ppp/chap-secrets</tt> 和/或 <tt>/etc/ppp/pap-secrets</tt> 档读取密码字串。 如果你正使用预设 pppd 的执行,就没有必要再重新安装 pppd 。 <p> pppd 以允许你使用 <em>login</em> 参数。 如果 <em>login</em> 选项被选取, pppd 将使用 <tt>/etc/passwd</tt> 档的帐号密码给 <em>PAP</em>. 当然在不久密码档会是 shadowedm。pppd-1.2.1d 档已经加入对 shadow 的支援。 <p> 下一节加入支援 shadow 的□例是针对 <tt>pppd-1.2.1d</tt> (一个较老版本的 pppd). <p> <tt>pppd-2.2.0</tt> 版就已经包括 shadow 支援罗。 <sect><heading>将 Shadow Suite 放进来使用。<label id="sec-work"> <p> 这节描述你需要知道有些程式在安装时就已经有 <em>Shadow Suite</em>。 大部分的资讯在操作手册可以找到。 <sect1><heading>新增、修改和删除使用者 <p> <em>Shadow Suite</em> 新增下列指令用来新增、修改和删除使用者。 这也是可以安装 <tt>adduser</tt> 程式。 <sect2><heading>useradd <p> <tt>useradd</tt> 使令可用在系统中新增使用者。 你也可以采用此指令来改变预设字串。 <p> 你应该做的第一件事是检查预设值设定和针对你的系统进行改变: <tscreen><verb>useradd -D</verb></tscreen><code> GROUP=1 HOME=/home INACTIVE=0 EXPIRE=0 SHELL= SKEL=/etc/skel</code> <p> 预设值不全是你要的,所以如果你开始新增使用者,你必须详阅每个使用者资讯。 而且,我们可能和应该改变设定值。 <p> 在我的系统上: <itemize> <item>我要预设群组是 100 <item>我要密码每到 60 天就到期 <item>我不要锁住帐号因为密码会到期 <item>我要预设 shell 是 <tt>/bin/bash</tt> </itemize> 为了这些改变,我要使用: <tscreen><verb>useradd -D -g100 -e60 -f0 -s/bin/bash</verb></tscreen> <p> 现在执行 <tt>useradd -D</tt> 将得到: <code> GROUP=100 HOME=/home INACTIVE=0 EXPIRE=60 SHELL=/bin/bash SKEL=/etc/skel </code> <p> 尽管依照你需要修改,预设值将存在 <tt>/etc/default/useradd</tt>. <p> 先在你可以使用 <tt>useradd</tt> 来新增系统使用者。举例说明,新增一使用者 <tt>fred</tt> 使用预设值方式如下: <tscreen><verb>useradd -m -c "Fred Flintstone" fred</verb></tscreen> 这将在 <tt>/etc/passwd</tt> 档中的一行建立如下: <tscreen><verb>fred:*:505:100:Fred Flintstone:/home/fred:/bin/bash</verb></tscreen> 且在 <tt>/etc/shadow</tt> 档中的一行建立如下; <tscreen><verb>fred:!:0:0:60:0:0:0:0</verb></tscreen> <tt>fred</tt>的根目录将被建立且 <tt>/etc/skel</tt> 的内容将被复制因为指令句中有 <tt>-m</tt> 设定。 <p> 因为我们并未详述 UID,系统会直接寻找下一个可获得的编号。 <p> <tt>fred</tt>的帐号被建立罗,但是 <tt>fred</tt> 仍然不能签入直到我们不再锁住(unlock)这个帐号。 透过更改密码完成 unlock 帐号,方法如下: <tscreen><verb>passwd fred</verb></tscreen> <code> Changing password for fred□Enter the new password (minimum of 5 characters) Please use a combination of upper and lower case letters and numbers. New Password: ******* Re-enter new password: ******* </code> 现在 <tt>/etc/shadow</tt> 档将包含: <tscreen><verb>fred:J0C.WDR1amIt6:9559:0:60:0:0:0:0</verb></tscreen> 且 <tt>fred</tt> 将可以签入和使用该系统。 <tt>useradd</tt> 和其他附带 <em>Shadow Suite</em> 比较好的地方是可以自动改变 <tt>/etc/passwd</tt> 和 <tt>/etc/shadow</tt> 。 所以如果你正在新增一个使用者, 且另一个使用者正在更改密码,这两个操作都可以正确的执行。 <p> 你使用提供的指令比直接存取 <tt>/etc/passwd</tt> 和 <tt>/etc/shadow</tt> 档还好。 如果你正编辑 <tt>/etc/shadow</tt> 档,且有个使用者在你编辑时要改变他的密码, 然後你储存编辑结果,这个使用者的密码将会遗失掉。 <p> 这里是使用 <tt>useradd</tt> 和 <tt>passwd</tt> 新增使用者的一些 interactive script : <code> #!/bin/bash # # /sbin/newuser - A script to add users to the system using the Shadow # Suite's useradd and passwd commands. # # Written my Mike Jackson <mhjack@tscnet.com> as an example for the Linux # Shadow Password Howto. Permission to use and modify is expressly granted. # # This could be modified to show the defaults and allow modification similar # to the Slackware Adduser program. It could also be modified to disallow # stupid entries. (i.e. better error checking). # ## # Defaults for the useradd command ## GROUP=100 # Default Group HOME=/home # Home directory location (/home/username) SKEL=/etc/skel # Skeleton Directory INACTIVE=0 # Days after password expires to disable account (0=never) EXPIRE=60 # Days that a passwords lasts SHELL=/bin/bash # Default Shell (full path) ## # Defaults for the passwd command ## PASSMIN=0 # Days between password changes PASSWARN=14 # Days before password expires that a warning is given ## # Ensure that root is running the script. ## WHOAMI=`/usr/bin/whoami` if [ $WHOAMI != "root" ]; then echo "You must be root to add news users!" exit 1 fi ## # Ask for username and fullname. ## echo "" echo -n "Username: " read USERNAME echo -n "Full name: " read FULLNAME # echo "Adding user: $USERNAME." # # Note that the "" around $FULLNAME is required because this field is # almost always going to contain at least on space, and without the "'s # the useradd command would think that you we moving on to the next # parameter when it reached the SPACE character. # /usr/sbin/useradd -c"$FULLNAME" -d$HOME/$USERNAME -e$EXPIRE \ -f$INACTIVE -g$GROUP -m -k$SKEL -s$SHELL $USERNAME ## # Set password defaults ## /bin/passwd -n $PASSMIN -w $PASSWARN $USERNAME >/dev/null 2>&1 ## # Let the passwd command actually ask for password (twice) ## /bin/passwd $USERNAME ## # Show what was done. ## echo "" echo "Entry from /etc/passwd:" echo -n " " grep "$USERNAME:" /etc/passwd echo "Entry from /etc/shadow:" echo -n " " grep "$USERNAME:" /etc/shadow echo "Summary output of the passwd command:" echo -n " " passwd -S $USERNAME echo "" </code> <p> 新增使用者是用 script 比直接编辑 <tt>/etc/passwd</tt> / <tt>/etc/shadow</tt> 档或使用 像 Slackware 的 <tt>adduser</tt> 程式还要好。 <p> 需要更多 <tt>useradd</tt> 资讯请参照线上操作手册。 <sect2><heading>usermod <p> <tt>usermod</tt> 程式是用在修改使用者资讯。 它的参数使用和 <tt>useradd</tt> 程式类似。 <p> 如果你要更新 <tt>fred</tt> 的 shell,你要作下列步骤: <tscreen><verb>usermod -s /bin/tcsh fred</verb></tscreen> 现在 <tt>fred</tt> 的 <tt>/etc/passwd</tt> 档将变成: <tscreen><verb>fred:*:505:100:Fred Flintstone:/home/fred:/bin/tcsh</verb></tscreen> 如果要使 <tt>fred</tt> 的帐号到期日为 09/15/97: <tscreen><verb>usermod -e 09/15/97 fred</verb></tscreen> 现在 <tt>fred</tt> 在 <tt>/etc/shadow</tt> 的栏位变成: <tscreen><verb>fred:J0C.WDR1amIt6:9559:0:60:0:0:10119:0</verb></tscreen> <p> 需要更多 <tt>usermod</tt> 资讯请参照线上操作手册。 <sect2><heading>userdel <p> <tt>userdel</tt> 用在删除使用者,使用方法为: <tscreen><verb>userdel -r username</verb></tscreen> <tt>-r</tt> 参数可以将该使用者根目录全部移除。位在期待目录的档案则需手动移除。 <p> 如果你只是要简单的锁住帐号而没有要删除它,建议你使用 <tt>passwd</tt> 指令。 <sect1><heading>passwd 指令和 passwd 老化 <p> <tt>passwd</tt> 指令很明显使用在改变密码,除此之外, 可由 <em>root</em> 使用在: <itemize> <item>Lock 和 unlock 帐号 (<tt>-l</tt> and <tt>-u</tt>) <item>设定密码合法的最大天数 (<tt>-x</tt>) <item>设定密码改变间的最小天数 (<tt>-n</tt>) <item>设定密码到期的警告天数 (<tt>-w</tt>) <item>设定在帐号未被锁死密码到期後的警告天数 (<tt>-i</tt>) <item>允许查询帐号资讯 (<tt>-S</tt>) </itemize> <p> 举例说明,如果要锁死 <tt>fred</tt> 帐号: <tscreen><verb>passwd -S fred fred P 03/04/96 0 60 0 0</verb></tscreen> 这表示 <tt>fred</tt> 的密码是有效的,它在 03/04/96 被修改且任何时间都可被修改 , fred 将不会收到警告且帐号将不会因密码到期而关闭。 <p> 这表示如果 <tt>fred</tt> 在密码到期後签入,它将被要求用一个新密码签入。 <p> 如果我们决定要警告 <tt>fred</tt> 在密码过期前 14 天,且让它的帐号在到期後14天警告, 我们需要作下列步骤: <tscreen><verb>passwd -w14 -i14 fred</verb></tscreen> 现在 <tt>fred</tt> 改变为: <tscreen><verb>fred P 03/04/96 0 60 14 14</verb></tscreen> 需要更多 <tt>passwd</tt> 资讯请参照线上操作手册。 <sect1><heading>login.defs 档 <p> <tt>/etc/login</tt> 档是对 <tt>login</tt> 程式的 configuration file 且 对 <em>Shadow Suite</em>。 <p> <tt>/etc/login</tt> 包含从预设值密码改变的驱动设定。 <p> <tt>/etc/login.defs</tt> 档是一个很好的文件档,然而仍有些事情要注意: <itemize> <item>It contains flags that can be turned on or off that determine the amount of logging that takes place. <item>It contains pointers to other configuration files. <item>It contains defaults assignments for things like password aging. </itemize> <p> 跟去上述你可以发现这是一个重要档,且你应该确认目前设定及你将对你系统的设定内容。 <sect1><heading>群组密码 <p> <tt>/etc/groups</tt> 档包括允许是用者存取群组之密码。 如果你定义 <tt>SHADOWGRP</tt> 在 <tt>/usr/src/shadow-YYMMDD/config.h</tt> 档将开启该功能。 <p> 如果你定义该常数且编译它,你需建立一个 <tt>/etc/gshadow</tt> 档来保存群组密码 和群组管理者资讯。 <p> 当你建立 <tt>/etc/shadow</tt>。你使用一个呼叫程式叫做 <tt>pwconv</tt>, 该程式不会建立 <tt>/etc/gshadow</tt> 档,但是这没关系,只要你自行建立即可。 <p> 为了建立起始 <tt>/etc/gshadow</tt> 档要执行下列步骤: <tscreen><verb>touch /etc/gshadow chown root.root /etc/gshadow chmod 700 /etc/gshadow</verb></tscreen> <p> 每次你建立一个新群组,它们会被加到 <tt>/etc/group</tt> 和 <tt>/etc/gshadow</tt> 档。 如果你透过新增或移除使用者来修改群组或改变群组密码,<tt>/etc/gshadow</tt> 档都将被改变。 <p> <tt>groups</tt>, <tt>groupadd</tt>, <tt>groupmod</tt>, 和 <tt>groupdel</tt> 程式是用来供应 <em>Shadow Suite</em> 部分可以变更群组。 <p> <tt>/etc/group</tt> 档格式如下: <tscreen><verb>groupname:!:GID:member,member,...</verb></tscreen> 其中: <descrip> <tag/<tt>groupname</tt></tag> The name of the group <tag/<tt>!</tt></tag> The field that normally holds the password, but that is now relocated to the <tt>/etc/gshadow</tt> file. <tag/<tt>GID</tt></tag> The numerical group ID number <tag/<tt>member</tt></tag> List of group members </descrip> <p> <tt>/etc/gshadow</tt> 档格式如下: <tscreen><verb>groupname:password:admin,admin,...:member,member,...</verb></tscreen> 其中: <descrip> <tag/<tt>groupname</tt></tag> The name of the group <tag/<tt>password</tt></tag> The encoded group password. <tag/<tt>admin</tt></tag> List of group administrators <tag/<tt>member</tt></tag> List of group members </descrip> <p> <tt>gpasswd</tt> 指令是用在新增或移除管理者和群组成员。 <tt>root</tt> 或其他在 群组管理者人员可新增或移除群组成员。 <p> 群组密码可以透过 <tt>passwd</tt> 指令改变,需透过 <em>root</em> 或在该群组管理者有权限的帐号方可修改。 <p> Despite the fact that there is not currently a manual page for <tt>gpasswd</tt>, typing <tt>gpasswd</tt> without any parameters gives a listing of options. It's fairly easy to grasp how it all works once you understand the file formats and the concepts. <sect1><heading>检查程式一致性 <p> <sect2><heading>pwck <p> <tt>pwck</tt> 程式提供在 <tt>/etc/passwd</tt> 和 <tt>/etc/shadow</tt> 档的一致性检查。 它将检查每个使用者名称且依照下列步骤确认: <itemize> <item>the correct number of fields <item>unique user name <item>valid user and group identifier <item>valid primary group <item>valid home directory <item>valid login shell </itemize> <p>它也会警告没有密码的帐号。 <p> 在安装 <em>Shadow Suite</em> 後执行 <tt>pwck</tt> 是一个很好的点子。 它也可以每周或每月周期性的执行。 如果你使用 <tt>-r</tt> 参数,你可以用 <tt>cron</tt> 来执行且收到电子邮件报告 <sect2><heading>grpck <p> <tt>grpck</tt> 检查 <tt>/etc/group</tt> 和 <tt>/etc/gshadow</tt> 档一致性的程式。 它作下列检查: <itemize> <item>the correct number of fields <item>unique group name <item>valid list of members and administrators </itemize> <p> 它也有 <tt>-r</tt> 参数自动产生报表。 <sect1><heading>Dial-up 密码 <p> Dial-up 密码是另一个对系统防御的选项列,该系统允许拨接存取。 如果你有一个系统允许许多人区域网路连结,但是你想限制拨接的权限,那你需使用 dial-up 密码。 为了要开启 dial-up 密码,你必须编辑 <tt>/etc/login.defs</tt> 档且确定将 <tt>DIALUPS_CHECK_ENAB</tt> 设定为 <tt>yes</tt>. <p> 有两个档案包括 dial-up 资讯, <tt>/etc/dialups</tt> 包括 ttys (one per line, with the leading "/dev/" removed)。 如果 tty 有被列出, dial-up 表示已经被检查。 <p> 第二个档是 <tt>/etc/d_passwd</tt> 。 这个档包括 shell 全部合法路径名称。 <p> 如果以个使用者签入一条列在 <tt>/etc/dialups</tt> 的线(line),且他的 shell 被列在 <tt>/etc/d_passwd</tt> 档,他将被允许存取透过提供正确的密码。 <p> 另一个使用 dial-up 密码的目的是设定指允许某些形式连结的线(可能是PPP 或 UUCP 连结)。 如果一个使用者试著得到另一种形式连结 (i.e. a list of shells),他必须知道使用这条线的密码。 <p> 在你可以在未来使用 dial-up 前,你密需建立一些档案。 <p> <tt>dpasswd</tt> 指令提供对在 <tt>/etc/d_passwd</tt> 档的 shells 指派密码。 可以看操作手册的到更多资讯。 <sect><heading>加入 shadow 支援 C 语言<label id="sec-adding"> <p> 新增支援 shadow 程式事实上是很直接的。 唯一的问题是程式需要以 root (或 SUID root) 权限执行,这样才可以存取 <tt>/etc/shadow</tt> 档。 <p> 这显示一个大问题: 当建立 SUID 程式时需要很小心依照程式运作。举例说明: 如果以个 程式有 shell escape,如果程式本身是 SUID root 将不需要以 root 方式呈现。 <p> 对程式新增支援 shadow 而言,它可以检查密码,但不需以 root 权限执行,而是以 SUID shadow 取代执行比较安全。 <tt>xlock</tt> 程式就是一个例子。 <p> 接下来□例介绍, <tt>pppd-1.2.1d</tt> 已经以 SUID as root 方式执行,所以新增 shadow 支援应该不会使程式产生任何影响。 <sect1><heading>标头档(Header files) <p> 标头档应存在 <tt>/usr/include/shadow</tt>。 应该有一个 <tt>/usr/include/shadow.h</tt>档, 但是它将 symbolic link 到 <tt>/usr/include/shadow/shadow.h</tt>。 <p> 为了新增支援 shadow 程式,你需要 include 标头档: <verb> #include <shadow/shadow.h> #include <shadow/pwauth.h> </verb> <p> <sect1><heading>libshadow.a 函式库(library) <p> 当你安装 <em>Shadow Suite</em>, <tt>libshadow.a</tt> 档被建立和安装在 <tt>/usr/lib</tt> 目录。 <p> 当编译一个 shadow support 程式,linker 需要包括 <tt>libshadow.a</tt> 函式库进入链结。 <p> 执行如下: <tscreen><verb>gcc program.c -o program -lshadow</verb></tscreen> <p> 然而,就像我们接下来要看的例子,大部分大程式使用 <tt>Makefile</tt> 且 通常有变数呼叫 <tt>LIBS=...</tt> 需要被修改。 <sect1><heading>Shadow 结构(Structure) <p> <tt>libshadow.a</tt> 函式库对它从 <tt>/etc/shadow</tt> 档接收资讯使用结构化呼叫。 这是从 <tt>/usr/include/shadow/shadow.h</tt> 标头档的 <tt>spwd</tt> 结构定义: <code> struct spwd { char *sp_namp; /* login name */ char *sp_pwdp; /* encrypted password */ sptime sp_lstchg; /* date of last change */ sptime sp_min; /* minimum number of days between changes */ sptime sp_max; /* maximum number of days between changes */ sptime sp_warn; /* number of days of warning before password expires */ sptime sp_inact; /* number of days after password expires until the account becomes unusable. */ sptime sp_expire; /* days since 1/1/70 until account expires */ unsigned long sp_flag; /* reserved for future use */ }; </code> <p> <em>Shadow Suite</em> 可以放除了编码密码之外的资料到 <tt>sp_pwdp</tt> 栏位。 密码栏位可包括: <tscreen><verb>username:Npge08pfz4wuk;@/sbin/extra:9479:0:10000::::</verb></tscreen> <p> 这表示一个额外的密码, <tt>/sbin/extra</tt> 程式应该被更多的权限呼叫。 程式的呼叫需取得使用者名称和指出为何需被呼叫的 switch才可通过。 查看 <tt>/usr/include/shadow/pwauth.h</tt> 和原始码 <tt>pwauth.c</tt> 获得更多资讯。 <p> 为何我们应使用 <tt>pwauth</tt> 去表示真正的权限,这是什麽意思,它将使第二组权限也 跑得很好。 <p> <em>Shadow Suite</em> 作者指出因为大部分存在的程式都不这麽作罗,所以 <em>Shadow Suite</em>未来的版本将移除。 <sect1><heading>Shadow 函式(Functions) <p> <tt>shadow.h</tt> 包含 <tt>libshadow.a</tt> 函式库: <code> extern void setspent __P ((void)); extern void endspent __P ((void)); extern struct spwd *sgetspent __P ((__const char *__string)); extern struct spwd *fgetspent __P ((FILE *__fp)); extern struct spwd *getspent __P ((void)); extern struct spwd *getspnam __P ((__const char *__name)); extern int putspent __P ((__const struct spwd *__sp, FILE *__fp)); </code> <p> 我们将使用的□例程式是: <tt>getspnam</tt> 将对供应名称恢复对我们 <tt>spwd</tt> 结构。 <sect1><heading>□例 <p> 这是一个□例描述新增 shadow 支援程式,但预设值并没有。 <p> 本□例使用 <em>Point-to-Point Protocol Server</em> (pppd-1.2.1d),它有个模式是表示 从 <tt>/etc/passwd</tt> 档取代 <em>PAP</em> 或 <em>CHAP</em> 档使用帐号密码的 <em>PAP</em> 权限,你将不需要在 <tt>pppd-2.2.0</tt> 加这些程式码,因为它已经存在罗。 <p> pppd 的未来大致上不会被使用很多,但是如果你安装 <em>Shadow Suite</em>,储存在 <tt>/etc/passwd</tt> 档的密码将无法运作。 <p> 在 <tt>pppd-1.2.1d</tt> 权限使用的程式码是位在 <tt>/usr/src/pppd-1.2.1d/pppd/auth.c</tt> 档。 <p> 接下来程式码需要被加在所有其他 <tt>#include</tt> 指令档案的最上头,我们将注意有环境指令的 <tt>#includes</tt>。 <p> <code> #ifdef HAS_SHADOW #include <shadow.h> #include <shadow/pwauth.h> #endif </code> <p> 接下来要做的事情是变更实际码, 我们将变更 <tt>auth.c</tt> 档。 <p> 变更前 <tt>auth.c</tt> 档 function 为: <code> /* * login - Check the user name and password against the system * password database, and login the user if OK. * * returns: * UPAP_AUTHNAK: Login failed. * UPAP_AUTHACK: Login succeeded. * In either case, msg points to an appropriate message. */ static int login(user, passwd, msg, msglen) char *user; char *passwd; char **msg; int *msglen; { struct passwd *pw; char *epasswd; char *tty; if ((pw = getpwnam(user)) == NULL) { return (UPAP_AUTHNAK); } /* * XXX If no passwd, let them login without one. */ if (pw->pw_passwd == '\0') { return (UPAP_AUTHACK); } epasswd = crypt(passwd, pw->pw_passwd); if (strcmp(epasswd, pw->pw_passwd)) { return (UPAP_AUTHNAK); } syslog(LOG_INFO, "user %s logged in", user); /* * Write a wtmp entry for this user. */ tty = strrchr(devname, '/'); if (tty == NULL) tty = devname; else tty++; logwtmp(tty, user, ""); /* Add wtmp login entry */ logged_in = TRUE; return (UPAP_AUTHACK); } </code> <p> 使用者的密码被放在 <tt>pw->pw_passwd</tt>,所以我们需新增 <tt>getspnam</tt> function,这将会把密码放到 <tt>spwd->sp_pwdp</tt>。 <p> 我们将新增 <tt>pwauth</tt> function 来表示真正的权限。 这将在 shadow 档设定时 自动产生第二个权限。 <p> 变更为可以支援 shadow 後的 <tt>auth.c</tt> function: <code> /* * login - Check the user name and password against the system * password database, and login the user if OK. * * This function has been modified to support the Linux Shadow Password * Suite if USE_SHADOW is defined. * * returns: * UPAP_AUTHNAK: Login failed. * UPAP_AUTHACK: Login succeeded. * In either case, msg points to an appropriate message. */ static int login(user, passwd, msg, msglen) char *user; char *passwd; char **msg; int *msglen; { struct passwd *pw; char *epasswd; char *tty; #ifdef USE_SHADOW struct spwd *spwd; struct spwd *getspnam(); #endif if ((pw = getpwnam(user)) == NULL) { return (UPAP_AUTHNAK); } #ifdef USE_SHADOW spwd = getspnam(user); if (spwd) pw->pw_passwd = spwd->sp-pwdp; #endif /* * XXX If no passwd, let NOT them login without one. */ if (pw->pw_passwd == '\0') { return (UPAP_AUTHNAK); } #ifdef HAS_SHADOW if ((pw->pw_passwd && pw->pw_passwd[0] == '@' && pw_auth (pw->pw_passwd+1, pw->pw_name, PW_LOGIN, NULL)) || !valid (passwd, pw)) { return (UPAP_AUTHNAK); } #else epasswd = crypt(passwd, pw->pw_passwd); if (strcmp(epasswd, pw->pw_passwd)) { return (UPAP_AUTHNAK); } #endif syslog(LOG_INFO, "user %s logged in", user); /* * Write a wtmp entry for this user. */ tty = strrchr(devname, '/'); if (tty == NULL) tty = devname; else tty++; logwtmp(tty, user, ""); /* Add wtmp login entry */ logged_in = TRUE; return (UPAP_AUTHACK); } </code> <p> 严谨的□例将启发我们在作其他改变的帮助。 原始的版本如果在 <tt>/etc/passwd</tt> 档 没有任何密码,可允许存取传回的 <tt>UPAP_AUTHACK</tt> 。这是<em>不</em>好的,因为 签入的使用是使用一个允许存取 PPP process的帐号,然後检查帐号密码,该帐号密码是由 RAP 、在 <tt>/etc/passwd</tt> 档的帐号和 <tt>/etc/shadow</tt> 档的密码供应。 <p> 所以如果我们设定原本版本对每个使用者,如 <tt>ppp</tt> 可以在 shell 执行,然後任何人可以 获得 ppp 链结透过设定他们对使用者 <tt>ppp</tt> 的 PAP 和 null 的密码。 <p> 我们修正 <tt>UPAP_AUTHNAK</tt> 取代 <tt>UPAP_AUTHACK</tt> 如果密码栏位是空的。 <p> 有趣的是 <tt>pppd-2.2.0</tt> 有相同的问题。 <p> 接下来我们需要变更 Makefile 以便让两件事发生: <tt>USE_SHADOW</tt> 必须被重新定义且<tt>libshadow.a</tt> 需要被新增到链结 process。 <p> 编辑 Makefile 且新增: <tscreen><verb>LIBS = -lshadow </verb></tscreen> <p> 然後我们找到这一行: <tscreen><verb>COMPILE_FLAGS = -I.. -D_linux_=1 -DGIDSET_TYPE=gid_t </verb></tscreen> <p> 然後改变它变成: <tscreen><verb>COMPILE_FLAGS = -I.. -D_linux_=1 -DGIDSET_TYPE=gid_t -DUSE_SHADOW </verb></tscreen> <p> 现在执行 make 跟 install. <sect><heading>常问问题及答案 <p> <em>Q:</em> 我用 tty's 用<em>root</em> 权限使用 <tt>/etc/securettys</tt> 档,但是都没有 任何运作,该如何解决? <p> <em>A:</em> <tt>/etc/securettys</tt> 档在 <em>Shadow Suite</em> 安装後就不具任何意义罗。 tty's 用 <em>root</em> 权限可以使用一个放在 <tt>/etc/login.defs</tt> 签入设定档进行修改。 该设定档也可能指到另一个档。 <p> <em>Q:</em> 我对 <em>Shadow Suite</em> 进行安装後,现在我没办法签入(login)系统, 我有忽略什麽步骤吗? <p> <em>A:</em> 你是真的安装 Shadow 程式罗,但是并未执行 <tt>pwconv</tt> 或你忘记复制 <tt>/etc/npasswd</tt> 到 <tt>/etc/passwd</tt> 且复制 <tt>/etc/nshadow</tt> 到 <tt>/etc/shadow</tt>罗。 你也需要复制 <tt>login.defs</tt> 到 <tt>/etc</tt>。 <p> <em>Q:</em> 在 xlock 那一章节有提到改变 <tt>/etc/shadow</tt> 档的群组拥有者到 <tt>shadow</tt>。我没有 <tt>shadow</tt> 群组,该如何处理? <p> <em>A:</em> 你可以新增一个。 简单的编辑 <tt>/etc/group</tt> 档,然後新增一行给 shadow 群组,你需要确认群组编号并未被其他群组使用,且你需要在 <tt>nogroup</tt> 纪录之前插入该设定。 或这你可以简化对 root权限设定 suid <tt>xlock</tt>。 <p> <em>Q:</em> 有任何对 Linux Shadow Password Suite 的电子邮件列表吗? <p> <em>A:</em> 有,但是它的目的是针对 Linux 下一个 Shadow Suite版本发展跟测试,你可以 到<tt>shadow-list-request@neptune.cin.net</tt> 电子邮件摘要输入: <tt>subscribe</tt>。 这是在讨论 Linux <tt>shadow-YYMMSS</tt>系列版本。你应该参加如果你 想参予未来发展或你安装 Suite 在你的电脑且想要得到新版本的资讯。 <p> <em>Q:</em> 我安装 <em>Shadow Suite</em>,但是当我使用 <tt>userdel</tt> 命令後, 我得到 "userdel: cannot open shadow group file" 讯息,我有哪里作错了吗? <p> <em>A:</em> 你编译 <em>Shadow Suite</em> 时有开启 <tt>SHADOWGRP</tt> 选项,但是 你没有一个 <tt>/etc/gshadow</tt> 档案,你需要编辑 <tt>config.h</tt> 档和重新编 译或建立一个 <tt>/etc/group</tt> 档,请看 shadow groups 那一节。 <p> <em>Q:</em> 我安装 <em>Shadow Suite</em> 但是我无法找到编码密码在我的 <tt>/etc/passwd</tt> 档,发生什麽问题? <p> <em>A:</em> 你可能在 Shadow <tt>config.h</tt> 档开启 <tt>AUTOSHADOW</tt> 选项或者 你的 <tt>libc</tt> 被 <tt>SAHDOW_COMPAT</tt> 选项编译,你需要决定是哪个问题,然後 再重新编译。 <sect><heading>版权声明(暂不翻译) <p> The Linux Shadow Password HOWTO is Copyright (c) 1996 Michael H. Jackson. <p> Permission is granted to make and distribute verbatim copies of this document provided the copyright notice and this permission notice are preserved on all copies. <p> Permission is granted to copy and distribute modified versions of this document under the conditions for verbatim copies above, provided a notice clearly stating that the document is a modified version is also included in the modified document. <p> Permission is granted to copy and distribute translations of this document into another language, under the conditions specified above for modified versions. <p> Permission is granted to convert this document into another media under the conditions specified above for modified versions provided the requirement to acknowledge the source document is fulfilled by inclusion of an obvious reference to the source document in the new media. Where there is any doubt as to what defines 'obvious' the copyright owner reserves the right to decide. <sect><heading>Miscellaneous and Acknowledgments. <p> The code examples for <tt>auth.c</tt> are taken from pppd-1.2.1d and ppp-2.1.0e, Copyright (c) 1993 and The Australian National University and Copyright (c) 1989 Carnegie Mellon University. <p> Thanks to Marek Michalkiewicz <marekm@i17linuxb.ists.pwr.wroc.pl> for writing and maintaining the <em>Shadow Suite</em> for Linux, and for his review and comments on this document. <p> Thanks to Ron Tidd <rtidd@tscnet.com> for his helpful review and testing. <p> Thanks to everyone who has sent me feedback to help improve this document. <p> Please, if you have any comments or suggestions then mail them to me. regards <p> <htmlurl url="mailto:mhjack@tscnet.com" name="Michael H. Jackson <mhjack@tscnet.com>"> </article>