Пароли Для Ленивых

Недавно одного из провайдеров, у которого я арендую выделенные сервера, взломали.

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

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

бессонная ночь перед отпуском Это тоже не радостное занятие.

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

Идея была проста — менять пароли как можно чаще (например, каждый день), чтобы даже если кто-то получил пароль из переписки два дня назад, с ним ничего нельзя было сделать.

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

Легко сказать - автоматизируйте смену паролей на Linux-сервере - я даже не видел этого вашего баша (кроме башорга, конечно), я вообще в этой жизни совсем другими вещами занимаюсь.

Однако методика разбиения проблемы на простые шаги и Google помогли решить проблему буквально за один вечер.

Шаг первый — получить MD5-хеш от какой-нибудь строки, например от сегодняшней даты:

echo -n $(date +%F) | md5sum

Шаг второй — присвойте это удовольствие какой-нибудь переменной, желательно сразу 2 раза, чтобы оно было длиннее (позже я покажу почему):

a=$(echo -n $(date +%F) | md5sum) && a=${a:0:32}${a:0:32}

Шаг третий – из полученной строки длиной 64 символа выберите, например, 27 символов из номера позиции сегодня (т.е.

если сегодня третье августа, то начиная с третьей позиции).

Таким образом, 31-го числа месяца мы гарантированно умещаемся в строку из 64 символов (31+27=58).

Вы можете выбрать любое другое число, главное, чтобы оно не превышало 64 символов или увеличьте исходную строку.



hs=${a:$(date +%d):27}

Следующий, четвёртый шаг — получение списка всех аккаунтов на сервере.

Меня устроил такой вариант (если кто-то предложит более точный, буду благодарен):

cat /etc/passwd | grep "/home" | cut -d: -f1

Самым сложным оказался пятый шаг — перебор строк полученного списка пользователей.

После получаса экспериментов у меня сработал следующий (промежуточный) вариант, показавший мне имя пользователя и полученный шаблон пароля:

lines=($(cat /etc/passwd | grep "/home" | cut -d: -f1)) for i in "${lines[@]}" do echo "$i" : $hs done

Понятно, что если просто оставить этот вариант, то зная сам алгоритм, подобрать пароль не составит труда.

Поэтому я решил немного усложнить ситуацию и мой шестой шаг выглядел так:

salt="абракадабра" lines=($(cat /etc/passwd | grep "/home" | cut -d: -f1)) for i in "${lines[@]}" do echo "$i" : $hs s=$salt"$i"$hs newhash=$(echo -n "$s" | md5sum) done

Другими словами, мы добавляем имя аккаунта и «соль» к хэшу, собранному от текущей даты, после чего снова вычисляем хэш от результата.

Добавляя известную только нам «соль», мы «ломаем» структуру алгоритма, а добавляя имя аккаунта, делаем хеш результата уникальным для каждого из них.

Поскольку мы собираемся менять пароли каждый день, давайте дадим волю нашей паранойе и не будем делать все пароли одинаковыми :) В процессе поиска удобной команды для смены пароля пользователя я наткнулся на упоминание о том, что в bash записываются все его ходы.

И действительно, файл .

bash_history самым нагло показал мне кусочки моих экспериментов.

Поэтому мне также пришлось изучить команду истории и ключ -c в качестве седьмого шага.

Восьмой шаг, очевидно, выглядел так:

cmd=`echo "$i":$newhash | chpasswd` echo $cmd

Девятым и последним шагом было собрать все это воедино и добавить в cron непосредственно перед началом ежедневного резервного копирования.

Скрипт получился примерно такой:

#!/bin/bash # # Prep some salt salt="абракадабра" # Calculate hash from today's date and add it to itself a=$(echo -n $(date +%F) | md5sum) && a=${a:0:32}${a:0:32} # Strip 27 characters starting from the character number of today's day of month hs=${a:$(date +%d):27} # Grab users into array lines=($(cat /etc/passwd | grep "/home" | cut -d: -f1)) # For each user create a new pass with salt + user name + hash # for i in "${lines[@]}" do s=$salt"$i"$hs newhash=$(echo -n "$s" | md5sum) newhash=${newhash:0:27} # echo "$i" : $salt"$i"$hs : $newhash # print this out if you want to cmd=`echo "$i":$newhash | chpasswd` echo $cmd done history -c

Явно видимые недостатки: — сильная алгоритмизация, т.е.

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

словарь для перечисления небольшой — под раздачу паролей могут попасть аккаунты, не требующие смены паролей (не могу сразу понять какие, но например на одном из серверов у меня есть шелл-аккаунт для использования PuTTy в качестве прокси — я бы не хочу, чтобы пароль для этой учетной записи менялся каждый час).

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

Вопросы: — Можно ли аналогичным образом генерировать более сложные пароли, используя другие регистры и служебные символы? — какие еще недостатки есть у этой реализации? - Какие еще преимущества есть у этой реализации? — можно ли компенсировать эти недостатки или вообще избавиться от них (например, чтобы нейтрализовать смену паролей на некоторых аккаунтах, можно создать стоп-лист и удалять из общего списка аккаунты, находящиеся в стоп-листе)? UPD: Первые же комментарии подсказали необходимость разъяснений.

Клиенты время от времени сами заходят в свой аккаунт (например, в cPanel) и именно для них логин/пароль удобнее, чем вход по сертификату.

Оболочка для этих аккаунтов обычно вообще отключена (за очень редким исключением).

Теги: #пароли #пароль #генератор паролей #автоматизация #linux #bash-скрипты Linux #безопасность #информационная безопасность

Вместе с данным постом часто просматривают: