Pull to refresh

Защита Home Assistant

Level of difficultyMedium
Reading time6 min
Views11K

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

И все это дельные советы, ничего плохого в них нет, но хочется чего то большего...

Как вообще обычно бывают взломы? Если в общих чертах: боты тупо сканируют все сети, одни сканируют только популярные порты 80 и 443, другие делают скан всех портов, пробуют сайты на уязвимости, чекают домены и так далее. Ломают сайты и серверы по разным причинам, думаю в основном для создания ботнета, и последующих ддос атак. Сканируют боты весь интернет, собирают свою базу, на каком домене стоит wordpress, а на каком HA, какой версии и так далее. Как только появляется новая уязвимость, они берут ранее собранную базу, и запускают ботов уже на взлом. Не факт что разрабы HA отреагируют быстро, и не факт, что Вы быстро успеете обновиться, поэтому лучше сделать так, чтобы Ваш сервер вообще не был ни в каких базах. Любая защита, это просто полоса с препятствиями, чем их больше, тем больше ботов отсеются, и тем меньше вероятность взлома.

P.S. Если Вы поставили 2FA, это не значит, что Вы защищены на 100%. Разработчики HA могут допустить ошибку, и злоумышленник, делая определенные запросы, сможет например отключить Вам 2FA и сбросить пароль, или проникнуть в систему вообще не используя логина. Не забывайте, что мы все юзаем HACS, а там разработчики тоже могут дырку сделать, поэтому нужно всегда стараться делать все возможное, тем более, если доступ к умному дому имеет ограниченный круг людей

Меняем порт

Так как большое кол-во ботов чекают именно порты 80 и 443, мы не будем выводить в инет наш HA под этими портами, а поставим например порт 8443

Забегая вперед скажу, что самый верный и гибкий способ настройки HA для удаленного доступа, это проксировать его через nginx. Так у нас откроется больше возможностей для блокировок, и не будет возни с сертификатами.

Значит делаем так, чтобы наш HA открывался из инета по адресу https://hass.mydomain.ru:8443

Надеюсь, вы знаете, как это сделать, расписывать не буду.

Ставим на поддомен

Если у Вас куплен отдельный домен для HA, как в моем случае, никогда не ставьте HA на корневой домен, типа mydomain.ru. Сделайте для него поддомен, например hass.mydomain.ru
Так отсеется еще одна кучка ботов, которые чекают именно основной домен.

Cloudflare

Так как у меня белый IP(и я настоятельно рекомендую его приобрести, появляется много возможностей), я разумеется засунул свой HA под cloudflare. Если коротко, то заходя на hass.mydomain.ru:8443, трафик идет сначала на сервера cloudflare, там с этим трафиком можно делать очень много всего интересного, в нашем случае там блокируем неугодных, и далее трафик уже идет на наш HA.

Таким образом мы во первых скрываем свой внешний IP, во вторых получаем мощные возможности бесплатного сервиса cloudflare, и снимаем лишнюю нагрузку на свой HA
Кстати не просто так я выбрал порт 8443, так как cloudflare поддерживаем не все порты, подробнее здесь.

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

Значит регается на cloudflare.com, добавляем домен mydomain.ru, прописываем NS адреса у регистратора, все по инструкции.

Заходим в DNS > Records

Добавляем A запись hass, и указываем ваш белый IP. Убеждаемся, что горит облако, значит трафик теперь у нас проксируется через cloudflare, замечательно.

Создаем сертификаты в SSL/TLS > Origin Server > Create Certificate > Вводим свой поддомен и после создания кладем сертификаты в nginx и прописываем к ним путь
Указываем режим сертификатов: SSL/TLS > Overview > Full (strict).

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

Блокировка стран

Мы живем в России, и доступ для нашего HA другим странам вообще не нужен. Заблочим все страны кроме РФ, таким образом мы отсеем еще одну приличную кучку ботов
Security > WAF > Create Rule

Тут мы создали правило, если в Hostname есть hass.mydomain.ru и страна юзера не Россия, то блочим.

Создадим еще правило

Так как в моем случае, на основном домене ничего нет, то блочу вообще весь трафик на него.

В целом это правило можно и не прописывать, если в DNS у Вас корневой домен не ведет на Ваш HA.

Блокировка провайдеров

Уже очень хорошо, мы заблочили огромную пачку ботов, но и в РФ хватает ботоводов, пойдем еще дальше.

Скорее всего в Вашей семье у всех один оператор связи. А внешка нам по сути и нужна, чтобы мы могли с телефона соединиться с HA, может быть с wifi работы еще, или wifi родных. Так давайте заблочим всех, кроме нужных нам провайдеров!

Заходим с телефона на 2ip.ru, копируем IP адрес. Например: 89.251.150.54
Вбиваем его в 2ip.ru/whois
Кликаем на: ASN: 29194
Крутим чуть ниже, где написано "Подробности WHOIS"
Находим блок: as-block: AS29092 - AS29337
То есть все IP адреса нашего мобильного провайдера находятся в AS блоках от AS29092 до AS29337
Что такое ASN можно почитать тут.

Заходим в CloudFlare: Security > WAF > Create Rule

То есть мы заблочили всех, кто не входит в данный диапазон ASN.

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

Но для боевого режима такое простое правило не прокатит. Во первых МТС может использовать ASN других мобильных операторов, у меня такое было, а так же, когда приходишь домой, приложение HA не сразу переключается на локалку, и шлет запросы по внешке, соответственно домашний IP тоже нужно добавить.

Поэтому изменяем правило, нажимаем Edit expression
Тут важно! Я для примера поставил комментарии // и разбил все по строкам. Когда будете вставлять в cloudflare выражение, удалите комментарии, отступы и новые строки, то есть напишите правило в одну строку.

(
	http.host contains "hass.mydomain.ru" and // если обращение к домену HA
	ip.src ne 213.123.321.50 and // и если это не наш белый домашний IP 
	(
		// если эта секция верна
		(
			ip.geoip.asnum lt 29092 and // AS ниже этого
			(ip.geoip.asnum lt 8192 or ip.geoip.asnum gt 8523) // и если AS меньше 8192 или больше 8523, то есть внутри этого диапазона AS номера, которыми мы пользуемся, и их не нужно блокировать
		) or
		// или если это секция верна
		(
			ip.geoip.asnum gt 29337 // если AS больше этого
		)
	)
)

Мы указали правило, при котором мы блокируем все AS, которые не входят в диапазон 29092-29337 и 8192-8523
А так же применимо правило только к hass.mydomain.ru и не учитывает наш домашний IP.

Смотрите блокировки в Security > Events, там показано, кого, когда и по какому правилу заблочило. При необходимости поправьте свое правило.

Можно пойти еще дальше, и добавить сюда не все диапазоны AS Провайдера, а только те, что юзаются в Вашем регионе или даже городе. Но это геморройно, IP у провайдеров не постоянные, велика вероятность, что у них все поменяется, и придется Вам регулярно изменять правила.

Если у Вас есть устройства, подключающиеся к HA из вне, то не забудьте прописать их IP тоже.

Защита nginx

Локально мы заходим в HA напрямую по адресу: http://192.168.1.30:8123
А на внешний адрес схема такая: user > cloudflare > nginx > HA
То есть nginx юзается только для внешки, и только для cloudflare.

Поэтому обязательно нужно задать правила в nginx, которые блокируют все айпи, кроме айпи cloudflare.

В секцию server конфига виртуального хоста nginx впишем

    allow 192.168.1.0/24;
    allow 173.245.48.0/20;
    allow 103.21.244.0/22;
    allow 103.22.200.0/22;
    allow 103.31.4.0/22;
    allow 141.101.64.0/18;
    allow 108.162.192.0/18;
    allow 190.93.240.0/20;
    allow 188.114.96.0/20;
    allow 197.234.240.0/22;
    allow 198.41.128.0/17;
    allow 162.158.0.0/15;
    allow 104.16.0.0/13;
    allow 104.24.0.0/14;
    allow 172.64.0.0/13;
    allow 131.0.72.0/22;
    deny all;

IP адреса cloudflare можно глянуть тут: https://www.cloudflare.com/ips/
На всякий случай разрешим и для локальных 192.168.1.0/24
Остальным всем запрет: deny all

Отключить IPV6

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

Отключим IPV6 в cloudflare, правда это нельзя сделать в панели
Заходим на Network > IPv6 Compatibility
Видим что переключатель неактивный, ниже нажимаем API и копируем ссылку Change IPv6 setting
Далее найдем наш глобальный API ключ: Profile > API Tokens > Global API Key > View
Копируем его, открываем любую консоль, где установлен curl, и посылаем вот такой запрос (подставить свой номер зоны, почту и ключ апи).

curl -X PATCH "https://api.cloudflare.com/client/v4/zones/НОМЕРЗОНЫ/settings/ipv6" -H "X-Auth-Email: ПОЧТА" -H "X-Auth-Key: GLOBAL-API-KEY" -H "Content-Type: application/json" --data "{\"value\":\"off\"}"

Ответ будет примерно такой

{"result":{"id":"ipv6","value":"off","modified_on":"2024-02-27T09:15:08.188213Z","editable":true},"success":true,"errors":[],"messages":[]}

Заходим на Network > IPv6 Compatibility
IPv6 отключен, отлично!

Резервный доступ

На случай если вдруг по каким то причинам вы будете в блоке, а зайти в HA крайне нужно, то у Вас дома обязательно должен быть VPN сервер, подключившись к которому Вы попадете в домашнюю сеть и спокойно заходите на http://192.168.1.30:8123

Резюмируем

Мы сузили круг доступа до нашего HA до минимума, и не в ущерб удобству.
В локальной сети мы заходим по локальному адресу.

А внешка у нас только для IP наших мобильных провайдеров.

Если кто то будет ломится по прямому айпи к нам, то у нас в роутере разрешен только порт 8443 (больше не нужно ничего открывать для HA).

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

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

Tags:
Hubs:
Total votes 14: ↑10 and ↓4+8
Comments21

Articles