Я написал Python CGI-скрипт, который вызывает bash
команды, и он должен проверить успешность входа на хост.
Как мне написать тест для этого?
Например, могу ли я создать bash
скрипт, который проверяет данную комбинацию имени пользователя и пароля с зарегистрированным пользователем на хосте?
login
программы.Ответы:
Использование PAM - лучшее решение. Вы можете написать небольшой код на C или установить пакет python-pam и использовать скрипт python, который входит в пакет python-pam. Видеть
/usr/share/doc/python-pam/examples/pamtest.py
источник
/usr/share/doc/packages/python-pam/examples/pamtest.py
Сценарий pamtest.py можно использовать для проверки учетных данных в системах, использующих PAM. для аутентификации включен в пакет python-pam (для которого требуется python), а в некоторых дистрибутивах полный путь -/usr/share/doc/python-pam/examples/pamtest.py
.Правильный подход к проверке того, может ли пользователь войти в систему, состоит в том, чтобы фактически войти в систему как этот пользователь.
Поэтому я рекомендую использовать сценарий CGI
expect
для запускаsu
, передачи пароля и запуска команды, которая должна быть выполнена. Вот черновик ожидаемого сценария, который делает именно это (предупреждение: абсолютно не проверено, и я не бегу в ожидании). Подставьте имя пользователя, пароль и команду (где я писалbob
,swordfish
аsomecommand
); не забудьте правильно процитировать.Если вы действительно не хотите выполнять команду через слой
su
(например, потому что то, что вы делаете, должно быть выполнено самим процессом CGI), то используйте команду ожидают, чтобы запустить командуtrue
и проверить, что возвращаемый статус равен 0.Другой подход заключается в использовании PAM непосредственно в вашем приложении через привязку PAM к Python .
источник
su -c true bob && echo success
жаль, что su не принимает пароль в качестве аргументаsu
CGI-скрипте, и ему нужен терминал для работы./bin/true
было бы достаточно.Более конкретно, ответьте: «Можно ли создать bash-скрипт, который будет проверять заданную комбинацию имени пользователя и пароля на зарегистрированном пользователе на хосте?»
Да.
источник
shadow
группа, что очень не рекомендуется для CGI: вам понадобится еще один уровень повышения привилегий. И вы предполагаете конкретный алгоритм хеширования паролей (поддерживаемый openssl) и место хранения паролей (/etc/shadow
в отличие, например, от NIS или LDAP), которые могут или не могут быть теми, которые фактически используются для этого конкретного пользователя.Здесь приведено PAM-решение 'C', 'Python', позвольте мне также поставить perl :-)
Источник: http://search.cpan.org/~nikip/Authen-PAM-0.16/PAM/FAQ.pod#1._Can_I_authenticate_a_user_non_interactively ?
источник
Если у вас есть root-доступ и вы используете пароли md5 и вам просто нужно сравнить пароли, вы можете использовать модуль perl Crypt :: PasswdMD5 . Возьмите хеш MD5 из / etc / shadow, уберите $ 1 $, а затем разделите оставшиеся $. Поле 1 = соль, поле 2 = зашифрованный текст. Затем хэшируйте текстовый ввод в ваш CGI, сравните его с зашифрованным текстом, и Боб - ваш дядя.
источник
shadow
группа, что очень не рекомендуется для CGI: вам понадобится еще один уровень повышения привилегий. И вы предполагаете конкретный алгоритм хеширования паролей (MD5, а не bcrypt или другой рекомендуемый алгоритм) и место хранения паролей (/etc/shadow
в отличие, например, от NIS или LDAP), которое может или не может быть тем, которое фактически используется для этого конкретного пользователя.После некоторого поиска я написал эту программу на C, которую можно использовать из скрипта
Вы компилируете это с:
Вы можете использовать его как
источник
shadow
группа, что очень не рекомендуется для CGI: вам понадобится еще один уровень повышения привилегий. И вы предполагаете конкретный алгоритм хеширования паролей (поддерживаемый openssl) и место хранения паролей (/etc/shadow
в отличие, например, от NIS или LDAP), которые могут или не могут быть теми, которые фактически используются для этого конкретного пользователя. Используйте PAM, он знает свою работу.Поскольку вы упомянули, что вы используете CGI в python, вероятно, уместно предположить, что вы используете Apache в качестве httpd-сервера. Если это так, оставьте процесс аутентификации вашей программы Apache и разрешайте только аутентифицированным людям выполнять ваши скрипты / программы cgi.
Существует множество модулей, которые могут выполнять аутентификацию для вас на Apache, это действительно зависит от того, какой механизм аутентификации вы ищете. То, как вы цитировали этот вопрос, похоже, связано с аутентификацией учетной записи локального хоста на основе / etc / passwd, теневых файлов. Модуль, который приходит к моему быстрому поиску по этому поводу
mod_auth_shadow
. Преимущество заключается в том, что вы позволяете кому-либо из авторитетных (работающих на привилегированном порту 80) аутентифицировать пользователя / пароль для вас, и вы можете полагаться на аутентифицированную информацию пользователя для запуска команд от имени пользователя, если это необходимо.Хорошие ссылки для начала:
http://adam.shand.net/archives/2008/apache_tips_and_tricks/#index5h2
http://mod-auth-shadow.sourceforge.net/
http://www.howtoforge.com/apache_mod_auth_shadow_debian_ubuntu
Другой подход заключается в использовании модуля SuEXEc из Apache, который выполняет процессы (программы cgi) от имени аутентифицированного пользователя.
источник
Этот код с использованием PAM работал для меня:
источник
Лучшее, что вы можете сделать, если вам нужен скрипт для входа на хост, это настроить ключ ssh между хостами.
Ссылка: http://pkeck.myweb.uga.edu/ssh/
Я в значительной степени снял это со страницы
Во-первых, установите OpenSSH на двух машинах UNIX, быстро и надежно. Насколько я могу судить, это лучше всего работает с использованием ключей DSA и SSH2 по умолчанию. Все другие HOWTO, которые я видел, похоже, имеют дело с ключами RSA и SSH1, и инструкции не удивительно не работают с SSH2. На каждой машине введите ssh somemachine.example.com и установите соединение с обычным паролем. Это создаст .ssh dir в вашем домашнем каталоге с правильными привилегиями. На вашей основной машине, где вы хотите, чтобы ваши секретные ключи жили (скажем поспешно), введите
Это попросит вас ввести секретную фразу-пароль. Если это ваш основной идентификационный ключ, обязательно используйте хорошую фразу-пароль. Если это работает правильно, вы получите два файла с именами id_dsa и id_dsa.pub в вашей директории .ssh. Примечание: можно просто нажать клавишу ввода, когда будет запрошена фраза-пароль, которая создаст ключ без ключевой фразы. Это плохая идея ™ для ключа идентификации, так что не делайте этого! Смотрите ниже для использования ключей без парольных фраз.
Скопируйте файл id_dsa.pub в каталог .ssh другого хоста с именем authorized_keys2. Теперь Burly готов принять ваш ключ SSH. Как сказать, какие ключи использовать? Команда ssh-add сделает это. Для теста введите
Это запустит ssh-agent, добавит вашу личность по умолчанию (запросит у вас пароль) и создаст оболочку bash. Из этой новой оболочки вы сможете:
Вы должны быть в состоянии войти
источник