diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2056b55 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.metadata.json diff --git a/AI_AGENT_PLAYBOOK.md b/AI_AGENT_PLAYBOOK.md index 46ab3c5..6979953 100644 --- a/AI_AGENT_PLAYBOOK.md +++ b/AI_AGENT_PLAYBOOK.md @@ -37,7 +37,7 @@ ## 🗺️ Архитектурная карта и взаимосвязи проектов -Инфраструктура состоит из 4 взаимосвязанных блоков: +Инфраструктура состоит из взаимосвязанных блоков: ```mermaid graph TD @@ -45,12 +45,17 @@ graph TD Web -->|"Интеграция ящиков (?mailbox=)"| MG["MailGuard SOC (172.16.8.151)"] Web -->|"Телеметрия & AD"| DC["Active Directory (172.16.8.9 / 19)"] + Mon["Сервер Мониторинга (172.16.8.150)"] -->|"Zabbix / Prometheus"| Web + Mon -->|"Телеметрия"| MG + Mon -->|"Метрики узлов"| KVM["Гипервизоры KVM (172.16.15.1/3/4)"] + Mon -->|"Алерты Webhook"| Syno["Synology NFS (172.16.11.133)"] + TG["Telegram Чат (KSP INFO)"] --> Bot["ChatOps Bot (172.16.8.8)"] Bot -->|"Триггер шаблонов"| Sem["Ansible Semaphore (172.16.8.8:3000)"] Sem -->|"Запуск плейбуков"| Playbooks["Ansible Core (172.16.8.8)"] Playbooks -->|"Динамический запрос паролей"| Vault["HashiCorp Vault (172.16.8.8:8200)"] - Playbooks -->|"Аудит & Бэкапы"| KVM["Гипервизоры KVM (172.16.15.1)"] + Playbooks -->|"Аудит & Бэкапы"| KVM Playbooks -->|"Дампы mysqldump"| DB["Кластер MySQL (192.168.220.x)"] Playbooks -->|"Аудит безопасности"| DC ``` @@ -68,7 +73,7 @@ export VAULT_TOKEN="<ВАШ_РООТ_ТОКЕН_VAULT>" ``` ### Шаг 2: Извлечение мастер-ключа SSH (Рекомендуется для беспарольного доступа) -В Vault хранится закрытый ключ Ed25519, публичная часть которого прописана в `/root/.ssh/authorized_keys` на серверах: +В Vault хранится закрытый ключ Ed25519, публичная часть которого прописана в `/root/.ssh/authorized_keys` на всех серверах: ```bash # Получить закрытый ключ SSH и настроить окружение: mkdir -p ~/.ssh && chmod 700 ~/.ssh @@ -76,9 +81,10 @@ curl -s -H "X-Vault-Token: $VAULT_TOKEN" "$VAULT_ADDR/v1/servers/data/master-ssh | python3 -c "import sys, json; print(json.load(sys.stdin)['data']['data']['private_key'])" > ~/.ssh/id_ed25519 chmod 600 ~/.ssh/id_ed25519 -# Подключение к любому серверу по SSH без запроса пароля: -ssh root@172.16.8.8 # Сервер автоматизации и Gitea +# Подключение к серверам по SSH без запроса пароля: +ssh root@172.16.8.8 # Сервер автоматизации, Gitea, Vault ssh root@172.16.8.151 # Почтовый архив MailGuard +ssh root@172.16.8.150 # Сервер мониторинга (Zabbix/Grafana/Prometheus) ``` ### Шаг 3: Получение root-паролей серверов из Vault @@ -92,50 +98,60 @@ curl -s -H "X-Vault-Token: $VAULT_TOKEN" "$VAULT_ADDR/v1/servers/data/server-8-8 curl -s -H "X-Vault-Token: $VAULT_TOKEN" "$VAULT_ADDR/v1/servers/data/server-151" \ | python3 -c "import sys, json; print(json.load(sys.stdin)['data']['data']['password'])" -# 3. KVM гипервизор vm-host01 (172.16.15.1): +# 3. Сервер 172.16.8.150 (Zabbix, Grafana, Prometheus, Portainer): +curl -s -H "X-Vault-Token: $VAULT_TOKEN" "$VAULT_ADDR/v1/servers/data/server-150" \ + | python3 -c "import sys, json; print(json.load(sys.stdin)['data']['data']['password'])" + +# 4. KVM гипервизор vm-host01 (172.16.15.1): curl -s -H "X-Vault-Token: $VAULT_TOKEN" "$VAULT_ADDR/v1/servers/data/vm-host01" \ | python3 -c "import sys, json; print(json.load(sys.stdin)['data']['data']['password'])" -# 4. Серверы баз данных MySQL: +# 5. Серверы баз данных MySQL: curl -s -H "X-Vault-Token: $VAULT_TOKEN" "$VAULT_ADDR/v1/servers/data/mysql-main" \ | python3 -c "import sys, json; d=json.load(sys.stdin)['data']['data']; print('SSH:', d['ssh_password'], 'DB:', d['db_password'])" ``` --- +## 📂 Справочник проектов и расположение на серверах + ### 1. `KSP-Steel/Infosystem` (Портал предприятия) - **Сервер**: `172.16.8.75` (Proxmox LXC, папка `/opt/infosystem`) - **Стек**: Vue 3 (Composition API, TypeScript, Tailwind CSS, Pinia, Lucide icons), FastAPI (Python 3.11), MySQL (порт 3307), Nginx. - **Особенности**: - `v2/frontend`: Современный SPA-интерфейс предприятия. - - Поддержка быстрого перехода в почтовый архив MailGuard: вызов `resolveMailboxEmail()`, который транслирует внутренние адреса леса домена (`@network.bkv-pvl.kz`) в реальные внешние ящики (`@ksp-steel.kz`), отображая визуально правильный email сотрудника. + - Поддержка быстрого перехода в почтовый архив MailGuard: вызов `resolveMailboxEmail()`. ### 2. `KSP-Steel/mailguard` (Почтовый архив ИБ) - **Сервер**: `172.16.8.151` (папка `/opt/mailguard`) - **Стек**: Python 3 worker/ingestion, Meilisearch (полнотекстовый поиск), PostgreSQL, Nginx, Docker. - **Особенности**: - Индексирует 700 000+ входящих и исходящих писем завода. - - Deep-link механизм: переход по `#mailboxes?mailbox=` автоматически подставляет email в поле поиска, раскрывает буквенную ветку сотрудника в алфавитном дереве и открывает досье переписки справа. + - Deep-link механизм: переход по `#mailboxes?mailbox=` автоматически фильтрует дерево и открывает переписку. -### 3. `KSP-Steel/ansible` (Автоматизация и ChatOps) +### 3. `KSP-Steel/monitoring` (Центральный мониторинг и телеметрия) +- **Сервер**: `172.16.8.150` (репозиторий в `/opt/monitoring-repo`, боевые папки `/opt/zabbix-docker`, `/opt/monitor`, `/opt/loki`) +- **Стек**: Zabbix 7.0 (PostgreSQL 16), Prometheus, Grafana, Grafana Loki, Portainer CE, Alert Bridge. +- **Особенности**: + - Zabbix Web на порту 80, Grafana на 3000, Prometheus на 9090, Portainer на 8000/9443. + - Микросервис `grafana-alert-bridge` (порт 9095) принимает алерты от Grafana по вебхуку и складывает журнал в Synology NAS (`/mnt/synology_infosec/log/01_grafana_errors/server-errors.log`). + - Автоматический скрипт резервного копирования: `/opt/monitoring-repo/scripts/backup_monitoring.sh` (в cron каждую ночь в 03:30). + +### 4. `KSP-Steel/ansible` (Автоматизация и ChatOps) - **Сервер**: `172.16.8.8` (папка `/opt/ansible/playbooks`) - **Стек**: Ansible Core 2.15+, Semaphore UI (порт 3000), Python Telegram Bot (`semaphore-bot.service`). - **Особенности**: - - Плейбуки для аудита безопасности AD (`ad_security_and_health.yaml`), создания учетных записей (`ad_exim_user_onboarding.yaml`), сброса паролей (`ad_user_password_reset.yaml`), мониторинга гипервизора (`vm-host01_health_check.yaml`), дампов MySQL (`mysql_audit_and_dump.yaml`). - - Все учетные данные подтягиваются на лету из Vault через lookup-плагин: - `{{ lookup('community.hashi_vault.hashi_vault', 'secret=servers/data/...:password') }}` + - Плейбуки для аудита безопасности AD, онбординга сотрудников, сброса паролей, мониторинга гипервизоров, дампов MySQL. + - Все секреты запрашиваются динамически из Vault через `community.hashi_vault.hashi_vault`. -### 4. `KSP-Steel/hashicorp-vault` (Хранилище секретов) +### 5. `KSP-Steel/hashicorp-vault` (Хранилище секретов) - **Сервер**: `172.16.8.8` (папка `/opt/infra`) -- **Стек**: HashiCorp Vault (`hashicorp/vault:latest`), Gitea, PostgreSQL, Docker Compose. +- **Стек**: HashiCorp Vault, Gitea, PostgreSQL, Docker Compose. - **Особенности**: - Точка входа: `http://172.16.8.8:8200` - Распечатка (Unseal): `/opt/infra/scripts/unseal_vault.sh` - Резервное копирование: `/opt/infra/scripts/backup_vault.sh` - - Движок `servers/` (KV v2): - - `servers/data/vm-host01` — пароль гипервизора - - `servers/data/mysql-main` — пароли основных MySQL - - `servers/data/mysql-special` — пароли спец-серверов MySQL + - Движок `servers/` (KV v2): `server-8-8`, `server-151`, `server-150`, `vm-host01`, `mysql-main`, `mysql-special`, `master-ssh-key`. --- diff --git a/AI_AGENT_PLAYBOOK.md.metadata.json b/AI_AGENT_PLAYBOOK.md.metadata.json deleted file mode 100644 index 8ae730b..0000000 --- a/AI_AGENT_PLAYBOOK.md.metadata.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "summary": "AI Agent Operational Playbook and Safety Protocol", - "updatedAt": "2026-09-28T10:42:09.419989309Z" -} \ No newline at end of file diff --git a/DISASTER_RECOVERY.md b/DISASTER_RECOVERY.md index 43cac35..d71ca4d 100644 --- a/DISASTER_RECOVERY.md +++ b/DISASTER_RECOVERY.md @@ -84,3 +84,36 @@ docker compose down docker compose up -d --build ``` Проверка работоспособности: `curl -I http://127.0.0.1:8090/` + +--- + +## 5. Стек мониторинга и телеметрии (`172.16.8.150`) + +### Сценарий А: Перезапуск компонентов +На сервере подготовлен скрипт управления: +```bash +ssh root@172.16.8.150 "/opt/monitoring-repo/scripts/restart_services.sh all" + +# Либо по отдельности: +/opt/monitoring-repo/scripts/restart_services.sh zabbix +/opt/monitoring-repo/scripts/restart_services.sh prometheus +/opt/monitoring-repo/scripts/restart_services.sh grafana +/opt/monitoring-repo/scripts/restart_services.sh bridge +/opt/monitoring-repo/scripts/restart_services.sh loki +``` + +### Сценарий Б: Восстановление из бэкапов на Synology +Все бэкапы сохраняются на NAS Synology в `/mnt/synology_infosec/backups/monitoring//`. +1. **Восстановление БД Zabbix (PostgreSQL)**: + ```bash + gunzip < /mnt/synology_infosec/backups/monitoring//zabbix_db_.sql.gz \ + | docker exec -i zabbix-postgres psql -U zabbix zabbix + ``` +2. **Восстановление конфигураций (Prometheus, Grafana, Alert Bridge, Loki)**: + ```bash + tar -xzf /mnt/synology_infosec/backups/monitoring//monitoring_configs_.tar.gz -C /opt/ + ``` +3. **Ручной запуск бэкапа**: + ```bash + /opt/monitoring-repo/scripts/backup_monitoring.sh + ``` diff --git a/DISASTER_RECOVERY.md.metadata.json b/DISASTER_RECOVERY.md.metadata.json deleted file mode 100644 index 921950a..0000000 --- a/DISASTER_RECOVERY.md.metadata.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "summary": "Disaster Recovery and Backup Procedures", - "updatedAt": "2026-09-28T10:44:14.990392137Z" -} \ No newline at end of file diff --git a/NETWORK_TOPOLOGY.md b/NETWORK_TOPOLOGY.md index c265b98..284e85a 100644 --- a/NETWORK_TOPOLOGY.md +++ b/NETWORK_TOPOLOGY.md @@ -9,22 +9,35 @@ | ПОДСЕТЬ УПРАВЛЕНИЯ И СЕРВИСОВ: 172.16.8.0/24 | | - 172.16.8.8 : InfosystemLocal (Gitea, HashiCorp Vault, Semaphore, ChatOps Bot)| | - 172.16.8.75 : infosystem-2 (Инфосистема 2.0, FastAPI, Vue 3, PerCo, MySQL) | +| - 172.16.8.150 : monitor-server (Zabbix 7.0, Grafana, Prometheus, Loki, Portainer)| | - 172.16.8.151 : mailguard (Почтовый архив SOC MailGuard, Exim, Meilisearch) | | - 172.16.8.9 : dc1 (Основной контроллер домена Active Directory, DNS, Kerberos)| -| - 172.16.8.19 : dc2 (Резервный контроллер домена Active Directory, DNS) | +| - 172.16.8.19 : dc2 (Резервный контроллер домена Active Directory, DNS, WMI) | | - 172.16.8.37 : db-corp-web (MySQL сервер корпоративных веб-сервисов) | | - 172.16.8.25 : db-it-ops (MySQL сервер ИТ-мониторинга и регламентов) | +| - 172.16.8.43 : infosystem-legacy (Устаревший хост Инфосистемы) | +| - 172.16.8.40 : local-web (Локальный веб-сервер) | +| - 172.16.8.23 : wiki-doc (Корпоративная база знаний Wiki/Docs) | +| - 172.16.8.4 : exim-local (Локальный почтовый узел Exim) | +-----------------------------------------------------------------------------------+ | +-----------------------------------------------------------------------------------+ | ПОДСЕТЬ СЕРВЕРОВ ВИРТУАЛИЗАЦИИ: 172.16.15.0/24 | | - 172.16.15.1 : vm-host01 (KVM/QEMU хост виртуализации, libvirt, ZFS storage) | +| - 172.16.15.3 : VM_Host03 (KVM гипервизор, smartctl мониторинг хранилища) | +| - 172.16.15.4 : vm-host04 (KVM гипервизор производственных систем) | +-----------------------------------------------------------------------------------+ | +-----------------------------------------------------------------------------------+ | ИЗОЛИРОВАННАЯ ПОДСЕТЬ DMZ / CLOUD: 192.168.220.0/24 | +| - 192.168.220.3 : exim-corp (Внешний корпоративный почтовый шлюз Exim) | | - 192.168.220.103 : db-dmz-mail-ftp (MySQL почтового шлюза и передачи файлов) | | - 192.168.220.22 : db-cloud-dns (MySQL DNS и внешних облачных сервисов) | ++-----------------------------------------------------------------------------------+ + | ++-----------------------------------------------------------------------------------+ +| СЕТЕВОЕ ХРАНИЛИЩЕ БЭКАПОВ И АРХИВОВ: 172.16.11.0/24 | +| - 172.16.11.133: Synology NAS (/volume4/INFOSEC -> /mnt/synology_infosec) | +-----------------------------------------------------------------------------------+ ``` @@ -35,13 +48,16 @@ | Имя хоста | IP-адрес | Роль / Назначение | ОС / Стек | Порты | Путь к секрету в HashiCorp Vault | | :--- | :--- | :--- | :--- | :--- | :--- | | **InfosystemLocal** | `172.16.8.8` | Gitea, HashiCorp Vault, Semaphore, Telegram Bot | Debian 12 (Linux 6.17 PVE) | `22` (SSH)
`80` (Gitea)
`8200` (Vault)
`3000` (Semaphore) | `servers/data/server-8-8` | +| **monitor-server** | `172.16.8.150` | Центральный сервер мониторинга и телеметрии | Ubuntu 25.04 (Docker) | `22` (SSH)
`80` (Zabbix)
`3000` (Grafana)
`3100` (Loki)
`8000/9443` (Portainer)
`9090` (Prometheus)
`9095` (Alert Bridge)
`10051` (Zabbix Core) | `servers/data/server-150` | | **mailguard** | `172.16.8.151` | Архив корпоративной почты ИБ | Debian 12 (Docker) | `22` (SSH)
`80` (Web UI)
`2525` (Ingestion) | `servers/data/server-151` | | **infosystem-2** | `172.16.8.75` | Портал предприятия Инфосистема 2.0 | Proxmox LXC (Docker) | `22` (SSH)
`8090` (Web)
`8091` (API)
`3307` (MySQL) | `servers/data/server-75` | -| **vm-host01** | `172.16.15.1` | Физический гипервизор KVM | Linux KVM / QEMU | `22` (SSH) | `servers/data/vm-host01` | +| **vm-host01** | `172.16.15.1` | Физический гипервизор KVM | Linux KVM / QEMU | `22` (SSH), `9100` (Node Exp) | `servers/data/vm-host01` | +| **VM_Host03** | `172.16.15.3` | Физический гипервизор KVM | Linux KVM / QEMU | `22` (SSH), `9100`, `9633` (Smartctl) | `servers/data/vm-host03` | +| **vm-host04** | `172.16.15.4` | Физический гипервизор KVM | Linux KVM / QEMU | `22` (SSH), `9100` (Node Exp) | `servers/data/vm-host04` | | **dc1** | `172.16.8.9` | Primary Domain Controller AD | Windows Server | `53, 88, 389, 445, 5985` (WinRM) | — (WinRM NTLM) | -| **dc2** | `172.16.8.19` | Secondary Domain Controller AD | Windows Server | `53, 88, 389, 445, 5985` (WinRM) | — (WinRM NTLM) | +| **dc2** | `172.16.8.19` | Secondary Domain Controller AD | Windows Server | `53, 88, 389, 445, 5985` (WinRM), `9182` | — (WinRM NTLM) | | **db-dmz-mail-ftp**| `192.168.220.103`| База данных почты и FTP | Linux / MySQL 8 | `22` (SSH), `3306` (MySQL) | `servers/data/mysql-main` | -| **db-corp-web** | `172.16.8.37` | База данных корпоративных сайтов | Linux / MySQL 8 | `22` (SSH), `3306` (MySQL) | `servers/data/mysql-main` | +| **db-corp-web** | `172.16.8.37` | База данных корпоративных сайтов | Linux / MySQL 8 | `22` (SSH), `3306` (MySQL), `9104` | `servers/data/mysql-main` | | **db-cloud-dns** | `192.168.220.22` | База данных Cloud DNS | Linux / MySQL 8 | `22` (SSH), `3306` (MySQL) | `servers/data/mysql-special` | | **db-it-ops** | `172.16.8.25` | База данных ИТ-операций | Linux / MySQL 8 | `22` (SSH), `3306` (MySQL) | `servers/data/mysql-special` | @@ -56,4 +72,4 @@ ``` ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF0rW5m6mvAg+Q9nDXCN6+H8i3w/QjyWLbGSJC3L+/Bw shelyagin_ra@KPP019011 ``` -Этот ключ прописан в `/root/.ssh/authorized_keys` на серверах инфраструктуры. +Этот ключ прописан в `/root/.ssh/authorized_keys` на всех ключевых серверах инфраструктуры (`172.16.8.8`, `172.16.8.151`, `172.16.8.150`). diff --git a/NETWORK_TOPOLOGY.md.metadata.json b/NETWORK_TOPOLOGY.md.metadata.json deleted file mode 100644 index df091f1..0000000 --- a/NETWORK_TOPOLOGY.md.metadata.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "summary": "Network Topology & Server Infrastructure Map", - "updatedAt": "2026-09-28T10:44:08.877757233Z" -} \ No newline at end of file diff --git a/README.md b/README.md index 5b5a6e7..3ea06a7 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Полный реестр физических и виртуальных серверов, IP-адресов, открытых портов, ролей и операционных систем (`172.16.8.x`, `172.16.15.x`, `192.168.220.x`). 3. 🛡️ [**Аварийное восстановление и регламент бэкапов (`DISASTER_RECOVERY.md`)**](./DISASTER_RECOVERY.md) - Инструкции по восстановлению каждого сервиса при сбоях (распечатка Vault, базы данных, образы KVM, почтовый архив). + Инструкции по восстановлению каждого сервиса при сбоях (распечатка Vault, базы данных, образы KVM, почтовый архив, мониторинг Zabbix/Grafana). --- @@ -26,6 +26,7 @@ | :--- | :--- | :--- | :--- | | [**`KSP-Steel/Infosystem`**](http://172.16.8.8/KSP-Steel/Infosystem) | Vue 3, Tailwind, FastAPI, MySQL, Docker | `172.16.8.75` | Главный корпоративный портал предприятия, телеметрия проходных PerCo, интеграция со штатом 1С и Active Directory, дашборды. | | [**`KSP-Steel/mailguard`**](http://172.16.8.8/KSP-Steel/mailguard) | Python 3, Meilisearch, PostgreSQL, Nginx, Docker | `172.16.8.151` | Платформа службы безопасности (SOC): полнотекстовый архив писем Exchange/Exim (700k+ сообщений), DLP-фильтрация, аудит рисков. | +| [**`KSP-Steel/monitoring`**](http://172.16.8.8/KSP-Steel/monitoring) | Zabbix 7.0, Grafana, Prometheus, Loki, Portainer | `172.16.8.150` | Централизованный стек мониторинга и телеметрии завода: метрики серверов, дашборды, сбор логов, алерты на Synology. | | [**`KSP-Steel/ansible`**](http://172.16.8.8/KSP-Steel/ansible) | Ansible Core, Semaphore, Python Telegram Bot, WinRM | `172.16.8.8` | Плейбуки регламентных процедур (аудит безопасности AD, онбординг, бэкапы KVM и MySQL, сброс паролей, ChatOps в Telegram). | | [**`KSP-Steel/hashicorp-vault`**](http://172.16.8.8/KSP-Steel/hashicorp-vault) | HashiCorp Vault, Gitea, PostgreSQL, Docker Compose | `172.16.8.8` | Центральное зашифрованное хранилище учетных данных и паролей серверов. Интегрировано с Ansible через lookup-плагин. | | [**`admin_ksp/Instruction`**](http://172.16.8.8/admin_ksp/Instruction) | Markdown, Mermaid | `172.16.8.8` | Настоящая центральная база знаний и инструкция для AI-агентов. | @@ -36,6 +37,10 @@ * **Git-сервер (Gitea)**: `http://172.16.8.8/` * **Хранилище секретов (Vault UI)**: `http://172.16.8.8:8200/ui` +* **Мониторинг Zabbix Web**: `http://172.16.8.150/` +* **Дашборды Grafana**: `http://172.16.8.150:3000/` +* **Метрики Prometheus**: `http://172.16.8.150:9090/` +* **Панель контейнеров Portainer**: `https://172.16.8.150:9443/` (HTTP: `:8000`) * **Панель оркестрации задач (Semaphore UI)**: `http://172.16.8.8:3000/` * **Почтовый архив ИБ (MailGuard)**: `http://172.16.8.151/` -* **Портал предприятия (Инфосистема 2.0)**: `http://172.16.8.75:8090/` (или доменное имя) +* **Портал предприятия (Инфосистема 2.0)**: `http://172.16.8.75:8090/` diff --git a/README.md.metadata.json b/README.md.metadata.json deleted file mode 100644 index 43c2467..0000000 --- a/README.md.metadata.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "summary": "Master Knowledge Base & AI Agent Guide README", - "updatedAt": "2026-09-28T10:41:57.720655921Z" -} \ No newline at end of file