Comments 32
Пользуйтесь )))
С разморозкой… Вы переоткрыли «Port knocking»?
На python, иии? Какая разница, на чём control plane? Оно стандартно рулит iptables/firewalld и ipset
В посте пример совсем не из области IoT, как можно заметить. Но если говорить про IoT на Cortex-A и потребление памяти этого демона может достаточно напряжным, то можно поискать нормальные поддерживаемые решения или заоптимизировать имеющееся вместо костылей iptables, написанных вручную.
Для port knocking уже упоминали knockd (он, если что вообще на си) и вполне может быть пригоден для embedded/IoT, если нужна защита такого рода.
1
# iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name BLOCK --update --seconds 60 --rttl --hitcount 3 -j DROP
# iptables -A INPUT -p tcp --syn --dport 22 -j ACCEPT
2
# iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m hashlimit --hashlimit-name BLOCK --hashlimit-mode srcip --hashlimit-above 2/m --hashlimit-burst 2 -j DROP
# iptables -A INPUT -p tcp --syn --dport 22 -j ACCEPT
3
# iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m connlimit ! --connlimit-above 1 -m limit --limit 2/m --limit-burst 2 -j ACCEPT
4
# iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name BLOCK --rcheck --seconds 600 -j DROP
# iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m hashlimit --hashlimit-name BLOCK --hashlimit-mode srcip --hashlimit-above 2/m --hashlimit-burst 2 -m recent --name BLOCK --set -j DROP
городить огород из последовательности — не очень удобная идея.
и это не защита от продвинутых атак.
весь диапазон портов ни кто не будет сканировать.
Обычная практика пентеста.
Сканируют только так.
Почитайте про Zmap, узнаете много такого о чем вам в школе не рассказали.
Есть что-то такое в природе? Или все вынуждены выкручиваются как могут?
*именно для учётной записи, а не для IP
Однако (даже если убрать из уравнения RDP как сервис в принципе), современные системы блокируют учётку полностью, никак не управляя вектором противодействия атаке.
RRAS/ADFS WAP с версии 2012 R2— отлично, пропустил (справедливости ради, на хабре не так уж много статей на эту тему, хотя какая разница). Век живи век учись.
Linux вообще уйма средств для этого— напишите плиз, с какими ключевыми словами идти в поисковик?
> и это не защита от продвинутых атак.
ну как сказать, в том же knockd, насколько я помню, можно было сделать так, что порт открывался только если сначала было обращения на tcp/12345, а затем в течение 3 секунд на udp 54321. Подобрать такую комбинацию будет на порядок сложнее вашего примера. И да, портов может быть больше 2х.
> весь диапазон портов ни кто не будет сканировать.
первая ошибка админа — самоуверенность в том, что это никогда не случится. Ничего со временем проходит, как правило
Господа комментаторы, покритикуйте мой способ пожалуйста:
Я меняю порт SSH, использую длиннющий случайный пароль и ключ для всех пользователей, поднимаю OpenVPN и закрываю ssh-порт от всех, кроме VPN-подсети. Таким образом наружу только vpn-порт(ну и пользовательские, http/https в основном). Понимаю, что таким образом начинаю зависеть от OpenVPN, потому и сомнения.
Прочитайте https://stribika.github.io/2015/01/04/secure-secure-shell.html, настройте аутентификацию по ключам и отключите password и keyboard-interactive. Менять порт необязательно, ставить security updates — обязательно.
Переход на исключительно парольный ауф позволяет полностью исключить возможность брутфорса, уже нет нужды ограничивать сетями или IPшниками, главное беречь свой ключ, как самого себя.
Детские методы с «а я сменил порт, я — кулхацкер» советуют только люди прочитавшие пару статей в сети и не понимающие что именно делают.
Да, порт-кнокинг для ssh это такое же секурити фроуг засовывание головы в песок. Безопасности не добавляет, а неудобств да.
При этом я поверх авторизации только по ключу еще баню всех левых используя fail2ban+ipset, но это уже просто что бы в логи не гадили.
А! Да. И поверх всего этого у меня еще
/etc/ssh/sshrc
# save it as /etc/profile.d/ssh-telegram.sh
# use sed to parse JSON from ipinfo.io
# you can get your user_id by writing to @get_id_bot
USERID="<target_user_id>"
KEY="<bot_private_key>"
TIMEOUT="10"
URL="https://api.telegram.org/bot$KEY/sendMessage"
DATE_EXEC="$(date "+%d %b %Y %H:%M")"
TMPFILE='/tmp/ipinfo-$DATE_EXEC.txt'
if [ -n "$SSH_CLIENT" ] && [ -z "$TMUX" ]; then
IP=$(echo $SSH_CLIENT | awk '{print $1}')
PORT=$(echo $SSH_CLIENT | awk '{print $3}')
HOSTNAME=$(hostname -f)
IPADDR=$(hostname -I | awk '{print $1}')
curl http://ipinfo.io/$IP -s -o $TMPFILE
CITY=$(cat $TMPFILE | sed -n 's/^ "city":[[:space:]]*//p' | sed 's/"//g')
REGION=$(cat $TMPFILE | sed -n 's/^ "region":[[:space:]]*//p' | sed 's/"//g')
COUNTRY=$(cat $TMPFILE | sed -n 's/^ "country":[[:space:]]*//p' | sed 's/"//g')
ORG=$(cat $TMPFILE | sed -n 's/^ "org":[[:space:]]*//p' | sed 's/"//g')
TEXT="$DATE_EXEC: ${USER} logged in to $HOSTNAME ($IPADDR) from $IP - $ORG - $CITY, $REGION, $COUNTRY port $PORT"
curl -s --max-time $TIMEOUT -d "chat_id=$USERID&disable_web_page_preview=1&text=$TEXT" $URL > /dev/null
rm $TMPFILE
fi
мой бот в телеграме присылает мне при удачном заходе на сервер сообщение с логином, IPшником и инфой по IPшнику откуда пришли. В принципе при авторайзе по ключу это тоже ненужно, но моей паранойе так спокойней.
Все надо делать с умом, и тчательностью. Особенно закрашивать важную информацию: в нашем случае — IP адрес сервера. Собственно отправил бы в личку айпишник — чтобы понятно было — но такой опции, Хабр мне не предоставляет. Рекомендую сменить картинку по-быстрее, пока кулхацкеры не начали ваш сервер на зуб пробовать.
тааак.
Видимо, комментаторы полагают что данная статья описывает систему защиты некого хоста.
Нет, не описывает.
Я лишь запостил один из элементов барьерного рифа.
Любой комплекс чего бы то ни было состоит из набора подходов, методик и мероприятий.
Простенькая первичная авторизация с помощью iptables