Недавно одного из провайдеров, у которого я арендую выделенные сервера, взломали.
Нанесенный ущерб был довольно небольшим, к счастью, резервные копии создаются ежедневно.
С другой стороны, сменить пароли для нескольких десятков учетных записей.
бессонная ночь перед отпуском Это тоже не радостное занятие.
Идея автоматизации смены паролей уже довольно давно зудит у меня в голове, несколько хабратопиков подтолкнули меня в правильном направлении.
Идея была проста — менять пароли как можно чаще (например, каждый день), чтобы даже если кто-то получил пароль из переписки два дня назад, с ним ничего нельзя было сделать.
В идеале система должна генерировать и менять пароль непосредственно перед ежедневным резервным копированием каждой учетной записи.
Легко сказать - автоматизируйте смену паролей на 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 #безопасность #информационная безопасность
-
Как Монетизировать Свой Блог
19 Oct, 24 -
Uwp – Выпуск 257
19 Oct, 24 -
Несколько Событий В Блогосфере Delphi
19 Oct, 24 -
Это 1.1.0
19 Oct, 24 -
Снежный Барс 64Бит
19 Oct, 24 -
Пикап Или Как Стать Мачо За Пару Недель.
19 Oct, 24