침입 방지 시스템 (IPS)으로 Suricata 구성하기

사이버 범죄의 인기가 높아지면서 기업들은 해커에 대한 보다 효과적인 보호가 필요합니다. 침입 방지 시스템 (IPS)은 컴퓨터 공격에 대항하기 위한 최상의 방법 중 하나입니다. 그러나 IPS를 찾기 전에 Suricata를 한 번 시도해보세요.

이 튜토리얼에서는 Linux 서버에서 완전히 기능하는 Suricata IPS를 구성하여 온라인 위협으로부터 네트워크를 보호하는 방법을 배우게 될 것입니다.

준비되셨나요? 계속 읽고 네트워크를 보호하기 시작하세요!

전제 조건

이 튜토리얼은 실습을 통해 설명됩니다. 함께 따라하려면 다음 사항이 필요합니다:

  • A Linux server – This demo uses Ubuntu 20.04 LTS, but any Linux distribution will work.
  • A non-root user with sudo privileges.
  • 네트워크 구성 및 Suricata 사용 방법에 따라 서버에 대해 더 많거나 적은 CPU 및 RAM이 필요할 수 있습니다. 일반적으로 검사할 트래픽이 많을수록 Suricata에 할당하는 자원도 많아집니다. 개발 환경에서는 Suricata가 모든 사용자의 서비스 품질을 저하시키지 않고 작업을 수행할 수 있도록 최소한 2개의 CPU와 8GB의 RAM을 사용할 계획을 세우세요.

Suricata 설치 및 PPA 저장소 추가하기

Suricata는 Ubuntu에 기본적으로 설치되어 있지 않지만, Suricata를 설치하는 방법은 시스템에 다른 패키지를 설치하는 방법과 유사합니다.

1. 시스템에서 사용 가능한 패키지를 업데이트하려면 apt update 명령을 실행하십시오.

sudo apt update -y
Updating the list of available packages

2. 다음으로, add-apt-repository 명령을 실행하여 Open Information Security Foundation (OISF)가 유지 관리하는 PPA 저장소를 추가하십시오. PPA 저장소를 추가하면 Suricata의 최신 안정 버전(ppa:oisf/suricata-stable)을 얻게 됩니다.

sudo add-apt-repository ppa:oisf/suricata-stable
Adding the PPA repository for Suricata

3. 새로 추가된 Suricata 저장소를 시스템 패키지 인덱스에 로드하려면 sudo apt update 명령을 다시 실행하십시오.

sudo apt update -y

4. 이제 Suricata PPA가 올바르게 추가되었는지 확인하기 위해 sudo apt policy 명령을 실행하십시오. Suricata PPA가 아래에 표시된 것처럼 목록에 표시되는지 확인하십시오. Suricata를 설치하기 전에 이 단계를 완료해야 합니다.

sudo apt policy
Running the sudo apt policy

5. 시스템에 suricata를 설치하려면 다음 명령을 실행하십시오.

sudo apt install suricata -y
Installing Suricata on your system

6. 설치가 완료되면 아래의 systemctl status 명령을 실행하여 suricata 서비스 상태를 확인하십시오.

sudo systemctl status suricata

아래에서 Suricata 서비스가 활성화(실행 중)되어 있는 것을 볼 수 있습니다.

Checking the Suricata service status

Suricata 구성

Suricata 패키지는 suricata.yaml이라는 구성 파일을 포함하고 있으며 /etc/suricata 디렉토리에 위치해 있습니다. 이 구성 파일에는 다양한 사용 사례를 위한 많은 다른 설정이 있습니다. 그러나 Suricata를 사용하기 전에 기본 구성 파일의 몇 가지 설정을 조정해야 합니다.

Suricata의 기본 모드는 침입 감지(IDS) 모드로, 트래픽을 기록하지만 삭제하지는 않습니다. 이 모드는 Suricata를 구성하고 익히기 위해 사용됩니다. Suricata에 더 익숙해지고 Suricata가 경고할 트래픽 유형을 더 잘 이해하면 IPS 모드를 사용하도록 선택할 수 있습니다.

Suricata는 JSON 형식의 필드를 추가합니다(커뮤니티 플로 ID). 커뮤니티 플로 ID는 다른 도구에서 생성된 레코드를 연관시킬 수 있는 8바이트 필드입니다. 이 기능은 Suricata를 Bro 또는 Elasticsearch와 같은 다른 도구와 함께 사용할 때 유용합니다.

1. 좋아하는 텍스트 편집기에서 /etc/suricata/suricata.yaml 파일을 엽니다.

2. 다음 줄을 찾아서 community-id: falsecommunity-id: true로 변경하십시오. 변경 사항을 저장하고 텍스트 편집기에서 나옵니다.

이벤트를 조사할 때마다 JSON 출력에서 커뮤니티 플로우 ID를 볼 수 있습니다.

Enabling Community ID

다음으로 시스템에서 기본 경로가 있는 장치를 찾으려면 다음 명령을 실행하십시오 (route show default). -p 플래그는 ip 명령이 장치를 인간이 읽을 수 있는 방식으로 출력하도록하며, -j 플래그는 JSON 출력을 출력합니다.

Suricata는 기본적으로 사용 가능한 네트워크 인터페이스에서 데이터 패킷을 스니핑하도록 구성됩니다. 그러나 Suricata가 시작될 때 듣기 위한 인터페이스를 지정하여 이 동작을 변경할 수 있습니다.

 ip -p -j route show default

아래에서 보는 바와 같이, dev 매개 변수는 Suricata가 데이터 패킷을 스니핑하는 데 사용할 인터페이스를 지정합니다. 이 데모에서 인터페이스는 eth0이지만 인터페이스는 tun0, wlan0 등과 같이 다를 수 있습니다.

Previewing the Network Interface

4. 마지막으로, /etc/suricata/suricata.yaml 구성 파일을 열고 af-packet 섹션 아래의 interface 매개 변수를 해당되는 대로 수정하십시오. 이 데모에서는 데이터 패킷을 스니핑하는 데 eth0이 인터페이스로 사용됩니다.

변경 사항을 저장하지만 현재 텍스트 편집기를 열어 둡니다.

Editing the /etc/suricata/suricata.yaml configuration file

실시간 규칙 리로딩 기능 설정

이제 Suricata를 구성했지만, 이것은 단지 귀하의 네트워크를 보호하기 위한 시작일 뿐입니다. 일반적으로 규칙을 즉시 추가하고 규칙을 자동으로 다시로드하려면 어떻게 해야 할까요? Suricata의 라이브 규칙 다시로드 기능을 사용하면 규칙을 실시간으로 업데이트할 수 있습니다. 결과적으로 Suricata를 수동으로 다시 시작하지 않아도 새로운 규칙이 적용됩니다.

/etc/suricata/suricata.yaml 파일을 열어 다음 지시문을 파일 내용의 맨 아래에 복사하여 변경 사항을 저장하십시오. 이러한 지시문을 사용하면 라이브 규칙 다시로드 기능을 활성화할 수 있습니다.

이 설정이 적용되면 규칙 세트를 편집/업데이트할 때 Suricata 서비스를 다시 시작하지 않고 변경 사항이 적용됩니다.

detect-engine:
  - rule-reload: true
Setting up the Live Rule Reloading

이제 아래의 kill 명령을 실행하여 Suricata 프로세스($(pidof suricata))에게 규칙을 다시 로드하도록 알립니다.

이 명령은 사용자 정의 신호(-usr2)를 지정된 프로세스 ID에 보내고 나서 Suricata가 다음을 자동으로 수행합니다:

  • 새 구성을 로드하여 규칙 변수 및 값 업데이트
  • 새 규칙 로드
  • 새로운 탐지 엔진 생성
  • 이전 및 새로운 탐지 엔진 교체
  • 모든 스레드가 업데이트되었는지 확인
  • 이전 탐지 엔진 해제
sudo kill -usr2 $(pidof suricata)

Suricata 규칙 세트 업데이트

라이브 규칙 다시로드 기능이 준비되었지만 규칙 세트를 업데이트하지 않으면 목적이 없습니다. 기본적으로 Suricata 패키지에는 /etc/suricata/rules 디렉터리에 위치한 가장 일반적인 인터넷 프로토콜만 감지하는 제한된 규칙 세트가 있습니다.

이 시점에서 Suricata 서비스를 시작하고 사용하려고 할 때, 아래와 같은 패턴과 일치하는 규칙 파일이 없다는 오류 메시지를 받게 됩니다. 이 오류 메시지는 Suricata가 사용할 규칙 세트가 없음을 나타냅니다.

Previewing Error Message when No Rulesets Exist

이 오류를 해결하려면 Suricata 인스턴스에 규칙 세트 파일을 제공하십시오. 다행히도 Suricata에는 타사 제공업체로부터 추가 규칙 세트를 가져올 수 있는 suricata-update라는 도구가 있습니다.

1. 아래 명령을 실행하여 Suricata 인스턴스를 업데이트하십시오.

sudo suricata-update

다음 출력에서 알 수 있듯이, 출력은 suricata-update 명령이 https://rules.emergingthreats.net/open/에 연결하여 규칙을 가져오고, 새로운 규칙을 /var/lib/suricata/rules/ 디렉토리에 저장했음을 나타냅니다..

출력에는 또한 다음과 같은 내용이 출력됩니다:

  • 총 규칙 세트 수(31737)
  • 활성화된 규칙 수(24355)
  • 추가된(31737)/제거된(0) 규칙 수.
Updating Your Suricata Rulesets

다음으로, 명령을 실행하여 모든 규칙 세트 제공업체(list-sources)를 나열하십시오.

suricata-update 명령은 무료 및 상용 제공자를 포함하여 다양한 제공업체로부터 규칙 세트를 가져옵니다.

sudo suricata-update list-sources

아래에서는 목록의 일부를 볼 수 있습니다. Suricata가 특정 규칙 세트를 가져오도록 원하는 규칙 세트 이름을 확인하십시오. 이 튜토리얼에서는 데모를 위해 et/open 규칙 세트를 가져옵니다 (세 번째 단계).

Listing all ruleset providers

3. 아래 명령을 실행하여 Suricata 룰에 (enable-source) et/open 규칙 세트를 가져오고 포함하세요.

sudo suricata-update enable-source et/open
Fetching the et/open rulesets

마지막으로, suricata-update 명령을 다시 실행하여 새로 선택한 규칙 세트를 로드하세요.

sudo suricata-update

Suricata 구성 유효성 검사

Suricata를 구성하고 규칙 세트를 추가했습니다. 이제 변경 내용을 검증하고 모든 것이 예상대로 작동하는지 확인하는 시간입니다. Suricata 패키지에는 현재 구성에서의 어떠한 이탈도 볼 수 있는 내장된 유효성 검사 서비스가 있습니다.

아래의 suricata 명령을 실행하여 Suricata 구성 파일의 변경 사항을 유효성 검사하세요 (-c /etc/suricata/suricata.yaml). 이 명령은 또한 모든 유효성 검사 메시지를 표시합니다 (-v).

-T 플래그는 Suricata가 “테스트 모드” 및 “상향식” 모드에서 실행되도록 지시합니다. 두 모드 모두 데이터 패킷과 일치시키기 위한 보다 엄격한 규칙을 가지고 있으며 잘못된 양성 결과를 덜 생성할 가능성이 높습니다.

sudo suricata -T -c /etc/suricata/suricata.yaml -v

Suricata는 매우 구성 가능한 방화벽이므로 테스트에는 몇 분이 걸릴 수 있습니다. 오류가 없으면 아래와 유사한 출력을 보게 될 것입니다. 여기에는 완료 메시지가 표시됩니다.

Validating Your Suricata Configuration: complete

구성 파일에 이와 유사한 오류가 있는 경우 Suricata는 각 오류를 출력하여 문제를 일으키는 특정 라인을 나타냅니다. 이러한 오류가 발생하면 각 구성 문제를 하나씩 수정하여 검증이 성공할 때까지 진행하세요.

Validating Your Suricata Configuration: errors

Suricata 규칙 테스트

이제 Suricata 구성 파일이 유효성을 검사했으므로 Suricata를 실행하여 올바르게 작동하는지 확인할 수 있습니다. Suricata를 사용하여 의심스러운 활동/트래픽을 감지하기 위해 curl 명령을 사용하여 ET Open(2100498))를 테스트합니다.

현재 Suricata 인스턴스에는 다양한 규칙 세트에서 가져온 30,000개 이상의 규칙이 있습니다. 모든 규칙을 설명과 함께 풀 테스트하는 것은 이 튜토리얼에 맞지 않습니다.

1. 아래의 curl 명령을 실행하여 TestMyNIDS 웹사이트에서 트래픽/HTTP 요청/활동을 생성합니다. TestMyNIDS는 NIDS 테스트, 유효성 검사 및 비교를 지원하기 위한 e-러닝 프로젝트입니다. 이 웹사이트는 NIDS 및 관련 도구의 비교 분석을 위한 독특한 플랫폼을 제공합니다.

이 웹사이트를 사용하여 구성된 규칙 세트가 예상대로 작동하는지 확인하기 위해 의심스러운 활동/트래픽을 테스트할 수 있습니다.

curl http://testmynids.org/uid/index.html

응답 데이터는 위장된 Linux/Unix root 사용자를 가정한 가짜 경고를 트리거하도록 설계되어 있습니다. 이 root 사용자는 침해될 수 있는 시스템에 있습니다.

Testing Your Suricata Rules

다음으로, 아래의 grep 명령을 실행하여 /var/log/suricata/ 디렉토리의 fast.log 파일을 일치하는 경고 메시지 2100498을 확인합니다. 이 명령은 사용자 경고를 위해 로그 파일을 확인합니다.

fast.log 파일 외에도 같은 디렉토리에서 주의해야 할 또 다른 로그 파일은 eve.log입니다.

grep 2100498 /var/log/suricata/fast.log

아래와 유사한 출력을 볼 수 있으며, 여기에는 시스템의 공용 IPv4 주소가 표시됩니다.

Examining the fast.log file

3. 이제 아래의 jq 명령을 실행하여 eve.log 파일을 검사합니다. eve.log 파일은 또한 이벤트를 로깅하지만 JSON 형식(/var/log/suricata/eve.json)으로 사용됩니다. eve.jsonfast.log 파일은 의심스러운 트래픽과 차단된 시도를 참조하기 위해 사용됩니다. 발견되면 필요한 조치를 취하십시오.

jq 'select(.alert .signature_id==2100498)' /var/log/suricata/eve.json

아래에서는 지정한 명령에서 경고 시그니처 ID인 “signature_id”: 2100498을 출력에서 볼 수 있습니다.

또한 /etc/suricata/suricata.yaml 파일에서 설정한 커뮤니티 플로우 ID인 “community_id”: “1:ETRbv54GHTVCayHTUR5OIovK4gh2=”을 출력에서 볼 수 있습니다.

community_id는 Elasticsearch와 같은 다른 도구와 함께 Suricata를 사용할 때 비교적 저렴한 비용으로 전체 “보안 모니터링 스택”을 얻기 위해 유용합니다.

Examining the eve.log file

결론

이 튜토리얼을 통해 네트워크를 보호하기 위해 Suricata를 설치하고 규칙 세트를 구성하는 방법을 배웠습니다. 또한 네트워크에서 트래픽을 생성하여 규칙 세트가 작동하는지 테스트하는 과정을 거쳤습니다.

이 시점에서 Suricata는 네트워크에서 의심스러운 활동/트래픽을 감지하기 위해 사용자 지정 규칙 세트와 함께 완벽하게 실행되고 있습니다.

지금이면 이 새로 얻은 지식을 기반으로 확장해 볼 만합니다. 어쩌면 Suricata, Zeek, Elasticsearch 스택을 설치하고 구성하여 완전한 “보안 모니터링 스택”을 구축하는 것부터 시작해보는 것은 어떨까요?

Source:
https://adamtheautomator.com/suricata/