我的任务是将信息和帐户从一台 Linux 服务器迁移到另一台。我对管理 Linux 服务器很有信心,但我从未尝试过这样的迁移。
通过谷歌搜索,我找到了这篇文章。http://www.cyberciti.biz/faq/howto-move-migrate-user-accounts-old-to-new-server/
这非常有帮助。不过,我还有一些问题……
我仍然不明白影子密码是如何生成的。如果我只是从 /etc/passwd 和 /etc/shadow 拖放用户,它真的能起作用吗?如何确保密码哈希值相同?盐呢?
如果我需要重构用户/组 ID,那么
$ usermod -g (newgid) username
在要移动的机器上会修改要移动用户的文件上的 ID 吗?
答案1
对于第一个问题,如果您的影子文件采用 $1$FZPUn/2R$JsQCE3TP3Uraez2P8ISIh0 密码格式(开头为美元、数字、美元),则不存在盐值问题。因为盐值位于下一个美元之间的第一部分(在我的示例中为 FZPUn/2R)。加密的密码位于其余部分。有关详细信息,请参阅“Glibc 注释”部分的 man crypt。
因此您可以无风险地移动您的影子文件。
对于第二部分,我更喜欢直接编辑 /etc/passwd 文件并手动更改组。您的方法可能是最好的(因为有锁)。
不要忘记文件:如果您更改 UID 或 GID,则必须 chown each 以授权您的用户读取他的文件!
答案2
影子密码就是以前的旧密码文件。
不幸的是,所使用的术语,但“密码文件”(/etc/passwd)通常不再包含密码信息。它包含用户信息(特别是地理经济合作组织)
历史上,/etc/passwd 也包含密码的哈希值。但是,/etc/passwd 需要可供某些系统程序读取,因为它包含重要的用户信息(UID、主 GID、主目录等)。
因此,Unix 方式不会破坏一切,而是允许向后兼容。因此 /etc/passwd 未更改,并创建了新的密码文件 /etc/shadow,并且 /etc/passwd 中的密码字段被清空。
/etc/shadow 现在仅包含身份验证所需的最少信息(因此登录时不需要访问 /etc/passwd 和 /etc/shadow)。
影子密码文件中最重要的部分是权限,其限制更加严格。
$ ls -l /etc/shadow /etc/passwd
-rw-r--r-- 1 root root 2041 2009-08-18 13:24 /etc/passwd
-rw-r----- 1 root shadow 1213 2009-08-18 13:24 /etc/shadow
如您所见,每个人都可以读取 /etc/passwd,而在我的 Ubuntu 系统上,只有 root 和 shadow 组才能读取 /etc/shadow(这是 Ubuntu 主义 - 许多系统只允许 root 读取,但“shadow”显然是一个特权系统组)。
再次强调,从历史上看,你的密码是使用以下方式加密的:数据加密标准但大多数现代发行版都使用更安全的 MD5 算法(我现在暂时这么说,但它肯定比 DES 更安全)来隐藏密码。任何以 $1$ 开头的密码哈希都是 MD5 哈希。
正如另一位海报所解释的,盐包含在哈希本身中,因此可以安全地从一台机器复制到另一台机器。
您不需要对重构用户和组 ID 做太多工作,除非您确实需要指定目标 uid/gid。可能目标系统存在冲突或不同的 uid/gid 编号方案,因此这通常不是必需的。在这种情况下,您不需要在这里参与 uid/gid 的混乱。usermod -g 也接受名称和数字。
如果您仅复制 passwd 文件(即不使用 useradd / groupadd)工具,那么您只需要 usermod -g 所有用户及其主要组)。
如果 UID / GID 发生变化,您可能还需要更改用户文件的权限。这有点棘手,但我在下面包含了一些代码。希望它能正常工作!
#!/bin/bash
## Variables to change
HOMEDIR="/home"
OLDPASSWD="oldpasswd"
OLDGROUP="oldgroup"
## System binaries - shouldn't need to change
AWK="/usr/bin/awk"
GREP="/bin/grep"
FIND="/usr/bin/find"
XARGS="/usr/bin/xargs"
CHOWN="/bin/chown"
CHGRP="/bin/chgrp"
${AWK} -F":" '{print $1,$3}' < ${OLDPASSWD} | \
while read user uid; do
if [ $? -ne 0 ]; then
echo "EOF"
fi
echo "[uid: ${uid} -> ${user} on ${HOMEDIR}]"
${FIND} ${HOMEDIR} -uid ${uid} -print0 | \
${XARGS} --no-run-if-empty -0 ${CHOWN} ${user}
done
${AWK} -F":" '{print $1,$3}' < ${OLDGROUP} | \
while read group gid; do
if [ $? -ne 0 ]; then
echo "EOF"
fi
echo "[gid: ${gid} -> ${group} on ${HOMEDIR}]"
${FIND} ${HOMEDIR} -gid ${gid} -print0 | \
${XARGS} --no-run-if-empty -0 ${CHGRP} ${group}
done
您将需要迁移源机器上的旧 /etc/passwd 和 /etc/group。复制用户内容时(如果您使用 tar,请使用“p”标志来保留权限),提取时应保留 uid/gid。这可能意味着每个用户主目录中都有一堆不属于他们的文件。
这做了两件事:
它遍历 passwd 文件的每一行并获取旧 uid 和用户名。它查找 /home 中所有由旧 uid 拥有的文件并运行
chown
它遍历旧组文件中的每个组,并获取旧组 ID 和组名。它找到 /home 中所有由旧组 ID 拥有的文件,然后运行
组
您可以编辑旧的密码文件,只对家中的用户执行此操作
例如
grep "/home" oldpasswd > oldpasswd.filter
或者仅适用于特定 UID 范围内的某些用户(下例中为 100 和 200)。
awk -F":" '$3 > 100 && $3 < 200 {print $0}' oldpasswd > oldpasswd.filter
答案3
正如您所意识到的,这里棘手的部分是使用新的 UID/GID 信息重新标记您拥有的所有文件。如果您使用 usermod 更改 UID,它将修复用户在其主目录中拥有的文件,但这是您可以免费获得的全部内容——只有这些文件,并且没有 gid 更改的帮助。要进行组更改或确保您获得了所有用户的文件(而不仅仅是他们主目录中的文件),您确实需要在整个文件系统中运行 find 来查找它们。有一个很好的例子更改用户的 UID 和 GID。