{"id":31755323,"url":"https://github.com/magomedcoder/monic","last_synced_at":"2025-10-09T18:43:20.190Z","repository":{"id":316282535,"uuid":"1062552102","full_name":"magomedcoder/monic","owner":"magomedcoder","description":"Monic - лёгкая система мониторинга логов и событий","archived":false,"fork":false,"pushed_at":"2025-09-23T17:03:36.000Z","size":18,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-23T19:06:50.455Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/magomedcoder.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-23T12:08:03.000Z","updated_at":"2025-09-23T17:04:15.000Z","dependencies_parsed_at":"2025-09-25T21:30:10.898Z","dependency_job_id":null,"html_url":"https://github.com/magomedcoder/monic","commit_stats":null,"previous_names":["magomedcoder/monic"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/magomedcoder/monic","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/magomedcoder%2Fmonic","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/magomedcoder%2Fmonic/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/magomedcoder%2Fmonic/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/magomedcoder%2Fmonic/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/magomedcoder","download_url":"https://codeload.github.com/magomedcoder/monic/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/magomedcoder%2Fmonic/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279001895,"owners_count":26083226,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-09T02:00:07.460Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-10-09T18:43:19.284Z","updated_at":"2025-10-09T18:43:20.181Z","avatar_url":"https://github.com/magomedcoder.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Monic - лёгкая система мониторинга логов и событий\n\nMonic состоит из двух частей: **Agent** и **Server**\n\n- **Monic Agent** - маленький демон на каждом узле.  \n  Подписывается на системные журналы, парсит события и отправляет их в серверную часть.  \n  Поддерживаемые транспорты отправки:\n    - HTTP\n    - gRPC\n\n- **Monic Server** - центральный приёмник.  \n  Принимает события по **HTTP** или **gRPC**, проверяет подпись/токен (если задан секрет) и сохраняет данные в\n  ClickHouse.  \n  Сервер может поднимать оба протокола одновременно.\n\n---\n\n### Статус\n\n- [x] Сбор событий из journald (SSH: успешный вход, ошибка входа, невалидный пользователь, отключение)\n- [x] Отправка событий агентом по HTTP\n- [x] Приём событий сервером\n- [x] Запись событий в ClickHouse\n- [x] Отправка событий агентом по gRPC\n- [x] Детекция порт-скана:\n    - [x] через firewall/journal\n    - [x] через пассивный сниффинг\n- [ ] Лёгкий веб-интерфейс (таблица событий и фильтры)\n\n---\n\n##### ВАЖНО: перед запуском измените секрет и включите нужный режим в файлах monic-agent.service и monic-server.service\n\n---\n\n### Запуск сервера\n\n#### Вариант 1: На хосте через systemd\n\n#### Установка ClickHouse\n\n```bash\n# Следуйте официальной документации:\n# https://clickhouse.com/docs/install/debian_ubuntu\n\n# После установки ClickHouse, запустите клиент и создайте базу данных:\nclickhouse-client --query \"CREATE DATABASE monic_db;\" --user **** --password ****\n```\n\n```bash\nsudo cp /init/monic-server.service /etc/systemd/system/\nsudo systemctl daemon-reload\nsudo systemctl enable monic-server\nsudo systemctl start monic-server\n```\n\n#### Проверить работу\n\n```bash\nsudo systemctl status monic-server\nsudo journalctl -u monic-server -f\n```\n\n#### Вариант 2: Docker\n\n```bash\ndocker compose up -d\n```\n\n#### Проверить работу\n\n```bash\ndocker compose logs -f monic-server\n```\n\n---\n\n### Переменные окружения\n\n- `MONIC_SERVER_HTTP_ADDR` - адрес HTTP-сервера, по умолчанию `:8000`.\n- `MONIC_SERVER_GRPC_ADDR` - адрес gRPC-сервера, по умолчанию пусто (gRPC выключен). Пример: `:50051`.\n- `MONIC_SERVER_TLS_CERT` - путь к `cert.pem` для gRPC TLS (опционально).\n- `MONIC_SERVER_TLS_KEY` - путь к `key.pem` для gRPC TLS (опционально).\n- `MONIC_SECRET` - секрет:\n    - HTTP: используется для HMAC (заголовок `X-Signature: sha256=\u003chex\u003e`).\n    - gRPC: используется как Bearer-токен в metadata `authorization: Bearer \u003csecret\u003e`.\n- `MONIC_SERVER_CLICKHOUSE_DSN` - DSN для подключения к ClickHouse, по\n  умолчанию `tcp://127.0.0.1:9000?database=monic_db`\n- `MONIC_SERVER_BATCH_SIZE` - размер батча перед вставкой, по умолчанию `500`\n- `MONIC_SERVER_BATCH_WINDOW_MS` - окно времени в мс перед отправкой батча, по умолчанию `500`\n\nМожно одновременно задать и `MONIC_SERVER_HTTP_ADDR`, и `MONIC_SERVER_GRPC_ADDR` - сервер запустит оба протокола.\n\n---\n\n# Агент\n\n### Запуск агента\n\n```bash\nsudo cp /init/monic-agent.service /etc/systemd/system/\nsudo systemctl daemon-reload\nsudo systemctl enable monic-agent\nsudo systemctl start monic-agent\n```\n\n#### Проверить работу\n\n```bash\nsudo systemctl status monic-agent\nsudo journalctl -u monic-agent -f\n```\n\n### Переменные окружения\n\n- **HTTP режим**\n    - `MONIC_HTTP_URL` - URL (например, `http://127.0.0.1:8000`)\n\n- **gRPC режим (приоритетнее, если задан `MONIC_GRPC_ADDR`)**\n    - `MONIC_GRPC_ADDR` - адрес gRPC-сервера (например, `127.0.0.1:50051`)\n    - `MONIC_GRPC_INSECURE` - `true` для нешифрованного gRPC, по умолчанию `false`\n\n- **Общие параметры:**\n    - `MONIC_SECRET` - секрет:\n        - в HTTP режиме используется для HMAC (`X-Signature`)\n        - в gRPC режиме используется как Bearer-токен (`authorization: Bearer \u003csecret\u003e`)\n\n    - `MONIC_JOURNAL_UNIT` - systemd unit для фильтрации, по умолчанию `sshd.service`.  \n      Если пусто - используется `SYSLOG_IDENTIFIER=sshd`.\n\n        - `MONIC_ENABLE_PORTSCAN` - включить детектор/сниффинг, по умолчанию `false`\n            - **Детектор порт-скана**\n                - `MONIC_PORTSCAN_WINDOW_SECONDS` - окно T секунд (по умолчанию `10`)\n                - `MONIC_PORTSCAN_DISTINCT_PORTS` - порог N разных портов (по умолчанию `12`)\n\n            - **Сниффинг**\n                - `MONIC_SNIFFER_IFACES` - запятая-разделённый список интерфейсов: `ens160,ens192`\n                - `MONIC_SNIFFER_PROMISC` - `true` для promiscuous, по умолчанию `false`\n                - `MONIC_SNIFFER_BPF` - кастомный BPF-фильтр.\n                  По умолчанию: `(tcp[tcpflags] \u0026 (tcp-syn) != 0 and (tcp[tcpflags] \u0026 tcp-ack) = 0) or udp`\n\n---\n\n### Включение детектора порт-скана\n\n#### Вариант А: через firewall/journal (nftables/iptables -\u003e kernel-logs)\n\n- Добавьте правила логирования входящих TCP SYN/UDP на «неразрешённые» порты.\n- Агент уже слушает kernel-журнал и парсит строки вида ... PROTO=TCP ... SRC=1.2.3.4 ... DPT=3389 ....\n\n#### iptables\n\n```bash\niptables -N MONIC-AGENT\niptables -A INPUT -p tcp --syn -j MONIC-AGENT\niptables -A MONIC-AGENT -m multiport ! --dports 22,80,443 -j LOG --log-prefix \"PORTSCAN \"\niptables -A MONIC-AGENT -m multiport ! --dports 22,80,443 -j REJECT\n```\n\n#### nftables\n\n```bash\nnft add table inet monic-agent\nnft 'add chain inet monic-agent input { type filter hook input priority 0; }'\nnft add rule inet monic-agent input ct state established,related accept\nnft add rule inet monic-agent input iif lo accept\nnft add rule inet monic-agent input tcp dport { 22,80,443 } accept\nnft add rule inet monic-agent input tcp flags syn log prefix \"PORTSCAN \"\nnft add rule inet monic-agent input tcp flags syn reject\n```\n\n```bash\nsudo MONIC_ENABLE_PORTSCAN=true monic-agent\n```\n\n#### Вариант Б: через сниффинг трафика\n\n```bash\nsudo MONIC_SNIFFER_IFACES=ens160,ens192 \\\n  MONIC_ENABLE_PORTSCAN=true \\\n  MONIC_SNIFFER_PROMISC=true \\\n  monic-agent\n```\n\nАгент будет генерировать «сырые» net_probe и агрегированные port_scan.\n\n---\n\n### Сборка\n\n- **go** 1.24\n- **make**\n- Для агента: `pkg-config`, `libsystemd-dev`, `libpcap-dev`\n\n\u003e **protoc**, **protoc-gen-go** и **protoc-gen-go-grpc** требуются только для\n\u003e **генерации gRPC/protobuf кода** из **.proto** файлов.\n\u003e - **protoc** 3.20\n\u003e - **protoc-gen-go** 1.36\n\u003e - **protoc-gen-go-grpc** 1.5\n\n```bash\nsudo apt install pkg-config libsystemd-dev libpcap-dev make\n\npkg-config --cflags --libs libsystemd, libpcap\n```\n\n```bash\nmake build\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmagomedcoder%2Fmonic","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmagomedcoder%2Fmonic","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmagomedcoder%2Fmonic/lists"}