본문 바로가기
서버인프라/crowdsec

Crowsec을 통한 SSH Brute Force 방어

by techwold ted 2023. 9. 20.

crowdsec 설치와 설정에 관한 사항은 넘어가겠습니다.
설치 및 사용이 간편하고, cli지원이 잘 되어 있어 링크로 대신 하겠습니다.

https://doc.crowdsec.net/docs/getting_started/install_crowdsec

 

Linux | CrowdSec

For those that prefer hands-on approach, you can as well manually install crowdsec.

docs.crowdsec.net

너무도 친절하게 설명이 잘 되어 있어서 설치 하는 방법을 안내하는 것이 적절하지 않다고 생각 됩니다.

 

이번에는 SSH bf 공격을 어떻게 crowdsec이 방어하는지에 대해 알아 보려 합니다.

ssh all 오픈 하고 사용 하는 경우가 클라우드로 넘어오면서 줄긴 했지만 아직도 가끔 실수로 인하여, 발생하는 경우가 있는것 같습니다. 특히 클라우드를 사용하지 않는 곳에서, 방화벽이 되어 있지않는 곳에서 사실 클라우드는 비쌉니다. 하지만 네트워크 구성 최초구성 시 서버 딜리버리등 시간적 요소들을 생각한다면 대부분 클라우드로 갑니다. 하지만 스타트업에서 그보다 적은 비용으로도 개발 생산 할 수 있다는 생각을 해봤으면 합니다.

 

그럼 본격적으로 Crowdsec구조를 보겠습니다.

tree -d /etc/crowdsec/
/etc/crowdsec/
├── bouncers
├── collections
├── console
├── hub
│   ├── collections
│   │   └── crowdsecurity
│   ├── parsers
│   │   ├── s00-raw
│   │   │   └── crowdsecurity
│   │   ├── s01-parse
│   │   │   └── crowdsecurity
│   │   └── s02-enrich
│   │       └── crowdsecurity
│   └── scenarios
│       ├── crowdsecurity
│       └── ltsich
├── notifications
├── parsers
│   ├── s00-raw
│   ├── s01-parse
│   └── s02-enrich
├── patterns
└── scenarios

23 directories

이런 디렉 토리 구조를 가지고 있습니다. 여기서 우리는 맨 처음 "parsers" 디렉토리를 들여다 봐야 합니다.

"/etc/crowdsec/parsers/s02-enrich" 디렉토리로 가서 아래와 같이 whitelists.yaml파일을 열어 줍니다.

vi /etc/crowdsec/parsers/s02-enrich/whitelists.yaml

RFC1918에서 규정한 사설 IP 주소의 범위를 가지고 있습니다.

  cidr:
    - "192.168.0.0/16"
    - "10.0.0.0/8"
    - "172.16.0.0/12"

우리는 여기서 테스트 해야 하는 대역을 제거하고 시작해야 합니다.

우리가 테스트 하기위해서 2대의 서버가 필요합니다. 그렇지 않으면 내 PC에서 테스트한다 가정한다면 우린 해당 서버에 4시간 동안 접속 못할 수 있습니다. 콘솔이 있다면 가능 하겠지만 그렇지 않다면,ㅠ

물론 로컬에서 VirtualBox, VMWare등을 사용한다면 큰 문제가 되지는 않을 것입니다. 하지만 우리는 최대한 운영환경에서 할때처럼 문제 없이 진행해야 합니다 테스트도, 습관이 중요하니까요...

 

다음 구조로 테스트 할 것입니다. 서버를 2대 생성해서 한대는 SSH를 허용한 상태에서 진행하시면 됩니다.

private망에서 하실 것을 권장 합니다. 

위에서 정상적으로 설치가 crowdsec이 설치가 되면 cscli명령어를 사용 할 수 있습니다.

cscli help

우린 여기서 두가지를 확인해야합니다. 첫 시간에 확인했던 구조에서 bouncer와 scenarios를 알아야 합니다.

cscli bouncers list

위 명령어를 실행 했을시 아래와 같이 보인다면 잘 설치 된 것입니다.

그리고 다음으로 확인해야 할 것이 아래 명령어 입니다.

cscli scenarios list

아래와 같은 결과가 나온다면 우린 이제ssh-bf에 대한 테스트 진행이 가능 한 것입니다.

 

테스트 시작

우선 SSH 가 오픈되어 있는 서버에  crowdsec이 설치 되어 있으니 지금부터 확인해 보도록 합니다. 우선 다음과 같이 

tail 명령어를 사용하여 log 파일을 열어줍니다.

tail -f /var/log/crowdsec.log

그리고 또다른 서버에서 ssh 접속을 시도합니다.

10.0.2.227서버에 접속을 시도 했고 일부로 password를 틀렸습니다.

# ssh ted@10.0.2.227
ted@10.0.2.227's password:
Permission denied, please try again.
ted@10.0.2.227's password:
Permission denied, please try again.
ted@10.0.2.227's password:
ted@10.0.2.227: Permission denied (publickey,password).
root@docker-repo:/home/ted# ssh ted@10.0.2.227
ted@10.0.2.227's password:
Permission denied, please try again.
ted@10.0.2.227's password:
Permission denied, please try again.
ted@10.0.2.227's password:
ted@10.0.2.227: Permission denied (publickey,password).

그리고 5번째 실패했을때 아래와 같이 실패 로그가 확인되었습니다.

time="20-09-2023 06:29:26" level=info msg="Ip 10.0.2.99 performed 'crowdsecurity/ssh-bf' (6 events over 3.184099072s) at 2023-09-20 06:29:26.933682902 +0000 UTC"
time="20-09-2023 06:29:27" level=info msg="(5f274281615046f78218d9798feab3b8u9yBx16KRt3IAy4j/crowdsec) crowdsecurity/ssh-bf by ip 10.0.2.99 (/0) : 4h ban on Ip 10.0.2.99"
time="20-09-2023 06:29:28" level=info msg="Signal push: 1 signals to push"

10.0.2.99 에서 ssh-bf에 해당하는 공격이 발생되어 해당 IP를 ban처리 했다는 내용입니다.

그럼 ban처리된 사항을 확인 하며 마무리 하겠습니다.

cscli decisions list
╭────────┬──────────┬──────────────┬──────────────────────┬────────┬─────────┬────┬────────┬────────────────────┬──────────╮
│   ID   │  Source  │ Scope:Value  │        Reason        │ Action │ Country │ AS │ Events │     expiration     │ Alert ID │
├────────┼──────────┼──────────────┼──────────────────────┼────────┼─────────┼────┼────────┼────────────────────┼──────────┤
│ 240004 │ crowdsec │ Ip:10.0.2.99 │ crowdsecurity/ssh-bf │ ban    │         │    │ 6      │ 3h54m51.696997161s │ 32       │
╰────────┴──────────┴──────────────┴──────────────────────┴────────┴─────────┴────┴────────┴────────────────────┴──────────╯

4시간 동안 차단 한다는 것을 알수 있습니다.

강제로 해제 하기 위해서는 다음과 같이 사용하시면 됩니다.

# cscli decisions delete --id 240004
# cscli decisions list
No active decisions

fail2ban에서도 지원했던 기능이긴 합니다. 하지만 안으로 들어가보면 다른 로직들이 많이 숨어 있습니다. 그리고 여기서 우리는 의문점 하나를 가져야 합니다. 왜 4시간이 적용된 것인지.....

 

'서버인프라 > crowdsec' 카테고리의 다른 글

CrowSec expiration 조정과 scenarios  (57) 2023.09.28
CrowdSec 을 사용해보자  (29) 2023.09.19

댓글