1. Tổng quan.
Vài tháng trước, CrowdSec đã thêm một số tính năng thú vị vào CrowdSec khi phát hành phiên bản v1.0.x. Một trong những tính năng thú vị nhất, là khả năng của CrowdSec Agent để hoạt động như một REST API HTTP để thu thập tín hiệu từ các CrowdSec Agent khác. Do đó, trách nhiệm của máy Agent đặc biệt này là lưu trữ và chia sẻ các tín hiệu đã thu thập. Từ giờ trở đi, chúng ta sẽ gọi máy chủ đặc biệt này là máy chủ LAPI. Một tính năng đáng chú ý khác, là việc ngăn chặn không còn phải diễn ra trên cùng một máy chủ như phát hiện. Ngăn chặn được thực hiện bằng cách sử dụng các bouncer. Bouncer dựa trên REST API HTTP được phục vụ bởi máy chủ LAPI.”
Trong đó:
- CrowdSec là một hệ thống bảo mật và phát hiện xâm nhập.
- LAPI server là một máy chủ đặc biệt trong hệ thống CrowdSec, chịu trách nhiệm thu thập và chia sẻ tín hiệu với các máy khách khác.
- Mitigation là quá trình ngăn chặn các hoạt động xâm nhập hoặc đe dọa. Trong phiên bản mới, việc ngăn chặn không còn phải thực hiện trên cùng một máy chủ mà được thực hiện thông qua các “bouncer” (các phần mềm hoặc dịch vụ đặc biệt).
- Bouncers là các phần mềm hoặc dịch vụ sử dụng REST API HTTP được cung cấp bởi máy chủ LAPI để thực hiện các biện pháp ngăn chặn, chẳng hạn như cấm IP đối với các đối tượng đe dọa.
Như vậy, trong phiên bản mới của CrowdSec, việc phát hiện và ngăn chặn các hoạt động xâm nhập đã được tách rời ra, và máy chủ LAPI đóng vai trò quan trọng trong việc lưu trữ và chia sẻ thông tin để thực hiện các biện pháp ngăn chặn bằng cách sử dụng các bouncer.
2. Ví dụ thực tế.
Dưới đây là một ví dụ thực tế về cách triển khai CrowdSec với 3 Nodes, trong đó chỉ có server-1 là máy chủ LAPI (Log API) Server:
- Server 1: LAPI Server
- Đây là máy chủ chính của bạn, được cấu hình để làm LAPI Server.
- Trên server này, bạn đã cài đặt CrowdSec và cấu hình nó để hoạt động dưới dạng LAPI Server.
- LAPI Server là nơi tất cả các tín hiệu xâm nhập được gửi đến và lưu trữ.
- Server 2 và 3: CrowdSec Agent và CrowdSec Bouncer
- Server này là một máy chủ hoặc máy tính khác trong hạ tầng của bạn.
- Cài đặt CrowdSec Agent và cấu hình nó để gửi tín hiệu xâm nhập đến LAPI Server trên Server 1.
- Cài đặt CrowdSec Bouncer và cấu hình nó để truy vấn tín hiệu xâm nhập từ LAPI Server trên Server 1 và thực hiện các biện pháp ngăn chặn, chẳng hạn như cấm IP của các đối tượng đe dọa. Bouncer này sẽ thường xuyên truy vấn LAPI Server để kiểm tra tín hiệu và thực hiện các biện pháp ngăn chặn.
Cách hoạt động:
- Khi có một sự cố xâm nhập xảy ra ví dụ Server 2 (ví dụ: nhiều yêu cầu SSH không hợp lệ), CrowdSec Agent trên Server 2 sẽ phát hiện và ghi lại tín hiệu xâm nhập này.
- Agent này sau đó sẽ gửi tín hiệu này đến LAPI Server trên Server 1.
- LAPI Server trên Server 1 lưu trữ tín hiệu và cung cấp chúng cho các bouncer như Bouncer trên Server 3.
- Bouncer trên Server 3 sẽ thường xuyên kiểm tra với LAPI Server để lấy danh sách các tín hiệu xâm nhập mới nhất và thực hiện các biện pháp ngăn chặn, ví dụ như cấm IP của người tấn công.
- LAPI Server trên Server 1 không trực tiếp thực hiện các biện pháp ngăn chặn, nhưng nó chứa thông tin về các tín hiệu xâm nhập và cung cấp chúng cho các bouncer để thực hiện các biện pháp ngăn chặn cụ thể. Các bouncer, chẳng hạn như Bouncer trên Server 3, sẽ làm nhiệm vụ cấm các truy cập xấu dựa trên thông tin này.
Như vậy, trong ví dụ này, CrowdSec được triển khai với 3 nodes khác nhau, giúp bạn tập trung lưu trữ và chia sẻ thông tin xâm nhập trên một máy chủ chính (LAPI Server) và thực hiện các biện pháp ngăn chặn trên các máy chủ khác (Bouncers) dựa trên thông tin từ LAPI Server.
3. Cách triển khai.
Trong bài viết này, chúng ta tìm hiểu cách triển khai CrowdSec với nhiều nodes. Dưới đây là sơ đồ ví dụ của mình.
- Server 1 chính là LAPI, chúng ta sẽ chọn PostgreSQL để lưu dữ liệu cho cho LAPI và cài đặt Crowdsec lên Server này.
- Server 2 và server 3 chính là các server vật lý, máy ảo, máy tính,… trong công ty của bạn được cài Crowdsec và Bouncer.
Yêu cầu tiên quyết
Các yêu cầu tiên quyết và bước đầu tiên để cài đặt CrowdSec trên ba Server chạy Ubuntu 20.04 và kết nối thông mạng với nhau.
- Hai Crowdsec Agent có kết nối internet, chạy hệ điều hành Ubuntu 20.04.
- Chúng ta sẽ gọi hai server Crowdsec Agent này là
server-2
vàserver-3
.
- Chúng ta sẽ gọi hai server Crowdsec Agent này là
- Server 1 (LAPI) không cần kết nối internet, chạy hệ điều hành Ubuntu 20.04.
- Chúng ta sẽ gọi server này là
server-1
. (Lưu ý rằng không bắt buộc phải ngắt kết nối internet cho server này).
- Chúng ta sẽ gọi server này là
- Kết nối 3 server này nối thông mạng với nhau.
Bước 1: Cài đặt CrowdSec
Cài đặt CrowdSec trên tất cả ba server.
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
apt install crowdsec -y
Bước 2 (Tùy chọn): Chuyển đổi DB mặc định sang PostgreSQL trên server-1
Ở bước này, chúng ta sẽ chuyển DB của CrowdSec từ DB mặc định sang PostgreSQL trên server-1.
Đây là các bước thực hiện:
Trước tiên, cài đặt PostgreSQL bằng lệnh sau:
sudo apt install postgresql -y
Khởi động và bật tính năng tự khởi động khi restart lại OS.
sudo systemctl start postgresql
sudo systemctl enable postgresql
Sau đó, bạn cần kết nối vào DB với tư cách người dùng “postgres” bằng lệnh sau:
sudo -i -u postgres
Tiếp theo, bạn vào PostgreSQL bằng cách nhập:
psql
Dựa trên tài liệu PostgreSQL của CrowdSec, bạn có thể khởi tạo DB mới bằng các lệnh sau:
postgres=# CREATE DATABASE crowdsec;
CREATE DATABASE
postgres=# CREATE USER crowdsec WITH PASSWORD 'your_password_here';
CREATE ROLE
postgres=# GRANT ALL PRIVILEGES ON DATABASE crowdsec TO crowdsec;
GRANT
postgres=# \q
exit
Lưu ý rằng bạn nên thay thế 'your_password_here'
bằng một mật khẩu bảo mật.
Tiếp theo, chúng ta cần thông báo cho CrowdSec biết về DB mới này bằng cách chỉnh sửa file cấu hình /etc/crowdsec/config.yaml
như sau:
Đoạn config mặc định trong file này.
db_config:
log_level: info
type: sqlite
db_path: /var/lib/crowdsec/data/crowdsec.db
#max_open_conns: 100
#user:
#password:
#db_name:
#host:
#port:
flush:
max_items: 5000
max_age: 7d
Chúng ta sử lại thành.
db_config:
log_level: info
type: postgres
user: crowdsec
password: "your_password_here"
db_name: crowdsec
host: 127.0.0.1
port: 5432
flush:
max_items: 5000
max_age: 7d
Sau khi đã đăng ký lại server local trong DB, bạn có thể khởi động lại dịch vụ CrowdSec bằng các lệnh sudo cscli machines add -a:
$ sudo cscli machines add -a
INFO[24-08-2023 07:09:12] Machine '81ad445998a76a0c0d2e3e6ba3f67221VzzrzjWSitHnXomk' successfully added to the local API
INFO[24-08-2023 07:09:12] API credentials dumped to '/etc/crowdsec/local_api_credentials.yaml'
Xác nhận lại kết quả bằng lệnh cscli machines list
.
$ cscli machines list
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Name IP Address Last Update Status Version Auth Type Last Heartbeat
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
81ad445998a76a0c0d2e3e6ba3f67221VzzrzjWSitHnXomk 2023-08-24T07:09:12Z ✔️ password 5s
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Khởi động lại Crowdsec.
sudo systemctl restart crowdsec
Kiểm tra lại trạng thái của Crowdsec.
$ sudo systemctl status crowdsec
● crowdsec.service - Crowdsec agent
Loaded: loaded (/lib/systemd/system/crowdsec.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2023-08-24 07:09:51 UTC; 3s ago
Process: 19172 ExecStartPre=/usr/bin/crowdsec -c /etc/crowdsec/config.yaml -t (code=exited, status=0/SUCCESS)
Main PID: 19200 (crowdsec)
Tasks: 7 (limit: 4663)
Memory: 53.0M
CGroup: /system.slice/crowdsec.service
└─19200 /usr/bin/crowdsec -c /etc/crowdsec/config.yaml
Aug 24 07:09:46 crowdsec-181 systemd[1]: Starting Crowdsec agent...
Aug 24 07:09:51 crowdsec-181 systemd[1]: Started Crowdsec agent.
Những bước này sẽ chuyển DB mặc định của CrowdSec sang PostgreSQL trên server-1
và cấu hình lại CrowdSec để sử dụng DB mới.
Bước 3: Kết nối server-2 và server-3 với server LAPI (Local API) trên server-1.
Trong bước này, chúng ta sẽ cấu hình CrowdSec trên server-1 để chấp nhận kết nối từ server-2 và server-3. Đảm bảo rằng Firewall của bạn cho phép các kết nối từ server-2 và server-3 đến cổng 8080 của server-1.
Cấu hình server LAPI (Local API) trên server-1:
Trước tiên, chúng ta cần chỉnh sửa file /etc/crowdsec/config.yaml
trên server-1 để cho phép các kết nối đến server LAPI. Điều này thực hiện bằng cách chỉnh sửa listen_uri: 127.0.0.1:8080
thành listen_uri: 0.0.0.0:8080
như dưới.
api:
client:
insecure_skip_verify: false
credentials_path: /etc/crowdsec/local_api_credentials.yaml
server:
log_level: info
listen_uri: 0.0.0.0:8080
profiles_path: /etc/crowdsec/profiles.yaml
console_path: /etc/crowdsec/console.yaml
online_client: # Central API credentials (to push signals and receive bad IPs)
credentials_path: /etc/crowdsec/online_api_credentials.yaml
trusted_ips: # IP ranges, or IPs which can have admin API access
- 127.0.0.1
- ::1
# tls:
# cert_file: /etc/crowdsec/ssl/cert.pem
# key_file: /etc/crowdsec/ssl/key.pem
Tiếp theo, chúng ta chỉnh sửa file /etc/crowdsec/local_api_credentials.yaml
để phù hợp với địa chỉ IP của server-1:
Đây là thông tin mặc định.
url: http://127.0.0.1:8080
login: 81ad445998a76a0c0d2e3e6ba3f67221VzzrzjWSitHnXomk
password: DbOtnNdaxlI76o7kRb4cLBEFdPSVfwmJPTqFCFwfLgWIaP4E9dKpsP4GtK8801g5
Chỉnh lại thông tin url như dưới, với 192.168.13.181 là IP của Server-1 (LAPI). Thông tin login và password các bạn có thể để nguyên.
url: http://192.168.13.181:8080
login: 81ad445998a76a0c0d2e3e6ba3f67221VzzrzjWSitHnXomk
password: DbOtnNdaxlI76o7kRb4cLBEFdPSVfwmJPTqFCFwfLgWIaP4E9dKpsP4GtK8801g5
Sau đó, khởi động lại dịch vụ CrowdSec trên server-1:
sudo systemctl restart crowdsec
Kiểm tra lại trạng thái của Crowdsec.
$ sudo systemctl status crowdsec
● crowdsec.service - Crowdsec agent
Loaded: loaded (/lib/systemd/system/crowdsec.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2023-08-24 07:21:09 UTC; 2min 42s ago
Process: 19268 ExecStartPre=/usr/bin/crowdsec -c /etc/crowdsec/config.yaml -t (code=exited, status=0/SUCCESS)
Main PID: 19297 (crowdsec)
Tasks: 7 (limit: 4663)
Memory: 43.9M
CGroup: /system.slice/crowdsec.service
└─19297 /usr/bin/crowdsec -c /etc/crowdsec/config.yaml
Aug 24 07:21:03 crowdsec-181 systemd[1]: Starting Crowdsec agent...
Aug 24 07:21:09 crowdsec-181 systemd[1]: Started Crowdsec agent.
Kiểm tra xem port 8080 đã listen chưa.
$ netstat -tlnp | grep crowdsec
tcp 0 0 127.0.0.1:6060 0.0.0.0:* LISTEN 19800/crowdsec
tcp6 0 0 :::8080 :::* LISTEN 19800/crowdsec
Kết quả thành công.
Cấu hình server-2 và server-3 để kết nối với LAPI server trên server-1:
Trên cả server-2 và server-3 vào file /etc/crowdsec/local_api_credentials.yaml
chỉnh sửa thông tin giống như bên Server-1 (LAPI) đã làm ở trên và lưu lại.
url: http://192.168.13.181:8080
login: 81ad445998a76a0c0d2e3e6ba3f67221VzzrzjWSitHnXomk
password: DbOtnNdaxlI76o7kRb4cLBEFdPSVfwmJPTqFCFwfLgWIaP4E9dKpsP4GtK8801g5
Trên cả server-2 và server-3, đăng ký với server LAPI trên server-1 bằng lệnh dưới, với http://192.168.13.181:8080 là url API tới Server-1.
sudo cscli lapi register -u http://192.168.13.181:8080
Nếu thành công bạn có kết quả như dưới.
$ sudo cscli lapi register -u http://192.168.13.181:8080
INFO[24-08-2023 07:33:18] Successfully registered to Local API (LAPI)
INFO[24-08-2023 07:33:18] Local API credentials dumped to '/etc/crowdsec/local_api_credentials.yaml'
WARN[24-08-2023 07:33:18] Run 'sudo systemctl reload crowdsec' for the new configuration to be effective.
Chạy lệnh sudo systemctl reload crowdsec
để reload lại Crowdsec khi muốn áp dụng config mới.
sudo systemctl reload crowdsec
Lúc này bạn sang server-1 (LAPI) dùng lệnh cscli machines list
bạn sẽ thấy có 2 Crowdsec Agent đã xuất hiện như dưới. Tuy nhiên bây giờ status nó đang có dấu đỏ vì nó vẫn chưa kích hoạt được, giờ hãy tiếp tục làm các bước tiếp theo để hoàn thiện nó.
$ cscli machines list
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Name IP Address Last Update Status Version Auth Type Last Heartbeat
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
81ad445998a76a0c0d2e3e6ba3f67221Oz5ieWhnGfRSOox5 192.168.13.182 2023-08-24T07:33:18Z 🚫 password ⚠️ 2m12s
81ad445998a76a0c0d2e3e6ba3f672210aJzmAadbQRUo6WT 192.168.13.183 2023-08-24T07:34:11Z 🚫 password 1m20s
81ad445998a76a0c0d2e3e6ba3f67221VzzrzjWSitHnXomk 192.168.13.181 2023-08-24T07:35:20Z ✔️ v1.5.2-debian-pragmatic-4fbc3402fba932c8bd34b671527dcf7909d264c0 password 11s
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Theo mặc định, server Local API hoạt động trên tất cả các cài đặt CrowdSec. Tuy nhiên, trong cài đặt này, chúng ta muốn tắt nó trên server-2 và server-3. Để làm điều này, chúng ta cần sửa file dịch vụ systemd của CrowdSec trên cả server-2 và server-3 như sau:
- Sao chép file dịch vụ từ
/lib/systemd/system/crowdsec.service
đến/etc/systemd/system/crowdsec.service
:
sudo cp /lib/systemd/system/crowdsec.service /etc/systemd/system/crowdsec.service
Tiếp theo, chỉnh sửa file /etc/systemd/system/crowdsec.service
và thêm tham số -no-api
vào lệnh gọi CrowdSec agent trên cả server-2 và server-3:
[Unit]
Description=Crowdsec agent
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=notify
Environment=LC_ALL=C LANG=C
PIDFile=/var/run/crowdsec.pid
ExecStartPre=/usr/bin/crowdsec -c /etc/crowdsec/config.yaml -t
ExecStart=/usr/bin/crowdsec -c /etc/crowdsec/config.yaml -no-api
#ExecStartPost=/bin/sleep 0.1
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
Cuối cùng, lưu các thay đổi và khởi động lại dịch vụ CrowdSec trên server-2 và server-3:
sudo systemctl daemon-reload
sudo systemctl restart crowdsec
Sau các bước này, server-2 và server-3 sẽ được phép gửi dữ liệu đến server LAPI trên server-1. Bạn có thể kiểm tra bằng cách chạy lệnh sudo cscli machines list
trên server-1, và nó sẽ hiển thị ba server đã được xác minh nhưng có 2 server chưa được xác nhận.
$ cscli machines list
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Name IP Address Last Update Status Version Auth Type Last Heartbeat
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
81ad445998a76a0c0d2e3e6ba3f67221Oz5ieWhnGfRSOox5 192.168.13.182 2023-08-24T07:33:18Z 🚫 password ⚠️ 2m12s
81ad445998a76a0c0d2e3e6ba3f672210aJzmAadbQRUo6WT 192.168.13.183 2023-08-24T07:34:11Z 🚫 password 1m20s
81ad445998a76a0c0d2e3e6ba3f67221VzzrzjWSitHnXomk 192.168.13.181 2023-08-24T07:35:20Z ✔️ v1.5.2-debian-pragmatic-4fbc3402fba932c8bd34b671527dcf7909d264c0 password 11s
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Bạn sử dụng lệnh sudo cscli machines validate <server-name>
để xác nhận cho phép 2 server này kết nối vào LAPI.
sudo cscli machines validate 81ad445998a76a0c0d2e3e6ba3f67221Oz5ieWhnGfRSOox5
sudo cscli machines validate 81ad445998a76a0c0d2e3e6ba3f672210aJzmAadbQRUo6WT
Đầu ra của nó như sau:
$ sudo cscli machines validate 81ad445998a76a0c0d2e3e6ba3f67221Oz5ieWhnGfRSOox5
INFO[24-08-2023 07:47:38] machine '81ad445998a76a0c0d2e3e6ba3f67221Oz5ieWhnGfRSOox5' validated successfully
$ sudo cscli machines validate 81ad445998a76a0c0d2e3e6ba3f672210aJzmAadbQRUo6WT
INFO[24-08-2023 07:47:38] machine '81ad445998a76a0c0d2e3e6ba3f672210aJzmAadbQRUo6WT' validated successfully
Bây giờ server-2 và server-3 đã được phép đẩy dữ liệu tới LAPI trên server-1. Có thể cần phải khởi động lại CrowdSec trên server-2 và server-3.
sudo systemctl restart crowdsec
Dùng lệnh cscli machines list kiểm tra lại và chúng ta có kết quả.
$ cscli machines list
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Name IP Address Last Update Status Version Auth Type Last Heartbeat
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
81ad445998a76a0c0d2e3e6ba3f67221Oz5ieWhnGfRSOox5 192.168.13.182 2023-08-24T07:48:30Z ✔️ v1.5.2-debian-pragmatic-4fbc3402fba932c8bd34b671527dcf7909d264c0 password 35s
81ad445998a76a0c0d2e3e6ba3f672210aJzmAadbQRUo6WT 192.168.13.183 2023-08-24T07:48:39Z ✔️ v1.5.2-debian-pragmatic-4fbc3402fba932c8bd34b671527dcf7909d264c0 password 26s
81ad445998a76a0c0d2e3e6ba3f67221VzzrzjWSitHnXomk 192.168.13.181 2023-08-24T07:48:20Z ✔️ v1.5.2-debian-pragmatic-4fbc3402fba932c8bd34b671527dcf7909d264c0 password 46s
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Bước 4: Thiết lập bouncers thực thi các hành động.
Bây giờ, chúng ta muốn cài đặt bouncers trên các server đối mặt với internet của chúng ta. Trước tiên, chúng ta phải tạo hai mã thông báo API cho server-2 và server-3 trên server-1.
Tạo hai mã thông báo API cho server-2.
$ sudo cscli bouncers add 192.168.13.182
Api key for '192.168.13.182':
59c43604871bff1732c27f998efcd223
Please keep this key since you will not be able to retrieve it!
Tạo hai mã thông báo API cho server-3.
$ sudo cscli bouncers add 192.168.13.183
Api key for '192.168.13.183':
616af5d9e9b4fd28d5d95f5093470a14
Please keep this key since you will not be able to retrieve it!
Cài đặt và cấu hình chương trình cs-firewall-bouncer
, một phần mở rộng của CrowdSec để thực hiện các biện pháp chặn trên các server đối mặt với internet (trong trường hợp này, server-2 và server-3). Chương trình này cho phép bạn tự động chặn các địa chỉ IP độc hại sử dụng iptables hoặc nftables trên hệ thống của bạn. Dưới đây là các bước chi tiết:
Trước hết, bạn cần tải chương trình cs-firewall-bouncer
từ trang phát hành chính:
wget https://github.com/crowdsecurity/cs-firewall-bouncer/releases/download/v0.0.10/cs-firewall-bouncer.tgz
Giải nén file tải về:
tar zxvf cs-firewall-bouncer.tgz
Di chuyển vào thư mục chương trình cs-firewall-bouncer
:
cd cs-firewall-bouncer-v0.0.10/
Chạy file cài đặt để cài đặt chương trình:
sudo ./install.sh
Nếu server của bạn chưa cài đặt iptables và nftables, script cài đặt sẽ yêu cầu sự cho phép của bạn để cài đặt chúng, hãy xác nhận y
nếu có yêu cầu nhé.. Tương tự, nếu ipset chưa được cài đặt, script cài đặt cũng sẽ yêu cầu sự cho phép để cài đặt nó.
Bạn có thể nhận được thông báo The firewall-bouncer service has been installed!
cài đặt thành công nhưng đồng thời bạn cũng nhận được thông báo Job for cs-firewall-bouncer.service failed because the control process exited with error code. See "systemctl status cs-firewall-bouncer.service" and "journalctl -xe" for details.
cho biết bạn sẽ không khởi động được dịch vụ.
$ sudo ./install.sh
cat: /etc/system-release: No such file or directory
iptables found
nftables is not present
ipset not found, do you want to install it (Y/n)?
y
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
ipset successfully installed
Installing firewall-bouncer
'./cs-firewall-bouncer' -> '/usr/local/bin/cs-firewall-bouncer'
cscli found, generating bouncer api key.
Created symlink /etc/systemd/system/multi-user.target.wants/cs-firewall-bouncer.service → /etc/systemd/system/cs-firewall-bouncer.service.
Job for cs-firewall-bouncer.service failed because the control process exited with error code.
See "systemctl status cs-firewall-bouncer.service" and "journalctl -xe" for details.
The firewall-bouncer service has been installed!
Đừng lo lắng hãy thực hiện các bước tiếp theo để khởi động dịch vụ này. Bây giờ, bạn cần cấu hình chương trình cs-firewall-bouncer
để sử dụng mã thông báo API đã tạo ở bước trước. Sửa file cấu hình /etc/crowdsec/cs-firewall-bouncer/cs-firewall-bouncer.yaml
như sau:
Với Server-2
có IP 192.168.13.182
với api_url
chính là địa chỉ url api đến server LAPI
và api_key
được tạo ra từ lệnh cscli bouncers add
ở bước trên.
mode: iptables
piddir: /var/run/
update_frequency: 10s
daemonize: true
log_mode: file
log_dir: /var/log/
log_level: info
api_url: http://192.168.13.181:8080/
api_key: 59c43604871bff1732c27f998efcd223
disable_ipv6: false
#if present, insert rule in those chains
iptables_chains:
- INPUT
# - FORWARD
# - DOCKER-USER
Với Server-3
có IP 192.168.13.183
với api_url
chính là địa chỉ url api đến server LAPI
và api_key
được tạo ra từ lệnh cscli bouncers add
ở bước trên.
mode: iptables
piddir: /var/run/
update_frequency: 10s
daemonize: true
log_mode: file
log_dir: /var/log/
log_level: info
api_url: http://192.168.13.181:8080/
api_key: 616af5d9e9b4fd28d5d95f5093470a14
disable_ipv6: false
#if present, insert rule in those chains
iptables_chains:
- INPUT
# - FORWARD
# - DOCKER-USER
Khởi động lại dịch vụ chương trình cs-firewall-bouncer
:
sudo systemctl restart cs-firewall-bouncer
Hãy xác nhận dịch vụ cs-firewall-bouncer đã chạy thành công ở 2 server Crowdsec Agent nhé.
$ sudo systemctl status cs-firewall-bouncer
● cs-firewall-bouncer.service - The firewall bouncer for CrowdSec
Loaded: loaded (/etc/systemd/system/cs-firewall-bouncer.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2023-08-24 08:03:28 UTC; 43s ago
Process: 16961 ExecStartPost=/bin/sleep 0.1 (code=exited, status=0/SUCCESS)
Main PID: 16937 (cs-firewall-bou)
Tasks: 10 (limit: 4663)
Memory: 15.1M
CGroup: /system.slice/cs-firewall-bouncer.service
└─16937 /usr/local/bin/cs-firewall-bouncer -c /etc/crowdsec/cs-firewall-bouncer//cs-firewall-bouncer.yaml
Aug 24 08:03:26 crowdsec-183 systemd[1]: Starting The firewall bouncer for CrowdSec...
Aug 24 08:03:26 crowdsec-183 cs-firewall-bouncer[16937]: time="2023-08-24T08:03:26Z" level=info msg="cs-firewall-bouncer v0.0.10-562a0023213b130d0e4cab64b3f6dce6ad419c39"
Aug 24 08:03:28 crowdsec-183 systemd[1]: Started The firewall bouncer for CrowdSec.
Sau các bước này, chương trình cs-firewall-bouncer
đã được cài đặt và cấu hình để thực hiện các biện pháp chặn trên server-2 và server-3. Nó sẽ tự động chặn các địa chỉ IP độc hại sử dụng iptables hoặc nftables dựa trên tín hiệu từ server LAPI trên server-1.
Bước 5 kiểm tra.
Vì trong file /etc/crowdsec/parsers/s02-enrich/whitelists.yaml
của cả 3 Server mặc định subnet 192.168.0.0/16 đang nằm trong danh sách whitelists nên mình sẽ vào xóa nó đi và chỉ whitelists 3 IP trong sơ đồ của mình thôi.
name: crowdsecurity/whitelists
description: "Whitelist events from private ipv4 addresses"
whitelist:
reason: "private ipv4/ipv6 ip/ranges"
ip:
- "127.0.0.1"
- "::1"
cidr:
- "192.168.0.0/16"
- "10.0.0.0/8"
- "172.16.0.0/12"
# expression:
# - "'foo.com' in evt.Meta.source_ip.reverse"
Mình chỉnh lại như sau.
cat > /etc/crowdsec/parsers/s02-enrich/whitelists.yaml << 'OEF'
name: crowdsecurity/whitelists
description: "Whitelist events from private ipv4 addresses"
whitelist:
reason: "private ipv4/ipv6 ip/ranges"
ip:
- "127.0.0.1"
- "::1"
cidr:
- "192.168.13.181/32"
- "192.168.13.182/32"
- "192.168.13.183/32"
- "10.0.0.0/8"
- "172.16.0.0/12"
# expression:
# - "'foo.com' in evt.Meta.source_ip.reverse"
OEF
Chỉnh sửa xong hãy khởi động lại Crowdsec.
sudo systemctl restart crowdsec
Kiểm tra trạng thái của nó.
$ sudo systemctl status crowdsec
● crowdsec.service - Crowdsec agent
Loaded: loaded (/lib/systemd/system/crowdsec.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2023-08-24 08:06:48 UTC; 44s ago
Process: 20229 ExecStartPre=/usr/bin/crowdsec -c /etc/crowdsec/config.yaml -t (code=exited, status=0/SUCCESS)
Main PID: 20254 (crowdsec)
Tasks: 7 (limit: 4663)
Memory: 47.6M
CGroup: /system.slice/crowdsec.service
└─20254 /usr/bin/crowdsec -c /etc/crowdsec/config.yaml
Aug 24 08:06:43 crowdsec-181 systemd[1]: crowdsec.service: Succeeded.
Aug 24 08:06:43 crowdsec-181 systemd[1]: Stopped Crowdsec agent.
Aug 24 08:06:43 crowdsec-181 systemd[1]: Starting Crowdsec agent...
Aug 24 08:06:48 crowdsec-181 systemd[1]: Started Crowdsec agent.
Mình sử dụng IP 192.168.13.227 để test trong trường hợp này. Như bạn đã thấy hiện tại mình vẫn có thể Ping và SSH đến 2 server 192.168.13.182 và 192.168.13.183.
root@pve-node3:~# ip a | grep 192.168.13
inet 192.168.13.227/23 scope global vmbr0
root@pve-node3:~#
root@pve-node3:~# ping -c 4 192.168.13.182
PING 192.168.13.182 (192.168.13.182) 56(84) bytes of data.
64 bytes from 192.168.13.182: icmp_seq=1 ttl=64 time=0.198 ms
64 bytes from 192.168.13.182: icmp_seq=2 ttl=64 time=0.222 ms
64 bytes from 192.168.13.182: icmp_seq=3 ttl=64 time=0.228 ms
64 bytes from 192.168.13.182: icmp_seq=4 ttl=64 time=0.190 ms
--- 192.168.13.182 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3069ms
rtt min/avg/max/mdev = 0.190/0.209/0.228/0.015 ms
root@pve-node3:~# ping -c 4 192.168.13.183
PING 192.168.13.183 (192.168.13.183) 56(84) bytes of data.
64 bytes from 192.168.13.183: icmp_seq=1 ttl=64 time=0.159 ms
64 bytes from 192.168.13.183: icmp_seq=2 ttl=64 time=0.146 ms
64 bytes from 192.168.13.183: icmp_seq=3 ttl=64 time=0.219 ms
64 bytes from 192.168.13.183: icmp_seq=4 ttl=64 time=0.207 ms
--- 192.168.13.183 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3075ms
rtt min/avg/max/mdev = 0.146/0.182/0.219/0.030 ms
Bây giờ trông server 192.168.13.227 mình sẽ ssh liên tục và cố tình không nhập mật khẩu để giả lập giống như đang có cuộc dò tìm thông tin ssh vào server 192.168.13.182 và khi view log bạn sẽ thấy tại LAPI và server 2 đã có log (81ad445998a76a0c0d2e3e6ba3f67221I8KrKU3qIXtThicJ/crowdsec) crowdsecurity/ssh-bf by ip 192.168.13.227 (/0) : 4h ban on Ip 192.168.13.227
chặn IP 192.168.13.227 trong vòng 4 giờ.
Và bây giờ bạn sẽ bị cấm SSH nếu sử dụng IP 192.168.13.227 SSH vào 192.168.13.182.
Tương tự bạn cũng sẽ bị cấm các giao thức khác.
Các server trong mạng Crowdsec đều sẽ áp dụng rule này.
Nếu bạn sử dụng cscli decisions list để xem các danh sách IP bị cấm bạn sẽ thấy IP 192.168.13.227 xuất hiện trong danh sách này.
$ sudo cscli decisions list
╭───────┬──────────┬───────────────────┬──────────────────────┬────────┬─────────┬────┬────────┬────────────────────┬──────────╮
│ ID │ Source │ Scope:Value │ Reason │ Action │ Country │ AS │ Events │ expiration │ Alert ID │
├───────┼──────────┼───────────────────┼──────────────────────┼────────┼─────────┼────┼────────┼────────────────────┼──────────┤
│ 15001 │ crowdsec │ Ip:192.168.13.227 │ crowdsecurity/ssh-bf │ ban │ │ │ 6 │ 3h52m23.933280573s │ 2 │
╰───────┴──────────┴───────────────────┴──────────────────────┴────────┴─────────┴────┴────────┴────────────────────┴──────────╯
Kết luận
Chúng ta đã thiết lập một cài đặt đa server của CrowdSec. Tài nguyên tiêu tốn trên server-2 và server-3 khá hạn chế do hầu hết các nhiệm vụ được thực hiện trên server-1. Điều này cho phép mở rộng cài đặt bằng cách chỉ thực hiện các bước sau:
- Đăng ký và xác minh CrowdSec agent trên server LAPI (Local API).
- Thêm và xác minh các bouncers mới.
Nên lưu ý rằng bouncers và CrowdSec agents không cần phải được cài đặt trên cùng một server. Do đó, CrowdSec agent phải được cài đặt ở nơi tạo ra các bản ghi logs, nhưng việc đối phó có thể thực hiện ở nơi khác.
Tuy nhiên, cần lưu ý rằng có một số hạn chế trong cài đặt này:
- Giao tiếp giữa các agent được thực hiện qua HTTP không mã hóa. Điều này chấp nhận được trên mạng local nhưng không thể thực hiện qua Internet. CrowdSec cho phép sử dụng HTTPS cho các giao tiếp này, và một bài viết tiếp theo sẽ đề cập đến chủ đề này.
- Theo dõi hoặc cảnh báo không được đề cập trong bài viết này. CrowdSec cho phép theo dõi mạnh mẽ thông qua trình lấy dữ liệu Prometheus. Một bài viết sẽ đề cập đến chủ đề này.
- DB của CrowdSec không có tính sẵn có cao. Hơn nữa, agent CrowdSec trên server-1 là một điểm thất bại duy nhất.
Bây giờ có thể bạn đang tự hỏi: làm thế nào để xây dựng một cài đặt CrowdSec đa server có tính sẵn có cao? Hãy tiếp tục theo dõi bài viết tiếp sau này của tôi.