А почему бы не менять пароль пользователя (единственного открытого для ssh 🙂 ) по крону?.. Кому интересно прошу под кат
Данная статья является не чем иным как стебом, прошу не воспринимать её в всерьез. Однако, и не строит забывать, то, что описанная ниже методика полностью работоспособна.
Подготовка:
sudo apt-get install hashalot
Собственно родился вот такой скриптик:
[code]#!/bin/bash
if [ -n "$1" ]
then
KEY=$1
else
read KEY
fi
KEY=`echo $KEY | tr ‘\n’ » 2>/dev/null`
date
TIME=`date +"%H %M %F"`
SECRET="type your secret phrase here"
PASS=`echo "$TIME $SECRET $KEY" | /usr/sbin/hashalot sha256 -q -x`
if [ -n "$2" ]
then
echo -e "$PASS\n$PASS" | passwd $2
else
echo $PASS
fi[/code]
Из настроек:
- В 11-й строке можно поиграть с ключами даты (только не используйте ключи выдающие значение с точностью меньше минуты).
- В 12-й строке вписать свою уникальную аброкадабру.
- В 13-й переставить местами ключи $TIME, $SECRET и $KEY. И поменять алгоритм хэша с sha256 на ripemd160, rmd160, rmd160compat, sha384 или sha512.
Собственно что делает сей скрипт:
Первый параметр — фраза ключ, которая принимает участие в генерации пароля (если не задать то скрипт спросит сам)
Второй параметр — какому пользюку менять пароль. Если не задано то пароль соот-но никому не меняется, а выводится на экран. Для безнаказанной смены пароля надо быть под root. Если хотите в секретной фразе использовать пробел то просто обнесите её кавычками. Например: `моя очень секретная фраза`
Если для вас шестнадцатеричный хэш — не кашерный пароль, то просто удалите ключ -x в конце 13-й строчки получите хэш в бинарном виде который будет преобразован в символы кодировки 🙂
Создаем сей скрипт в /root, делаем исполняемым.
Далее пишем в крон что-то на подобие
* * * * * /root/myScript mySicretPhrase mySharedUserName
где myScript — имя выше описанного скрипта
mySicretPhrase — что-то что вам легко запомнить
mySharedUserName — имя пользователя который страдает параноей
Собственно все есть кроме решения вопроса — а как же все таки зайти с удаленного компьютера?
Варианта три (IMHO):
- Таскать с собой на флешке копию скрипта и запустив на удаленном компьютере получить тот же пароль, но для этого надо быть уверенным что на удаленном компьютере нет расхождения по времени с удаленным более чем на минуту (IMHO некошерно).
- Нарисовать вэб морду, но тут не понятно сколько настроек выносить в эту вэб морду (IMHO некошерно).
- Сделать серверное приложение к которому можно будет подключится ввести mySecretPhrase и получить текущий пароль.
Остановимся на данном варианте подробнее.
Делаем следующее:
1. Установим элементарный TCP сервер
sudo apt-get install ucspi-tcp
Для IP-6
sudo apt-get install ucspi-tcp-ipv6
2. Там есть интересная прилажуха tcpserver
Работает вот так:
tcpserver xx.xx.xx.xx port myScript
где xx.xx.xx.xx — IP адрес сервера
port — порт сервера
myScript — приложения которому сервер будет передавать все полученные сообщения и отдавать пользователю все что вывело приложение. Если приложение остановилось то пользователь отключается.
У этого приложения есть еще много ключей настройки… но сейчас не о них.
3. У нас получается что-то вроде такого:
tcpserver 192.168.0.999 66 /root/myScript
4. Теперь в /etc/init.d создаем скрипт с содержанием на подобие п.3, делаем запускаемым и ставим в автозагрузку.
P.S.: пора лечится от паранойи…
P.P.S.: что бы получить пароль надо на удаленной машине выполнить:
telnet my-server.com 66
и ввести mySecretPhrase. Ответ от сервера и будет паролем по времени можно определить сколько еще пароль будет актуальным.
то есть брутфорс теперь выглядит так:
— надо нащупать порт
— перебором кидаем фразы на него
— ответ пользуем в ssh
проблема только узнать mySharedUserName
Надо еще учесть Fail2Ban
А в cron-e можно сделать так чтобы — «только не используйте ключи выдающие значение с точностью меньше минуты»?
Расскажите как 😉
В cron`е никак он только по минутам 🙂 , но он по этому и по минутам, что по факту задания запускаются не точно в начало минуты а + 1 — 2 сек.
И если при генерации пароля брать точность меньше минуты, то ты в свой пароль никогда не попадешь…
А вот date без проблем даст тебе значение меньше минуты 😉