8.28. Shadow-4.16.0

Shadow 软件包包含安全地处理密码的程序。

估计构建时间: 0.1 SBU
需要硬盘空间: 112 MB

8.28.1. 安装 Shadow

[重要]

重要

如果已经安装了 Linux-PAM,则应该按照 BLFS shadow 页面,而非本页的说明安装 shadow。

[注意]

注意

如果您希望强制使用强密码,参考 https://www.linuxfromscratch.org/blfs/view/systemd/postlfs/cracklib.html 以在构建 Shadow 前安装 CrackLib。然后,将 --with-libcrack 添加到下面的 configure 命令中。

禁止该软件包安装 groups 程序和它的手册页,因为 Coreutils 会提供更好的版本。同样,避免安装第 8.3 节 “Man-pages-6.9.1”软件包已经提供的手册页:

sed -i 's/groups$(EXEEXT) //' src/Makefile.in
find man -name Makefile.in -exec sed -i 's/groups\.1 / /'   {} \;
find man -name Makefile.in -exec sed -i 's/getspnam\.3 / /' {} \;
find man -name Makefile.in -exec sed -i 's/passwd\.5 / /'   {} \;

不使用默认的 crypt 加密方法,使用安全程度高很多的 YESCRYPT 算法加密密码,这也允许设定长度超过 8 个字符的密码。还需要把过时的用户邮箱位置 /var/spool/mail 改为当前普遍使用的 /var/mail 目录。另外,从默认的 PATH 中删除/bin/sbin,因为它们只是指向 /usr 中对应目录的符号链接:

[注意]

注意

如果由于某种原因,希望将 /bin 和/或 /sbin 包含在 PATH 中,可以在构建 LFS 后通过 .bashrc 修改 PATH

sed -e 's:#ENCRYPT_METHOD DES:ENCRYPT_METHOD YESCRYPT:' \
    -e 's:/var/spool/mail:/var/mail:'                   \
    -e '/PATH=/{s@/sbin:@@;s@/bin:@@}'                  \
    -i etc/login.defs
[注意]

注意

如果您选择构建有 Cracklib 支持的 Shadow,执行该命令:

sed -i 's:DICTPATH.*:DICTPATH\t/lib/cracklib/pw_dict:' etc/login.defs

准备编译 Shadow:

touch /usr/bin/passwd
./configure --sysconfdir=/etc   \
            --disable-static    \
            --with-{b,yes}crypt \
            --without-libbsd    \
            --with-group-name-max-length=32

新的配置选项的含义:

touch /usr/bin/passwd

我们需要保证 /usr/bin/passwd 存在,因为它的位置会被硬编码到一些程序中;且如果它不存在的话,安装脚本会在错误的位置创建它。

--with-{b,yes}crypt

Shell 将它展开为两个选项,--with-bcrypt--with-yescrypt。它们允许 shadow 使用 Libxcrypt 实现的 Bcrypt 和 Yescrypt 算法对密码进行散列操作。这些算法相比于传统的 SHA 系列算法更安全 (特别是对基于 GPU 的攻击抵抗力强很多)。

--with-group-name-max-length=32

用户名最长只能有 32 个字符。设定组名称最大长度为相同值。

--without-libbsd

不要使用 LFS 不包含的 libbsd 库中的 readpassphrase 函数。使用软件包内置的 readpassphrase 实现代替它。

编译该软件包:

make

该软件包不包含测试套件。

安装该软件包:

make exec_prefix=/usr install
make -C man install-man

8.28.2. 配置 Shadow

该软件包包含用于添加、修改、删除用户和组,设定和修改它们的密码,以及进行其他管理任务的工具。如果希望查阅关于 password shadowing 的详细解释,阅读解压得到源代码目录树中的 doc/HOWTO 文件。如果使用 Shadow 支持,请注意所有需要验证密码的程序 (如显示管理器、FTP 程序、pop3 守护进程等) 都必须和 Shadow 兼容。换句话说,它们必须能使用 Shadow 加密的密码。

如果要对用户密码启用 Shadow 加密,执行以下命令:

pwconv

如果要对组密码启用 Shadow 加密,执行:

grpconv

下面需要解释 Shadow 中 useradd 的默认配置。首先,useradd 的默认操作是创建一个用户,以及一个名字和用户名相同的组。默认情况下,用户 ID (UID) 和组 ID (GID) 会从 1000 开始。这意味着,如果您不向 useradd 传递参数,每个用户都会属于一个不同的组。如果您不希望这样,就要传递 -g 或者 -N 参数给 useradd,或者在/etc/login.defs 中修改 USERGROUPS_ENAB 的值。参阅 useradd(8) 了解更多相关信息。

其次,为了修改默认参数,必须创建 /etc/default/useradd 文件,并定制其内容,以满足您的特定需要。使用以下命令创建它:

mkdir -p /etc/default
useradd -D --gid 999

/etc/default/useradd 参数解释

GROUP=999

该参数设定 /etc/group 文件中使用的第一个组编号。这里的值 999 是在上面的 --gid 参数中给定的。您可以将它修改为您希望的任何值。注意,useradd 绝不会重用 UID 或 GID。如果该参数指定的数字已经被使用了,它就会使用下一个可用的数字。另外,如果您第一次使用不带 -g 参数的 useradd 命令时没有编号 999 的组,您就会在终端看到错误消息 —— useradd: unknown GID 999,尽管用户账号仍会被正常创建。为了防止这种现象的出现,我们在第 7.6 节 “创建必要的文件和符号链接”中已经用编号 999 创建了 users 组。

CREATE_MAIL_SPOOL=yes

该参数使得 useradd 为每个新用户创建邮箱文件。useradd 会使得 mail 为邮箱文件属组,并为邮箱文件赋予 0660 权限模式。如果您不希望 useradd 创建邮箱文件,执行以下命令:

sed -i '/MAIL/s/yes/no/' /etc/default/useradd

8.28.3. 设定根用户密码

为用户 root 选择一个密码,并执行以下命令设定它:

passwd root

8.28.4. Shadow 的内容

安装的程序: chage, chfn, chgpasswd, chpasswd, chsh, expiry, faillog, getsubids, gpasswd, groupadd, groupdel, groupmems, groupmod, grpck, grpconv, grpunconv, login, logoutd, newgidmap, newgrp, newuidmap, newusers, nologin, passwd, pwck, pwconv, pwunconv, sg (到 newgrp 的链接), su, useradd, userdel, usermod, vigr (到 vipw 的链接), 以及 vipw
安装的目录: /etc/default 和 /usr/include/shadow
安装的库: libsubid.so

简要描述

chage

用于修改强制性密码更新的最大天数

chfn

用于修改用户全名和其他信息

chgpasswd

用于批量更新组密码

chpasswd

用于批量更新用户密码

chsh

用于改变用户的默认登录 shell

expiry

检查并强制保证当前密码过期策略

faillog

用于检查失败登录日志,设定锁定账户的最大失败次数,以及重置失败次数

getsubids

用于列出一个用户的辅助 ID 范围

gpasswd

用于增加或删除组的用户和管理员

groupadd

以指定名称创建组

groupdel

删除指定的组

groupmems

允许用户在不需要超级用户权限的情况下,管理自己的组成员列表

groupmod

用于修改给定的组名称或 GID

grpck

验证组文件 /etc/group/etc/gshadow 的完整性

grpconv

根据普通组文件创建或更新加密组文件

grpunconv

根据 /etc/gshadow 文件更新 /etc/group 文件,并删除前者

login

被系统用于允许用户登录

logoutd

是一个限制登录时间和端口的守护进程

newgidmap

用于设定用户命名空间的 gid 映射

newgrp

用于在登录会话中修改当前 GID

newuidmap

用于设定用户命名空间的 uid 映射

newusers

用于批量创建或更新用户账户

nologin

显示一条账户不可用的消息;它被设计为充当已禁用账户的默认 shell

passwd

用于修改用户或组账户的密码

pwck

检验密码文件 /etc/passwd/etc/shadow 的完整性

pwconv

从普通密码文件创建或更新加密密码文件

pwunconv

根据 /etc/shadow 更新 /etc/passwd 并删除前者

sg

在用户 GID 设为给定组 ID 的情况下,执行给定命令

su

用替换的用户和组 ID 运行 shell

useradd

以指定名称创建新用户,或更新新用户默认信息

userdel

删除给定用户

usermod

用于修改给定用户的登录名称、用户标识符 (UID)、shell、初始组、home 目录等信息

vigr

编辑 /etc/group/etc/gshadow 文件

vipw

编辑 /etc/passwd/etc/shadow 文件

libsubid

用于操作用户或组的辅助 ID 范围的库