Пароль linux на python

Changing password, python, linux

Because, i love it, its compillable, and already made a big part in python, This is just a part. I’m trying to learn that language.

I’d recommend tagging this ‘linux’ in addition to ‘ubuntu’ — for this question, any answers are to be (mostly) applicable across all linux distros.

3 Answers 3

There are two main ways to go about this —

One is calling the passwd command line tool from python (such as via stdlib’s subprocess module). If your script isn’t running as root, you’ll need to wrap using the «su» or «sudo» commands in order to elevate to root privledge. Writing the expected data to stdin should be sufficient, but if you find you need to perform different actions based on exactly what the sudo/passwd prompts say, the pexpect module may be helpful.

The second is writing directly to the /etc/shadow file where the password hashes are stored. This will definitely require your script to run as root, in order to have read/write perms on /etc/shadow. Stdlib offers the spwd module for accessing /etc/shadow, but it’s read-only, so you’ll have to roll your own reader/writer. the csv module might be useful, /etc/shadow is close to being a csv file with a «:» separator, but with some minor differences.

If you choose the second route, you’ll need to be able to generate new hashes of replacement password, and insert them into the shadow file. The fastest way on linux is to use the stdlib crypt module, but you’ll have to take care of salt generation, and setting the appropriate password hash prefix («$5$», «$6$» etc). Alternately, the host_context object in the Passlib library can take care of most of that for you (disclaimer: I’m the author of that library).

In general, I’d recommend the first route if possible — modifying /etc/shadow directly is fraught with danger — if you mess up the /etc/shadow file, you won’t be able to log in. If you go this route, back up the file a lot.

Источник

Безопасный ввод и сохранение зашифрованных паролей в конфигах Linux: пишем скрипт на Python

Как вывести свою систему на новый уровень безопасности с модулями 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 года или около того. С ней я чувствую себя комфортно и верю в её безопасность.

Читайте также:  Telnet проверить порт линукс

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

print("Enter password: ") myinput = input() print("You entered: ", myinput) 

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

$ ./test.py Enter password: my-Complex-Passphrase 

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

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

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

$ python -m pip install --user \ python-gnupg getpass4 

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

 #!/usr/bin/env python # by Seth Kenlon # GPLv3 # install deps: # python3 -m pip install --user python-gnupg getpass4 import gnupg import getpass from pathlib import Path def get_api_pass(): homedir = str(Path.home()) gpg = gnupg.GPG(gnupghome=os.path.join(homedir,".gnupg"), use_agent=True) passwd = getpass.getpass(prompt="Enter your GnuPG password: ", stream=None) with open(os.path.join(homedir,'.mutt','pass.gpg'), 'rb') as f: apipass = (gpg.decrypt_file(f, passphrase=passwd)) f.close() return str(apipass) if __name__ == "__main__": apipass = get_api_pass() print(apipass) 

Сохраните файл как password_prompt.py, если хотите попробовать скрипт у себя. Если вместе с ним вы хотите использовать offlineimap, укажите в конфигурационном файле .offlineimaprc имя и путь к скрипту с паролем (у меня это ~/.mutt/password_prompt.py). Правда, там нужно сделать ещё кое-что, но об этом позже.

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

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

$ echo "hello world" > pass $ gpg --encrypt pass $ mv pass.gpg ~/.mutt/pass.gpg $ rm pass 

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

$ python ~/.mutt/password_prompt.py Enter your GPG password: hello world 

Ура! При вводе ничего не отображается, но если вы правильно введёте пароль (нужно ввести hello world), на следующей строке вы увидите тестовое сообщение «hello world». Оно же и является паролем, полученным в результате расшифровки файла ~/.mutt/pass.gpg. Значит, скрипт работает правильно.

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

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

Читайте также:  Kaspersky antivirus для linux

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

pythonfile = ~/.mutt/password_prompt.py 

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

remotepasseval = get_api_pass()

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

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

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

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

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

Источник

How to change a Linux user password from python

I’m having problems with changing a Linux user’s password from python. I’ve tried so many things, but I couldn’t manage to solve the issue, here is the sample of things I’ve already tried: sudo_password is the password for sudo, sudo_command is the command I want the system to run, user is get from a List and is the user who I want to change the password for, and newpass is the pass I want to assign to ‘user’

 user = list.get(ANCHOR) sudo_command = 'passwd' f = open("passwordusu.tmp", "w") f.write("%s\n%s" % (newpass, newpass)) f.close() A=os.system('echo -e %s|sudo -S %s < %s %s' % (sudo_password, sudo_command,'passwordusu.tmp', user)) print A windowpass.destroy() 

but it returns the same error code. I tried several other ways with 'passwd' command, but whithout succes. With 'chpasswd' command I 've tried this:

 user = list.get(ANCHOR) sudo_command = 'chpasswd' f = open("passwordusu.tmp", "w") f.write("%s:%s" % (user, newpass)) f.close() A=os.system('echo %s|sudo -S %s < %s %s' % (sudo_password, sudo_command,'passwordusu.tmp', user)) print A windowpass.destroy() 
 A=os.system('echo %s|sudo -S %s:%s|%s' % (sudo_password, user, newpass, sudo_command)) @;which returns 32512 A=os.system("echo %s | sudo -S %s < \"%s\"" % (sudo_password, sudo_command, "passwordusu.tmp")) @;which returns 256 
 user = list.get(ANCHOR) sudo_command = 'mkpasswd -m sha-512' os.system("echo %s | sudo -S %s %s > passwd.tmp" % (sudo_password,sudo_command, newpass)) sudo_command="usermod -p" f = open('passwd.tmp', 'r') for line in f.readlines(): newpassencryp=line f.close() A=os.system("echo %s | sudo -S %s %s %s" % (sudo_password, sudo_command, newpassencryp, user)) @;which returns 32512 

Источник

Оцените статью
Adblock
detector