Невозможно создать пользователя с паролем через ssh [закрыто]

13

Я пытался создать пользователя с паролем через SSH (с правами root), как это:

ssh root@123.45.6.7 useradd -p $(openssl passwd -1 1234) newuser

Таким образом, я мог успешно создать учетную запись с именем newuser, но я не мог войти с ожидаемым паролем (который есть 1234)

Не имеет значения, если я добавлю двойные кавычки:

ssh root@123.45.6.7 "useradd -p $(openssl passwd -1 1234) newuser"

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

password=$(openssl passwd -1 1234)
ssh root@123.45.6.7 "useradd -p $password newuser"

Есть что-то, по чему я скучаю? Заранее спасибо!

amigcamel
источник
Передача паролей в командной строке - плохая идея, потому что другие пользователи могут видеть аргументы командной строки. Смотрите ответ Химейла за это. Кроме того, это звучит как проблема XY . Чего вы на самом деле пытаетесь достичь? Какой смысл пароля учетной записи, который никто не знает (или должен знать)? Если дело в том, чтобы создать учетную запись, которая не принимает входы через пароль, просто не устанавливайте пароль вообще, в результате чего вход на основе пароля будет отключен в качестве политики Ubuntu по умолчанию.
Дэвид Фёрстер

Ответы:

22

Это классическая проблема цитирования.

Проблема: без каких-либо кавычек или двойных кавычек команда substitution ( $()) и раскрытие переменной (значения $s в возвращенном хэшированном пароле opensslобрабатываются как индикатор переменной) выполняются в локальной среде, а не в удаленной оболочке.

Решение: используйте одинарные кавычки вокруг useraddкоманды, используемой sshв локальной оболочке, чтобы предотвратить подстановку команд и раскрытие переменных в локальной среде, чтобы расширения происходили в удаленной неинтерактивной неинтерактивной оболочке:

ssh root@123.45.6.7 'useradd -p "$(openssl passwd -1 1234)" newuser'

Обратите внимание на цитаты.

Проблемы с безопасностью:

  • Вход по SSH rootдолжен быть отключен, если он должен быть включен, должна быть разрешена только аутентификация на основе ключей

  • MD5 уже сломан, и без соли вы подвергаетесь простой атаке таблицы Rainbow (даже не требуется атака методом грубой форсировки / словаря); openssl passwdдействительно генерирует случайную соль, хотя. Во всяком случае, вы действительно должны рассмотреть возможность использования SHA-2 с солью

  • Пароли, передаваемые в качестве аргументов командам, могут быть видны другим процессам в (удаленной) системе; это зависит от того, как ваш procfsсмонтирован (посмотрите hidepid), и если команда переписывает себя (в этом случае, вероятно, это не так)

heemayl
источник
1
Работает как шарм, и спасибо за дополнительную информацию!
Amigcamel
1
хэш пароля md5crypt имеет соль ...
ilkkachu
@ilkkachu MD5 не является безопасным хешем. Если вам интересно, запустите поиск по информационной безопасности . На самом деле вы должны использовать составной алгоритм или криптографическую библиотеку, но SHA-2 значительно лучше, чем MD5.
wizzwizz4
1
@ wizzwizz4 да, это хорошо известно, это не меняет того факта, что информация в этом ответе неверна. :)
Хоббс
2
@ wizzwizz4, хэш пароля ( md5crypt ), поддерживаемый crypt(3)в Linux и помеченный $1$идентификатором, не совпадает с алгоритмом простого хеширования MD5, так же как хеши$5$ и $6$ пароли не являются простыми SHA-256 и SHA-512. , Метод на основе MD5 имеет фиксированное количество итераций, что является самой большой проблемой.
ilkkachu
7

Как отметил @heemayl, алгоритм хеширования паролей MD5 устарел, и в современных системах используются более новые хэши паролей на основе SHA-2, которые имеют настраиваемый коэффициент работы. Но инструмент командной строки OpenSSL, похоже, не поддерживает их.

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

Это должно позволить вам создать нового пользователя и изменить его пароль на удаленном конце.

echo "newuser:newpass" | ssh root@123.45.6.7 'useradd newuser; chpasswd' 

chpasswdберет имя пользователя и пароль из стандартного ввода, а не из командной строки. На самом деле это является преимуществом, поскольку аргументы командной строки видимы для всех других процессов в системе, поэтому при запуске openssl passwdна удаленном компьютере пароль будет на мгновение виден всем процессам в системе.

Я не уверен, есть ли готовая утилита командной строки для генерации хэшей паролей, известных системной crypt(3)функции. Perl имеет встроенную cryptфункцию , но правильная соль все равно должна быть сгенерирована.

ilkkachu
источник