OSSECデコーダーとルール、ossec-logtestについて

# はじめに
OSSECデコーダーとルール、ossec-logtestについて記事にしました。
なお、OSSECのインストール手順にご興味のある方は以下の記事を参照ください。
- [Amazon Linux2にOSSECをインストールした（OSSEC-Serverインストール）](https://qiita.com/Diavolo/items/81ce9ecdfca2a7c6b1a4)
- [Amazon Linux2にOSSECをインストールした（OSSEC-Agentインストール）](https://qiita.com/Diavolo/items/2bab537c36203049188d)
- [Amazon Linux2にOSSECをインストールした（OSSEC-Localインストール）](https://qiita.com/Diavolo/items/7a5391578abe5ca67536)

# 各種ファイルとパスについて
- デコードとルールのテストツール：/var/ossec/bin/ossec-logtest
- デコード設定：/var/ossec/etc/decoder.xml
- ルール設定：/var/ossec/rules/*.xml
- OSSECのログファイル：/var/ossec/logs/ossec.log
- OSSECのアラートログ：/var/ossec/logs/alerts/alerts.log
- Active Responseのログ：/var/ossec/logs/active-responses.log

# 各種ファイルの出力例
- Active Responseのログ
```/var/ossec/logs/active-responses.log
# cat active-responses.log
Tue Mar  1 08:42:57 UTC 2022 /var/ossec/active-response/bin/host-deny.sh add - 1xx.4x.1xx.1xx 1646124177.162 5706
Tue Mar  1 08:42:57 UTC 2022 /var/ossec/active-response/bin/firewall-drop.sh add - 1xx.4x.1xx.1xx 1646124177.162 5706
Tue Mar  1 08:53:27 UTC 2022 /var/ossec/active-response/bin/host-deny.sh delete - 1xx.4x.1xx.1xx 1646124177.162 5706
Tue Mar  1 08:53:27 UTC 2022 /var/ossec/active-response/bin/firewall-drop.sh delete - 1xx.4x.1xx.1xx 1646124177.162 5706
Tue Mar  1 09:57:52 UTC 2022 /var/ossec/active-response/bin/host-deny.sh add - 3x.1xx.2xx.2xx 1646128672.11989 5758
Tue Mar  1 09:57:52 UTC 2022 /var/ossec/active-response/bin/firewall-drop.sh add - 3x.1xx.2xx.2xx 1646128672.11989 5758
Tue Mar  1 10:08:23 UTC 2022 /var/ossec/active-response/bin/host-deny.sh delete - 3x.1xx.2xx.2xx 1646128672.11989 5758
Tue Mar  1 10:08:23 UTC 2022 /var/ossec/active-response/bin/firewall-drop.sh delete - 3x.1xx.2xx.2xx 1646128672.11989 5758
```

- OSSECのログ
``` /var/ossec/logs/ossec.log
2022/03/05 11:52:10 ossec-testrule: INFO: Reading local decoder file.
2022/03/05 11:52:10 ossec-testrule: INFO: Started (pid: 3264).
2022/03/05 12:36:49 ossec-testrule: INFO: Reading local decoder file.
2022/03/05 12:36:49 ossec-testrule: INFO: Started (pid: 3658).
2022/03/05 12:38:27 ossec-testrule: INFO: Reading local decoder file.
2022/03/05 12:38:27 ossec-testrule: INFO: Started (pid: 3661).
```

# デコーダーとルールについて
OSSECにはマネージャーとエージェントがあります。エージェントは監視対象のサーバログやファイルのハッシュをマネージャーに送信します。マネージャーはエージェントから送られてきた情報を分析し、アラートの通知や通信の遮断などのアクティブレスポンスを行います。

なお、デコーダー機能とルールマッチ機能は、マネージャーにだけ存在する機能になっております。
デーモンは、/var/ossec/bin/ossec-analysisd です。

また、デコードの設定は、xmlファイルに書かれています。
デコードの設定ファイル：/var/ossec/etc/decoder.xml

デフォルトで、デコード設定は330個ありました。
```/var/ossec/etc/decoder.xml
# cd /var/ossec/etc
# # grep decoder decoder.xml | grep name | wc -l
330
```
デコード設定の名前だけ抽出してみます。
```/var/ossec/etc/decoder.xml
# cd /var/ossec/etc
# grep decoder decoder.xml | grep name
<decoder name="pam">
<decoder name="pam">
<decoder name="pam-user">
```
例として、loginページへのアクセスのデコーダーを見てみます。
正規表現を利用してデコードしています。
\S は 空白文字以外、\S+ は空白文字以外の1回以上の繰り返しです。
```/var/ossec/etc/decoder.xml
<decoder name="web-accesslog">
  <type>web-log</type>
  <prematch_pcre2>^\S+ \S+ \S+ \[\S+ \S\d+\] "\w+ \S+ HTTP\S+" </prematch_pcre2>
  <pcre2>^(\S+) \S+ (\S+) \[\S+ \S\d+\] </pcre2>
  <pcre2>"(\w+) (\S+) HTTP\S+" (\d+) </pcre2>
  <order>srcip, srcuser, action, url, id</order>
</decoder>
```
ルールは/var/ossec/rulesのxmlに書かれています。
``` /var/ossec/rules/*.xml
#cd /var/ossec/rules
#ls 
apache_rules.xml     ftpd_rules.xml              ms_dhcp_rules.xml        ossec_rules.xml       sendmail_rules.xml        unbound_rules.xml
apparmor_rules.xml   hordeimp_rules.xml          ms-exchange_rules.xml    owncloud_rules.xml    smbd_rules.xml            vmpop3d_rules.xml
arpwatch_rules.xml   ids_rules.xml               ms_firewall_rules.xml    pam_rules.xml         solaris_bsm_rules.xml     vmware_rules.xml
asterisk_rules.xml   imapd_rules.xml             ms_ftpd_rules.xml        php_rules.xml         sonicwall_rules.xml       vpn_concentrator_rules.xml
attack_rules.xml     kesl_rules.xml              ms_ipsec_rules.xml       pix_rules.xml         spamd_rules.xml           vpopmail_rules.xml
cimserver_rules.xml  last_rootlogin_rules.xml    ms_powershell_rules.xml  policy_rules.xml      squid_rules.xml           vsftpd_rules.xml
cisco-ios_rules.xml  lighttpd_rules.xml          ms-se_rules.xml          postfix_rules.xml     sshd_rules.xml            web_appsec_rules.xml
clam_av_rules.xml    linux_usbdetect_rules.xml   mysql_rules.xml          postgresql_rules.xml  symantec-av_rules.xml     web_rules.xml
courier_rules.xml    local_rules.xml             named_rules.xml          proftpd_rules.xml     symantec-ws_rules.xml     wordpress_rules.xml
dnsmasq_rules.xml    mailscanner_rules.xml       netscreenfw_rules.xml    proxmox-ve_rules.xml  syslog_rules.xml          zeus_rules.xml
dovecot_rules.xml    mcafee_av_rules.xml         nginx_rules.xml          psad_rules.xml        sysmon_rules.xml
dropbear_rules.xml   mhn_cowrie_rules.xml        nsd_rules.xml            pure-ftpd_rules.xml   systemd_rules.xml
exim_rules.xml       mhn_dionaea_rules.xml       openbsd-dhcpd_rules.xml  racoon_rules.xml      telnetd_rules.xml
firewalld_rules.xml  ms1016_usbdetect_rules.xml  openbsd_rules.xml        roundcube_rules.xml   topleveldomain_rules.xml
firewall_rules.xml   msauth_rules.xml            opensmtpd_rules.xml      rules_config.xml      trend-osce_rules.xml
```
web,accesslogのルールは、/var/ossec/rules/web_rules.xml にありました。
``` /var/ossec/rules/web_rules.xml
<group name="web,accesslog,">
  <rule id="31100" level="0">
    <category>web-log</category>
    <description>Access log messages grouped.</description>
  </rule>

  <rule id="31108" level="0">
    <if_sid>31100</if_sid>
    <id_pcre2>^2|^3</id_pcre2>
    <compiled_rule>is_simple_http_request</compiled_rule>
    <description>Ignored URLs (simple queries).</description>
   </rule>

  <rule id="31101" level="5">
    <if_sid>31100</if_sid>
    <id_pcre2>^4</id_pcre2>
    <description>Web server 400 error code.</description>
  </rule>

  <rule id="31102" level="0">
    <if_sid>31101</if_sid>
    <url_pcre2>\.jpg$|\.gif$|favicon\.ico$|\.png$|robots\.txt$|\.css$|\.js$|\.jpeg$</url_pcre2>
    <compiled_rule>is_simple_http_request</compiled_rule>
    <description>Ignored extensions on 400 error codes.</description>
  </rule>

  <rule id="31103" level="6">
    <if_sid>31100,31108</if_sid>
    <url_pcre2>=select%20|select\+|insert%20|%20from%20|%20where%20|union%20|</url_pcre2>
    <url_pcre2>union\+|where\+|null,null|xp_cmdshell</url_pcre2>
    <description>SQL injection attempt.</description>
    <group>attack,sql_injection,</group>
  </rule>
  <rule id="31104" level="6">
    <if_sid>31100</if_sid>

    <!-- Attempt to do directory transversal, simple sql injections,
      -  or access to the etc or bin directory (unix). -->
    <url_pcre2>%027|%00|%01|%7f|%2E%2E|%0A|%0D|\.\./\.\.|\.\.\\\.\.|echo;|</url_pcre2>
    <url_pcre2>cmd\.exe|root\.exe|_mem_bin|msadc|/winnt/|/boot\.ini|</url_pcre2>
    <url_pcre2>/x90/|default\.ida|/sumthin|nsiislog\.dll|chmod%|wget%|cd%20|</url_pcre2>
    <url_pcre2>exec%20|\.\./\.\.//|%5C\.\./%5C|\./\./\./\./|2e%2e%5c%2e|\\x5C\\x5C</url_pcre2>
    <description>Common web attack.</description>
    <group>attack,</group>
  </rule>

  <rule id="31105" level="6">
    <if_sid>31100</if_sid>
    <url_pcre2>%3Cscript|%3C%2Fscript|script>|script%3E|SRC=javascript|IMG%20|</url_pcre2>
    <url_pcre2>%20ONLOAD=|INPUT%20|iframe%20</url_pcre2>
    <description>XSS (Cross Site Scripting) attempt.</description>
    <group>attack,</group>
  </rule>
```
# ossec-logtestについて
デコーダーとルールは、/var/ossec/bin/ossec-logtest を利用して、テストすることができます。
198.168.3.5 - - [05/Mar/2022:21:38:24 +0900] "POST /login HTTP/1.1" 200 - をテストしてみたところ、ルールID:31108にヒットしました。
```/var/ossec/bin/ossec-logtest
# /var/ossec/bin/ossec-logtest
2022/03/05 12:38:27 ossec-testrule: INFO: Reading local decoder file.
2022/03/05 12:38:27 ossec-testrule: INFO: Started (pid: 3661).
ossec-testrule: Type one log per line.

198.168.3.5 - - [05/Mar/2022:21:38:24 +0900] "POST /login HTTP/1.1" 200 -


**Phase 1: Completed pre-decoding.
       full event: '198.168.3.5 - - [05/Mar/2022:21:38:24 +0900] "POST /login HTTP/1.1" 200 -'
       hostname: 'ip-172-31-83-176'
       program_name: '(null)'
       log: '198.168.3.5 - - [05/Mar/2022:21:38:24 +0900] "POST /login HTTP/1.1" 200 -'

**Phase 2: Completed decoding.
       decoder: 'web-accesslog'
       srcip: '198.168.3.5'
       srcuser: '-'
       action: 'POST'
       url: '/login'
       id: '200'

**Phase 3: Completed filtering (rules).
       Rule id: '31108'
       Level: '0'
       Description: 'Ignored URLs (simple queries).'

```

# おわりに
今回の記事は以上です。では、また。