Я попытался создать пользователя с паролем через 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"
Что я скучаю? Заранее спасибо!
Это классическая проблема цитирования.
Проблема: Без кавычек или двойных кавычек подстановка команды ($()
) и расширение переменных ($
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
), и если команда перезаписывает сама себя (в данном случае, вероятно, это не так)
Как отметил @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
, но все равно нужно сгенерировать правильную соль.