Linuxの監査システム　Auditについて理解する

# はじめに
本記事はLinuxの監査システムであるAuditについて記載しています。

AuditはLinuxの監査システムとして、監査ルールを定義し、システムで発生したセキュリテイに関するイベントをログファイルに出力します。

ログファイルに出力されたメッセージを監視することで、セキュリテイに関するイベントを検知することができます。

Auditでは以下の監査ルールが設定可能です。

- 制御ルール
- システムコールルール
- ファイルシステムルール

## Auditの概要
Auditはauditdデーモンとして起動し、カーネルから受け取った監査結果をログファイルに出力します。

全般的な設定は`/etc/audit/auditd.conf`ファイルで設定します。

- /etc/audit/auditd.conf

```text
#
# This file controls the configuration of the audit daemon
#

local_events = yes
write_logs = yes
log_file = /var/log/audit/audit.log
log_group = root
log_format = RAW
flush = INCREMENTAL_ASYNC
freq = 50
max_log_file = 8
num_logs = 5
priority_boost = 4
disp_qos = lossy
dispatcher = /sbin/audispd
name_format = NONE
##name = mydomain
max_log_file_action = ROTATE
space_left = 75
space_left_action = SYSLOG
verify_email = yes
action_mail_acct = root
admin_space_left = 50
admin_space_left_action = SUSPEND
disk_full_action = SUSPEND
disk_error_action = SUSPEND
use_libwrap = yes
##tcp_listen_port = 60
tcp_listen_queue = 5
tcp_max_per_addr = 1
##tcp_client_ports = 1024-65535
tcp_client_max_idle = 0
enable_krb5 = no
krb5_principal = auditd
##krb5_key_file = /etc/audit/audit.key
distribute_network = no
```

Auditを操作するための基本的なコマンドは以下になります。

| コマンド          |  説明             |
|:-----------------|:------------------|
| auditctl         | Auditの動作に関する設定、Auditルールの定義を行う            |
| ausearch         | Auditのログファイルから監査結果を検索            |
| aureport         | Auditのログファイルから監査結果のレポートを作成           |

監査ルールは`auditctl`コマンドを実行するか、永続的な設定を行う場合は`/etc/audit/rules.d/audit.rules`ファイルで設定を行います。

## auditctl
`auditctl`コマンドの使用方法について、ルール別に解説します。

### 制御ルール
Auditの動作に関する設定を行います。

- Auditの監査を無効（0）、有効（1）に設定または、設定をロック（2）し変更不可にする（以下は有効にする場合）   
`# auditctl -e 1`
- オプションの設定値を表示    
`# auditctl -s`
- 全てのAuditルールの削除    
`# auditctl -D`

### システムコールルール
システムコールに関するルールを設定します。

**書式：auditctl -a ＜アクション＞,＜リスト＞ -F ＜フィールド＞=＜値＞ -S ＜システムコール＞ -k ＜キー名＞**

- システムコールを定義   
`# auditctl -a always,exit -F arch=b64 -S adjtimex,settimeofday -k time-change`
- システムコールルールの確認   
`# auditctl -l`

```console
-a always,exit -F arch=b64 -S adjtimex,settimeofday -F key=time-change
```

-Sに指定するシステムコール名やシステムコール番号は、`/usr/include/asm/unistd_64.h`ファイルを参照するか、`ausyscall`コマンドで確認できます。

- openが含むシステムコール名で検索   
`# cat /usr/include/asm/unistd_64.h | grep open`

```text
#define __NR_open 2
#define __NR_mq_open 240
#define __NR_openat 257
#define __NR_perf_event_open 298
#define __NR_open_by_handle_at 304
```

- `ausyscall`コマンドでopenが含むシステムコール名で検索

`# ausyscall open` 

```console
open               2
mq_open            240
openat             257
perf_event_open    298
open_by_handle_at  304
```

### ファイルシステムルール
ファイルシステムに関するルールを設定します。
ファイルに対して書き込みや属性変更等が行わなれた場合はログに出力します。

**書式：auditctl -w ＜ファイル＞ -p ＜パーミッション＞ -k ＜キー名＞**

- ファイルシステムルールの定義   
`# auditctl -w /etc/passwd -p wa -k identity`
- ファイルシステムルールの確認   
`# auditctl -l`

```console
-w /etc/passwd -p wa -k identity
```

例としてtestというアカウントでパスワードを変更すると、以下のように`/var/log/audit/audit.log`ファイルにパスワード変更のログが出力されているのが確認できます。

```console
type=USER_CHAUTHTOK msg=audit(1582528251.037:19125): pid=32026 uid=0 auid=0 ses=2508 subj=unconfined_u:unconfined_r:passwd
_t:s0-s0:c0.c1023 msg='op=PAM:chauthtok grantors=pam_pwquality,pam_unix acct="test" exe="/usr/bin/passwd" hostname=localho
st.localdomain addr=? terminal=pts/1 res=success
```

## ausearch
`ausearch`コマンドは指定した条件に従って、監査ログからキーワードで一致したログを検索して出力します。`/etc/audit/auditd.conf`ファイルの`log_file`で指定したログファイルを対象とします。

- Auditログファイルの検索（以下は`-i`で日時やpidをテキストテキスト変換し、`-k`でキーワードを指定）   
`# ausearch -i -k time-change`

```console
----
type=CONFIG_CHANGE msg=audit(2020年02月24日 15:00:55.539:17800) : auid=root ses=2118 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 op=add_rule key=time-change list=exit res=yes 
----
type=CONFIG_CHANGE msg=audit(2020年02月24日 15:01:17.592:17824) : auid=root ses=2118 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 op=remove_rule key=time-change list=exit res=yes 
----
type=CONFIG_CHANGE msg=audit(2020年02月24日 15:08:59.057:17944) : auid=root ses=2118 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 op=add_rule key=time-change list=exit res=yes 
```

- 指定したメッセージタイプに一致するイベントを検索（以下は`-m`でログインに関するイベント、`--start today`で今日の日時を指定）   
`# ausearch -m USER_LOGIN --start today`

```console
----
time->Thu Apr 30 21:25:25 2020
type=USER_LOGIN msg=audit(1588249525.137:125): pid=1341 uid=0 auid=0 ses=1 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=login id=0 exe="/usr/sbin/sshd" hostname=192.168.10.10 addr=192.168.10.10 terminal=/dev/pts/0 res=success'
```

- 指定可能なメッセージタイプを抽出するワンライナー   
`# ausearch -m help 2>&1 | awk -v RS=' ' '/^[A-Z]{2}/{ print}' | sort`

## aureport
`aureport`コマンドは指定した条件に従って、監査ログのレポートを出力します。

- Auditレポートの生成（以下は`-l`でログインに関するレポート、`-i`で日時やpidをテキストテキスト変換し、`-ts`から`-te`でログの検索範囲として開始日時と終了日時を指定）     
`# aureport -l -i -ts yesterday -te now`

```console
Login Report
============================================
# date time auid host term exe success event
============================================
1. 2020年02月23日 21:12:44 root ＜IPアドレス＞ /dev/pts/0 /usr/sbin/sshd yes 132
2. 2020年02月24日 12:52:29 root ＜IPアドレス＞ ssh /usr/sbin/sshd no 16883
3. 2020年02月24日 12:52:35 root ＜IPアドレス＞ /dev/pts/0 /usr/sbin/sshd yes 16901
4. 2020年02月24日 15:45:37 root ＜IPアドレス＞ /dev/pts/1 /usr/sbin/sshd yes 18626
5. 2020年02月24日 18:27:12 root ＜IPアドレス＞ /dev/pts/0 /usr/sbin/sshd yes 21660
```

- Auditレポートの生成（サマリー）  
`# aureport --summary`

```console
Summary Report
======================
Range of time in logs: 1970年01月01日 09:00:00.000 - 2020年02月24日 16:07:17.070
Selected time for report: 1970年01月01日 09:00:00 - 2020年02月24日 16:07:17.070
Number of changes in configuration: 220
Number of changes to accounts, groups, or roles: 5
Number of logins: 7
Number of failed logins: 1
Number of authentications: 14
Number of failed authentications: 12
Number of users: 2
Number of terminals: 9
Number of host names: 3
Number of executables: 24
Number of commands: 28
Number of files: 48
Number of AVC's: 3716
Number of MAC events: 9
Number of failed syscalls: 25835
Number of anomaly events: 10
Number of responses to anomaly events: 0
Number of crypto events: 89
Number of integrity events: 0
Number of virt events: 0
Number of keys: 3
Number of process IDs: 13855
Number of events: 90789
```

### キーボード入力の監査
`aureport`コマンドを活用し、ターミナルで入力したコマンドをログに記録することができます。

キーボード入力の監査を行うためには、以下のファイルに次の設定値を記述します。

- `/etc/pam.d/system-auth`
- `/etc/pam.d/password-auth`

```text
session required pam_tty_audit.so disable=* enable=test
```

動作確認を行うために以下のコマンドを実行し、tesユーザに変更します。

- ユーザ変更  
`# su -l test`

例として適当に以下のコマンドを実行し、`ctrl + d`でログアウトします。

`$ date`
`$ echo "test"`
`$ top`

以下のコマンドを実行すると、testユーザがターミナルで実行したコマンドが確認できます。

`# aureport --tty --start today`

```console
TTY Report
===============================================
# date time event auid term sess comm data
===============================================
1. 2020年04月30日 21:58:09 184 0 ? 1 bash "date",<ret>,"echo \"test\"",<ret>,"top",<ret>,<^L>,<^D>
```

## /etc/audit/rules.d/audit.rules
永続的な設定は`/etc/audit/rules.d/audit.rules`ファイルで設定します。
設定変更後はauditdの再起動を行うことで設定が反映されます。

# おわりに
システム管理者としてAuditは必要な知識です。

Auditはオープンシステムの標準的なレベルとして、OS関連のセキュリティ規格である**Controlled Access Protection Profile (CAPP)**の要件を満たすように作られています。

## 参考
- [第6章 システム監査](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/security_guide/chap-system_auditing)
- [6.5. AUDIT ルールの定義](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/security_guide/sec-defining_audit_rules_and_controls)