如果 UID 需要改变,是否需要在 Linux 服务器之间迁移用户?

如果 UID 需要改变,是否需要在 Linux 服务器之间迁移用户?

我的任务是将信息和帐户从一台 Linux 服务器迁移到另一台。我对管理 Linux 服务器很有信心,但我从未尝试过这样的迁移。

通过谷歌搜索,我找到了这篇文章。http://www.cyberciti.biz/faq/howto-move-migrate-user-accounts-old-to-new-server/

这非常有帮助。不过,我还有一些问题……

  1. 我仍然不明白影子密码是如何生成的。如果我只是从 /etc/passwd 和 /etc/shadow 拖放用户,它真的能起作用吗?如何确保密码哈希值相同?盐呢?

  2. 如果我需要重构用户/组 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。这可能意味着每个用户主目录中都有一堆不属于他们的文件。

这做了两件事:

  1. 它遍历 passwd 文件的每一行并获取旧 uid 和用户名。它查找 /home 中所有由旧 uid 拥有的文件并运行

    chown

  2. 它遍历旧组文件中的每个组,并获取旧组 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

相关内容