Я пытался создать пользователя с паролем через 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"
Есть что-то, по чему я скучаю? Заранее спасибо!
command-line
ssh
password
users
amigcamel
источник
источник
Ответы:
Это классическая проблема цитирования.
Проблема: без каких-либо кавычек или двойных кавычек команда substitution (
$()
) и раскрытие переменной (значения$
s в возвращенном хэшированном паролеopenssl
обрабатываются как индикатор переменной) выполняются в локальной среде, а не в удаленной оболочке.Решение: используйте одинарные кавычки вокруг
useradd
команды, используемойssh
в локальной оболочке, чтобы предотвратить подстановку команд и раскрытие переменных в локальной среде, чтобы расширения происходили в удаленной неинтерактивной неинтерактивной оболочке:Обратите внимание на цитаты.
Проблемы с безопасностью:
Вход по SSH
root
должен быть отключен, если он должен быть включен, должна быть разрешена только аутентификация на основе ключейMD5 уже сломан, и без соли вы подвергаетесь простой атаке таблицы Rainbow (даже не требуется атака методом грубой форсировки / словаря);
openssl passwd
действительно генерирует случайную соль, хотя. Во всяком случае, вы действительно должны рассмотреть возможность использования SHA-2 с сольюПароли, передаваемые в качестве аргументов командам, могут быть видны другим процессам в (удаленной) системе; это зависит от того, как ваш
procfs
смонтирован (посмотритеhidepid
), и если команда переписывает себя (в этом случае, вероятно, это не так)источник
crypt(3)
в Linux и помеченный$1$
идентификатором, не совпадает с алгоритмом простого хеширования MD5, так же как хеши$5$
и$6$
пароли не являются простыми SHA-256 и SHA-512. , Метод на основе MD5 имеет фиксированное количество итераций, что является самой большой проблемой.Как отметил @heemayl, алгоритм хеширования паролей MD5 устарел, и в современных системах используются более новые хэши паролей на основе SHA-2, которые имеют настраиваемый коэффициент работы. Но инструмент командной строки OpenSSL, похоже, не поддерживает их.
chpasswd
Утилита , однако, позволит вам изменить пароль пользователя в соответствии с настройками системы.Это должно позволить вам создать нового пользователя и изменить его пароль на удаленном конце.
chpasswd
берет имя пользователя и пароль из стандартного ввода, а не из командной строки. На самом деле это является преимуществом, поскольку аргументы командной строки видимы для всех других процессов в системе, поэтому при запускеopenssl passwd
на удаленном компьютере пароль будет на мгновение виден всем процессам в системе.Я не уверен, есть ли готовая утилита командной строки для генерации хэшей паролей, известных системной
crypt(3)
функции. Perl имеет встроеннуюcrypt
функцию , но правильная соль все равно должна быть сгенерирована.источник