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

Я попытался создать пользователя с паролем через 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"

Что я скучаю? Заранее спасибо!

13
задан 29 March 2017 в 23:23

2 ответа

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

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

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

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

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

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

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

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

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

22
ответ дан 23 November 2019 в 03:13

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

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

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

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

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

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

7
ответ дан 23 November 2019 в 03:13

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

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