Мне было поручено перенести информацию и учетные записи с одного сервера Linux на другой. Я уверенно администрирую серверы Linux, но я никогда не пробовал делать подобное.
Погуглил, я нашел эту статью. http://www.cyberciti.biz/faq/howto-move-migrate-user-accounts-old-to-new-server/
Это было очень полезно. Однако у меня есть еще несколько вопросов ...
Я до сих пор не понимаю, как создаются теневые пароли. Если я просто перетащу пользователей из / etc / passwd и / etc / shadow, это действительно сработает? Как сделать так, чтобы хэши паролей совпадали? А что насчет солей?
Если мне нужно провести рефакторинг идентификаторов пользователей / групп, будет $ 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 должны сохраняться при извлечении. Вероятно, это означает, что в домашнем каталоге каждого пользователя имеется куча файлов, которыми они не владеют.
Это делает две вещи:
Он проходит через каждую строку файла passwd и захватывает СТАРЫЙ uid и имя пользователя. Он находит каждый файл в / home, принадлежащий старому uid, и запускает
Chown
Он проходит через каждую группу в старом файле группы и получает старый 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 для пользователя.