695

Архитектурная ошибка или защита от взлома? Разбираем зависимость Home Assistant от онлайн-сервисов⁠⁠

Home Assistant позиционирует себя как локальную систему. Но я столкнулся с ситуацией, когда локальная функция (Samba) не работает из-за облачного сбоя. При этом я вообще не использую облако. В статье описываю как обошёл эту проблему за 5 минут, когда за день разобрался в причине.

Мне очень нравится Home Assistant как система управления умным домом, потому что она позволяет не зависеть от облаков и от падений интернета. Это не просто слова - с 2017 года я использую умный дом в обычной двухкомнатной хрущевке, и в основном всё работает. Но это скорее тестовый полигон для меня - я сам там не живу и поэтому очень ценю то что Home Assistant можно настроить один раз и если не обновлять, то несколько лет всё может спокойно проработать. А на этих новогодних каникулах у меня было время и я решил полностью обновить все дополнения и прошивки. Как оказалось зря - паранойя безопасности ломает определение Home Assistant как автономного сервиса, который можно использовать локально.

Небольшая предыстория: весь мой проект начался в 2017 году с идеи удаленного сбора показаний счётчиков квартиры, где я использовал самые доступные по цене решения: ESP8266, MegaD. Потом решил подключить управление светом через дешевые Sonoff с прошивкой Tasmota и OpenHAB. 1000 дней пользовался OpenHAB, а затем перешел на Home Assistant, а в 2024 году провёл ремонт и замену Wi-Fi реле на Zigbee. И до недавнего времени это работало.

В первых числах января 2026 решил удаленно обновить все зависимости - за несколько раз всё обновилось, но мне ещё понадобилось включить дополнение Samba share, чтобы из под Windows проверить пару конфигов, которые не хотели работать. А я отключил Samba share ещё год назад. Удаленно не смог включить - всё какая-то ошибка вылазила, хотя все остальные компоненты работают. Пришлось ехать на квартиру и думал что может быть Raspberry Pi 3 2015 года уже старая стала или флешка сдохла. У меня было ещё несколько запасных - прихватил и чистую флешку и новый микрокомпьютер 2017 года и новый блок питания.

"Стенд проверки"

"Стенд проверки"

Поставил чистую систему - в 2026 году это происходит через Raspberry Pi Imager, хочу с Windows компьютера подключиться, а там та же ошибка Не удалось сохранить конфигурацию дополнения, Unknown error, see supervisor logs. И непонятно из-за чего.

Ошибка Home Assistant Не удалось сохранить конфигурацию дополнения, Unknown error, see supervisor logs

Ошибка Home Assistant Не удалось сохранить конфигурацию дополнения, Unknown error, see supervisor logs

Только в логах на чистой системе подробно рассмотрел что WARNING (MainThread) [supervisor.utils.pwned] Can’t fetch HIBP data: Timeout

Ошибка Home Assistant WARNING (MainThread) [supervisor.utils.pwned] Can’t fetch HIBP data: Timeout

Ошибка Home Assistant WARNING (MainThread) [supervisor.utils.pwned] Can’t fetch HIBP data: Timeout

Стал разбираться и оказалось что Home Assistant абсолютно все пароли проверяет на  скомпромитированность через онлайн сервис, а поскольку мы в России, то этот сервис не даёт ответа видимо из-за санкций или политики, а в интерфейсе ничего внятного не пишет - просто неизвестная ошибка.

И я в своём полностью локальном Home Assistant не могу к нему по локальной сети подключиться из-за того что этот онлайн сервис HIBP не отвечает. Сервис HIBP (Have I Been Pwned) проверяет были ли заново создаваемые пароли в утечках данных.

Но какая-то нестыковка кажется с заявленной полной локальностью Home Assistant?

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

Как исправить ошибку WARNING (MainThread) [supervisor.utils.pwned] Can’t fetch HIBP data: Timeout

Поскольку у меня уже был физический доступ к SD карте - раз я приехал на удаленную квартиру, на которой установлен Home Assistant, то решил через физическое подключение к Linux провести все манипуляции, потому что функция PwnedConnectivityError блокирует абсолютно всё.

SD карта, подключенная к Linux

SD карта, подключенная к Linux

Нашёл проблему в файле pwned.py, он файл лежит внутри контейнера Supervisor, в моём случае по адресу admin:///media/mike/hassos-data/docker/overlay2/0e05ec32ffef35caed1b7184eefcfdda5eb1a35ad60e68e5d14f3a73996b18ea/diff/usr/src/supervisor/supervisor/utils.

Картридер в Ubuntu

Картридер в Ubuntu

Но у вас будет другой путь, надо искать внутри внутри контейнера Supervisor: /usr/src/supervisor/supervisor/utils/pwned.py

Файл /usr/src/supervisor/supervisor/utils/<!--noindex--><a href="https://pikabu.ru/story/arkhitekturnaya_oshibka_ili_zashchita_ot_vzloma_razbiraem_zavisimost_home_assistant_ot_onlaynservisov_13570135?u=http%3A%2F%2Fpwned.py&t=pwned.py&h=1a22d5b8f515012e396a2adbe93c582cbdbbb670" title="http://pwned.py" target="_blank" rel="nofollow noopener">pwned.py</a><!--/noindex-->

Файл /usr/src/supervisor/supervisor/utils/pwned.py

Вот оригинальный файл pwned.py с проблемой:

"""Small wrapper for haveibeenpwned.com API."""

import io
import logging

import aiohttp

from ..exceptions import PwnedConnectivityError, PwnedError, PwnedSecret

_LOGGER: logging.Logger = logging.getLogger(__name__)
_API_CALL: str = "https://api.pwnedpasswords.com/range/{hash}"

_CACHE: set[str] = set()


async def check_pwned_password(websession: aiohttp.ClientSession, sha1_pw: str) -> None:
"""Check if password is pwned."""
sha1_pw = sha1_pw.upper()

# Chech hit cache
sha1_short = sha1_pw[:5]
if sha1_short in _CACHE:
raise PwnedSecret()

_LOGGER.debug("Check pwned state of %s", sha1_short)
try:
async with websession.get(
_API_CALL.format(hash=sha1_short), timeout=aiohttp.ClientTimeout(total=10)
) as request:
if request.status != 200:
raise PwnedError(
f"Pwned service response with {request.status}", _LOGGER.warning
)
data = await request.text()

buffer = io.StringIO(data)
for line in buffer:
if not sha1_pw.endswith(line.split(":")[0]):
continue
_CACHE.add(sha1_short)
raise PwnedSecret()

except (aiohttp.ClientError, TimeoutError) as err:
raise PwnedConnectivityError(
f"Can't fetch HIBP data: {str(err) or 'Timeout'}", _LOGGER.warning
) from err

Файл /usr/src/supervisor/supervisor/utils/<!--noindex--><a href="https://pikabu.ru/story/arkhitekturnaya_oshibka_ili_zashchita_ot_vzloma_razbiraem_zavisimost_home_assistant_ot_onlaynservisov_13570135?u=http%3A%2F%2Fpwned.py&t=pwned.py&h=1a22d5b8f515012e396a2adbe93c582cbdbbb670" title="http://pwned.py" target="_blank" rel="nofollow noopener">pwned.py</a><!--/noindex-->

Файл /usr/src/supervisor/supervisor/utils/pwned.py

Вот моя изменненная версия pwned.py с полным отключением проблемного в России сервиса Have I Been Pwned (HIBP):

"""Small wrapper for haveibeenpwned.com API."""

import io
import logging

import aiohttp

from ..exceptions import PwnedConnectivityError, PwnedError, PwnedSecret

_LOGGER: logging.Logger = logging.getLogger(__name__)
_API_CALL: str = "https://api.pwnedpasswords.com/range/{hash}"

_CACHE: set[str] = set()


async def check_pwned_password(websession: aiohttp.ClientSession, sha1_pw: str) -> None:
"""Check if password is pwned."""
return None

"""
sha1_pw = sha1_pw.upper()

# Chech hit cache
sha1_short = sha1_pw[:5]
if sha1_short in _CACHE:
raise PwnedSecret()

_LOGGER.debug("Check pwned state of %s", sha1_short)
try:
async with websession.get(
_API_CALL.format(hash=sha1_short), timeout=aiohttp.ClientTimeout(total=10)
) as request:
if request.status != 200:
raise PwnedError(
f"Pwned service response with {request.status}", _LOGGER.warning
)
data = await request.text()

buffer = io.StringIO(data)
for line in buffer:
if not sha1_pw.endswith(line.split(":")[0]):
continue
_CACHE.add(sha1_short)
raise PwnedSecret()

except (aiohttp.ClientError, TimeoutError) as err:
raise PwnedConnectivityError(
f"Can't fetch HIBP data: {str(err) or 'Timeout'}", _LOGGER.warning
) from err
"""

После того как внёс изменения и вставил SD карту обратно в Raspberry Pi все пароли стало успешно сохранять и работоспособность полностью восстановилась.

Работоспособность сохранения паролей восстановилась

Работоспособность сохранения паролей восстановилась

Масштаб проблемы

Судя потому что я нашёл через поиск эта проблема существует уже несколько месяцев. Вот например похожий пример, когда человек пытался с ней справиться осенью 2025 года.

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

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

Автор: Михаил Шардин

Правила сообщества

Публиковать могут пользователи с любым рейтингом. Однако!


Приветствуется:

• уважение к читателям и авторам

• конструктивность комментариев

• простота и информативность повествования

• тег python2 или python3, если актуально

• код публиковать в виде цитаты, либо ссылкой на специализированный сайт


Не рекомендуется:

• допускать оскорбления и провокации

• распространять вредоносное ПО

• просить решить вашу полноценную задачу за вас

• нарушать правила Пикабу

61
Автор поста оценил этот комментарий

В какие-то дебри полезли. Вышеуказанная проверка HIBP отключается простой командой в терминале: ha security options --pwned=false

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества