mkpasswd -m sha-512 выдает неверный логин

У меня проблемы с попыткой установить пароли для моих новых пользователей.

Я нашел учебное пособие, указывающее, что 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

Вход в систему очень хорошо!

3
задан 3 December 2017 в 23:59

2 ответа

1112 Ладно, я закрыла вопрос. Поскольку вывод 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

4
ответ дан 3 December 2017 в 23:59

Почему это происходит?

Причина, по которой он терпит неудачу, заключается в том, что элементы с начальным $ обрабатываются как переменные и не заключаются в кавычки при передаче их в 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

Что можно сделать? Что работает?

Однако подоболочка работает, потому что замены не происходит - нет переменных. И цитирование также работает по той же причине.

Вот несколько методов:

  1. Подстановка команд:

    $ sudo -p ">" useradd -m -s /bin/bash -p $(mkpasswd --hash=SHA-512 "123" ) newusr        
    >
    $ su newusr
    Password: 
    newusr@ubuntu1604:/home/admin$ 
    
  2. Одинарные кавычки (обратите внимание, что 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
    
  3. Возьмите выходные данные из потока mkpasswd stdout и передайте его через xargs с флагом -I:

    $ mkpasswd -m sha-512 'password1' | sudo -p '>' xargs -I % useradd -p % newuser1 
    
  4. Добавить \ к каждому $ (который ОП выяснил в свой ответ ). Сценарий также, согласно комментария Джорджа .

    $ useradd -m -s /bin/bash -p \$6\$5AfGzrQ9u\$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1 newuser
    
3
ответ дан 3 December 2017 в 23:59

Другие вопросы по тегам:

Похожие вопросы: