Назад | Перейти на главную страницу

Перенос пользователей между серверами Linux, если необходимо изменить UID?

Мне было поручено перенести информацию и учетные записи с одного сервера Linux на другой. Я уверенно администрирую серверы Linux, но я никогда не пробовал делать подобное.

Погуглил, я нашел эту статью. http://www.cyberciti.biz/faq/howto-move-migrate-user-accounts-old-to-new-server/

Это было очень полезно. Однако у меня есть еще несколько вопросов ...

  1. Я до сих пор не понимаю, как создаются теневые пароли. Если я просто перетащу пользователей из / etc / passwd и / etc / shadow, это действительно сработает? Как сделать так, чтобы хэши паролей совпадали? А что насчет солей?

  2. Если мне нужно провести рефакторинг идентификаторов пользователей / групп, будет $ usermod -g (newgid) username на машине для перемещения изменить идентификаторы файлов пользователя для перемещения?

Теневые пароли - это то, что раньше были файлами старых паролей.

К сожалению, используется терминология, но «файл паролей» (/ etc / passwd) обычно больше не содержит информации о паролях. Он содержит информацию о пользователе (в частности, GECOS)

Исторически / etc / passwd также содержал хэш вашего пароля. Однако / etc / passwd должен быть доступен для чтения определенными системными программами, поскольку он содержит важную информацию о пользователе (UID, основной GID, домашний каталог и т. Д.)

Таким образом, вместо того, чтобы ломать все, Unix Way обеспечивает обратную совместимость. Таким образом, / 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, а / etc / shadow доступен для чтения только в моей системе Ubuntu с правами root и теневой группой (это Ubuntu-ism - многие системы позволяют читать только root, но ' shadow ', очевидно, является привилегированной системной группой).

Опять же, исторически ваш пароль был зашифрован с помощью DES но большинство современных дистрибутивов имеют теневые пароли с использованием более безопасного (я говорю это предварительно, но он определенно более безопасен, чем DES) алгоритма MD5. Любой хэш пароля, начинающийся с $ 1 $, является хешем MD5.

Соль, как объяснил другой постер, содержится в самом хэше, поэтому их можно безопасно копировать с одной машины на другую.

Вам не нужно много делать с рефакторингом идентификаторов пользователей и групп, если вам действительно не нужно указывать целевой 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. Он проходит через каждую группу в старом файле группы и получает старый gid и имя группы. Он находит каждый файл в / home, принадлежащий старому gid, и запускает

    chgrp

Вы можете отредактировать старый файл passwd, чтобы сделать это только для пользователей, которые находятся дома

например

grep "/home" oldpasswd > oldpasswd.filter

Или только для определенных пользователей в определенном диапазоне UID (100 и 200 в примере ниже).

awk -F":" '$3 > 100 && $3 < 200 {print $0}' oldpasswd > oldpasswd.filter

Что касается первого вопроса, то проблем с солью нет, если ваш теневой файл имеет формат пароля $ 1 $ FZPUn / 2R $ JsQCE3TP3Uraez2P8ISIh0 (с долларом, числом, долларом в начале). Потому что соль является первой частью между следующими долларами (FZPUn / 2R в моем примере). Остальное - зашифрованный пароль. См. Man crypt в разделе «Заметки Glibc».

Таким образом, вы можете перемещать теневой файл без риска.

Что касается второй части, я предпочитаю редактировать файл / etc / passwd напрямую и изменять группу вручную. Ваш метод, возможно, лучший (из-за блокировки).

Не забывайте файлы: если вы измените UID или GID, вы должны выбрать каждый из них, чтобы разрешить пользователю читать его файлы!

Как вы уже поняли, сложная часть здесь - это перемаркировать все файлы, которые у вас есть, с новой информацией UID / GID. Если вы используете usermod для изменения UID, он исправит файлы, принадлежащие пользователю, в их домашнем каталоге, но это ровно столько, сколько вы получаете бесплатно - это только эти файлы, и никакой помощи при изменении gid не будет. Чтобы внести групповые изменения или убедиться, что у вас есть все файлы пользователя (а не только те, которые находятся в его доме), вам действительно нужно запустить find по всей файловой системе, чтобы найти их. Есть хороший пример на Изменение UID и GID для пользователя.