不正アクセスの痕跡を調べる(Ubuntu)

セキュリティ

Ubuntuに不正にログインされていないか調査する方法について調べたので残しておきます。

環境

Windows11 home
 VMWare ゲストOS Ubuntu 24.10

確認方法

現在ログインしているユーザを調べる

次のコマンドで現在Ubuntuにログインしているユーザを表示します。

$ > who
UserA seat0        2025-02-02 16:33 (login screen)
UserA tty2         2025-02-02 16:33 (tty2)
UserB pts/1        2025-02-02 16:40 (192.168.254.1)

$ > w
 16:59:31 up 45 min,  3 users,  load average: 0.00, 0.04, 0.17
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU  WHAT
UserA             -                16:16   45:30   0.00s  2.63s /usr/lib/systemd/systemd --user
UserA    tty2     -                16:33   45:36   0.04s  0.03s /usr/libexec/gnome-session-binary --sess
UserB             192.168.254.1    16:59   45:30   0.00s  0.02s sshd: UserB [priv]

 VMWareからUbuntuを使用すると、seat0、tty2が表示されるようです。
 この2件を除外すると、
UserBが、pts/1接続で、IPアドレス192.168.254.1からリモートログイン
していることがわかります。
 このユーザをログアウトさせるには次のコマンドを使用します。

# 強制的にログインユーザ(pts/1)を排除する
$ > pkill -KILL -t pts/1

wコマンドを使用すると、ログインに使用したユーザ名がわかるので、ログアウトさせた間に、パスワードを変更しましょう。

過去にログインしていたユーザを調べる

Ubuntuのログイン履歴や入力コマンドは、/var/log.auth.logに残るので、ここを調べることで過去のログインを調べることができます。

$ > tail /var/log/auth.log
2025-02-02T16:59:12.763515+09:00 kvm sshd[12421]: Accepted publickey for UserB from 192.168.254.1 port 55685 ssh2: ED25519 SHA256:**********************************
2025-02-02T16:59:12.766340+09:00 kvm sshd[12421]: pam_unix(sshd:session): session opened for user UserB(uid=1000) by UserB(uid=0)
2025-02-02T16:59:12.767738+09:00 kvm sshd[12421]: pam_systemd(sshd:session): New sd-bus connection (system-bus-pam-systemd-12421) opened.
2025-02-02T16:59:12.774294+09:00 kvm systemd-logind[1183]: New session 20 of user UserB.
:

ログは膨大な量なので、次のコマンドで絞り込みを行うと見やすいです。

ログイン成功ログを抽出

$ > grep "Accepted" /var/log/auth.log
2025-02-02T15:23:49.592753+09:00 kvm sshd[9673]: Accepted publickey for UserB from 192.168.254.1 port 65154 ssh2: ED25519 SHA256:**********************************
2025-02-02T16:40:21.203102+09:00 kvm sshd[12050]: Accepted publickey for UserB from 192.168.254.1 port 54941 ssh2: ED25519 SHA256:**********************************

ログインに使用したIPアドレスやポート番号が残っているので、ここからログイン元を追うことができます。

ログイン失敗ログを抽出

$ > grep "Failed" /var/log/auth.log
2025-02-02T17:11:23.964313+09:00 kvm sshd[12581]: Failed password for invalid user UserC from 192.168.254.1 port 56141 ssh2
2025-02-02T17:11:29.182760+09:00 kvm sshd[12581]: Failed password for invalid user UserC from 192.168.254.1 port 56141 ssh2

なんというパスワードを入力したのかはわかりません。

何をしたのか調べる(コマンド入力履歴)

コマンド入力履歴を調べる

 Ubuntuに入力したコマンド履歴は、
   /var/log/auth.log (システム全体)
   /home/ユーザー名/.bash_history (対象アカウントのみ)
に保存されます。
 対象のユーザがわかっているのなら、.bash_historyを確認するのが一般的です。

システム全体のコマンド履歴を調べる

$ > grep "COMMAND=" /var/log/auth.log
025-02-02T12:50:55.769508+09:00 kvm sudo: ****** : TTY=pts/0 ; PWD=/home/*****/デスクトップ ; USER=root ; COMMAND=/usr/bin/apt update
2025-02-02T12:51:04.874054+09:00 kvm sudo: ******: TTY=pts/0 ; PWD=/home/*****/デスクトップ ; USER=root ; COMMAND=/usr/bin/apt upgrade
:

sudoコマンドを使った履歴は、USER=rootになるようです。

対象ユーザのコマンド履歴を調べる

$ > tail /home/*****/.bash_history
ls
sudo apt update
sudo apt upgrade

こちらの方法だと、入力したコマンドは見やすいですが、入力した時間はわかりません。
homeフォルダ以下に履歴ファイルが存在するので、bash_history自体が改ざんされている危険性もあります。

RDPのログイン追跡

RDP接続履歴を確認する

 xrdpサーバは、ログを
   /var/log/xrdp.log  操作履歴
/var/log/xrdp-sesman.log セッションログイン履歴
に残しますので、ここから接続元を特定できそうです。

 ところが、VM環境では

$ > grep "192.168"  /var/log/xrdp.log 
何も出力しない

$ > tail  /var/log/xrdp.log 
:
[20250202-17:38:56] [INFO ] address [0.0.0.0] port [3389] mode 1
[20250202-17:38:56] [INFO ] listening to port 3389 on 0.0.0.0
[20250202-17:38:56] [INFO ] xrdp_listen_pp done
[20250202-17:38:58] [INFO ] starting xrdp with pid 1567

$ > grep "192.168"  /var/log/xrdp-sesman.log 
何も出力しない

$ > tail  /var/log/xrdp-sesman.log 
:
[20250202-16:14:01] [INFO ] starting xrdp-sesman with pid 1523
[20250202-16:14:03] [INFO ] sesman_main_loop: sesman asked to terminate
[20250202-17:38:56] [INFO ] starting xrdp-sesman with pid 1542
[20250202-17:38:58] [INFO ] sesman_main_loop: sesman asked to terminate

となりました。
 auth.logを確認するも、ssh接続によるログイン履歴はあるのに、RDPによるログイン履歴が見分けられませんでした。(見方が間違っているのでしょうか)
 xrdp-sesman.logログの中身を確認しましたが、欲しいログが見つけられず…(マジですか)
 きっとVM環境だから表示されないだけなのだと信じたいです。
 

 Ubuntuのリモート接続を「ロック」に戻しました。