Linux передать пароль в команду

Обновлено: 06.07.2024

При написании скриптов на Bash для автоматизации создания нового пользователя Linux так, как например описано в → этой статье (с помощью команды useradd ) не достаточно просто передать пароль в эту команду. Передаваемый пароль должен быть зашифрован. Иначе, при создании нового пользователя, значение его пароля будет сохранено «как есть», а при попытке входа этого пользователя в систему, пароль будет кодироваться. И пользователь не сможет залогиниться так как обычно закодированный вариант пароля и его вводимое значения не совпадают. В этой статье подробно рассмотрим, как передавать в систему закодированную версию пароля пользователя.

Какой пароль пользователя нужен для команды useradd в Линукс

Для начала разберёмся с тем, какой пароль пользователя нужен для команды useradd в Debian. Для этого, как было подробно рассмотрено в статье по ссылке во вступлении, посмотрим мануал этой команды и увидим, что опция -p, необходимая для передачи пароля, требует:

зашифрованного варианта ввода пароля.

Значит, то, что нужно передать в систему должно быть сначала зашифровано. Сразу покажу, как это сделать, а потом накидаю, куда смотреть, если понадобятся подробности.

Команда для шифрования пароля пользователя в Linux

Итак, зашифровать пользователь в том виде, в котором он требуется для правильной работы с авторизацией пользователей в Линукс, можно таким способом:

В примере выше, зашифрованная версия пароля сохранится в переменной encpass .

Для шифрования используется функция openssl с параметрами passwd и -crypt , ну и, собственно, передаётся само значение пароля в не зашифрованном виде.

Подробное описание функции openssl можно прочитать в мануале, вызвав его man openssl .

Краткую подсказку по функции openssl можно получить, введя openssl help . При этом будет выдан список стандартных и прочих команд по управлению процессом шифрования.

Резюме

Более подробно рассматривать разные режимы шифрования, их алгоритмы, принципы передачи и хранения данных, мне пока не интересно. Самое главное — вопрос, как создавать пользователя, передавая значение его пароля в систему через переменную, рассмотрен, опробован и оказался работоспособен.

Я пишу программу C Shell, которая будет делать su или sudo или ssh . Все они хотят, чтобы их пароли вводились в консоли (TTY), а не в stdin или в командной строке.

Кто-нибудь знает решение?

Настройка без пароля sudo не вариант.

ожидать может быть вариантом, но его нет в моей урезанной системе.

Для sudo есть опция -S для принятия пароля от стандартного ввода. Вот мужская запись:

Это позволит вам выполнить команду вроде:

Что касается SSH, я предпринял много попыток автоматизировать / сценарий его использования безуспешно. Кажется, что нет встроенного способа передать пароль в команду без запроса. Как уже упоминалось, утилита « ожидаем », похоже, нацелена на решение этой дилеммы, но, в конечном счете, правильная авторизация с закрытым ключом - правильный путь при попытке ее автоматизировать.

К счастью, в Ruby есть встроенный SSH-клиент, который позволяет вам указать пароль. Вы можете попробовать ruby ​​-e "require 'net / ssh'; Net :: SSH.start (" example.com "," test_user ",: password => 'secret') do | ssh | Put 'Успешный вход в систему'; пока cmd = получает; помещает ssh.exec! (cmd); end end " Я ненавижу быть участником вечеринки здесь, но это может привести к тому, что ваш пароль появится в списке процессов. Я пытался найти лучший путь, наткнулся на эту статью и был удивлен, что никто не указал на нее. Отличное решение, но остерегайтесь рисков. Избегайте отображения пароля в списке процессов или лог-файлах, поместив его в файл и используя cat; 'cat pw | sudo -S <command> и позже rm pw . Другой способ - использовать netcat и доставить пароль через сокет - nc -l 12345 | sudo -S <command> . На отправляющей стороне; echo myPassord | nc <target> 12345 , Это просто перемещает проблему обработки пароля, но, вероятно, на главную консоль, где у вас есть больше возможностей.

Я написал некоторый Applescript, который запрашивает пароль через диалоговое окно, а затем создает собственную команду bash, например:

Я не уверен, поможет ли это.

Было бы неплохо, если бы sudo принял предварительно зашифрованный пароль, чтобы я мог зашифровать его в своем скрипте и не беспокоиться о том, чтобы повторять пароли с открытым текстом. Однако это работает для меня и моей ситуации.

Как автоматизировать вход по SSH с паролем? Я настраиваю свою тестовую виртуальную машину, поэтому усиление безопасности не рассматривается. SSH выбран для приемлемой безопасности с минимальной настройкой.

echo password | ssh id@server

Это не работает.

Я помню, что проделал это с помощью некоторых трюков, которыми кто-то руководил, но я не могу вспомнить, какой трюк я использовал .

Ответ 1

Не используйте пароль. Создайте SSH-ключ без ключевой фразы и отправьте его на свою виртуальную машину.

Если у вас уже есть SSH-ключ, вы можете пропустить этот шаг . Просто нажмите Enter для ключа и обеих парольных фраз:

$ ssh-keygen -t rsa -b 2048

Generating public/private rsa key pair.

Enter file in which to save the key (/home/username/.ssh/id_rsa):

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /home/username/.ssh/id_rsa.

Your public key has been saved in /home/username/.ssh/id_rsa.pub.

Скопируйте свои ключи на целевой сервер:

$ ssh-copy-id id@server

id@server's password:

Теперь попробуйте войти в систему с помощью ssh 'id@server' и зарегистрируйтесь:

.ssh/authorized_keys

чтобы убедиться, что мы не добавили лишние ключи.

Наконец, проверьте вход…

$ ssh id@server

id@server:

$

Вы также можете изучить возможность использования, ssh-agent, если хотите попытаться защитить свои ключи парольной фразой.

Ответ 2

$ sudo apt-get install sshpass

$ sshpass -p your_password ssh user@hostname

Ответ 3

Ответ 4

Ответ 5

Единый вход SSH обычно достигается с помощью аутентификации с открытым ключом и агента аутентификации. Вы можете легко добавить свой тестовый ключ виртуальной машины к существующему агенту аутентификации (см. Пример ниже). Существуют и другие методы, такие как gssapi / kerberos, но они более сложные.

sshpass

Ответ 6

Я удивлен, что никто не упомянул plink о putty-tools пакете в Ubuntu:

plink user@domain -pw mypass [cmd]

Он также доступен в Windows, а синтаксис в основном совместим с клиентом openssh.

Ответ 7

Ответ 8

В зависимости от ваших потребностей в автоматизации, возможно, вам подойдет Ansible. Он может прекрасно управлять такими вещами, как запрос пароля, запрос пароля sudo, различные способы изменения использования, безопасное использование зашифрованных хранилищ.

Если это не подходит, я бы предложил Expect.

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Данная глава содержит дополнительную информацию о паролях локальных пользователей.

В главе подробно описаны три метода установки паролей; с использованием утилиты passwd , с использованием реализации алгоритма шифрования passwd из библиотеки openssl , а также с использованием функции crypt в программе на языке C.

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

Утилита passwd

Пароли пользователей могут устанавливаться с помощью утилиты passwd . При смене паролей пользователям придется предоставлять утилите свои старые пароли перед двукратным вводом новых паролей. Как вы видите, утилита passwd может выполнять простейшую проверку с целью предотвращения использования слишком простых паролей для учетных записей пользователей. Пользователь root не должен выполнять эти правила (хотя он и будет видеть предупреждения). Также пользователь root не должен вводить старый пароль перед двукратным вводом нового пароля.

Файл shadow

Пароли пользователей хранятся в зашифрованном виде в файле /etc/shadow . Файл /etc/shadow доступен только для чтения и может читаться исключительно пользователем root. В разделе, посвященном правам доступа к файлам, мы поговорим о том, как пользователям удается изменять свои пароли. На текущий момент вам нужно знать лишь о том, что пользователи могут изменять свои пароли с помощью утилиты /usr/bin/passwd .

Файл /etc/shadow содержит таблицу с девятью разделенными двоеточиями столбцами. Эти девять столбцов (слева направо) содержат имя пользователя, зашифрованный пароль, время последнего изменения пароля (первый день соответствует 1 января 1970 года), количество дней, в течение которых пароль должен оставаться неизменным, день истечения срока действия пароля, количество дней перед истечением срока действия пароля, в течение которых должно выводиться предупреждение, количество дней после истечения срока действия пароля, по прошествии которых учетная запись должна быть отключена, а также день, когда учетная запись была отключена (также с начала 1970 года). Последнее поле пока не имеет значения.

Все пароли в примере выше являются хэшами фразы hunter2 .

Шифрование ключевых фраз с помощью утилиты passwd

Пароли пользователей системы хранятся в зашифрованном формате. Их шифрование осуществляется средствами функции crypt . Простейший (и рекомендованный) способ добавления пользователя с заданным паролем в систему заключается в добавлении пользователя в систему с помощью команды useradd -m имя_пользователя с последующей установкой пароля с помощью утилиты passwd .

Шифрование ключевых фраз с помощью утилиты openssl

Другой способ создания учетных записей пользователей с паролями заключается в использовании параметра -p утилиты useradd, но в случае использования данного параметра утилите необходимо передавать уже зашифрованный пароль. Вы можете зашифровать пароль с помощью команды openssl passwd .

Команда openssl passwd позволяет сгенерировать несколько отдельных хэшей для одного и того же пароля, причем для этой цели используется значение salt . Данное значение salt может быть выбрано произвольным образом и будет отображаться в виде двух первых символов хэша. В данном примере показана методика создания учетной записи пользователя с паролем.

Помните о том, что после выполнения данной команды ваш пароль в открытом виде будет сохранен в файле истории команд командной оболочки!

Шифрование ключевых фраз с помощью функции crypt

Третий вариант заключается в создании вашей собственной программы на языке программирования C, которая будет использовать функцию crypt с ее последующей компиляции в бинарный файл. Эта простая программа может быть скомпилирована средствами компилятора gcc с помощью команды, аналогичной следующей: При использовании описанной программы MyCrypt нам придется передавать два параметра. Первым параметром является незашифрованный пароль, а вторым - значение salt. Значение salt используется для изменения алгоритма шифрования в соответствии с одним из 4096 различных вариантов. Данная вариация используется для предотвращения ситуаций, в которых два пользователя с одним и тем же паролем могут использовать одну и ту же запись в файле /etc/shadow .

Обратили ли вы внимание на то, что первые два символа зашифрованного пароля являются значением salt ?

Стандартный вывод функции crypt генерируется с использованием алгоритма DES, который давно устарел и может быть взломан за считанные минуты. Более предпочтительным алгоритмом для шифрования паролей является алгоритм md5 , который может быть распознан по начальным символам значения salt $1$. Длина значения salt для алгоритма md5 может достигать восьми символов. Значения salt хранятся в открытом виде в строках файла /etc/shadow между вторым и третьим символами $, поэтому никогда не используйте строку пароля в качестве значения salt!

Файл /etc/login.defs

Файл /etc/login.defs содержит некоторые стандартные значения параметров паролей пользователей, таких, как период устаревания паролей или ограничения длины паролей. (Там же вы можете обнаружить числовые ограничения идентификаторов пользователей и идентификаторов групп, а также указание на то, должна ли создаваться домашняя директория пользователя по умолчанию).

Утилита chage

Утилита chage может использоваться для установки даты истечения срока действия пользовательской учетной записи (-E), установки минимального (-m) и максимального (-M) срока действия пароля, даты истечения срока действия пароля, а также установки количества дней, в течение которых выводятся предупреждения об истечении срока действия пароля. Многие из этих функций реализованы также и в рамках утилиты passwd . Параметр -l утилиты chage позволяет ознакомиться с текущими значениями этих параметров для указанного пользователя.

Блокировка учетных записей

Пароли из файла /etc/shadow не могут начинаться с символа восклицательного знака. Если второе поле в строке из файла /etc/passwd начинается с символа восклицательного знака, пароль не может использоваться.

Использование данной особенности обычно называется блокировкой , деактивацией или отключением пользовательской учетной записи. Помимо текстового редактора vi (или vipw) вы можете использовать утилиту usermod для этой цели.

Первая команда из следующего примера предназначена для вывода хэшированного пароля пользователя laura из файла /etc/shadow . Следующая команда позволяет деактивировать пароль пользователя laura , после чего Laura не сможет пройти фазу аутентификации при условии использования данного пароля. Как видно в примере ниже, в результате перед хэшем пароля просто добавляется символ восклицательного знака. Пользователь root (а также пользователи с доступом к команде su посредством sudo ) все так же будут иметь возможность использовать команду su для работы с учетной записью пользователя laura (так как в этом случае пароль пользователя не требуется). Кроме того, следует учитывать тот факт, что Laura все еще сможет войти в систему в том случае, если она заранее настроила доступ по ssh без использования пароля! Вы можете снова разблокировать учетную запись с помощью команды usermod -U .

Следует подходить с осторожностью к работе и учитывать различия параметров интерфейса командной строки утилит passwd , usermod и useradd в различных дистрибутивах Linux. Проверяйте содержимое локальных файлов при использовании таких возможностей, как "деактивация, отключение или блокировка" учетных записей пользователей и их паролей.

Редактирование локальных файлов

В том случае, если вы все еще хотите отредактировать вручную файл /etc/passwd или /etc/shadow , располагая информацией о командах для управления паролями, используйте утилиту vipw вместо непосредственного использования текстового редактора vi(m). Утилита vipw осуществляет корректную блокировку данного файла.

Практическое задание: пароли пользователей

1. Установите пароль hunter2 для пользователя serena .

2. Также установите пароль для пользователя venus , после чего заблокируйте учетную запись пользователя venus с помощью утилиты usermod . Проверьте наличие признаков блокировки в файле /etc/shadow до и после осуществления блокировки.

3. Используйте команду passwd -d для деактивации пароля пользователя serena . Проверьте наличие строки для пользователя serena в файле /etc/shadow до и после осуществления деактивации.

4. Каковы различия между операцией блокировки пользовательской учетной записи и операцией деактивации пароля пользовательской учетной записи, которые мы только что осуществляли с помощью команд usermod -L и passwd -d ?

5. Попытайтесь изменить пароль serena на пароль serena as serena.

6. Сделайте так, чтобы пользователь serena был обязан изменять пароль через каждые 10 дней.

7. Сделайте так, чтобы каждый новый пользователь был обязан изменять свой пароль через каждые 10 дней.

8. Воспользуйтесь учетной записью пользователя root для создания резервной копии файла /etc/shadow . Используйте текстовый редактор vi для копирования хэша пароля hunter2 из строки пользователя venus в строку пользователя serena . Может ли после этого пользователь serena войти в систему с паролем hunter2 ?

9. В каких случаях следует использовать утилиту vipw вместо vi ? Какая проблема может возникнуть при использовании текстового редактора vi или vim для редактирования файла паролей?

10. Используйте команду chsh для вывода списка доступных командных оболочек (данная команда будет работать исключительно в дистрибутивах RHEL/CentOS/Fedora) и сравните вывод с выводом команды cat /etc/shells .

11. Какой параметр утилиты useradd позволяет установить имя домашней директории пользователя?

12. Как можно определить, заблокирован или разблокирован пароль пользователя serena ? Предложите решение на основе утилиты grep , а также решение на основе утилиты passwd .

Корректная процедура выполнения практического задания: пароли пользователей

1. Установите пароль hunter2 для пользователя serena .

2. Также установите пароль для пользователя venus , после чего заблокируйте учетную запись пользователя venus с помощью утилиты usermod . Проверьте наличие признаков блокировки в файле /etc/shadow до и после осуществления блокировки.

Обратите внимание на то, что в результате выполнения команды usermod -L перед хэшем пароля добавляется символ восклицательного знака.

3. Используйте команду passwd -d для деактивации пароля пользователя serena . Проверьте наличие строки для пользователя serena в файле /etc/shadow до и после осуществления деактивации.

4. Каковы различия между операцией блокировки пользовательской учетной записи и операцией деактивации пароля пользовательской учетной записи, которые мы только что осуществляли с помощью команд usermod -L и passwd -d ?

Блокировка предотвратит вход пользователя в систему с использованием установленного пароля благодаря добавлению символа ! перед хэшем пароля в файле /etc/shadow .

Деактивация с помощью утилиты passwd приведет к удалению хэша пароля из файла /etc/shadow .

5. Попытайтесь изменить пароль serena на пароль serena as serena.

Войдите в систему с именем пользователя serena , после чего выполните команду: passwd serena . Исполнение команды должно завершиться неудачей!

6. Сделайте так, чтобы пользователь serena был обязан изменять пароль через каждые 10 дней.

7. Сделайте так, чтобы каждый новый пользователь был обязан изменять свой пароль через каждые 10 дней.

8. Воспользуйтесь учетной записью пользователя root для создания резервной копии файла /etc/shadow . Используйте текстовый редактор vi для копирования хэша пароля hunter2 из строки пользователя venus в строку пользователя serena . Может ли после этого пользователь serena войти в систему с паролем hunter2 ?

9. В каких случаях следует использовать утилиту vipw вместо vi ? Какая проблема может возникнуть при использовании текстового редактора vi или vim для редактирования файла паролей?

Утилита vipw выведет предупреждение в том случае, если кто-либо еще в данный момент редактирует данный файл (с помощью утилиты vipw ).

10. Используйте команду chsh для вывода списка доступных командных оболочек (данная команда будет работать исключительно в дистрибутивах RHEL/CentOS/Fedora) и сравните вывод с выводом команды cat /etc/shells .

11. Какой параметр утилиты useradd позволяет установить имя домашней директории пользователя?

12. Как можно определить, заблокирован или разблокирован пароль пользователя serena ? Предложите решение на основе утилиты grep , а также решение на основе утилиты passwd .

Как вывести свою систему на новый уровень безопасности с модулями python-gnupg и getpass4.


Изображение : freeGraphicToday, via Pixabay. CC0.

В условиях растущих требований к безопасности создание и хранение паролей может вызвать вопросы не только для пользователей, но и у разработчиков и системных администраторов. Специалисты и другие осведомлённые люди знают, что пароли нужно хранить в зашифрованном виде. Уже на этапе ввода символы пароля нужно скрывать от любых глаз (даже от того человека, который его вводит). Всегда ли мы можем выполнить хотя бы эти требования?

Я единственный пользователь своего ноутбука, а на его борту крутится ОС семейства Linux. Поэтому меня не беспокоят пользователи, которые могут случайно или неслучайно посмотреть мои конфигурационные файлы, работая на этом же компьютере. Я решил заморочиться и повысить безопасность своего личного ноутбука, и на то есть свои причины. Да, я шифрую свой домашний каталог, но как только вхожу в систему, любой пароль, хранящийся в виде простого текста в файле конфигурации, потенциально может быть уязвим для чересчур любопытных глаз.

К тому же, я использую почтовый клиент Mutt. Он позволяет мне читать и составлять электронные письма прямо в Linux-терминале. Мне удобно, мне нравится. Правда, ему нужно, чтобы я хранил пароль в файле конфигурации (.mutt), либо всё время вводил пароль в интерактивном режиме. Поэтому я ограничил права доступа к моему конфигурационному файлу Mutt, чтобы его мог видеть только я.

Но есть ещё один важный момент: я периодически пишу технические статьи, составляю туториалы, помогаю людям в сообществе и публикую много своего кода в общедоступных репозиториях, публикую скриншоты своего экрана, часто показываю что-то на примере своей рабочей системы. Если по недосмотру меня угораздит засветить в Интернете (или где-то ещё) данные (и в том числе пароли) из моих конфигурационных файлов, это бросит неприятную тень на мою репутацию и безопасность. Так что надо подстраховаться.

Ну и, если вдруг злоумышленник завладеет моим ноутбуком или каким-то другим образом получит доступ в систему, он не сможет получить мой пароль без боя, просто запустив cat для просмотра логов и конфигов.

Поиск решения задачи

Я решил, что лучший способ защитить мой пароль в Mutt — ввести пароль с клавиатуры, сохранить его в зашифрованном файле GPG, написать на Python скрипт расшифровки для моего GPG-пароля, ну и заодно обеспечить передачу пароля Mutt в скрипт offlineimap, который я использую для локальной синхронизации моего ноутбука с почтовым сервером.

Из подзаголовка статьи ясно, что я буду использовать модули python-gnupg и getpass. Модуль Python python-gnupg — это обёртка для инструмента шифрования gpg. Учтите, python-gnupg не следует путать с модулем под названием gnupg. GnuPG (GPG) — это утилита шифрования для Linux, и я использую её с 2009 года или около того. С ней я чувствую себя комфортно и верю в её безопасность.

Получить пользовательский ввод с помощью Python довольно просто. Вы вызываете input, и всё, что введёт пользователь сохраняется в переменной:


И в этом случае есть одна громадная проблема: когда я ввожу пароль в терминале, всё, что я набираю, видно всем, кто смотрит через моё плечо или просматривает историю моего терминала:

Написание скрипта с python-gnupg и getpass

Как это часто бывает, ничего самому писать не надо, потому что уже существует модуль Python, который позволяет решить проблему. Это модуль getpass4. С точки зрения пользователя он ведёт себя точно так же, как любое стандартное приглашение к вводу, за исключением того, что не отображает введённые символы.

Установим оба модуля с помощью pip:

У меня получился вот такой скрипт для создания пароля с невидимым вводом и расшифровкой:

Сохраните файл как password_prompt.py, если хотите попробовать скрипт у себя. Если вместе с ним вы хотите использовать offlineimap, укажите в конфигурационном файле .offlineimaprc имя и путь к скрипту с паролем (у меня это

/.mutt/password_prompt.py). Правда, там нужно сделать ещё кое-что, но об этом позже.

Тестирование скрипта с gpg

Надеюсь, у вас уже установлен gpg, так как сейчас мы будем создавать зашифрованный файл пароля и тестировать скрипт.

Запускаем созданный ранее скрипт:

/.mutt/pass.gpg. Значит, скрипт работает правильно.

Интеграция с offlineimap

Я выбрал Python, потому что знал, что offlineimap может вызывать скрипты, написанные на Python. Если вы уже пользуетесь offlineimap, вы поймете, что единственная необходимая «интеграция» сводится к изменению двух строк в вашем файле .offlineimaprc (точнее — к добавлению одной строки и изменению другой).

Сначала добавьте строку, ссылающуюся на файл нашего скрипта:


Теперь вместо пароля в строке с remotepasseval после знака «=» вызовите функцию get_api_pass(), которая живёт в скрипте password_prompt.py:


Всё! Теперь никто не сможет прочитать пароль из вашего конфигурационного файла!

Безопасность даёт свободу

Иногда кажется, что у меня паранойя: я много думаю о тонкостях обеспечения безопасности на моём личном компьютере. Действительно ли SSH конфиг должен иметь разрешения chmod 600? Действительно ли имеет значение, что пароль электронной почты находится в конфигурационном файле, спрятанном в скрытой папке, которая называется, как ни странно, .mutt? Хотя написать подобный скрипт на Python можно и для других конфигурационных файлов.

Зная, что в моих файлах конфигурации отсутствуют незашифрованные конфиденциальные данные, мне намного проще публиковать файлы в общедоступных репозиториях Git, копировать и вставлять сниппеты на форумах и делиться своими знаниями в форме актуальных, рабочих файлов конфигурации. С этой точки зрения, повышение уровня безопасности облегчило мне жизнь. А с таким количеством Python-модулей на все случаи жизни, сделать это было достаточно легко.


Аренда облачного сервера с быстрыми NVMе-дисками и посуточной оплатой у хостинга Маклауд.

Читайте также: