П'ять паралельних задач. Найцінніше в них — не можливості, а знайдене.
0069 БІЛІНГ. Аудит 0009 показав, що перевірка ліміту не спрацювала б
жодного разу: isPlanLimit шукала слово «ліміт», а тригер писав
"device limit reached" англійською. Перше ж досягнення стелі дало б
клієнту 500 замість пояснення. Плюс три діри: тригер лише на INSERT
(стеля в 15 обходилась за чотири дії через архів), max_maps/max_agents/
max_users не перевіряло ніщо — тобто рівно те, чим відрізняються плани,
і license_keys була закрита політикою tenant_isolation з 0011, хоча
tenant_id там NULLABLE навмисно: головний сценарій self-hosted був
недосяжний.
Після закінчення ліцензії не вимикається нічого — замерзає лише ріст.
Моніторинг, що перестав моніторити через несплачений рахунок, це
аварія в мережі клієнта, спричинена нами.
0070 SLA. Джерелом обрано ts.icmp_1h, а не device_status_history:
остання не вміє сказати «ми не знали» — перехід пишеться лише при
зміні стану, тож доба мовчання зонда виглядає як доба роботи. Час
розкладено на чотири частини, і «немає даних» не додається ні до чого;
замість вибору між двома брехнями звіт каже, яку частку періоду він
бачив. Закритий період тримає тригер, а не домовленість у Go.
0071 ВІДПОВІДНІСТЬ. 20 правил, кожне прив'язане до родини: об'єднаний
вираз, що покриває Cisco й не покриває MikroTik, дав би «0 порушень» і
сховав сліпу пляму. Вендор не входить у перелік, доки для нього немає
зразка конфігу в тесті. TestBuiltinRulesAreNotAlwaysGreen вимагає, щоб
у кожного правила був конфіг, де воно спрацювало, І де ні.
ПІСОЧНИЦЯ УСТАНОВНИКА — та сама установка в ізольованому проєкті
compose. Знайшла дві справжні вади з трьох спроб:
* healthcheck бази ходив unix-сокетом, а споживачі по TCP. При
первинній ініціалізації Postgres слухає лише сокет — compose
вважав базу здоровою, migrate отримував connection refused. На
створеній базі цієї фази немає, тож вада чекала на першого клієнта;
* у білому переліку модулів API не було traps і filecfg — зонд із
приймачем трапів неможливо було зареєструвати взагалі.
ТЕСТИ СТОРІНОК: 137 → 252. Мережевий шар, права доступу, незворотні
дії, фільтри з адресного рядка. Підмінюється лише fetch і WebSocket —
api/client.ts працює справжній.
131 lines
9.4 KiB
Text
131 lines
9.4 KiB
Text
# NetPulse — файл відповідей.
|
||
#
|
||
# Тут лежить рівно те, чого установник не може вирішити за вас: п'ять
|
||
# значень. Решта — секрети, які людині не можна давати вводити руками
|
||
# (секрет, який пропонують придумати, виявляється admin123), і
|
||
# налаштування, у яких є одне правильне значення або значення, що
|
||
# рахується з машини.
|
||
#
|
||
# Файл НЕ обов'язковий. `./netpulse install` без нього ставить робочу
|
||
# систему на самопідписаному сертифікаті, без прийому трапів ззовні, з
|
||
# помірними строками зберігання й поясом хоста. Кожен рядок нижче
|
||
# каже, що буде, якщо його не чіпати.
|
||
#
|
||
# cp netpulse.conf.example netpulse.conf
|
||
# ./netpulse install
|
||
#
|
||
# Синтаксис: КЛЮЧ=значення, без лапок, без пробілів навколо «=».
|
||
#
|
||
# ПІСОЧНИЦЯ (`./netpulse sandbox`) цей файл НЕ читає, і це навмисно.
|
||
# Вона ставить систему на localhost із самопідписаним сертифікатом,
|
||
# а справжній DOMAIN звідси відправив би її по сертифікат для адреси,
|
||
# яка веде на бойовий стенд: витрачені спроби списались би з тижневої
|
||
# квоти домену, і платив би за перевірку той, кого перевіряли. З
|
||
# TRAPS_FROM те саме — правило в DOCKER-USER це стан хоста, і прибрати
|
||
# його разом із томами пісочниці не вийшло б.
|
||
|
||
|
||
# ---------------------------------------------------------------------
|
||
# DOMAIN — доменне ім'я, на яке дивиться A-запис цього сервера.
|
||
# ---------------------------------------------------------------------
|
||
#
|
||
# Це рішення людини, бо ані сервер, ані установник не знають, що написано
|
||
# в чужій зоні DNS. Перевірити «чи веде домен сюди» до першого запуску
|
||
# теж не можна: запис міг з'явитись хвилину тому й ще не розійтися.
|
||
#
|
||
# ПОРОЖНЬО: адресою системи стає IP цієї машини, а сертифікат —
|
||
# самопідписаний. Працює одразу, але браузер щоразу лається, і зонди
|
||
# доводиться запускати з -insecure. Let's Encrypt тут ні до чого: він не
|
||
# видає сертифікатів на IP-адреси взагалі, тому «залишити порожнім і
|
||
# сподіватись на справжній сертифікат» неможливо за побудовою.
|
||
#
|
||
# Домен можна вписати пізніше: змінити рядок і повторити
|
||
# `./netpulse install` — переустановлення нічого не ламає.
|
||
DOMAIN=
|
||
|
||
# ---------------------------------------------------------------------
|
||
# ADMIN_EMAIL — пошта для Let's Encrypt.
|
||
# ---------------------------------------------------------------------
|
||
#
|
||
# На неї приходить лист, коли продовження сертифіката ламається. Це
|
||
# єдиний канал, яким про це дізнаються ДО того, як сайт перестане
|
||
# відкриватись, — тому адреса має бути та, яку читають, а не та, що
|
||
# гарно виглядає.
|
||
#
|
||
# ПОРОЖНЬО при заданому DOMAIN: сертифікат усе одно береться, але
|
||
# попередження про проблеми з продовженням нікуди не піде.
|
||
#
|
||
# Без DOMAIN не потрібна зовсім: сертифікат самопідписаний, продовжувати
|
||
# нічого й нікому скаржитись.
|
||
ADMIN_EMAIL=
|
||
|
||
# ---------------------------------------------------------------------
|
||
# TRAPS_FROM — від кого приймати SNMP-трапи (порт 162/udp).
|
||
# ---------------------------------------------------------------------
|
||
#
|
||
# Це рішення, а не налаштування: 162/udp не має автентифікації взагалі.
|
||
# Хто знає адресу — той шле, і система це запише. На машині з публічним
|
||
# інтерфейсом «слухати всюди» означає віддати чужим людям право
|
||
# наповнювати вашу базу подіями.
|
||
#
|
||
# ПОРОЖНЬО: трапи слухаються лише на 127.0.0.1. Ззовні не приймається
|
||
# нічого. Решта моніторингу (ICMP, SNMP-опитування, збір конфігів) від
|
||
# цього не залежить — зонди самі ходять до заліза.
|
||
#
|
||
# АДРЕСА цієї машини (наприклад 10.0.0.5): порт піднімається лише на
|
||
# цьому інтерфейсі. Найдешевший спосіб пустити трапи з внутрішньої
|
||
# мережі й не пустити з інтернету — якщо інтерфейси різні.
|
||
#
|
||
# ПІДМЕРЕЖА (наприклад 10.0.0.0/24) або чужа адреса: порт піднімається
|
||
# на всіх інтерфейсах, а джерело обмежується правилом у ланцюжку
|
||
# DOCKER-USER. Потребує iptables на хості; якщо його немає, установник
|
||
# ЗУПИНИТЬСЯ, а не відкриє порт усім мовчки. Правило не переживає
|
||
# перезавантаження саме собою — установник скаже, що з цим робити.
|
||
#
|
||
# any: слухати всюди, приймати від будь-кого. Установник це зробить і
|
||
# гучно скаже, що саме ви щойно дозволили.
|
||
TRAPS_FROM=
|
||
|
||
# ---------------------------------------------------------------------
|
||
# RETENTION — скільки тримати дані.
|
||
# ---------------------------------------------------------------------
|
||
#
|
||
# Рішення організації, а не властивість збірки: «ми маємо бачити
|
||
# півроку» — це вимога до вас, а не до продукту. Установник не має права
|
||
# вгадати її, бо помилка в один бік коштує диска, а в другий — історії,
|
||
# заради якої систему й ставили.
|
||
#
|
||
# Строк — рівня інсталяції, не кабінету: TimescaleDB видаляє дані цілими
|
||
# чанками, а чанк ріжеться за часом і про кабінет не знає нічого
|
||
# (пояснення — у міграції 0064). Розкладку профілю по видах даних видно
|
||
# на сторінці «Сховище» й там же правиться поштучно.
|
||
#
|
||
# economy — метрики 7 діб, годинні агрегати півроку, syslog тиждень.
|
||
# Для диска на 50 ГБ і кількох сотень хостів.
|
||
# normal — метрики 35 діб, годинні агрегати два роки, аудит рік.
|
||
# Те, що люди мають на увазі під «як зазвичай».
|
||
# archive — метрики 90 діб, годинні агрегати п'ять років, аудит п'ять
|
||
# років. Коли історію вимагає регламент. Диск рахуйте
|
||
# заздалегідь: це в кілька разів більше за normal.
|
||
#
|
||
# ПОРОЖНЬО: normal.
|
||
#
|
||
# Профіль накладається лише на ПЕРШІЙ установці. Повторний запуск
|
||
# `install` не чіпає строки: до того часу їх уже могли поправити руками,
|
||
# і мовчки повернути наш профіль означало б знищити дані за чужим
|
||
# рішенням.
|
||
RETENTION=normal
|
||
|
||
# ---------------------------------------------------------------------
|
||
# TZ — часовий пояс.
|
||
# ---------------------------------------------------------------------
|
||
#
|
||
# У ньому рахуються розклади бекапів конфігів, вікна тиші для сповіщень
|
||
# і підписи часу на графіках. Пояс хоста тут не завжди правильна
|
||
# відповідь: сервер у чужому дата-центрі цілком може стояти в UTC, а
|
||
# «о третій ночі» для вимкнення сповіщень означає третю ночі там, де
|
||
# сидять чергові.
|
||
#
|
||
# ПОРОЖНЬО: береться пояс хоста, а якщо визначити не вдалось —
|
||
# Europe/Kyiv.
|
||
TZ=Europe/Kyiv
|