add: Защита хоста с помощью CrowdSec ....
This commit is contained in:
parent
af40c9c716
commit
fc924e196b
BIN
images/crowdsec--security-panel.png
Normal file
BIN
images/crowdsec--security-panel.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 59 KiB |
@ -33,6 +33,8 @@ Fail2Ban (он написан на Golang), работает с IPv6 и имее
|
|||||||
|
|
||||||
### CrowdSec на первом узле и защита SSH на хосте
|
### CrowdSec на первом узле и защита SSH на хосте
|
||||||
|
|
||||||
|
#### Подготовка к установке CrowdSec
|
||||||
|
|
||||||
Делаем обновляем список пактов и систему:
|
Делаем обновляем список пактов и систему:
|
||||||
```shell
|
```shell
|
||||||
sudo apt update
|
sudo apt update
|
||||||
@ -44,6 +46,8 @@ sudo apt upgrade
|
|||||||
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
|
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Установка CrowdSec и проверка
|
||||||
|
|
||||||
Устанавливаем CrowdSec:
|
Устанавливаем CrowdSec:
|
||||||
```shell
|
```shell
|
||||||
sudo apt install crowdsec
|
sudo apt install crowdsec
|
||||||
@ -245,7 +249,36 @@ sudo cscli metrics
|
|||||||
|
|
||||||
Как видим, CrowdSec читает `/var/log/auth.log` (логи SSH).
|
Как видим, CrowdSec читает `/var/log/auth.log` (логи SSH).
|
||||||
|
|
||||||
#### Подключаем CrowdSec для обмена данными об атаках
|
#### Установка CrowdSec Firewall Bouncer -- блокировщик IP-адресов
|
||||||
|
|
||||||
|
По мне, блокировки CrowdSec довольно беззубые. К счастью через "вышибалу" Firewall Bouncer можно блокировать
|
||||||
|
IP-адреса по iptables (или nftables) и сделать CrowdSec злее fail2ban. Для этого нужно установить
|
||||||
|
`crowdsec-firewall-bouncer-iptables`:
|
||||||
|
```shell
|
||||||
|
sudo apt-get install crowdsec-firewall-bouncer-iptables
|
||||||
|
```
|
||||||
|
|
||||||
|
А затем подключить его в CrowdSec:
|
||||||
|
```shell
|
||||||
|
sudo cscli bouncers add firewall-bounce
|
||||||
|
```
|
||||||
|
|
||||||
|
Проверим, что "вышибала" установлен:
|
||||||
|
```shell
|
||||||
|
sudo cscli bouncers list
|
||||||
|
```
|
||||||
|
|
||||||
|
Увидим что-то вроде:
|
||||||
|
```text
|
||||||
|
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
Name IP Address Valid Last API pull Type Version Auth Type
|
||||||
|
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
cs-firewall-bouncer-xxxx 127.0.0.1 ✔️ xxxx-xx-xxTxx:xx:xxZ crowdsec-firewall-bouncer v0.0.31-debian-pragmatic-xxxxxx... api-key
|
||||||
|
firewall-bouncer ✔️ api-key
|
||||||
|
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Подключаем наш CrowdSec к обмену данными об атаках
|
||||||
|
|
||||||
CrowdSec может обмениваться данными об атаках с другими участниками сети. Чтобы это сделать, нужно пойти [на сайт
|
CrowdSec может обмениваться данными об атаках с другими участниками сети. Чтобы это сделать, нужно пойти [на сайт
|
||||||
CrowdSec](https://crowdsec.net/) и зарегистрироваться. После подтверждения регистрации по email, в личном кабинете
|
CrowdSec](https://crowdsec.net/) и зарегистрироваться. После подтверждения регистрации по email, в личном кабинете
|
||||||
@ -300,7 +333,24 @@ sudo cscli metrics
|
|||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
Как видим, CrowdSec получает блокировки.
|
Как видим, CrowdSec получает блокировки. Если очень интересно, можно посмотреть, что именно и почему блокируется
|
||||||
|
(например, `ssh:bruteforce`):
|
||||||
|
```shell
|
||||||
|
sudo cscli decisions list --origin CAPI
|
||||||
|
```
|
||||||
|
|
||||||
|
Увидим длиннющий список, примерно такого содержания:
|
||||||
|
```text
|
||||||
|
╭───────┬────────┬────────────────────────────────────┬────────────────┬────────┬─────────┬────┬────────┬────────────┬──────────╮
|
||||||
|
│ ID │ Source │ Scope:Value │ Reason │ Action │ Country │ AS │ Events │ expiration │ Alert ID │
|
||||||
|
├───────┼────────┼────────────────────────────────────┼────────────────┼────────┼─────────┼────┼────────┼────────────┼──────────┤
|
||||||
|
..... .... ...................... .............. ... . ......... .
|
||||||
|
│ ..... │ CAPI │ Ip:129.211.204.27 │ ssh:bruteforce │ ban │ │ │ 0 │ 79h15m46s │ 1 │
|
||||||
|
│ ..... │ CAPI │ Ip:128.199.124.27 │ ssh:bruteforce │ ban │ │ │ 0 │ -1h44m14s │ 1 │
|
||||||
|
│ ..... │ CAPI │ Ip:Ip:2602:80d:1006::76 │ ssh:bruteforce │ ban │ │ │ 0 │ 48h15m46s │ 1 │
|
||||||
|
│ ..... │ CAPI │ Ip:123.58.213.127 │ ssh:bruteforce │ ban │ │ │ 0 │ 160h15m46s │ 1 │
|
||||||
|
╰───────┴────────┴────────────────────────────────────┴────────────────┴────────┴─────────┴────┴────────┴────────────┴──────────╯
|
||||||
|
```
|
||||||
|
|
||||||
#### Настройка Whitelist (белого списка)
|
#### Настройка Whitelist (белого списка)
|
||||||
|
|
||||||
@ -343,3 +393,138 @@ sudo cscli allowlist inspect home_whitelist
|
|||||||
───────────────────────────────────────────────────────────────
|
───────────────────────────────────────────────────────────────
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Еще один способ отредактировать (создать) Whitelist-конфиг парсера, который мы получили командой
|
||||||
|
`sudo cscli parsers list`. Конфиг `/etc/crowdsec/parsers/s02-enrich/whitelists.yaml` довольно простой, если его
|
||||||
|
отредактировать (добавить нужные IP-адреса, подсети или даже доменные имена), а затем перезапустить CrowdSec -- получим
|
||||||
|
тот же результат. Только управлять через списки (allowlist) удобнее.
|
||||||
|
[См. документацию](https://doc.crowdsec.net/u/getting_started/post_installation/whitelists/).
|
||||||
|
|
||||||
|
|
||||||
|
#### Настройка Firewall Bouncer (блокировщик IP-адресов)
|
||||||
|
|
||||||
|
Когда мы проверяли установку CrowdSec, и проверим список сценариев `shell sudo cscli scenarios list`, то нам был
|
||||||
|
показан список yaml-манифестов c конфигурациями сценариев блокировок. В частности касающихся SSH:
|
||||||
|
* `/etc/crowdsec/scenarios/ssh-bf.yaml` -- брутфорс SSH
|
||||||
|
* `/etc/crowdsec/scenarios/ssh-slow-bf.yaml` -- медленный брутфорс SSH
|
||||||
|
* `/etc/crowdsec/scenarios/ssh-cve-2024-6387.yaml` -- regreSSHion-атака (атаки уязвимости SSH-серверов старых версий)
|
||||||
|
* `/etc/crowdsec/scenarios/ssh-refused-conn.yaml` -- отказ соединения SSH, защищает от сканеров, которые ищут
|
||||||
|
открытые SSH-порты (на очень актуально, если у вас SSH открыт по стандартном 22-порту).
|
||||||
|
|
||||||
|
В некоторых манифестах может быть несколько блоков конфигурации блокировок для разных сценариев атак "зловредов".
|
||||||
|
Например, в `ssh-bf.yaml` есть блоки `crowdsecurity/ssh-bf` (для тупого брутфорса) и `crowdsecurity/ssh-bf_user-enum`
|
||||||
|
(для перебора пользователей).
|
||||||
|
|
||||||
|
Меняем "беззубые" параметры, на что-то более серьезное. Открываем на редактирование, например, `ssh-bf.yaml`:
|
||||||
|
```shell
|
||||||
|
sudo nano /etc/crowdsec/scenarios/ssh-bf.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
Увидим что-то типа:
|
||||||
|
```yaml
|
||||||
|
# ssh bruteforce
|
||||||
|
type: leaky
|
||||||
|
name: crowdsecurity/ssh-bf
|
||||||
|
description: "Detect ssh bruteforce"
|
||||||
|
filter: "evt.Meta.log_type == 'ssh_failed-auth'"
|
||||||
|
leakspeed: "10s"
|
||||||
|
references:
|
||||||
|
- http://wikipedia.com/ssh-bf-is-bad
|
||||||
|
capacity: 5
|
||||||
|
groupby: evt.Meta.source_ip
|
||||||
|
blackhole: 1m
|
||||||
|
reprocess: true
|
||||||
|
labels:
|
||||||
|
service: ssh
|
||||||
|
confidence: 3
|
||||||
|
spoofable: 0
|
||||||
|
classification:
|
||||||
|
- attack.T1110
|
||||||
|
label: "SSH Bruteforce"
|
||||||
|
behavior: "ssh:bruteforce"
|
||||||
|
remediation: true
|
||||||
|
---
|
||||||
|
# ssh user-enum
|
||||||
|
type: leaky
|
||||||
|
name: crowdsecurity/ssh-bf_user-enum
|
||||||
|
description: "Detect ssh user enum bruteforce"
|
||||||
|
filter: evt.Meta.log_type == 'ssh_failed-auth'
|
||||||
|
groupby: evt.Meta.source_ip
|
||||||
|
distinct: evt.Meta.target_user
|
||||||
|
leakspeed: 10s
|
||||||
|
capacity: 5
|
||||||
|
blackhole: 1m
|
||||||
|
labels:
|
||||||
|
service: ssh
|
||||||
|
remediation: true
|
||||||
|
confidence: 3
|
||||||
|
spoofable: 0
|
||||||
|
classification:
|
||||||
|
- attack.T1589
|
||||||
|
behavior: "ssh:bruteforce"
|
||||||
|
label: "SSH User Enumeration"
|
||||||
|
```
|
||||||
|
|
||||||
|
Что тут происходит:
|
||||||
|
|
||||||
|
* Сценарий `crowdsecurity/ssh-bf`:
|
||||||
|
* Тип: `leaky` -- leaky bucket — алгоритм "дырявое ведро", считающий события в окне времени.
|
||||||
|
* Фильтр: `evt.Meta.log_type == 'ssh_failed-auth'` -- ловит неудачные попытки входа по SSH из `/var/log/auth.log`.
|
||||||
|
* Логика:
|
||||||
|
* `groupby: evt.Meta.source_ip` -- группирует события по IP атакующего.
|
||||||
|
* `leakspeed: 10s` -- "окно времени" — 10 секунд (считает попытки за 10 сек).
|
||||||
|
* `capacity: 5` -- Бан после 5 неудачных попыток.
|
||||||
|
* `blackhole: 1m` -- Бан на 1 минуту.
|
||||||
|
* Сценарий `crowdsecurity/ssh-bf_user-enum`:
|
||||||
|
* Тип тот же.
|
||||||
|
* Фильтр тот же.
|
||||||
|
* Логика:
|
||||||
|
* `distinct: evt.Meta.target_user` -- считает попытки с разными пользователями (root, admin, pi, orangepi и т.д.).
|
||||||
|
* `leakspeed: 10s` -- "окно времени" — 10 секунд.
|
||||||
|
* `capacity: 5` -- Бан после 5 разных пользователей за 10 секунд.
|
||||||
|
* `blackhole: 1m` -- Бан на 1 минуту.
|
||||||
|
|
||||||
|
Как видим в обоих случаях бан срабатывает после пяти попыток за десять секунд, и блокировка всего на минуту. Конечно,
|
||||||
|
брутфорсеры -- это быстрые атаки, но "быстрота" понятие относительное. Я выставляю:
|
||||||
|
* `leakspeed: 10m`
|
||||||
|
* `capacity: 2`
|
||||||
|
* `blackhole: 1h`
|
||||||
|
|
||||||
|
И считаю, что это довольно мягко. Но чтоб случайно не заблокировать себя, когда буду подключаться с внешнего IP
|
||||||
|
не из белого списка (например, по мобильному интернету) -- это разумный компромисс.
|
||||||
|
|
||||||
|
После редактирования файла, нужно перезапустить CrowdSec, чтоб он применил изменения:
|
||||||
|
```shell
|
||||||
|
sudo systemctl restart crowdsec
|
||||||
|
```
|
||||||
|
|
||||||
|
Другие сценарии можно настроить по аналогии. "Злость" управляется параметрами `leakspeed`, `capacity` и `blackhole`.
|
||||||
|
Но имейте в виду: не стоит менять много параметров одновременно. Настройки разных сценариев могут конфликтовать
|
||||||
|
друг другом, и тогда CrowdSec не запустится. И еще, экспериментально я обнаружил, что настройки дней, например `2d`
|
||||||
|
тоже недопустимы. Надо указывать `48h` (48 часов), и в целом очень длительные `leakspeed` и `blackhole` не нравятся
|
||||||
|
CrowdSec.
|
||||||
|
|
||||||
|
После перезапуска CrowdSec, можно проверить, что он начал банить на основании настроенных правил (особо ждать не
|
||||||
|
придется, зловреды попадутся уже через пру минут):
|
||||||
|
```shell
|
||||||
|
sudo cscli decisions list
|
||||||
|
```
|
||||||
|
|
||||||
|
Увидим что-то типа:
|
||||||
|
```text
|
||||||
|
╭───────┬──────────┬────────────────────┬────────────────────────────────┬────────┬─────────┬─────────────────────────────────────────────┬────────┬────────────┬──────────╮
|
||||||
|
│ ID │ Source │ Scope:Value │ Reason │ Action │ Country │ AS │ Events │ expiration │ Alert ID │
|
||||||
|
├───────┼──────────┼────────────────────┼────────────────────────────────┼────────┼─────────┼─────────────────────────────────────────────┼────────┼────────────┼──────────┤
|
||||||
|
│ 30004 │ crowdsec │ Ip:39.98.38.186 │ crowdsecurity/ssh-slow-bf │ ban │ CN │ 37963 Hangzhou Alibaba Advertising Co.,Ltd. │ 11 │ 3h54m49s │ 6 │
|
||||||
|
│ 30002 │ crowdsec │ Ip:165.246.104.64 │ crowdsecurity/ssh-bf │ ban │ KR │ 9317 INHA UNIVERSITY │ 3 │ 3h50m0s │ 4 │
|
||||||
|
│ 90210 │ crowdsec │ Ip:180.101.143.248 │ crowdsecurity/ssh-bf_user-enum │ ban │ CN │ 4134 Chinanet │ 3 │ 3h6m38s │ 216 │
|
||||||
|
╰───────┴──────────┴────────────────────┴────────────────────────────────┴────────┴─────────┴─────────────────────────────────────────────┴────────┴────────────┴──────────╯
|
||||||
|
```
|
||||||
|
|
||||||
|
Время блокировок (`expiration`) могут оказаться даже сильнее чем наши настройки. Это из-за того, что "зловред"
|
||||||
|
может попасть под несколько блокировок одновременно или успеть сделать несколько атак (_а если честно, я сам не
|
||||||
|
понимаю, как это работает, даже настройки блокировки на 12 часов будут отображаться как 4-часовые_).
|
||||||
|
|
||||||
|
Плюсом является то, что бгадоря обмену информацией о блокировках, а личного кабинета на сайте CrowdSec можно
|
||||||
|
посмотреть ваши локальные блокировки в веб-интерфейсе:
|
||||||
|
|
||||||
|

|
Loading…
x
Reference in New Issue
Block a user