80 lines
8.6 KiB
Markdown
80 lines
8.6 KiB
Markdown
|
|
# Карта Безопасности — процесс узла Монтаны на MontanaOS
|
|||
|
|
|
|||
|
|
Версия: 0.2
|
|||
|
|
Привязка к спецификации: MontanaOS v0.2, раздел 6.2
|
|||
|
|
|
|||
|
|
Эта Карта Безопасности фиксирует контракт окружения исполнения для процесса `montana-node` на устройстве MontanaOS. Любое нарушение любого пункта — блокирующий дефект, не повод для предупреждения.
|
|||
|
|
|
|||
|
|
## 1. Защита от подкачки
|
|||
|
|
|
|||
|
|
Требование. Ни одна страница памяти процесса узла не попадает в подкачку.
|
|||
|
|
|
|||
|
|
Реализация. Подкачка отключена глобально на этапе ранней инициализации командой `swapoff -a` в [init.montana-node.rc](system/init.montana-node.rc). Дополнительно процесс узла блокирует свои рабочие сегменты, содержащие приватные ключи, через системный вызов `mlock`.
|
|||
|
|
|
|||
|
|
Проверка. Файл `/proc/<pid>/status` процесса узла содержит поле `VmLck` со значением больше нуля. Сторожевой таймер проверяет это в каждом цикле опроса. При нарушении узел останавливается, не перезапускается до ручного вмешательства.
|
|||
|
|
|
|||
|
|
## 2. Защита от аварийных дампов
|
|||
|
|
|
|||
|
|
Требование. Аварийный дамп процесса узла не создаётся ни при каких обстоятельствах.
|
|||
|
|
|
|||
|
|
Реализация — два слоя.
|
|||
|
|
|
|||
|
|
Слой системы инициализации. Жёсткий лимит размера ядра при аварии установлен в ноль ноль через директиву `rlimit core 0 0` в сервисной записи. Это предотвращает создание дампа на уровне ядра до того, как сам процесс получит возможность его запретить.
|
|||
|
|
|
|||
|
|
Слой процесса. Двоичный файл узла обязан вызывать системный вызов `prctl(PR_SET_DUMPABLE, 0)` до загрузки приватных ключей в память. Это требование контракта двоичного файла, документированное в спецификации MontanaOS v0.2 раздел 5.4.
|
|||
|
|
|
|||
|
|
Проверка. Файл `/proc/<pid>/status` процесса узла содержит поле `Dumpable` со значением ноль. Сторожевой таймер проверяет это в каждом цикле опроса. При нарушении узел останавливается, не перезапускается.
|
|||
|
|
|
|||
|
|
## 3. Защита от отладчика
|
|||
|
|
|
|||
|
|
Требование. Никакой процесс, кроме самого процесса узла, не может присоединиться к процессу узла как отладчик.
|
|||
|
|
|
|||
|
|
Реализация. Политика обязательного контроля доступа SELinux запрещает разрешение `ptrace` на домен `montana_node` со всех остальных доменов, включая системные (`u:r:system_app:s0`, `u:r:adbd:s0`, и так далее). Конкретный файл политики — `system/sepolicy/montana_node.te` (создаётся в Фазе 2 дорожной карты).
|
|||
|
|
|
|||
|
|
Проверка. Попытка `strace -p <pid>` или эквивалент со стороны любого пользователя, включая root, завершается отказом доступа.
|
|||
|
|
|
|||
|
|
## 4. Защита от вытеснения при нехватке памяти
|
|||
|
|
|
|||
|
|
Требование. Процесс узла не убивается убийцей при нехватке памяти раньше критических системных приложений.
|
|||
|
|
|
|||
|
|
Реализация. Сервисная запись узла содержит директиву `oom_score_adj -800`. Это ставит процесс в категорию «системные приложения с высоким приоритетом», но не выше системного сервера (минус девятьсот) и не выше системы инициализации (минус тысяча).
|
|||
|
|
|
|||
|
|
Проверка. Файл `/proc/<pid>/oom_score_adj` процесса узла содержит значение минус восемьсот.
|
|||
|
|
|
|||
|
|
## 5. Минимизация системных привилегий
|
|||
|
|
|
|||
|
|
Требование. Процесс узла располагает только теми системными привилегиями, которые ему действительно нужны.
|
|||
|
|
|
|||
|
|
Реализация. Сервисная запись узла объявляет capabilities `NET_BIND_SERVICE` (привязка к привилегированному порту) и `IPC_LOCK` (блокировка памяти). Все остальные системные привилегии узлу недоступны.
|
|||
|
|
|
|||
|
|
Проверка. Файл `/proc/<pid>/status` процесса узла содержит поле `CapEff` (effective capabilities) с битами только для двух перечисленных привилегий.
|
|||
|
|
|
|||
|
|
## 6. Изоляция файловой системы
|
|||
|
|
|
|||
|
|
Требование. Процесс узла читает и пишет только в свои каталоги: `/data/montana/keys/` (только чтение в момент загрузки, потом закрытый дескриптор), `/data/montana/state/` (чтение и запись), `/data/montana/` (только чтение конфигурации).
|
|||
|
|
|
|||
|
|
Реализация. Политика SELinux привязывает процесс узла к домену `montana_node` и разрешает доступ только к меткам `montana_keys`, `montana_state`, `montana_config`. Сетевой доступ ограничен tcp-сокетами в инициированном направлении и принимающим сокетом на порту восемь тысяч четыреста сорок четыре.
|
|||
|
|
|
|||
|
|
Проверка. Сторонний процесс не может прочитать ни один файл в `/data/montana/`. Процесс узла не может записать в файловую систему за пределами `/data/montana/state/`.
|
|||
|
|
|
|||
|
|
## 7. Очистка секретов при завершении
|
|||
|
|
|
|||
|
|
Требование. При нормальном или аварийном завершении процесса узла все рабочие копии секретов в памяти затираются нулями до возвращения страниц операционной системе.
|
|||
|
|
|
|||
|
|
Реализация. Контракт двоичного файла узла. Узел регистрирует обработчик сигналов аварии (`SIGSEGV`, `SIGBUS`, `SIGABRT`, `SIGTERM`, `SIGINT`), который выполняет затирание перед завершением. Это требование документировано в спецификации MontanaOS v0.2 раздел 5.4.
|
|||
|
|
|
|||
|
|
Проверка. Тест-критерий проверяется фаззингом: посылка `SIGSEGV` процессу узла, дамп всей памяти системы (через `kdump`), проверка, что байт-паттерны секретных ключей не встречаются в дампе.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Тест-критерии для приёмки
|
|||
|
|
|
|||
|
|
Карта Безопасности считается выполненной, если:
|
|||
|
|
|
|||
|
|
1. Все семь требований выше проверены автоматическими тестами в составе `montana-node` testsuite.
|
|||
|
|
2. Сторожевой таймер успешно обнаруживает и реагирует на нарушение требований 1, 2, 4, 5.
|
|||
|
|
3. Политика SELinux проходит compile-time проверку через `secilc` без предупреждений.
|
|||
|
|
4. Тест фаззинга на затирание секретов (требование 7) проходит на тестовом устройстве.
|
|||
|
|
|
|||
|
|
Невыполнение любого пункта — блокер для релиза.
|