Неможливо створити користувача з паролем через ssh [closed]


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"

Чи є щось, що я сумую? Спасибі заздалегідь!


Передача паролів у командному рядку - погана ідея, оскільки інші користувачі можуть бачити аргументи командного рядка. Дивіться на це відповідь heemayl. Крім цього, це звучить як проблема XY . Чого ви насправді намагаєтесь досягти? Який сенс пароля облікового запису, про який ніхто не знає (або він повинен знати)? Якщо справа в тому, щоб створити обліковий запис, який не приймає вхід за допомогою пароля, просто не встановіть пароля, що дозволить увійти на основі пароля вимкнено як політику за замовчуванням Ubuntu.
Девід Фоерстер

Відповіді:


22

Це класичне питання цитування.

Проблема: Без будь-якого котирування або подвійного цитування заміщення команд ( $()) та розширення змінної ( $s в хешованому паролі, поверненому посиланням, opensslтрактується як індикатор змінної), робиться в локальному середовищі, а не на віддаленій оболонці.

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

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

Зверніть увагу на пропозиції.

Питання безпеки:

  • rootУвійти в SSH слід вимкнути, якщо у вас має бути включено лише автентифікацію на основі ключа

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

  • Паролі, передані як аргументи командам, можуть бути видимими для інших процесів у (віддаленій) системі; це залежить від способу procfsмонтування (дивіться hidepid), і якщо команда переписує себе (це, мабуть, це не так)


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бере ім'я користувача та пароль із stdin, а не командного рядка. Це фактично перевага, оскільки аргументи командного рядка видно для всіх інших процесів у системі, тому, якщо запустити openssl passwdна пульті, пароль буде миттєво видимим для всіх процесів у системі.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.