Наблюдение на сървъра без лични данни
Контейнерът Status не може безопасно да установява свободното място и
синхронизацията на часовника на сървъра, състоянието на Docker или избрания
маршрут за обновявания. Той не трябва да получава общ достъп до
сървъра само за да показва тези факти. Затова проверка на сървъра с права root свежда
наблюдението до един точен файл без тайни:
/opt/lospor-hospital/.data/runtime/update/state/host-observability.v2.json
lospor-host-observability.timer обновява файла всяка минута. Status монтира
директорията само за четене. Проверката няма маршрут през Status, а Status няма
гнездо на Docker, монтирана файлова система на root, команден ред или екран за дневници.
Какво преминава границата
Файлът v2 съдържа само идентификатор на схемата/сигнала, UTC време на наблюдението и фиксирани състояния за:
- общото свободно място във файловите системи на системата, Docker и архивите;
- мрежовата синхронизация на часовника;
- актуалността на защитеното доказателство за проверен локален архив;
- потвърждението от шифрованото външно хранилище;
- услугата и сигнала на агента за обновяване;
- срока на HTTPS сертификата;
- очакваните постоянни Compose услуги;
- незавършени или небезопасни данни от дневника за възстановяване;
- заключването при активиране на версия; и
- маршрута за обновявания: свързан или офлайн.
Анализаторът отхвърля целия сигнал при допълнителен ключ, непознато състояние, или невалидно/бъдещо време. Той не може да приеме идентификатор на пациент или случай, потребител/акаунт, име на сървър, домейн, IP адрес, файлов път, съдържание на сертификат, стойност на тайна, необработен изход от команда, ред от дневник или свободен текст. Самата проверка извежда към услугата само фиксирани кодове.
При липсващ/невалиден сигнал или сигнал, по-стар от три минути, Status показва Неизвестно, никога зелено. Така са допустими две пропуснати едноминутни изпълнения и малко закъснение, без да се прикрива спрян timer.
Прагове и значения
- Мястото е
lowпод 20 GiB свободни или при 85% използване иcriticalпод 10 GiB или при 95% използване в която и да е наблюдавана файлова система. Публикува се само най-лошото състояние; пътищата и броят байтове остават на сървъра. - Провереният локален архив е актуален шест часа, остарява до осмия час и след това е просрочен. Четиричасовият интервал има двучасов допуск за изпълнение и повторен опит, без да се отслабва алармата след осмия час.
- Потвърждението за най-новия проверен външен архив е актуално шест часа,
остарява до 24 часа и след това е просрочено. Потвърждение за по-стар обект е
pending. Доставеното отложено действие е изричноnot-configured, а не успешно копие. - Инсталираният агент за обновяване трябва да е активен и да е подал сигнал през последните десет минути. Изрично избраният режим само от конзолата се показва като ненастроен, а не като повреда.
- Сертификат, който изтича до 30 дни, е ограничен; изтекъл или липсващ
сертификат е недостъпен. В режим
operatorсе проверява единственият предоставен от болницата сертификат, за който проверката за готовност вече е доказала, че покрива и двете публични имена. В режим ACME илиlocalсе правят отделни SNI проверки презloopbackза клиничното и изследователското име. Локалният тестов CA на Caddy умишлено издава краткотрайни сертификати и ги подновява автоматично, затова приlocalсе проверява реалното изтичане без 30-дневното предупреждение за публичен или болничен сертификат. При всеки режим се проверява и независимият резервен сертификат на Status. Публикува се само най-лошото състояние; име, път, име на притежателя (subject), отпечатък или съдържание на сертификат не преминава към Status. - Всяка очаквана постоянна услуга трябва да работи и, ако има състояние за изправност от Docker, да е изправна. Не се очаква еднократните контейнери за миграция или първоначална настройка контейнери да продължават да работят.
- Данните за възстановяване и активиране преминават границата единствено като
clear,presentилиinvalid. Имената и фазите на дневници, имената на бази данни, идентичността на архива, данните за процеса и часовете остават на сървъра. Завършено възстановяване на място еclearсамо когато точният му надежден маркер за границата преди промяна на данните е структурно безопасен. Осиротял, променен или небезопасен маркер еinvalid, а не зелено състояние.
Проверка за болничното наблюдение
Собствената система за наблюдение на болницата може да използва същия сигнал без достъп до Status, Docker, тайни или дневници на сървъра:
python3 /opt/lospor-hospital/current/scripts/check-host-observability.py
Командата е локална проверка, съвместима с Nagios: код за изход 0 е OK, 1 е
WARNING, 2 е CRITICAL, а 3 е UNKNOWN. Изходът съдържа само
фиксираното състояние LOSPOR HOST и позволени кодове за резултат. Никога не
извежда път, име на сървър, адрес, идентификатор, данни за достъп, ред от дневник или
произволен вход. Липсващ, прекалено голям, свързан, достъпен за запис извън
root, с повторен ключ, невалиден, бъдещ или по-стар от три минути сигнал винаги
дава UNKNOWN. Болничният ИТ екип може да извиква командата от Nagios/Icinga
или друг локален изпълнител; не се добавя външна телеметрия.
Инсталиране и възстановяване
Обикновеният инсталатор добавя и стартира наблюдението след записването на режима на агента за обновяване. За повторно инсталиране на каноничните модули и незабавно изискване на нов сигнал:
sudo sh /opt/lospor-hospital/current/scripts/install-host-observability.sh
Инсталаторът проверява четирите модула за услуги и таймери чрез systemd-analyze,
включва двата таймера, стартира веднъж проверката на сертификата и наблюдението
и спира с грешка без точен и нов сигнал. Услугите използват
ProtectSystem=strict, записват само в тесните си директории за състояние и
тайни и следват връзката current, така че активирана версия обновява и двете
проверки.
Новата инсталация и всяко обновяване на системата проверяват резервната
двойка ключ/сертификат на Status, двата задължителни SAN за локален достъп (loopback) и поне 30
дни оставаща валидност. Валидната двойка се запазва без промяна. Изтичаща,
повредена или несъответстваща двойка се заменя едва след като пълната нова
двойка с валидност 825 дни премине всички проверки. Постоянен timer повтаря
проверката два пъти дневно, така че работещата система да не надживее
първоначалния си сертификат. Подмяната записва траен маркер за презареждане,
рестартира само Status, проверява дали слушателят на локалния адрес подава сертификат с
очаквания SHA-256 отпечатък и изтрива маркера едва след успешно доказване.
Неуспешен рестарт или различен отпечатък запазва маркера за следващото
изпълнение и остава видим чрез сигнала от сървъра. Проверката използва общото
постоянно заключване за архивиране и обновяване, затова изчаква, вместо
да рестартира Status по време на архивиране, миграция на базата данни, активиране на
версия или друго действие на сървъра, което променя данни. Същата проверка се изпълнява
при инсталация, обновяване и преди действията за поддръжка на системния
администратор. Тъй като сертификатът е самоподписан, болничният ИТ екип може да
трябва отново да му добави доверие, ако преди това е скрил обичайното предупреждение на браузъра
предупреждение.
Диагностика само на сървъра:
systemctl status lospor-host-observability.timer
systemctl status lospor-host-observability.service
systemctl status lospor-status-fallback-certificate.timer
systemctl status lospor-status-fallback-certificate.service
sudo sh /opt/lospor-hospital/current/scripts/host-observability-probe.sh
Дневниците остават на сървъра. Не копирайте необработени дневници в Status или в диагностичен пакет без отделен преглед за лични данни.
Свързано и офлайн предоставяне на обновявания
HOSPITAL_UPDATE_SUPPLY_MODE=connected е режимът по подразбиране. Версиите се
изтеглят от публичното издание в GitHub, а образите — анонимно от ghcr.io;
системата не пази данни за достъп до GitHub или регистъра, а доверието идва само
от подписа на версията. Сървърът се нуждае от изходящ HTTPS към
api.github.com, хранилището за файлове на GitHub, към което той пренасочва, и
ghcr.io. Анонимното ползване на GitHub API е ограничено за мрежов адрес; когато
лимитът е изчерпан, подготовката съобщава кога да опитате отново.
HOSPITAL_UPDATE_SUPPLY_MODE=offline взема всяка версия от проверен USB носител и
не изисква изходящ достъп. Провереният маршрут load-offline.sh избира този
режим при нова офлайн инсталация. Status показва и двата маршрута като валиден
избор, а непознат режим — като прекъсване.