sshでログイン/ログアウトした時間のレポートを作成する

そういうツールが無いらしいので自作

環境は以下

```bash
# cat /etc/os-release
NAME="Fedora Linux"
VERSION="38 (Server Edition)"
ID=fedora
VERSION_ID=38
```

`awk` ファイルを用意します。 特権昇格も表示できるように `su` も確認します。

```awk:secure_parse.awk
#!/usr/bin/awk -f
BEGIN {
    print "pid dst loginDate loginTime loginUser src su logoutDate logoutTime"
}
$4 ~ /sshd/ && /Accepted/ {
    # $4 pid
    # $3 destination hostname
    # $1 login date
    # $2 login time
    # $8 login user
    # $10 source ip address
    sshd[$4] = $4 " " $3 " " $1 " " $2 " " $8 " " $10 " -"
}
$4 ~ /su/ && /session opened for user/ {
    su[$4] = $4 " " $3 " " $1 " " $2 " " $10 " - " $12
}
$4 ~ /su/ && /session closed for user/ {
    if ($4 in su) {
        print su[$4] " " $1 " " $2
        delete su[$4]
    } else {
        print $4 " " $3 " - - " $10 " - - " $1 " " $2
    }
}
$4 ~ /sshd/ && /session closed/ {
    # $4 pid
    # $1 logout date
    # $2 logout time
    if ($4 in sshd) {
        print sshd[$4] " " $1 " " $2
        delete sshd[$4]
    } else {
        # ログイン記録が無い場合は - で埋めて出力する
        print $4 " " $3 " - - " $10 " - - " $1 " " $2
    }
}
END {
    # ログアウト記録が無い場合は、ログアウト日時を付けずに出力する
    for(pid in su){
        print su[pid]
    }
    for(pid in sshd){
        print sshd[pid]
    }
}
```

年月日が出力できないと駄目らしいので、年月日をそれらしく出力するよう調整し、先の `awk` に通します。

```bash
# 実行月が1月なら整形するログは
# 昨年12月であるはずなので現在の年からマイナスする
month=$(date +%m)
if [ $month -eq "01" ]; then
    year=$(($(date +%Y) - 1))
else
    year=$(date +%Y)
fi

# 日付を整形したログを生成する
log=/var/log/secure
paste -d ' ' \
    <(cat $log | cut -c 1-15 | xargs -I@ date -d "@" "+%F %T") \
    <(cat $log | cut -c 17-) \
    | sed 's/^..../'$year'/' \
    | awk -f secure_parse.awk \
    | column -t 
```

なんかこんな感じの出力になります。

```console
pid           dst          loginDate   loginTime  loginUser             src            su                       logoutDate  logoutTime
su[41228]:    34-fedora38  2024-05-20  23:11:22   root(uid=0)           -              asterisk(uid=0)          2024-05-20  23:11:23
su[41279]:    34-fedora38  2024-05-20  23:11:41   admin(uid=920200000)  -              asterisk(uid=920250500)  2024-05-20  23:11:44
su[41251]:    34-fedora38  2024-05-20  23:11:28   sssss(uid=920250500)  -              asterisk(uid=0)          2024-05-20  23:11:45
su[39723]:    34-fedora38  2024-05-20  21:31:12   root(uid=0)           -              asterisk(uid=0)          2024-05-20  23:14:43
sudo[39721]:  34-fedora38  2024-05-20  21:31:12   root(uid=0)           -              asterisk(uid=1000)       2024-05-20  23:14:43
sshd[39678]:  34-fedora38  2024-05-20  21:31:08   asterisk              192.168.1.133  -                        2024-05-20  23:14:43
su[41680]:    34-fedora38  2024-05-20  23:15:22   sssss(uid=920250500)  -              asterisk(uid=920200000)  2024-05-20  23:15:24
su[41658]:    34-fedora38  2024-05-20  23:15:13   admin(uid=920200000)  -              asterisk(uid=0)          2024-05-20  23:15:26
su[41636]:    34-fedora38  2024-05-20  23:15:09   root(uid=0)           -              asterisk(uid=0)
sudo[41634]:  34-fedora38  2024-05-20  23:15:09   root(uid=0)           -              asterisk(uid=1000)
sshd[41602]:  34-fedora38  2024-05-20  23:14:49   asterisk              192.168.1.133  -
```

date と time は結合した方が良かったかもしれない。