웹사이트 검색

Rocky Linux 8에서 Elastic Stack과 함께 Suricata IDS를 설치 및 구성하는 방법


이 페이지에서

  1. 전제 조건
  2. 방화벽 구성\n
  3. 1부
  4. 1단계 - Suricata 설치
  5. 2단계 - Suricata 구성
    1. 커뮤니티 ID 활성화\n
    2. 네트워크 인터페이스 선택
    3. 라이브 규칙 새로고침
    4. 디렉토리 권한 구성\n

    1. 규칙 집합 공급자 추가\n

    1. 방화벽 구성\n
    2. Elasticsearch 시작
    3. Elasticsearch 비밀번호 만들기\n

    1. Kibana 포트 구성
    2. Kibana 액세스 구성
    3. Kibana 시작하기\n

    1. SSH 로컬 터널 사용
    2. Nginx 리버스 프록시 사용\n
    3. 방화벽 구성\n
    4. SSL 설치 및 구성
    5. 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은 소프트웨어의 안정적인 최신 버전에 대한 리포지토리를 활성화합니다. 프롬프트가 표시될 때마다 yENTER를 누르십시오.

    다음으로 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
    

    예제에서 새로운 인터페이스 enp0s1cluster-id 변수의 고유 값을 추가했습니다. 추가하는 모든 인터페이스에 고유한 클러스터 ID를 포함해야 합니다.

    라이브 규칙 다시 로드

    규칙을 추가, 제거 및 편집할 때마다 Suricata를 다시 시작해야 합니다. Live Rule을 활성화하면 Suricata는 다시 시작하지 않고도 모든 규칙 변경 사항을 처리할 수 있습니다.

    실시간 재로딩을 활성화하려면 구성 파일의 맨 아래에 다음 행을 추가하십시오.

    . . .
    
    detect-engine:
      - rule-reload: true
    

    라이브 다시 로드가 활성화되면 다음 명령을 사용하여 Suricata 프로세스를 다시 시작하지 않고 규칙을 다시 로드할 수 있습니다.

    $ sudo kill -usr2 $(pidof suricata)
    

    &#36 (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, usernamepassword 의 값을 편집합니다. 아래와 같이 표시됩니다. 사용자 이름으로 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 터널을 나타냅니다.\n
    • private_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를 리버스 프록시로 구성했습니다. 질문이 있으시면 아래 의견에 게시하십시오.