diff --git a/README.md b/README.md index ebe1c92..9a7f46e 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,10 @@ | Репозиторий | Назначение | |-------------|------------| -| [ssh-monitor](https://github.com/PTah/ssh-monitor) | Linux: SSH, sudo, logind, брутфорс, баны IP | -| [RDP-login-monitor](https://github.com/PTah/RDP-login-monitor) | Windows: RDP/RDS, RD Gateway, WinRM, admin share C$/ADMIN$ | +| [ssh-monitor](https://git.kalinamall.ru/PapaTramp/ssh-monitor) | Linux: SSH, sudo, logind, брутфорс, баны IP | +| [RDP-login-monitor](https://git.kalinamall.ru/PapaTramp/RDP-login-monitor) | Windows: RDP/RDS, RD Gateway, WinRM, admin share C$/ADMIN$ | | **security-alert-center** (этот репозиторий) | Ubuntu 24.04: API, БД, UI, оповещения | -| [seaca](https://github.com/PTah/seaca) | Android: мобильный клиент SAC, push (FCM) | +| [seaca](https://git.kalinamall.ru/PapaTramp/seaca) | Android: мобильный клиент SAC, push (FCM) | ## Статус @@ -29,8 +29,8 @@ События приходят от агентов по [контракту ingest](docs/agent-integration.md) (`type`, `severity`, `details`): -- **Linux — [ssh-monitor](https://github.com/PTah/ssh-monitor):** SSH (успех/неудача), **sudo**, **systemd-logind**, брутфорс и баны IP (ipset), пороги без бана, ежедневный отчёт, heartbeat. -- **Windows — [RDP-login-monitor](https://github.com/PTah/RDP-login-monitor):** +- **Linux — [ssh-monitor](https://git.kalinamall.ru/PapaTramp/ssh-monitor):** SSH (успех/неудача), **sudo**, **systemd-logind**, брутфорс и баны IP (ipset), пороги без бана, ежедневный отчёт, heartbeat. +- **Windows — [RDP-login-monitor](https://git.kalinamall.ru/PapaTramp/RDP-login-monitor):** - **RDP/RDS** (4624/4625); - **RD Gateway** (302/303), **WinRM / PowerShell Remoting** (Enter-PSSession, ID 91); - **админ-шары `C$` / `ADMIN$`** (Security **5140**, `smb.admin_share.access`); @@ -65,7 +65,7 @@ ## Быстрый старт (native) ```bash -git clone https://github.com/PTah/security-alert-center.git /opt/security-alert-center +git clone https://git.kalinamall.ru/PapaTramp/security-alert-center.git /opt/security-alert-center # deploy/env.native.example -> config/sac-api.env cd /opt/security-alert-center/backend python3 -m venv .venv && .venv/bin/pip install -r requirements.txt diff --git a/README_en.md b/README_en.md index b3b0a4b..735fe20 100644 --- a/README_en.md +++ b/README_en.md @@ -8,8 +8,8 @@ Self-hosted hub for collecting, storing, and displaying security events from Lin | Repository | Role | |------------|------| -| [ssh-monitor](https://github.com/PTah/ssh-monitor) | Linux: SSH, sudo, logind, brute-force, IP ban | -| [RDP-login-monitor](https://github.com/PTah/RDP-login-monitor) | Windows: RDP/RDS, RD Gateway, WinRM, admin share C$/ADMIN$ | +| [ssh-monitor](https://git.kalinamall.ru/PapaTramp/ssh-monitor) | Linux: SSH, sudo, logind, brute-force, IP ban | +| [RDP-login-monitor](https://git.kalinamall.ru/PapaTramp/RDP-login-monitor) | Windows: RDP/RDS, RD Gateway, WinRM, admin share C$/ADMIN$ | | **security-alert-center** (this repo) | Ubuntu 24.04: API, database, UI, notifications | ## Status @@ -28,8 +28,8 @@ Self-hosted hub for collecting, storing, and displaying security events from Lin Agents send events via the [ingest contract](docs/agent-integration.md) (`type`, `severity`, `details`): -- **Linux — [ssh-monitor](https://github.com/PTah/ssh-monitor):** SSH success/failure, **sudo**, **systemd-logind**, brute-force and IP ban (ipset), thresholds without ban, daily report, heartbeat. -- **Windows — [RDP-login-monitor](https://github.com/PTah/RDP-login-monitor):** +- **Linux — [ssh-monitor](https://git.kalinamall.ru/PapaTramp/ssh-monitor):** SSH success/failure, **sudo**, **systemd-logind**, brute-force and IP ban (ipset), thresholds without ban, daily report, heartbeat. +- **Windows — [RDP-login-monitor](https://git.kalinamall.ru/PapaTramp/RDP-login-monitor):** - **RDP/RDS** (4624/4625); - **RD Gateway** (302/303), **WinRM / PowerShell Remoting** (Enter-PSSession, event ID 91); - **admin shares `C$` / `ADMIN$`** (Security **5140**, `smb.admin_share.access`); @@ -64,7 +64,7 @@ Agents send events via the [ingest contract](docs/agent-integration.md) (`type`, ## Quick start (native) ```bash -git clone https://github.com/PTah/security-alert-center.git /opt/security-alert-center +git clone https://git.kalinamall.ru/PapaTramp/security-alert-center.git /opt/security-alert-center # deploy/env.native.example -> config/sac-api.env cd /opt/security-alert-center/backend python3 -m venv .venv && .venv/bin/pip install -r requirements.txt diff --git a/deploy/.env.example b/deploy/.env.example index 0a90b4d..885e984 100644 --- a/deploy/.env.example +++ b/deploy/.env.example @@ -7,7 +7,7 @@ POSTGRES_PASSWORD=change-me-long-random POSTGRES_DB=sac # API (публичный URL для ссылок в ответах ingest) -SAC_PUBLIC_URL=https://sac.example.com +SAC_PUBLIC_URL=https://sac.kalinamall.ru SAC_API_PORT=8000 # JWT (UI — позже) diff --git a/deploy/README.md b/deploy/README.md index f4495d7..77433fd 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -5,7 +5,7 @@ 1. [docs/install-ubuntu-24.04-native.md](../docs/install-ubuntu-24.04-native.md) 2. `deploy/env.native.example` → `/opt/security-alert-center/config/sac-api.env` 3. `deploy/systemd/sac-api.service` → `/etc/systemd/system/` -4. `deploy/nginx/sac.conf.tls.example` → `/etc/nginx/sites-available/sac` (wildcard TLS; только `sac.example.com`, чужие Host → 444) +4. `deploy/nginx/sac.conf.tls.example` → `/etc/nginx/sites-available/sac` (wildcard TLS; только `sac.kalinamall.ru`, чужие Host → 444) или `sac.conf.example` — только HTTP / отладка 5. `deploy/sac-deploy.sh` → `/opt/sac-deploy.sh` — полное обновление после `git pull` diff --git a/deploy/env.native.example b/deploy/env.native.example index a79d8e5..644fa12 100644 --- a/deploy/env.native.example +++ b/deploy/env.native.example @@ -5,7 +5,7 @@ DATABASE_URL=postgresql+psycopg2://sac:CHANGE_ME_POSTGRES_PASSWORD@127.0.0.1:5432/sac -SAC_PUBLIC_URL=https://sac.example.com +SAC_PUBLIC_URL=https://sac.kalinamall.ru JWT_SECRET=CHANGE_ME_openssl_rand_hex_32 # API key для агентов: Authorization: Bearer <ключ> diff --git a/deploy/nginx/sac.conf.example b/deploy/nginx/sac.conf.example index bb4dbf6..b32e1dd 100644 --- a/deploy/nginx/sac.conf.example +++ b/deploy/nginx/sac.conf.example @@ -1,18 +1,18 @@ # /etc/nginx/sites-available/sac -# Production FQDN: sac.example.com +# Production FQDN: sac.kalinamall.ru # API: 127.0.0.1:8000 (systemd sac-api) # -# Hostname: только sac.example.com; остальные Host → 444 (см. default_server ниже). +# Hostname: только sac.kalinamall.ru; остальные Host → 444 (см. default_server ниже). # # Порядок: 1) этот конфиг (только :80) → nginx -t → reload -# 2) certbot --nginx -d sac.example.com (добавит :443 и сертификаты) +# 2) certbot --nginx -d sac.kalinamall.ru (добавит :443 и сертификаты) upstream sac_api { server 127.0.0.1:8000; keepalive 8; } -# --- default: отклонить чужие Host (не sac.example.com) --- +# --- default: отклонить чужие Host (не sac.kalinamall.ru) --- server { listen 80 default_server; listen [::]:80 default_server; @@ -23,7 +23,7 @@ server { server { listen 80; listen [::]:80; - server_name sac.example.com; + server_name sac.kalinamall.ru; location /.well-known/acme-challenge/ { root /var/www/html; diff --git a/deploy/nginx/sac.conf.tls.example b/deploy/nginx/sac.conf.tls.example index 6e10387..6f3f015 100644 --- a/deploy/nginx/sac.conf.tls.example +++ b/deploy/nginx/sac.conf.tls.example @@ -1,8 +1,8 @@ # /etc/nginx/sites-available/sac # HTTPS с корпоративным wildcard-сертификатом (например VeriSign / DigiCert). -# Покрывает sac.example.com при CN/SAN *.example.com или sac.example.com +# Покрывает sac.kalinamall.ru при CN/SAN *.kalinamall.ru или sac.kalinamall.ru # -# Hostname: только sac.example.com. Любой другой Host (например ext.example.com +# Hostname: только sac.kalinamall.ru. Любой другой Host (например ext.kalinamall.ru # при ошибке DNS/маршрутизации на IP SAC) получает 444 / reject handshake — # форма входа SAC не отдаётся на «чужом» имени. # @@ -32,18 +32,18 @@ server { ssl_reject_handshake on; } -# Редирект HTTP → HTTPS (только sac.example.com) +# Редирект HTTP → HTTPS (только sac.kalinamall.ru) server { listen 80; listen [::]:80; - server_name sac.example.com; + server_name sac.kalinamall.ru; return 301 https://$host$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; - server_name sac.example.com; + server_name sac.kalinamall.ru; # --- замените пути на ваши файлы wildcard --- ssl_certificate /etc/ssl/sac/fullchain.pem; diff --git a/deploy/sac-deploy.sh b/deploy/sac-deploy.sh index cda558e..9a59b46 100644 --- a/deploy/sac-deploy.sh +++ b/deploy/sac-deploy.sh @@ -40,7 +40,7 @@ else if [ -z "${UPSTREAM}" ]; then UPSTREAM="origin/main" fi - log "WARN: fast-forward невозможен (часто после force-push на upstream) — reset --hard ${UPSTREAM}" + log "WARN: fast-forward невозможен (часто после force-push на kalinamall) — reset --hard ${UPSTREAM}" sudo -u "${APP_USER}" git -C "${APP_ROOT}" reset --hard "${UPSTREAM}" fi diff --git a/deploy/systemd/sac-api.service b/deploy/systemd/sac-api.service index 1aeddb3..6920d4c 100644 --- a/deploy/systemd/sac-api.service +++ b/deploy/systemd/sac-api.service @@ -1,6 +1,6 @@ [Unit] Description=Security Alert Center API (FastAPI) -Documentation=https://github.com/PTah/security-alert-center +Documentation=https://git.kalinamall.ru/PapaTramp/security-alert-center After=network-online.target postgresql.service Wants=network-online.target Requires=postgresql.service diff --git a/docs/agent-integration.md b/docs/agent-integration.md index 97f51dd..e408b34 100644 --- a/docs/agent-integration.md +++ b/docs/agent-integration.md @@ -14,7 +14,7 @@ ```ini # off | exclusive | dual | fallback UseSAC="exclusive" -SAC_URL="https://sac.example.com/api/v1/events" +SAC_URL="https://sac.kalinamall.ru/api/v1/events" SAC_API_KEY="sac_xxxxxxxx" SAC_SPOOL_DIR="/var/lib/ssh-monitor/sac-spool" SAC_SEND_HEARTBEAT="1" @@ -26,7 +26,7 @@ SAC_TIMEOUT_SEC="12" ```powershell $UseSAC = "exclusive" # off | exclusive | dual | fallback -$SacUrl = "https://sac.example.com/api/v1/events" +$SacUrl = "https://sac.kalinamall.ru/api/v1/events" $SacApiKey = "sac_xxxxxxxx" $SacSpoolDir = "D:\Soft\Logs\sac-spool" ``` @@ -74,7 +74,7 @@ UI **Настройки** (`/settings`) — правило + параметры ### 1.4. Версии и доставка обновлений -При **любом** изменении агента, влияющем на SAC или поведение на хосте, поднимайте версию и пушьте в **GitHub** (`github.com/PTah`): +При **любом** изменении агента, влияющем на SAC или поведение на хосте, поднимайте версию и пушьте в **GitHub** (`github.com/PTah`); для зеркала kalinamall — `.\scripts\Push-Mirror.ps1 kalinamall`: | Агент | Маркер версии | Как хост узнаёт о новой версии | |-------|---------------|--------------------------------| @@ -113,7 +113,7 @@ UI **Настройки** (`/settings`) — правило + параметры ```http POST /api/v1/events HTTP/1.1 -Host: sac.example.com +Host: sac.kalinamall.ru Content-Type: application/json Authorization: Bearer sac_xxxxxxxx Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000 @@ -136,7 +136,7 @@ Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000 "status": "created", "event_id": "550e8400-e29b-41d4-a716-446655440000", "created": true, - "sac_event_url": "https://sac.example.com/api/v1/events/12345", + "sac_event_url": "https://sac.kalinamall.ru/api/v1/events/12345", "problem_id": null } ``` diff --git a/docs/deployment.md b/docs/deployment.md index c38334c..e3a744c 100644 --- a/docs/deployment.md +++ b/docs/deployment.md @@ -21,7 +21,7 @@ deploy/ sac-deploy.sh → /opt/sac-deploy.sh (полное обновление) ``` -**Production URL:** `https://sac.example.com` +**Production URL:** `https://sac.kalinamall.ru` **Конфиг:** `/opt/security-alert-center/config/sac-api.env` (владелец `sac:sac`, chmod 600). **UI:** статика `frontend/dist`, раздаётся через FastAPI (после `npm run build`). @@ -42,7 +42,7 @@ deploy/ ## 2. Сетевые правила -**Агенты →** `https://sac.example.com/api/v1/events` +**Агенты →** `https://sac.kalinamall.ru/api/v1/events` **SAC →** Telegram, SMTP (исходящие) **Админы →** 443 (UI/API через nginx) @@ -66,7 +66,7 @@ deploy/ ```bash systemctl status sac-api curl -sS http://127.0.0.1:8000/health -curl -sS https://sac.example.com/health +curl -sS https://sac.kalinamall.ru/health ``` --- diff --git a/docs/event-schema-v1.json b/docs/event-schema-v1.json index 4b28de8..c867a07 100644 --- a/docs/event-schema-v1.json +++ b/docs/event-schema-v1.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/PTah/security-alert-center/schemas/event-v1.json", + "$id": "https://git.kalinamall.ru/PapaTramp/security-alert-center/schemas/event-v1.json", "title": "Security Alert Center Event v1", "description": "Каноническое событие от ssh-monitor или RDP-login-monitor", "type": "object", diff --git a/docs/install-ubuntu-24.04-docker.md b/docs/install-ubuntu-24.04-docker.md index 63bc24b..c2900d2 100644 --- a/docs/install-ubuntu-24.04-docker.md +++ b/docs/install-ubuntu-24.04-docker.md @@ -24,7 +24,7 @@ Docker удобен для локальной отладки или изолир ```bash sudo apt install -y git -sudo git clone https://github.com/PTah/security-alert-center.git /opt/security-alert-center +sudo git clone https://git.kalinamall.ru/PapaTramp/security-alert-center.git /opt/security-alert-center sudo chown -R "$USER:$USER" /opt/security-alert-center ``` diff --git a/docs/install-ubuntu-24.04-native.md b/docs/install-ubuntu-24.04-native.md index fd58ce3..a757816 100644 --- a/docs/install-ubuntu-24.04-native.md +++ b/docs/install-ubuntu-24.04-native.md @@ -9,7 +9,7 @@ | Параметр | Пример | |----------|--------| -| FQDN | `sac.example.com` | +| FQDN | `sac.kalinamall.ru` | | IP | `10.0.0.50` | | Каталог | `/opt/security-alert-center` | | Пользователь сервиса | `sac` | @@ -71,7 +71,7 @@ nginx -v ```bash sudo mkdir -p /opt -sudo git clone https://github.com/PTah/security-alert-center.git /opt/security-alert-center +sudo git clone https://git.kalinamall.ru/PapaTramp/security-alert-center.git /opt/security-alert-center ``` --- @@ -144,7 +144,7 @@ sudo chmod 600 /opt/security-alert-center/config/sac-api.env - `DATABASE_URL` — с паролем PostgreSQL из шага 4 (если в пароле есть `#`, `@`, `%` — возьмите значение в **кавычки**: `DATABASE_URL="postgresql+psycopg2://..."`) - `JWT_SECRET` — `openssl rand -hex 32` -- `SAC_PUBLIC_URL` — `https://sac.example.com` +- `SAC_PUBLIC_URL` — `https://sac.kalinamall.ru` - `SAC_BOOTSTRAP_API_KEY` — `python3.12 -c "import secrets; print('sac_'+secrets.token_urlsafe(32))"` - `SAC_ADMIN_PASSWORD` — пароль входа в веб-UI (отдельно от API key агентов) - `EVENT_SCHEMA_PATH=/opt/security-alert-center/schemas/event-schema-v1.json` @@ -195,7 +195,7 @@ journalctl -u sac-api -f ## 9. nginx и TLS Для KalinaMall: **корпоративный wildcard VeriSign** (или DigiCert), не Let's Encrypt. -Хост `sac.example.com` должен попадать под `*.example.com`. +Хост `sac.kalinamall.ru` должен попадать под `*.kalinamall.ru`. **Подробно:** форматы, scp с Windows/Linux, `.pfx` → PEM, права — **[ssl-certificate.md](ssl-certificate.md)**. @@ -223,7 +223,7 @@ sudo usermod -aG ssl-cert www-data ```bash # с вашего компьютера: -scp fullchain.pem privkey.pem deploy@:/tmp/ +scp fullchain.pem privkey.pem papatramp@:/tmp/ # на сервере: sudo mv /tmp/fullchain.pem /tmp/privkey.pem /etc/ssl/sac/ @@ -263,28 +263,28 @@ sudo nginx -t sudo systemctl reload nginx ``` -Шаблон `sac.conf.tls.example` содержит **default_server** с `return 444` (:80) и `ssl_reject_handshake` (:443) для любого Host, кроме `sac.example.com`. Это защищает от ситуации, когда на IP SAC (например ``) по ошибке DNS попадает `ext.example.com` и открывается форма входа SAC. +Шаблон `sac.conf.tls.example` содержит **default_server** с `return 444` (:80) и `ssl_reject_handshake` (:443) для любого Host, кроме `sac.kalinamall.ru`. Это защищает от ситуации, когда на IP SAC (например `192.168.160.145`) по ошибке DNS попадает `ext.kalinamall.ru` и открывается форма входа SAC. Проверка после reload: ```bash -curl -sS -o /dev/null -w '%{http_code}\n' --resolve sac.example.com:443:127.0.0.1 https://sac.example.com/health +curl -sS -o /dev/null -w '%{http_code}\n' --resolve sac.kalinamall.ru:443:127.0.0.1 https://sac.kalinamall.ru/health # ожидается 200 -curl -sS -o /dev/null -w '%{http_code}\n' --resolve ext.example.com:443:127.0.0.1 https://ext.example.com/ 2>/dev/null || echo "connection closed (444/reject OK)" +curl -sS -o /dev/null -w '%{http_code}\n' --resolve ext.kalinamall.ru:443:127.0.0.1 https://ext.kalinamall.ru/ 2>/dev/null || echo "connection closed (444/reject OK)" ``` Проверка: ```bash -curl -sS https://sac.example.com/health | jq . +curl -sS https://sac.kalinamall.ru/health | jq . ``` -В `config/sac-api.env` должно быть: `SAC_PUBLIC_URL=https://sac.example.com` +В `config/sac-api.env` должно быть: `SAC_PUBLIC_URL=https://sac.kalinamall.ru` ### 9.3. Агенты (ssh-monitor, RDP) и доверие к CA -- Агенты ходят на `https://sac.example.com/api/v1/events`. +- Агенты ходят на `https://sac.kalinamall.ru/api/v1/events`. - Если используется **внутренний корневой CA**, а не публичный VeriSign/DigiCert в системном store — на Linux/Windows может понадобиться установка корневого сертификата в доверенные (или корпоративный прокси с подменой TLS). - Для публичного коммерческого wildcard от известного УЦ обычно **дополнительных действий на агентах не нужно**. @@ -299,7 +299,7 @@ curl -sS https://sac.example.com/health | jq . ```bash sudo cp deploy/nginx/sac.conf.example /etc/nginx/sites-available/sac # ... nginx -t, reload, затем: -sudo certbot --nginx -d sac.example.com +sudo certbot --nginx -d sac.kalinamall.ru ``` --- @@ -317,7 +317,7 @@ ls -la dist/index.html sudo systemctl restart sac-api ``` -В `config/sac-api.env` задайте `SAC_ADMIN_PASSWORD`, затем откройте `https://sac.example.com/` (логин `SAC_ADMIN_USERNAME`, по умолчанию `admin`). +В `config/sac-api.env` задайте `SAC_ADMIN_PASSWORD`, затем откройте `https://sac.kalinamall.ru/` (логин `SAC_ADMIN_USERNAME`, по умолчанию `admin`). После обновления с multi-user (миграция `009_sac_users`): выполните `alembic upgrade head` в каталоге `backend/`. При первом старте API создаст пользователя **admin** из `SAC_ADMIN_*`, если таблица `sac_users` пуста. @@ -343,7 +343,7 @@ curl -sS http://127.0.0.1:8000/health | jq . Через nginx (после TLS): ```bash -curl -sS https://sac.example.com/health | jq . +curl -sS https://sac.kalinamall.ru/health | jq . ``` Тест ingest (подставьте `SAC_BOOTSTRAP_API_KEY`): diff --git a/docs/install-ubuntu-24.04.md b/docs/install-ubuntu-24.04.md index 6dcb39e..23a7bcb 100644 --- a/docs/install-ubuntu-24.04.md +++ b/docs/install-ubuntu-24.04.md @@ -14,7 +14,7 @@ ```bash # см. полный чеклист в native-руководстве sudo apt update && sudo apt install -y git postgresql nginx python3.12 python3.12-venv -sudo git clone https://github.com/PTah/security-alert-center.git /opt/security-alert-center +sudo git clone https://git.kalinamall.ru/PapaTramp/security-alert-center.git /opt/security-alert-center # … PostgreSQL, venv, config/sac-api.env, systemd, nginx ``` diff --git a/docs/operations-prod-status.md b/docs/operations-prod-status.md index 4a5571b..35b2893 100644 --- a/docs/operations-prod-status.md +++ b/docs/operations-prod-status.md @@ -1,8 +1,8 @@ -# SAC production — пример статуса развёртывания +# SAC production — текущий статус (KalinaMall) Ориентир для продолжения работ. Обновляйте при смене этапа. -**Сервер:** Ubuntu 24.04, FQDN `sac.example.com` +**Сервер:** Ubuntu 24.04, FQDN `sac.kalinamall.ru` **Каталог:** `/opt/security-alert-center` **Пользователь сервиса:** `sac` (git, venv, npm — только от него) **Конфиг:** `/opt/security-alert-center/config/sac-api.env` @@ -39,7 +39,7 @@ sudo /opt/sac-deploy.sh | Параметр | Значение | |----------|----------| | Хост | `ubabuba` / `10.10.36.9` | -| Репозиторий | `github.com/PTah/ssh-monitor` (`main`, есть `sac-client.sh`) | +| Репозиторий | `git.kalinamall.ru/PapaTramp/ssh-monitor` (`main`, есть `sac-client.sh`) | | `UseSAC` | пилот **exclusive** — см. [pilot-2.1-exclusive.md](pilot-2.1-exclusive.md) | | Сервис | `ssh-monitor.service` — **active** | | `--check-sac` | OK (health + ingest `agent.test` 202) | diff --git a/docs/pilot-2.1-exclusive.md b/docs/pilot-2.1-exclusive.md index fbf0867..c968162 100644 --- a/docs/pilot-2.1-exclusive.md +++ b/docs/pilot-2.1-exclusive.md @@ -17,7 +17,7 @@ sudo /opt/scripts/update_ssh_monitor.sh ```ini UseSAC=exclusive -SAC_URL=https://sac.example.com +SAC_URL=https://sac.kalinamall.ru SAC_API_KEY=sac_xxxxxxxx SAC_TLS_SKIP_VERIFY=0 SAC_SPOOL_DIR=/var/lib/ssh-monitor/sac-spool diff --git a/docs/roadmap.md b/docs/roadmap.md index bc6d387..c13bd13 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -66,7 +66,7 @@ **Цель:** нативный Android-клиент и push по тем же правилам оповещений, что Telegram/email/webhook. -Репозиторий клиента: [seaca](https://github.com/PTah/seaca) (Kotlin, Jetpack Compose, FCM). +Репозиторий клиента: [seaca](https://git.kalinamall.ru/PapaTramp/seaca) (Kotlin, Jetpack Compose, FCM). **Сервер SAC:** @@ -77,7 +77,7 @@ **Не в мобильном клиенте:** пользователи SAC, каналы Telegram/SMTP/webhook, админ-настройки. -Подробный план клиента — [seaca/docs/ROADMAP.md](https://github.com/PTah/seaca/blob/main/docs/ROADMAP.md). +Подробный план клиента — [seaca/docs/ROADMAP.md](https://git.kalinamall.ru/PapaTramp/seaca/src/branch/main/docs/ROADMAP.md). --- @@ -109,7 +109,7 @@ | v0.1 | — (не требуется) | — | | v0.2 | TBD (тег с UseSAC) | TBD | | v0.3+ | совместимость schema 1.0 | совместимость schema 1.0 | -| v0.6 | — | — (мобильный клиент [seaca](https://github.com/PTah/seaca), не агент) | +| v0.6 | — | — (мобильный клиент [seaca](https://git.kalinamall.ru/PapaTramp/seaca), не агент) | При breaking change схемы — `schema_version: 1.1` с поддержкой 1.0 на ingest. diff --git a/docs/runbook-ops.md b/docs/runbook-ops.md index 2437ffe..92e70db 100644 --- a/docs/runbook-ops.md +++ b/docs/runbook-ops.md @@ -1,6 +1,6 @@ # Runbook: эксплуатация SAC -Краткие процедуры для prod (`sac.example.com`, native install в `/opt/security-alert-center`). +Краткие процедуры для prod (`sac.kalinamall.ru`, native install в `/opt/security-alert-center`). ## Деплой приложения @@ -13,7 +13,7 @@ sudo /opt/sac-deploy.sh Проверка: ```bash -curl -sS https://sac.example.com/health | jq . +curl -sS https://sac.kalinamall.ru/health | jq . ``` Ожидается `status: ok`, `database: ok`. При устаревших heartbeat агентов — `status: degraded`, поле `hosts_stale` > 0. @@ -101,4 +101,4 @@ sudo -u sac bash -lc 'cd /opt/security-alert-center/backend && .venv/bin/python **Устаревший heartbeat** — увеличить `SAC_HEARTBEAT_STALE_MINUTES` или проверить `agent.heartbeat` на хосте. -**Чужой Host на IP SAC (форма SAC на ext.example.com)** — в nginx только `server_name sac.example.com`; default_server → 444 / `ssl_reject_handshake`. Обновить конфиг из `deploy/nginx/sac.conf.tls.example`, `sudo nginx -t && sudo systemctl reload nginx`. HAProxy на этом не решается — правка на **** (nginx SAC). +**Чужой Host на IP SAC (форма SAC на ext.kalinamall.ru)** — в nginx только `server_name sac.kalinamall.ru`; default_server → 444 / `ssl_reject_handshake`. Обновить конфиг из `deploy/nginx/sac.conf.tls.example`, `sudo nginx -t && sudo systemctl reload nginx`. HAProxy на этом не решается — правка на **192.168.160.145** (nginx SAC). diff --git a/docs/seaca-mobile.md b/docs/seaca-mobile.md index 0a4f06e..33bbc6c 100644 --- a/docs/seaca-mobile.md +++ b/docs/seaca-mobile.md @@ -1,6 +1,6 @@ # Seaca — мобильный клиент SAC -Репозиторий приложения: [seaca](https://github.com/PTah/seaca). +Репозиторий приложения: [seaca](https://git.kalinamall.ru/PapaTramp/seaca). Требуется SAC **≥ 0.9.0** с применённой миграцией `014`. --- @@ -40,7 +40,7 @@ | Способ входа | **Логин и пароль + код** — в приложении нужны учётные данные SAC; **Только код** — пароль не нужен, пользователь должен быть выбран в форме | | Срок (часов) | Код перестаёт принимать **новые** привязки; уже подключённые телефоны не отключаются | -Код показывается **один раз** после «Выдать код». Передайте оператору: URL сервера (**`https://sac-api.example.com`** для Seaca; веб-админка — `https://sac.example.com`), код `sacmob_…`, при режиме password — логин/пароль SAC. +Код показывается **один раз** после «Выдать код». Передайте оператору: URL сервера (**`https://sac-api.kalinamall.ru`** для Seaca; веб-админка — `https://sac.kalinamall.ru`), код `sacmob_…`, при режиме password — логин/пароль SAC. ### Подключённые устройства @@ -81,10 +81,10 @@ SAC_FCM_SERVICE_ACCOUNT_JSON=/etc/security-alert-center/fcm-service-account.json | Hostname | Clients | IP allowlist | |----------|---------|--------------| -| `sac.example.com` | Web UI | yes (`git-sac-allowed`) | -| `sac-api.example.com` | Seaca, `/api/v1/mobile/*` | no (enroll + JWT) | +| `sac.kalinamall.ru` | Web UI | yes (`git-sac-allowed`) | +| `sac-api.kalinamall.ru` | Seaca, `/api/v1/mobile/*` | no (enroll + JWT) | -Both resolve to the same SAC server (****). nginx must accept both names in `server_name`. See [reverse-proxy/docs/sac-access.md](https://github.com/PTah/reverse-proxy/blob/main/docs/sac-access.md). +Both resolve to the same SAC server (**192.168.160.145**). nginx must accept both names in `server_name`. See [reverse-proxy/docs/sac-access.md](https://git.kalinamall.ru/PapaTramp/reverse-proxy/src/branch/main/docs/sac-access.md). --- diff --git a/docs/ssl-certificate.md b/docs/ssl-certificate.md index 98199d1..749a312 100644 --- a/docs/ssl-certificate.md +++ b/docs/ssl-certificate.md @@ -1,6 +1,6 @@ # TLS-сертификат для SAC (wildcard VeriSign / DigiCert) -Куда положить файлы, в каком формате, как скопировать на сервер `sac.example.com`. +Куда положить файлы, в каком формате, как скопировать на сервер `sac.kalinamall.ru`. Связано: [install-ubuntu-24.04-native.md](install-ubuntu-24.04-native.md) §9, шаблон `deploy/nginx/sac.conf.tls.example`. @@ -17,7 +17,7 @@ nginx читает **два PEM-файла** (текст, начинается Имена файлов можно другие, если пути совпадают с `ssl_certificate` / `ssl_certificate_key` в `/etc/nginx/sites-available/sac`. -**Покрытие имени:** в сертификате должен быть CN или SAN вида `*.example.com` (wildcard) или `sac.example.com`. +**Покрытие имени:** в сертификате должен быть CN или SAN вида `*.kalinamall.ru` (wildcard) или `sac.kalinamall.ru`. --- @@ -85,7 +85,7 @@ sudo -u www-data test -r /etc/ssl/sac/privkey.pem && echo "key OK" || echo "key Если уже есть `fullchain.pem` и `privkey.pem` на ПК: ```bash -scp fullchain.pem privkey.pem deploy@SAC_SERVER:/tmp/ +scp fullchain.pem privkey.pem papatramp@SAC_SERVER:/tmp/ ``` На сервере: @@ -103,11 +103,11 @@ sudo rm -f /tmp/fullchain.pem /tmp/privkey.pem ### 4.2. С Windows (PowerShell / pscp) -Файлы, например, в `D:\Certs\example\`: +Файлы, например, в `D:\Certs\kalinamall\`: ```powershell -scp D:\Certs\example\fullchain.pem deploy@SAC_SERVER:/tmp/ -scp D:\Certs\example\privkey.pem deploy@SAC_SERVER:/tmp/ +scp D:\Certs\kalinamall\fullchain.pem papatramp@SAC_SERVER:/tmp/ +scp D:\Certs\kalinamall\privkey.pem papatramp@SAC_SERVER:/tmp/ ``` Дальше на сервере — те же `sudo mv` и `chown`, что в §4.1. @@ -115,7 +115,7 @@ scp D:\Certs\example\privkey.pem deploy@SAC_SERVER:/tmp/ Если есть только **`wildcard.pfx`**: ```powershell -scp D:\Certs\example\wildcard.pfx deploy@SAC_SERVER:/tmp/ +scp D:\Certs\kalinamall\wildcard.pfx papatramp@SAC_SERVER:/tmp/ ``` Распаковка на **сервере** (§4.3). @@ -128,19 +128,19 @@ scp D:\Certs\example\wildcard.pfx deploy@SAC_SERVER:/tmp/ mkdir -p /tmp/certs # один файл -scp user@certs-host.example.com:/path/to/wildcard_example_com.pfx /tmp/certs/ +scp user@certs-host.example.com:/path/to/wildcard_kalinamall_ru.pfx /tmp/certs/ # несколько файлов scp user@certs-host:/path/to/fullchain.pem user@certs-host:/path/to/privkey.pem /tmp/certs/ # нестандартный SSH-порт (у scp заглавная P) -scp -P 2222 user@certs-host:/path/to/wildcard_example_com.pfx /tmp/certs/ +scp -P 2222 user@certs-host:/path/to/wildcard_kalinamall_ru.pfx /tmp/certs/ ``` С другого сервера **отдать** на SAC (push — команда на сервере-источнике): ```bash -scp /path/to/wildcard_example_com.pfx deploy@:/tmp/certs/ +scp /path/to/wildcard_kalinamall_ru.pfx papatramp@:/tmp/certs/ ``` Нужен SSH-доступ и право **читать** файл на источнике. @@ -162,13 +162,13 @@ sudo mkdir -p /tmp/certs cd /tmp/certs # замените имя PFX; Enter Import Password: — пароль от PFX (не sudo) -sudo openssl pkcs12 -legacy -in wildcard_example_com.pfx -nocerts -nodes \ +sudo openssl pkcs12 -legacy -in wildcard_kalinamall_ru.pfx -nocerts -nodes \ -out privkey.pem -sudo openssl pkcs12 -legacy -in wildcard_example_com.pfx -clcerts -nokeys \ +sudo openssl pkcs12 -legacy -in wildcard_kalinamall_ru.pfx -clcerts -nokeys \ -out server.crt -sudo openssl pkcs12 -legacy -in wildcard_example_com.pfx -cacerts -nokeys \ +sudo openssl pkcs12 -legacy -in wildcard_kalinamall_ru.pfx -cacerts -nokeys \ -out ca-chain.crt # fullchain = сервер + промежуточные (порядок важен) @@ -183,20 +183,20 @@ sudo chmod 750 /etc/ssl/sac # очистка временных файлов sudo shred -u server.crt ca-chain.crt privkey.pem 2>/dev/null -sudo rm -f /tmp/certs/wildcard_example_com.pfx +sudo rm -f /tmp/certs/wildcard_kalinamall_ru.pfx ``` Если `-legacy` недостаточно: ```bash sudo openssl pkcs12 -provider legacy -provider default \ - -in wildcard_example_com.pfx -nocerts -nodes -out privkey.pem + -in wildcard_kalinamall_ru.pfx -nocerts -nodes -out privkey.pem ``` Проверить содержимое PFX: ```bash -sudo openssl pkcs12 -legacy -in wildcard_example_com.pfx -info -noout +sudo openssl pkcs12 -legacy -in wildcard_kalinamall_ru.pfx -info -noout ``` Пароль PFX вводится интерактивно (`Enter Import Password`). **Не** коммитьте PFX и ключ в git. @@ -207,13 +207,13 @@ sudo openssl pkcs12 -legacy -in wildcard_example_com.pfx -info -noout Типичный набор от VeriSign / DigiCert: -- `star_example_com.crt` — ваш wildcard +- `star_kalinamall_ru.crt` — ваш wildcard - `DigiCertCA.crt` / `intermediate.crt` — промежуточный - (иногда) `TrustedRoot.crt` — корневой **не** добавляйте в fullchain для nginx ```bash # на ПК или на сервере, в каталоге с исходниками: -cat star_example_com.crt intermediate.crt > fullchain.pem +cat star_kalinamall_ru.crt intermediate.crt > fullchain.pem # ключ переименовать: cp private.key privkey.pem ``` @@ -269,13 +269,13 @@ ssl_certificate_key /etc/ssl/sac/privkey.pem; sudo ln -sf /etc/nginx/sites-available/sac /etc/nginx/sites-enabled/sac sudo nginx -t sudo systemctl reload nginx -curl -sS https://sac.example.com/health | jq . +curl -sS https://sac.kalinamall.ru/health | jq . ``` В приложении SAC (`/opt/security-alert-center/config/sac-api.env`): ```ini -SAC_PUBLIC_URL=https://sac.example.com +SAC_PUBLIC_URL=https://sac.kalinamall.ru ``` --- diff --git a/docs/testing-e2e-checklist.md b/docs/testing-e2e-checklist.md index 5f0bbb7..eeff8ed 100644 --- a/docs/testing-e2e-checklist.md +++ b/docs/testing-e2e-checklist.md @@ -45,7 +45,7 @@ ```bash API_KEY="sac_…" -BASE="https://sac.example.com" +BASE="https://sac.kalinamall.ru" # warning → должен уйти в TG при min=warning curl -sS -X POST "$BASE/api/v1/events" \ diff --git a/docs/work-plan.md b/docs/work-plan.md index caac5ea..1683122 100644 --- a/docs/work-plan.md +++ b/docs/work-plan.md @@ -9,7 +9,7 @@ | # | Задача | Статус | |---|--------|--------| | 0.1–0.3 | ТЗ, архитектура, схема, deployment | ✅ | -| 0.5 | Репозиторий GitHub + prod deployment | ✅ | +| 0.5 | Репозиторий GitHub + зеркало kalinamall | ✅ | | 0.6 | Multi-root workspace | ✅ | --- @@ -37,7 +37,7 @@ |---|--------|--------| | 1B.1 | Scaffold backend FastAPI | ✅ | | 1B.2 | PostgreSQL + Alembic (hosts, events, api_keys) | ✅ | -| 1B.3 | `POST /api/v1/events`, `GET /health` | ✅ prod `sac.example.com` | +| 1B.3 | `POST /api/v1/events`, `GET /health` | ✅ prod `sac.kalinamall.ru` | | 1B.4 | systemd + nginx + TLS | ✅ | | 1B.5 | Валидация JSON Schema v1 | ✅ | @@ -90,7 +90,7 @@ - [x] `d2-1` UI Problems: список, фильтры, `Ack/Resolve`, карточка с таймлайном - [x] `d2-2` Dashboard: top hosts/types, `open vs resolved 24h`, drill-down - [x] `d2-3` Ops: retention, health checks, runbook backup/restore/deploy -- [x] `dod` DoD: нет дублей `event_id`, Problems e2e, 3 правила, UI MVP, docs, push в prod +- [x] `dod` DoD: нет дублей `event_id`, Problems e2e, 3 правила, UI MVP, docs, push в kalinamall ### Отображение хостов (`display_name`, как `SERVER_DISPLAY_NAME` у ssh) @@ -122,7 +122,7 @@ - [x] `14:30–16:00` Dashboard: `open/resolved 24h` + drill-down - [x] `16:00–17:00` retention job (`events 30–90d`, `problems 180d+`) - [x] `17:00–18:00` health checks (DB/worker/heartbeat stale) -- [x] `18:00–19:00` runbook + финальный push в prod + freeze dev +- [x] `18:00–19:00` runbook + финальный push в kalinamall + freeze dev ### Неделя после freeze (только тестирование) diff --git a/docs/workspace-three-repos.md b/docs/workspace-three-repos.md index c271d71..517d424 100644 --- a/docs/workspace-three-repos.md +++ b/docs/workspace-three-repos.md @@ -6,22 +6,26 @@ ## 1. Расположение репозиториев (пример) -| Имя в workspace | Публичный remote | -|-----------------|------------------| -| `ssh-monitor` | github.com/PTah/ssh-monitor | -| `rdp-monitor` | github.com/PTah/RDP-login-monitor | -| `security-alert-center` | github.com/PTah/security-alert-center | +| Имя в workspace | Путь (пример Windows) | Remote | +|-----------------|----------------------|--------| +| `ssh-monitor` | `D:\Soft\Git\ssh-monitor` | git.kalinamall.ru/PapaTramp/ssh-monitor | +| `rdp-monitor` | `D:\Soft\Git\RDP-login-monitor` | git.kalinamall.ru/PapaTramp/RDP-login-monitor | +| `security-alert-center` | `D:\Soft\Git\security-alert-center` | git.kalinamall.ru/PapaTramp/security-alert-center | + +Пути подставьте свои. --- ## 2. Файл workspace +Создайте `security-monitors.code-workspace`: + ```json { "folders": [ - { "path": "ssh-monitor", "name": "ssh-monitor" }, - { "path": "RDP-login-monitor", "name": "rdp-monitor" }, - { "path": "security-alert-center", "name": "security-alert-center" } + { "path": "D:/Soft/Git/ssh-monitor", "name": "ssh-monitor" }, + { "path": "D:/Soft/Git/RDP-login-monitor", "name": "rdp-monitor" }, + { "path": "D:/Soft/Git/security-alert-center", "name": "security-alert-center" } ], "settings": { "files.eol": "\n" @@ -29,22 +33,44 @@ } ``` +Открыть: **File → Open Workspace from File**. + --- -## 3. Соглашения +## 3. Порядок работ по фазам + +| Фаза | Где править | +|------|-------------| +| 0 — ТЗ | `security-alert-center/docs/` | +| 1 — MVP SAC | `security-alert-center/backend`, `frontend` | +| 2 — UseSAC | `ssh-monitor`, `RDP-login-monitor` + мелкие правки SAC при необходимости | + +--- + +## 4. Соглашения - Контракт событий: `security-alert-center/schemas/event-schema-v1.json` — **единственный источник истины**. - Изменение схемы → обновить ТЗ + версию `schema_version` + оба агента. -- Коммиты в три репо **раздельные**; связь через теги/версии в README. +- Коммиты в три репо **раздельные**; связь через теги/версии в README (см. [roadmap.md](roadmap.md)). ```bash -git clone https://github.com/PTah/security-alert-center.git -git clone https://github.com/PTah/ssh-monitor.git -git clone https://github.com/PTah/RDP-login-monitor.git +git add … +git commit -m "…" +git push kalinamall main ``` --- +## 5. URL репозиториев + +| Проект | URL | +|--------|-----| +| security-alert-center | `https://git.kalinamall.ru/PapaTramp/security-alert-center.git` | +| ssh-monitor | `https://git.kalinamall.ru/PapaTramp/ssh-monitor.git` | +| RDP-login-monitor | `https://git.kalinamall.ru/PapaTramp/RDP-login-monitor.git` | + +--- + ## См. также -- [work-plan.md](work-plan.md) +- [work-plan.md](work-plan.md) фаза 0.6 diff --git a/schemas/event-schema-v1.json b/schemas/event-schema-v1.json index f22278c..d2b779d 100644 --- a/schemas/event-schema-v1.json +++ b/schemas/event-schema-v1.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/PTah/security-alert-center/schemas/event-v1.json", + "$id": "https://git.kalinamall.ru/PapaTramp/security-alert-center/schemas/event-v1.json", "title": "Security Alert Center Event v1", "description": "Каноническое событие от ssh-monitor или RDP-login-monitor", "type": "object",