Rocky Linux 8에서 Elastic Stack과 함께 Suricata IDS를 설치 및 구성하는 방법
이 페이지에서
- 전제 조건
- 방화벽 구성\n
- 1부
- 1단계 - Suricata 설치
- 2단계 - Suricata 구성
- 커뮤니티 ID 활성화\n
- 네트워크 인터페이스 선택
- 라이브 규칙 새로고침
- 디렉토리 권한 구성\n
- 규칙 집합 공급자 추가\n
- 방화벽 구성\n
- Elasticsearch 시작
- Elasticsearch 비밀번호 만들기\n
- Kibana 포트 구성
- Kibana 액세스 구성
- Kibana 시작하기\n
- SSH 로컬 터널 사용
- Nginx 리버스 프록시 사용\n
- 방화벽 구성\n
- SSL 설치 및 구성
- Nginx 설치 및 구성
Suricata는 서버를 통과하는 모든 인터넷 트래픽 패킷을 검사하고 처리하는 네트워크 모니터링 도구입니다. 의심스러운 활동이 감지되면 로그 이벤트를 생성하고 알림을 트리거하며 트래픽을 삭제할 수 있습니다.
단일 시스템에 Suricata를 설치하여 해당 트래픽을 모니터링하거나 게이트웨이 호스트에 배포하여 연결된 다른 서버에서 들어오고 나가는 모든 트래픽을 스캔할 수 있습니다. Suricata를 Elasticsearch, Kibana 및 Filebeat와 결합하여 보안 정보 및 이벤트 관리(SIEM) 도구를 생성할 수 있습니다.
이 튜토리얼에서는 Rocky Linux 8 서버에 ElasticStack과 함께 Suricata IDS를 설치합니다. 스택의 다양한 구성 요소는 다음과 같습니다.
- Elasticsearch는 서버에서 보안 이벤트를 저장, 인덱싱, 연관 및 검색합니다.\n
- Kibana는 Elasticsearch에 저장된 로그를 표시합니다.\n
- Suricatas
eve.json
로그 파일을 구문 분석하고 처리를 위해 각 이벤트를 Elasticsearch로 보내는 Filebeat.\n - Suricata는 의심스러운 이벤트에 대한 네트워크 트래픽을 스캔하고 유효하지 않은 패킷을 삭제합니다.\n
튜토리얼은 두 부분으로 나누어져 있는데, 첫 번째 부분은 Suricata 설치 및 구성을 다루고 두 번째 부분은 Elastic Stack 설치 및 구성을 다룹니다.
튜토리얼을 위해 Suricata와 Elastic 스택을 서로 다른 서버에 설치합니다.
전제 조건
-
The servers hosting the Elastic Stack and Suricata should have a minimum of 4GB RAM and 2 CPU cores.
-
The servers should be able to communicate with each other using private IP addresses.
-
The servers should be running Rocky Linux 8 with a non-root sudo user.
-
If you want to access Kibana dashboards from everywhere, set up a domain (
kibana.example.com
) pointing to the server where Suricata will be installed. -
Install essential packages on both servers.
$ sudo dnf install yum-utils nano curl
방화벽 구성
1 부
1단계 - Suricata 설치
Suricata를 설치하려면 OISF(Open Information Security Foundations) 패키지 리포지토리를 서버에 추가해야 합니다.
$ sudo dnf install 'dnf-command(copr)' $ sudo dnf copr enable @oisf/suricata-6.0
첫 번째 명령은
dnf
패키지 설치 프로그램에 대한 커뮤니티 프로젝트(copr
)를 활성화합니다. 두 번째 명령은 OISF 저장소를 활성화하고 시스템에 추가합니다.suricata-6.0
은 소프트웨어의 안정적인 최신 버전에 대한 리포지토리를 활성화합니다. 프롬프트가 표시될 때마다y
및ENTER
를 누르십시오.다음으로 EPEL 저장소를 추가합니다.
$ sudo dnf install epel-release
수리카타를 설치합니다.
$ sudo dnf install suricata
Suricata 서비스를 활성화합니다.
$ sudo systemctl enable suricata
2단계 - Suricata 구성
Suricata는 구성을
/etc/suricata/suricata.yaml
파일에 저장합니다. Suricata의 기본 모드는 IDS(침입 탐지 시스템) 모드로, 트래픽이 기록만 되고 중지되지는 않습니다. Suricata를 처음 사용하는 경우 모드를 변경하지 않은 상태로 두어야 합니다. 구성하고 자세히 알아보면 IPS(침입 방지 시스템) 모드를 켤 수 있습니다.커뮤니티 ID 활성화
커뮤니티 ID 필드를 사용하면 서로 다른 모니터링 도구에서 생성된 레코드 간에 데이터를 더 쉽게 연관시킬 수 있습니다. Elasticsearch와 함께 Suricata를 사용할 것이므로 커뮤니티 ID를 활성화하는 것이 유용할 수 있습니다.
편집을 위해
/etc/suricata/suricata.yaml
파일을 엽니다.$ sudo nano /etc/suricata/suricata.yaml
# Community Flow ID
줄을 찾아 변수community-id
의 값을true
로 설정합니다.. . . # Community Flow ID # Adds a 'community_id' field to EVE records. These are meant to give # records a predictable flow ID that can be used to match records to # output of other tools such as Zeek (Bro). # # Takes a 'seed' that needs to be same across sensors and tools # to make the id less predictable. # enable/disable the community id feature. community-id: true . . .
이제 이벤트에는 다양한 모니터링 도구에서 데이터 세트를 일치시키는 데 사용할 수 있는
1:S+3BA2UmrHK0Pk+u3XH78GAFTtQ=
와 같은 ID가 있습니다.네트워크 인터페이스 선택
기본 Suricata 구성 파일은
eth0
장치/네트워크 인터페이스에서 트래픽을 검사합니다. 서버가 다른 네트워크 인터페이스를 사용하는 경우 구성에서 업데이트해야 합니다.다음 명령을 사용하여 네트워크 인터페이스의 장치 이름을 확인하십시오.
$ ip -p -j route show default
다음과 같은 출력을 받게 됩니다.
[ { "dst": "default", "gateway": "164.90.192.1", "dev": "eth0", "protocol": "static", "metric": 100, "flags": [ ] } ]
dev
변수는 네트워킹 장치를 나타냅니다. 출력에서eth0
이 네트워킹 장치로 표시됩니다. 출력은 시스템에 따라 다를 수 있습니다.이제 장치 이름을 알았으므로 구성 파일을 엽니다.
$ sudo nano /etc/suricata/suricata.yaml
라인 번호 580 주변에서
af-packet:
라인을 찾습니다. 그 아래에서interface
변수 값을 시스템의 장치 이름으로 설정합니다.# Linux high speed capture support af-packet: - interface: eth0 # Number of receive threads. "auto" uses the number of cores #threads: auto # Default clusterid. AF_PACKET will load balance packets based on flow. cluster-id: 99 . . .
추가 인터페이스를 추가하려면
af-packet
섹션 하단 650행 부근에 인터페이스를 추가하면 됩니다.새 인터페이스를 추가하려면 아래와 같이
-interface: default
섹션 바로 위에 삽입하십시오.# For eBPF and XDP setup including bypass, filter and load balancing, please # see doc/userguide/capture-hardware/ebpf-xdp.rst for more info. - interface: enp0s1 cluster-id: 98 ... - interface: default #threads: auto #use-mmap: no #tpacket-v3: yes
예제에서 새로운 인터페이스
enp0s1
과cluster-id
변수의 고유 값을 추가했습니다. 추가하는 모든 인터페이스에 고유한 클러스터 ID를 포함해야 합니다.라이브 규칙 다시 로드
규칙을 추가, 제거 및 편집할 때마다 Suricata를 다시 시작해야 합니다. Live Rule을 활성화하면 Suricata는 다시 시작하지 않고도 모든 규칙 변경 사항을 처리할 수 있습니다.
실시간 재로딩을 활성화하려면 구성 파일의 맨 아래에 다음 행을 추가하십시오.
. . . detect-engine: - rule-reload: true
라이브 다시 로드가 활성화되면 다음 명령을 사용하여 Suricata 프로세스를 다시 시작하지 않고 규칙을 다시 로드할 수 있습니다.
$ sudo kill -usr2 $(pidof suricata)
$ (pidof suricata)
플래그는 Suricata 프로세스의 프로세스 ID를 찾습니다.kill
명령의-usr2
부분은 Suricata 프로세스에SIGUSR2
신호를 보냅니다.SIGUSR2
신호는 규칙을 다시 로드하도록 Suricata로 구성됩니다.완료되면 Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.
디렉터리 권한 구성
Suricata는 설치 프로세스 중에
suricata
라는 시스템 사용자 및 그룹을 자동으로 생성했습니다. 설치가 제대로 작동하려면 적절한 디렉토리 권한을 부여해야 합니다.다음 명령을 실행하여
suricata
를 Suricatas 디렉터리의 그룹으로 설정합니다.$ sudo chgrp -R suricata /etc/suricata $ sudo chgrp -R suricata /var/lib/suricata/rules $ sudo chgrp -R suricata /var/lib/suricata/update $ sudo chgrp -R suricata /var/log/suricata
읽기 및 쓰기에 대한 그룹 권한을 설정합니다.
$ sudo chmod -R g+r /etc/suricata/ $ sudo chmod -R g+rw /var/lib/suricata/rules $ sudo chmod -R g+rw /var/lib/suricata/update $ sudo chmod -R g+rw /var/log/suricata
sudo 없이 직접 작업을 수행할 수 있도록 현재 사용자 이름을 suricata 그룹에 추가합니다.
$ sudo usermod -a -G suricata $USER
새 그룹 구성원을 적용하려면 서버에서 로그아웃했다가 다시 로그인하거나 다음을 입력하십시오.
$ su - ${USER}
계속하려면 사용자 비밀번호를 입력하라는 메시지가 표시됩니다.
다음을 입력하여 사용자가 이제 suricata 그룹에 추가되었는지 확인합니다.
$ id -nG username sudo suricata
3단계 - Suricata 규칙 구성
Suricata는 기본적으로 제한된 규칙 세트만 사용하여 네트워크 트래픽을 감지합니다.
suricata-update
라는 도구를 사용하여 외부 공급자로부터 더 많은 규칙 세트를 추가할 수 있습니다. 추가 규칙을 포함하려면 다음 명령을 실행하십시오.$ suricata-update 16/2/2022 -- 07:00:16 - <Info> -- Using data-directory /var/lib/suricata. 16/2/2022 -- 07:00:16 - <Info> -- Using Suricata configuration /etc/suricata/suricata.yaml 16/2/2022 -- 07:00:16 - <Info> -- Using /usr/share/suricata/rules for Suricata provided rules. ..... 16/2/2022 -- 07:00:16 - <Info> -- No sources configured, will use Emerging Threats Open ('https://rules.emergingthreats.net/open/suricata-6.0.4/emerging.rules.tar.gz', None, True) 16/2/2022 -- 07:00:16 - <Info> -- Checking https://rules.emergingthreats.net/open/suricata-6.0.4/emerging.rules.tar.gz.md5. 16/2/2022 -- 07:00:16 - <Info> -- Fetching https://rules.emergingthreats.net/open/suricata-6.0.4/emerging.rules.tar.gz. 100% - 3162050/3162050 ..... 16/2/2022 -- 07:00:23 - <Info> -- Writing rules to /var/lib/suricata/rules/suricata.rules: total: 32004; enabled: 24611; added: 8; removed 1; modified: 1218 16/2/2022 -- 07:00:23 - <Info> -- Writing /var/lib/suricata/rules/classification.config 16/2/2022 -- 07:00:23 - <Info> -- Testing with suricata -T. 16/2/2022 -- 07:01:16 - <Info> -- Done.
규칙 세트 공급자 추가
더 많은 공급자를 추가하여 Suricatas 규칙을 확장할 수 있습니다. 다양한 무료 및 상업용 공급자로부터 규칙을 가져올 수 있습니다.
다음 명령을 사용하여 기본 공급자 목록을 나열할 수 있습니다.
$ suricata-update list-sources
예를 들어
tgreen/hunting
규칙 세트를 포함하려는 경우 다음 명령을 사용하여 활성화할 수 있습니다.$ suricata-update enable-source tgreen/hunting
suricata-update
명령을 다시 실행하여 새 규칙을 다운로드하고 업데이트합니다.4단계 - Suricata 구성 확인
Suricata는 구성 파일과 오류 규칙을 확인하는 유효성 검사 도구와 함께 제공됩니다. 다음 명령을 실행하여 유효성 검사 도구를 실행합니다.
$ sudo suricata -T -c /etc/suricata/suricata.yaml -v 22/2/2022 -- 23:20:10 - <Info> - Running suricata under test mode 22/2/2022 -- 23:20:10 - <Notice> - This is Suricata version 6.0.4 RELEASE running in SYSTEM mode 22/2/2022 -- 23:20:10 - <Info> - CPUs/cores online: 2 22/2/2022 -- 23:20:10 - <Info> - dropped the caps for main thread 22/2/2022 -- 23:20:10 - <Info> - fast output device (regular) initialized: fast.log 22/2/2022 -- 23:20:10 - <Info> - eve-log output device (regular) initialized: eve.json 22/2/2022 -- 23:20:10 - <Info> - stats output device (regular) initialized: stats.log 22/2/2022 -- 23:20:21 - <Info> - 1 rule files processed. 24611 rules successfully loaded, 0 rules failed 22/2/2022 -- 23:20:21 - <Info> - Threshold config parsed: 0 rule(s) found 22/2/2022 -- 23:20:21 - <Info> - 24614 signatures processed. 1216 are IP-only rules, 4120 are inspecting packet payload, 19074 inspect application layer, 108 are decoder event only 22/2/2022 -- 23:21:02 - <Notice> - Configuration provided was successfully loaded. Exiting. 22/2/2022 -- 23:21:03 - <Info> - cleaning up signature grouping structure... complete
-T
플래그는 Suricata가 테스트 모드에서 실행되도록 지시하고-c
플래그는 구성 파일의 위치를 구성하며-v
플래그는 명령의 자세한 출력을 인쇄합니다. 시스템 구성 및 추가된 규칙 수에 따라 명령을 완료하는 데 몇 분 정도 걸릴 수 있습니다.5단계 - Suricata 실행
이제 Suricata가 구성 및 설정되었으므로 애플리케이션을 실행할 차례입니다.
$ sudo systemctl start suricata
프로세스의 상태를 확인하십시오.
$ sudo systemctl status suricata
모든 것이 올바르게 작동하면 다음 출력이 표시되어야 합니다.
? suricata.service - Suricata Intrusion Detection Service Loaded: loaded (/usr/lib/systemd/system/suricata.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2022-02-16 07:14:22 UTC; 32min ago Docs: man:suricata(1) Process: 1494 ExecStartPre=/bin/rm -f /var/run/suricata.pid (code=exited, status=0/SUCCESS) Main PID: 1496 (Suricata-Main) Tasks: 8 (limit: 23479) Memory: 367.5M CGroup: /system.slice/suricata.service ??1496 /sbin/suricata -c /etc/suricata/suricata.yaml --pidfile /var/run/suricata.pid -i eth0 --user suricata Feb 16 07:14:22 suricata systemd[1]: Starting Suricata Intrusion Detection Service... Feb 16 07:14:22 suricata systemd[1]: Started Suricata Intrusion Detection Service.
이 프로세스는 모든 규칙의 구문 분석을 완료하는 데 몇 분 정도 걸릴 수 있습니다. 따라서 위의 상태 확인은 Suricata가 실행되어 준비되었는지 여부에 대한 완전한 표시가 아닙니다. 다음 명령을 사용하여 해당 로그 파일을 모니터링할 수 있습니다.
$ sudo tail -f /var/log/suricata/suricata.log
로그 파일에 다음 줄이 표시되면 Suricata가 실행 중이고 네트워크 트래픽을 모니터링할 준비가 되었음을 의미합니다.
16/02/2022 -- 07:18:39 - <Info> - All AFP capture threads are running.
6단계 - Suricata 규칙 테스트
Suricata가 의심스러운 트래픽을 감지하는지 확인합니다. Suricata 가이드는 다음 명령을 사용하여 ET Open 규칙 번호 2100498을 테스트할 것을 권장합니다.
$ curl http://testmynids.org/uid/index.html
다음과 같은 응답을 받게 됩니다.
uid=0(root) gid=0(root) groups=0(root)
위 명령어는 손상된 시스템에서 실행할 수 있는
id
명령어의 출력을 반환하는 것처럼 가장합니다. Suricata가 트래픽을 감지했는지 테스트하려면 지정된 규칙 번호를 사용하여 로그 파일을 확인해야 합니다.$ grep 2100498 /var/log/suricata/fast.log
요청에서 IPv6을 사용한 경우 다음 출력이 표시되어야 합니다.
02/22/2022-23:24:33.997371 [**] [1:2100498:7] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 2600:9000:2204:5c00:0018:30b3:e400:93a1:80 -> 2a03:b0c0:0002:00d0:0000:0000:0fc2:b001:41468
요청에서 IPv4를 사용한 경우 다음 출력이 표시됩니다.
02/22/2022-23:21:46.783476 [**] [1:2100498:7] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 204.246.178.81:80 -> 164.90.192.1:36364
Suricata는 또한 JSON 형식을 사용하여
/var/log/suricata/eve.log
파일에 이벤트를 기록합니다. 이러한 규칙을 읽고 해석하려면 이 자습서의 범위를 벗어나는jq
를 설치해야 합니다.우리는 Suricata를 설치하고 테스트한 튜토리얼의 1부를 마쳤습니다. 다음 부분에는 ELK 스택을 설치하고 Suricata 및 해당 로그를 시각화하도록 설정하는 작업이 포함됩니다. 이 튜토리얼의 2부는 별도로 지정하지 않는 한 두 번째 서버에서 수행해야 합니다.
7단계 - Elasticsearch 및 Kibana 설치
Elasticsearch 설치의 첫 번째 단계는 Elastic GPG 키를 서버에 추가하는 것입니다.
$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
편집을 위해
/etc/yum/yum.repos.d/elasticsearch.repo
파일을 생성하고 열어서 Elasticsearch 패키지용 리포지토리를 생성합니다.$ sudo nano /etc/yum.repos.d/elasticsearch.repo
다음 코드를 붙여넣습니다.
[elasticsearch] name=Elasticsearch repository for 7.x packages baseurl=https://artifacts.elastic.co/packages/7.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=0 autorefresh=1 type=rpm-md
Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.
Elasticsearch와 Kibana를 설치합니다.
$ sudo dnf install --enablerepo=elasticsearch elasticsearch kibana
그 이후로 매번
--enablerepo=elasticsearch
플래그를 사용해야 합니다. 저장소는 기본적으로 비활성화되어 있습니다. 이렇게 하면 이러한 패키지가 실수로 업그레이드되는 것을 방지할 수 있습니다.다음 명령을 사용하여 서버 개인 IP 주소를 찾으십시오.
$ ip -brief address show lo UNKNOWN 127.0.0.1/8 ::1/128 eth0 UP 164.90.205.77/20 10.18.0.7/16 2a03:b0c0:2:d0::fef:b001/64 fe80::340a:6eff:fe5c:76ed/64 eth1 UP 10.133.0.3/16 fe80::906f:b5ff:fec4:c7b8/64
서버의 개인 IP(이 경우 10.133.0.3)를 기록해 둡니다. 이를
your_private_IP
라고 합니다. 서버의 공용 IP 주소(164.90.205.77)는 나머지 자습서에서your_public_IP
로 참조됩니다. 또한 서버의 네트워크 이름인eth1
을 기록해 두십시오.8단계 - Elasticsearch 구성
Elasticsearch는 구성을
/etc/elasticsearch/elasticsearch.yml
파일에 저장합니다. 편집할 파일을 엽니다.$ sudo nano /etc/elasticsearch/elasticsearch.yml
Elasticsearch는 기본적으로 로컬 연결만 허용합니다. Kibana가 개인 IP 주소를 통해 액세스할 수 있도록 변경해야 합니다.
#network.host: 192.168.0.1
줄을 찾아 아래와 같이 바로 아래 줄을 추가합니다.# By default Elasticsearch is only accessible on localhost. Set a different # address here to expose this node on the network: # #network.host: 192.168.0.1 network.bind_host: ["127.0.0.1", "your_private_IP"] # # By default Elasticsearch listens for HTTP traffic on the first free port it # finds starting at 9200. Set a specific HTTP port here:
이렇게 하면 사설 IP 주소를 통해 Kibana에서 사용할 수 있는 동안 Elastic이 여전히 로컬 연결을 수락할 수 있습니다.
다음 단계는 일부 보안 기능을 켜고 Elastic이 단일 노드에서 실행되도록 구성되었는지 확인하는 것입니다. 그렇게 하려면 파일 끝에 다음 행을 추가하십시오.
. . . discovery.type: single-node xpack.security.enabled: true
여러 Elastic 검색 노드를 사용하려는 경우 첫 번째 줄을 생략할 수 있습니다.
완료되면 Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.
방화벽 구성
개인 네트워크를 통해 액세스할 수 있도록 Elasticsearch에 대한 적절한 방화벽 규칙을 추가합니다.
$ sudo firewall-cmd --permanent --zone=internal --change-interface=eth1 $ sudo firewall-cmd --permanent --zone=internal --add-service=elasticsearch $ sudo firewall-cmd --permanent --zone=internal --add-service=kibana $ sudo firewall-cmd --reload
7단계에서 얻은 것과 같은 첫 번째 명령에서 인터페이스 이름을 선택해야 합니다. 위의 명령은 방화벽의 기본 영역을 내부로 변경하고 Elasticsearch용 포트 9200, 9300 및 Kibana용 포트 5601을 엽니다.
Elasticsearch 시작
이제 Elasticsearch를 구성했으므로 서비스를 시작할 차례입니다.
$ sudo systemctl start elasticsearch
Elasticsearch 비밀번호 만들기
Elasticsearch의 보안 설정을 활성화한 후 다음 단계는 기본 사용자에 대한 몇 가지 암호를 생성하는 것입니다. Elasticsearch는
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords
에서 임의 암호를 생성할 수 있는 암호 생성 유틸리티와 함께 제공됩니다.암호를 만듭니다.
$ cd /usr/share/elasticsearch/bin $ sudo ./elasticsearch-setup-passwords auto
다음과 같은 출력이 표시됩니다. 메시지가 나타나면 계속하려면
y
를 누르십시오.Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user. The passwords will be randomly generated and printed to the console. Please confirm that you would like to continue [y/N]y Changed password for user apm_system PASSWORD apm_system = EtwMg8maU67o5tvD5rse Changed password for user kibana_system PASSWORD kibana_system = dTanR7Q2HtgDtATRvuJv Changed password for user kibana PASSWORD kibana = dTanR7Q2HtgDtATRvuJv Changed password for user logstash_system PASSWORD logstash_system = XGSjxNktuNMWVfGYibox Changed password for user beats_system PASSWORD beats_system = JXTr7CeHkMue608qVTQa Changed password for user remote_monitoring_user PASSWORD remote_monitoring_user = Q6JTJNl3lPy0fhy6QuMP Changed password for user elastic PASSWORD elastic = bd1YJfhSa8RC8SMvTIwg
유틸리티는 한 번만 실행할 수 있으므로 모든 암호를 안전한 위치에 저장하십시오.
9단계 - Kibana 구성
Kibana 구성의 첫 번째 단계는 비밀 키를 생성하여
xpack
보안 기능을 활성화하는 것입니다. Kibana는 이러한 비밀 키를 사용하여 Elasticsearch에 데이터를 저장합니다. 비밀 키를 생성하는 유틸리티는/usr/share/kibana/bin
디렉터리에서 액세스할 수 있습니다.$ cd /usr/share/kibana/bin/ $ sudo ./kibana-encryption-keys generate -q --force
-q
플래그는 명령 지침을 억제하고--force
플래그는 새로운 비밀이 생성되도록 합니다. 다음과 같은 출력을 받게 됩니다.xpack.encryptedSavedObjects.encryptionKey: 0f4e5e1cf8fad1874ffed0faac6be0da xpack.reporting.encryptionKey: d435c78a4e37521e539c0e905420c9f5 xpack.security.encryptionKey: 7ba0e2a02747bb90fb0f9a3c267b99ed
출력을 복사합니다. 편집을 위해
/etc/kibana/kibana.yml
에서 Kibanas 구성 파일을 엽니다.$ sudo nano /etc/kibana/kibana.yml
파일 끝에 이전 명령의 코드를 붙여넣습니다.
. . . # Specifies locale to be used for all localizable strings, dates and number formats. # Supported languages are the following: English - en , by default , Chinese - zh-CN . #i18n.locale: "en" xpack.encryptedSavedObjects.encryptionKey: 0f4e5e1cf8fad1874ffed0faac6be0da xpack.reporting.encryptionKey: d435c78a4e37521e539c0e905420c9f5 xpack.security.encryptionKey: 7ba0e2a02747bb90fb0f9a3c267b99ed
Kibana 포트 구성
서버 사설 IP 주소에서 액세스할 수 있도록 Kibana를 구성해야 합니다. 파일에서
#server.host: "localhost"
줄을 찾고 표시된 대로 바로 아래에 다음 줄을 추가합니다.# Kibana is served by a back end server. This setting specifies the port to use. #server.port: 5601 # Specifies the address to which the Kibana server will bind. IP addresses and host names are both valid values. # The default is 'localhost', which usually means remote machines will not be able to connect. # To allow connections from remote users, set this parameter to a non-loopback address. #server.host: "localhost" server.host: "your_private_IP"
완료되면 Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.
Kibana 액세스 구성
다음 단계는 Kibana가 인증에 사용할 수 있는 사용자 이름과 암호를 생성하는 것입니다. Kibanas 구성 파일을 직접 편집하여 이를 수행할 수 있지만 보안 문제가 발생할 수 있습니다. 보안 방법에는
kibana-keystore
애플리케이션 사용이 포함됩니다.다음 명령을 실행하여 사용자 이름을 설정하십시오. 사용자 이름으로
kibana_system
을 입력합니다.$ cd /usr/share/kibana/bin $ sudo ./kibana-keystore add elasticsearch.username Enter value for elasticsearch.username: *************
명령을 다시 실행하여 비밀번호를 설정하십시오. 8단계에서 Kibana에 대해 생성한 암호를 사용해야 합니다. 자습서의 경우 암호는
dTanR7Q2HtgDtATRvuJv
입니다.$ sudo ./kibana-keystore add elasticsearch.password Enter value for elasticsearch.password: ********************
키바나 시작하기
이제 Kibana에 대한 보안 액세스 및 네트워킹을 구성했으므로 프로세스를 시작하십시오.
$ sudo systemctl start kibana
실행 중인지 상태를 확인하십시오.
$ sudo systemctl status kibana
10단계 - Filebeat 설치 및 구성
Suricata 서버에 Filebeat를 설치한다는 점에 유의해야 합니다. 따라서 다시 전환하고 Elastic GPG 키를 추가하여 시작하십시오.
$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
탄력적 리포지토리를 만들고 엽니다.
$ sudo nano /etc/yum.repos.d/elasticsearch.repo
다음 코드를 붙여넣습니다.
[elasticsearch] name=Elasticsearch repository for 7.x packages baseurl=https://artifacts.elastic.co/packages/7.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=0 autorefresh=1 type=rpm-md
Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.
파일비트를 설치합니다.
$ sudo dnf install --enablerepo=elasticsearch filebeat
Filebeat는
/etc/filebeat/filebeat.yml
파일에 구성을 저장합니다. 편집을 위해 엽니다.$ sudo nano /etc/filebeat/filebeat.yml
가장 먼저 해야 할 일은 Kibanas 대시보드에 연결하는 것입니다. Kibana 섹션에서
#host: "localhost:5601"
줄을 찾아 그림과 같이 바로 아래에 다음 줄을 추가합니다.. . . # Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API. # This requires a Kibana endpoint configuration. setup.kibana: # Kibana Host # Scheme and port can be left out and will be set to the default (http and 5601) # In case you specify and additional path, the scheme is required: http://localhost:5601/path # IPv6 addresses should always be defined as: https://[2001:db8::1]:5601 #host: "localhost:5601" host: "your_private_IP:5601" . . .
다음으로 파일의 Elasticsearch 출력 섹션을 찾아
hosts
,username
및password
아래와 같이 표시됩니다. 사용자 이름으로elastic
을 값으로 선택하고 암호로 이 자습서의 8단계에서 생성된 값을 사용합니다.output.elasticsearch: # Array of hosts to connect to. hosts: ["your_private_IP:9200"] # Protocol - either `http` (default) or `https`. #protocol: "https" # Authentication credentials - either API key or username/password. #api_key: "id:api_key" username: "elastic" password: "bd1YJfhSa8RC8SMvTIwg" . . .
완료되면 Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.
다음으로 Filebeats 내장 Suricata 모듈을 활성화합니다.
$ sudo filebeat modules enable suricata
Filebeat 구성의 마지막 단계는
filebeat setup
명령을 사용하여 SIEM 대시보드와 파이프라인을 Elasticsearch로 로드하는 것입니다.$ sudo filebeat setup
명령이 완료되는 데 몇 분 정도 걸릴 수 있습니다. 완료되면 다음 출력을 받아야 합니다.
Overwriting ILM policy is disabled. Set `setup.ilm.overwrite: true` for enabling. Index setup finished. Loading dashboards (Kibana must be running and reachable) Loaded dashboards Setting up ML using setup --machine-learning is going to be removed in 8.0.0. Please use the ML app instead. See more: https://www.elastic.co/guide/en/machine-learning/current/index.html It is not possble to load ML jobs into an Elasticsearch 8.0.0 or newer using the Beat. Loaded machine learning job configurations Loaded Ingest pipelines
Filebeat 서비스를 시작합니다.
$ sudo systemctl start filebeat
서비스 상태를 확인합니다.
$ sudo systemctl status filebeat
11단계 - Kibana 대시보드 액세스
KIbana는 사설 IP 주소를 통해서만 Elasticsearch에 액세스하도록 구성되어 있으므로 두 가지 액세스 옵션이 있습니다. 첫 번째 방법은 PC에서 Elasticsearch 서버로 SSH 터널을 사용하는 것입니다. 이렇게 하면 PC에서 서버의 사설 IP 주소로 포트 5601이 전달되고
http://localhost:5601
에서 PC에서 Kibana에 액세스할 수 있습니다. 그러나이 방법은 다른 곳에서 액세스 할 수 없음을 의미합니다.옵션은 Suricata 서버에 Nginx를 설치하고 이를 리버스 프록시로 사용하여 개인 IP 주소를 통해 Elasticsearchs 서버에 액세스하는 것입니다. 우리는 두 가지 방법을 논의할 것입니다. 요구 사항에 따라 두 가지 방법 중 하나를 선택할 수 있습니다.
SSH 로컬 터널 사용
Windows 10 또는 Windows 11을 사용하는 경우 Windows Powershell에서 SSH LocalTunnel을 실행할 수 있습니다. Linux 또는 macOS에서는 터미널을 사용할 수 있습니다. 아직 구성하지 않은 경우 SSH 액세스를 구성해야 할 수 있습니다.
컴퓨터 터미널에서 다음 명령을 실행하여 SSH 터널을 생성합니다.
$ ssh -L 5601:your_private_IP:5601 _public_IP -N
-L
플래그는 PC 포트에서 서버로 트래픽을 전달하는 로컬 SSH 터널을 나타냅니다.\nprivate_IP:5601
은 트래픽이 서버에서 전달되는 IP 주소입니다. 이 경우 Elasticsearch 서버의 사설 IP 주소로 바꾸십시오.your_public_IP
는 SSH 연결을 여는 데 사용되는 Elasticsearch 서버의 공용 IP 주소입니다.-N
플래그는 OpenSSH에게 명령을 실행하지 않고 터널이 실행되는 동안 연결을 유지하도록 지시합니다.\n
이제 터널이 열렸으므로 PC 브라우저에서 URL
http://localhost:5601
을 열어 Kibana에 액세스할 수 있습니다. 다음 화면이 나타납니다.Kibana에 액세스해야 하는 동안 명령 실행을 유지해야 합니다. 터미널에서 Ctrl + C를 눌러 터널을 닫습니다.
Nginx 리버스 프록시 사용
이 방법은 전 세계 어디에서나 대시보드에 액세스하려는 경우에 가장 적합합니다.
방화벽 구성
계속 진행하기 전에 방화벽에서 HTTP 및 HTTPS 포트를 열어야 합니다.
$ sudo firewall-cmd --permanent --add-service=http $ sudo firewall-cmd --permanent --add-service=https
변경 사항을 적용하려면 방화벽을 다시 로드하십시오.
$ sudo firewall-cmd --reload
SSL 설치 및 구성
첫 번째 단계는 Lets Encrypt SSL 인증서를 설치하는 것입니다. 이미 EPEL 저장소를 설정했으므로 Certbot 도구를 설치합니다.
$ sudo dnf install certbot
도메인
kibana.example.com
에 대한 SSL 인증서를 생성합니다.$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m -d kibana.example.com
위의 명령은 서버의
/etc/letsencrypt/live/kibana.example.com
디렉토리에 인증서를 다운로드합니다.Diffie-Hellman 그룹 인증서를 생성합니다.
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Lets Encrypt 자동 갱신을 위한 챌린지 웹 루트 디렉터리를 만듭니다.
$ sudo mkdir -p /var/lib/letsencrypt
SSL을 갱신하기 위해 Cron 작업을 생성합니다. 인증서를 확인하고 필요한 경우 갱신하기 위해 매일 실행됩니다. 이를 위해 먼저
/etc/cron.daily/certbot-renew
파일을 생성하고 편집을 위해 엽니다.$ sudo nano /etc/cron.daily/certbot-renew
다음 코드를 붙여넣습니다.
#!/bin/sh certbot renew --cert-name kibana.example.com --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"
Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.
실행 가능하도록 태스크 파일에 대한 권한을 변경하십시오.
$ sudo chmod +x /etc/cron.daily/certbot-renew
Nginx 설치 및 구성
Rocket Linux 8.5는 안정적인 최신 Nginx 버전을 모듈로 제공합니다. 다음 명령을 사용하여 설치하십시오.
$ sudo dnf module install nginx:1.20
다음 명령을 사용하여 설치하려는 버전을 확인할 수 있습니다.
$ dnf module list nginx Rocky Linux 8 - AppStream Name Stream Profiles Summary nginx 1.14 [d] common [d] nginx webserver nginx 1.16 common [d] nginx webserver nginx 1.18 common [d] nginx webserver nginx 1.20 [e] common [d] [i] nginx webserver Extra Packages for Enterprise Linux Modular 8 - x86_64 Name Stream Profiles Summary nginx mainline common nginx webserver nginx 1.20 [e] common [d] [i] nginx webserver
Nginx 설치를 확인합니다.
$ nginx -v nginx version 1.20.1
Nginx 서비스를 활성화합니다.
$ sudo systemctl enable nginx
Kibana용 Nginx 구성 파일을 생성하고 엽니다.
$ sudo nano /etc/nginx/conf.d/kibana.conf
다음 코드를 붙여넣습니다. IP 주소를 Elasticsearch 서버의 사설 IP 주소로 바꿉니다.
server { listen 80; listen [::]:80; server_name kibana.example.com; return 301 https://$host$request_uri; } server { server_name kibana.example.com; charset utf-8; listen 443 ssl http2; listen [::]:443 ssl http2; access_log /var/log/nginx/kibana.access.log; error_log /var/log/nginx/kibana.error.log; ssl_certificate /etc/letsencrypt/live/kibana.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/kibana.example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/kibana.example.com/chain.pem; ssl_session_timeout 1d; ssl_session_cache shared:MozSSL:10m; ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; resolver 8.8.8.8; ssl_stapling on; ssl_stapling_verify on; ssl_dhparam /etc/ssl/certs/dhparam.pem; location / { proxy_pass http://your_private_IP:5601; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.
편집을 위해
/etc/nginx/nginx.conf
파일을 엽니다.$ sudo nano /etc/nginx/nginx.conf
include /etc/nginx/conf.d/*.conf;
줄 앞에 다음 줄을 추가합니다.server_names_hash_bucket_size 64;
Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.
구성을 확인하십시오.
$ sudo nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Nginx 서비스를 시작합니다.
$ sudo systemctl start nginx
Kibana 대시보드는 원하는 곳 어디에서나 URL
https://kibana.example.com
을 통해 액세스할 수 있어야 합니다.12단계 - Kibana 대시보드 관리
대시보드 관리를 계속 진행하기 전에 Kibanas 구성에서 기본 URL 필드를 추가해야 합니다.
Kibanas 구성 파일을 엽니다.
$ sudo nano /etc/kibana/kibana.yml
주석 처리된 줄
#server.publicBaseUrl: ""
을 찾아 앞의 해시를 제거하여 다음과 같이 변경합니다.server.publicBaseUrl: "https://kibana.example.com"
Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.
Kibana 서비스를 다시 시작합니다.
$ sudo systemctl restart kibana
몇 분 정도 기다린 후 브라우저에서 URL
https://kibana.example.com
을 로드합니다. 사용자 이름elastic
과 이전에 생성한 비밀번호(bd1YJfhSa8RC8SMvTIwg
)로 로그인하면 다음 화면이 표시됩니다.상단 검색창에
type:data suricata
를 입력하시면 수리카타스 정보를 찾으실 수 있습니다.첫 번째 결과([Filebeat Suricata] Alert Overview)를 클릭하면 다음과 유사한 화면이 나타납니다. 기본적으로 지난 15분 동안의 항목만 표시되지만 자습서에 대한 더 많은 데이터를 표시하기 위해 더 큰 시간 범위에 걸쳐 표시됩니다.
이벤트 버튼을 클릭하면 기록된 모든 이벤트를 볼 수 있습니다.
이벤트 및 경고 페이지를 아래로 스크롤하면 프로토콜 유형, 소스 및 대상 포트, 소스의 IP 주소별로 각 이벤트 및 경고를 식별할 수 있습니다. 트래픽이 발생한 국가도 볼 수 있습니다.
Kibana 및 Filebeat를 사용하여 다른 유형의 대시보드에 액세스하고 생성할 수 있습니다. 즉시 사용할 수 있는 유용한 내장 대시보드 중 하나는 보안 대시보드입니다. 왼쪽 햄버거 메뉴에서 네트워크 대시보드를 클릭하면 다음과 같은 화면이 나타납니다.
내장된 Filebeat 모듈을 활성화 및 구성하여 Nginx와 같은 더 많은 대시보드를 추가할 수 있습니다.
결론
이것으로 Rocky Linux 8 기반 서버에서 Elastic Stack으로 Suricata IDS를 설치 및 구성하는 방법에 대한 자습서를 마칩니다. 또한 외부에서 Kibana 대시보드에 액세스하기 위해 Nginx를 리버스 프록시로 구성했습니다. 질문이 있으시면 아래 의견에 게시하십시오.