У меня проблемы с попыткой установить пароли для моих новых пользователей.
Я нашел учебное пособие, указывающее, что mkpasswd -m sha-512 "my password here"
выдаст соленый и хешированный пароль, который можно использовать в сочетании с useradd -m -p "hashed and salted passwd" -s /bin/bash username
, однако, когда я попробовал это на тестовом пользователе, я продолжал получать Incorrect Login
.
Я использую Ubuntu 16.04 и использую mkpasswd
из пакета whois
.
Что я здесь не так делаю?
1) apt update
2) apt install whois
3) mkpasswd -m sha-512 "my password here"
производит: $6$1FuuSdKgVke$bc8doOVGZhzomoeafvcQnpYhAxfR4aWdAuYvbxSHw6ZCFZ4NC5j9C762kmvs4Pc66bv4.LYTfrlknm5cWx65g.
4) useradd -m -p $6$1FuuSdKgVke$bc8doOVGZhzomoeafvcQnpYhAxfR4aWdAuYvbxSHw6ZCFZ4NC5j9C762kmvs4Pc66bv4.LYTfrlknm5cWx65g. -s /bin/bash testuser
5) login testuser
Запрашивает пароль:
6) введите мой пароль здесь
Говорит: Login incorrect
Хочу добавить, что я пробовал то же самое с паролем без пробелов, и опущены кавычки из команды mkpasswd
. Казалось, ни то, ни другое не изменило.
Я также попытался сделать пользователя без флага -p (то есть не добавлять пароль) и вручную скопировал соленый / хешированный пароль в /etc/shadow
, что дает те же результаты, что и выше, Логин неверный.
Еще интереснее, если я использую подоболочку для ввода значения, кажется, все работает нормально.
useradd -m -p $(mkpasswd -m sha-512 "my password") -s /bin/bash test
login test
тип: my password
Вход в систему очень хорошо!
mkpassword
приведет к $id$salt$hash
, когда вы скопируете и вставите это в команду useradd
, bash попытается выполнить замену переменной на $
. Таким образом, их необходимо экранировать, используя \$id\$salt\$hash
, чтобы bash не делал замену переменных перед добавлением строки в /etc/shadow
.
mkpasswd -m sha-512 "my password"
приводит к
$6$5AfGzrQ9u$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1
, который можно скопировать и вставить в useradd
, убедившись, что каждый $
заменен на \$
.
useradd -m -s /bin/bash -p \$6\$5AfGzrQ9u\$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1
Причина, по которой он терпит неудачу, заключается в том, что элементы с начальным $
обрабатываются как переменные и не заключаются в кавычки при передаче их в useradd
.
Части $6...
, $1...
и $b...
из вашего хэша рассматриваются как переменные. Конечно, ошибка в оболочке - оболочки выполняют расширение переменных (если они не заключены в одинарные кавычки), прежде чем что-либо запускается. И поскольку эти 3 переменные не существуют в вашей среде, они исчезают из строки, которую вы передаете useradd
.
Давайте посмотрим, какая команда фактическая выполняется после того, как оболочка выполнила все необходимые расширения и замены и передала это системному вызову execve()
. Сравните:
$ strace -e execve useradd -p $abra$cadabra newuser
execve("/usr/sbin/useradd", ["useradd", "-p", "newuser"], [/* 82 vars */]) = 0
$ strace -e trace=execve useradd -p '$abra$cadabra' newuser
execve("/usr/sbin/useradd", ["useradd", "-p", "$abra$cadabra", "newuser"], [/* 82 vars */]) = 0
В первом примере $abra$cadabra
(в котором находится ваш хэш) исчезает из команды, которая фактически запускается системой. Напротив, одиночная кавычка $abra$cadabra
во втором примере появляется в списке аргументов, которые передаются в execve()
.
Другими словами, вы сгенерировали правильный хеш, но shell передает useradd
совершенно другой аргумент в качестве аргумента, который в конечном итоге является командой, выполняемой системой. Фактически, давайте просто возьмем ваш хеш для примера и сравним два случая цитирования и отсутствия кавычек:
$ strace -e execve echo $6$1FuuSdKgVke$bc8doOVGZhzomoeafvcQnpYhAxfR4aWdAuYvbxSHw6ZCFZ4NC5j9C762kmvs4Pc66bv4.LYTfrlknm5cWx65g
execve("/bin/echo", ["echo", "FuuSdKgVke.LYTfrlknm5cWx65g"], [/* 82 vars */]) = 0
FuuSdKgVke.LYTfrlknm5cWx65g
+++ exited with 0 +++
Обратите внимание, что то, что система на самом деле видит после того, как оболочка выполнила обработку переменных, это FuuSdKgVke.LYTfrlknm5cWx65g
. Но он увидит правильный хеш, если вы укажете его:
$ strace -e execve echo '$6$1FuuSdKgVke$bc8doOVGZhzomoeafvcQnpYhAxfR4aWdAuYvbxSHw6ZCFZ4NC5j9C762kmvs4Pc66bv4.LYTfrlknm5cWx65g'
execve("/bin/echo", ["echo", "$6$1FuuSdKgVke$bc8doOVGZhzomoeaf"...], [/* 82 vars */]) = 0
Однако подоболочка работает, потому что замены не происходит - нет переменных. И цитирование также работает по той же причине.
Вот несколько методов:
Подстановка команд:
$ sudo -p ">" useradd -m -s /bin/bash -p $(mkpasswd --hash=SHA-512 "123" ) newusr
>
$ su newusr
Password:
newusr@ubuntu1604:/home/admin$
Одинарные кавычки (обратите внимание, что I ' мы обрезали фактический хеш, потому что он слишком длинный и не подходит для форматирования):
$ sudo -p ">" mkpasswd --hash=SHA-512 "112"
>
GVhvDY$vhw89D2X0bd2REQWE
$ sudo -p ">" useradd -m -s /bin/sh -p 'GVhvDY$vhw89D2X0bd2REQWE' newusr2
>
$ su newusr2
Password:
$ echo $USER
newusr2
Возьмите выходные данные из потока mkpasswd
stdout
и передайте его через xargs
с флагом -I
:
$ mkpasswd -m sha-512 'password1' | sudo -p '>' xargs -I % useradd -p % newuser1
Добавить \
к каждому $
(который ОП выяснил в свой ответ ). Сценарий также, согласно комментария Джорджа .
$ useradd -m -s /bin/bash -p \$6\$5AfGzrQ9u\$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1 newuser