サーバに誰がログインしたか確認する方法

セキュリティ

 ふとローカール環境上のubuntuに自分以外の人がログインしていたらどうしようと思ったので、確認方法を残しておきます。
 ログインされた場合の調査方法も、調べた分だけ載せておきます。

環境

メインOS Windows11 (192.168.19.1)
ゲストOS Ubuntu24.04.1 LTS

現在ログインしているユーザを表示する方法(wコマンド)

$ w
 20:48:01 up 15 min,  4 users,  load average: 0.02, 0.14, 0.24
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
①****     tty2     -                20:33   15:15   0.05s  0.04s /usr/libexec/gnome-session-binary --session=ubuntu
②****           192.168.19.1     20:34   14:51   0.00s  0.05s sshd: ub-axis [priv]
③****           192.168.19.1     20:36   14:51   0.00s  0.01s sshd: ub-axis [priv]
③****           192.168.19.1     20:36   14:51   0.00s  0.01s sshd: ub-axis [priv]

現在ログインしているアカウントを4件確認することができました。

 ①GUIでログインしたユーザです。(自分自身)
  VMWare上の端末

 ②メインOS側のPowerShellから”powershell”コマンドでリモート接続したユーザ 

 ③④ WinSCPによるSSHログイン
  WinSCPでログインすると2セッション追加されました。
  コンソール用とファイル転送用で2セッション使っているのかもしれません(WinSAP上ではコンソールによる直接コマンド送信が行えます)


この”w”コマンドを使用すれば、
   現在ログインしているユーザの一覧
   ログイン元のIPアドレス
が表示されるので、いつから、どの端末でログインしているかを調べることができます。

これまでにログインしたユーザを知りたい(lastlog、last)

次のコマンドで、全ユーザのログイン履歴を表示することができます。

lastlogを使った確認方法(ユーザ毎に最終ログインを表示)

$ lastlog
Username         Port     From                                       Latest
root                                                                **一度もログインしていません**
daemon                                                              **一度もログインしていません**
www-data                                                            **一度もログインしていません**
mysql                                                               **一度もログインしていません**
syslog                                                              **一度もログインしていません**
sa**                                                                **一度もログインしていません**
co**                                                                **一度もログインしていません**
ge**                                                                **一度もログインしていません**
 :
*****          pts/0    192.168.19.1                              月  9月 16 21:19:36 +0900 2024

すべてのユーザ名一覧と、最終ログイン記録が出力されます。
こんなにユーザを登録した覚えはないと思って調べたところ、ほとんどはシステムユーザであり、手動でログインすることはできないとのこと。

lastを使った確認方法(すべてのログイン履歴を表示)

# 全てのログイン履歴
$ last
****  pts/0        Mon Sep 16 21:19   still logged in    192.168.19.1
****  pts/0        Mon Sep 16 20:56 - 21:18  (00:22)     192.168.19.1
****  pts/0        Mon Sep 16 20:36 - 20:53  (00:17)     192.168.19.1
:

# 最近5件のログイン履歴
$ last -5 -a
****  pts/0        Mon Sep 16 21:19   still logged in    192.168.19.1
****  pts/0        Mon Sep 16 20:56 - 21:18  (00:22)     192.168.19.1
****  pts/0        Mon Sep 16 20:36 - 20:53  (00:17)     192.168.19.1
****  tty2         Mon Sep 16 20:33   still logged in    tty2
****  seat0        Mon Sep 16 20:33   still logged in    login screen

 全てのログイン履歴を表示すると精査するのが大変なので、直近の5~10件程度を確認するというやり方が現実的だと思います。
 -aオプションを付けると、日付で対象のログインを探す際に便利です。

サーバに登録されている一般ユーザの見分け方

 ゲストOS(ubuntu)の次のファイルに、ユーザの一覧が存在します。

$ cat /etc/passwd

各行のデータは、”:”で7つのフィールドに区切られており、左から順番に
  ユーザー名
  パスワード(通常はxと表示)
  ユーザーID(0~65536の数字)
  グループID(0~65536の数字)
  コメント
  ホームディレクトリ(/home/????)
  ログインシェル
となっています。
 このユーザID(UID)を使って
   0~999 システムユーザ
   1000~ 一般ユーザ
で分別することができます。

「/etc/passwd」ファイル – Linux技術者認定 LinuC | LPI-Japan 参照

不審なログインがあった場合はどうしたらいいのか

 私は幸いにも不審なログインがありませんでしたが、もし公開環境で不審なログインを見つけた際は、次のコマンドで
  いつ、どこから、何をされたのか
を確認することが重要だと思います。

●lastコマンド等を使ってログイン日時を特定する

●パスワードの入力に失敗していないか

 /var/log/auth.logには、
    ログイン認証系のログ
    sudoの使用履歴ログ
が出力されます。
 次のコマンドを使って、総当たり攻撃等の痕跡(パスワードの入力に失敗していないか)を確認することができます。

# パスワードの入力に失敗していないか
> sudo cat /var/log/auth.log | grep 'Failed password'

# sudo を使って不審なコマンドを実行していないか
> sudo cat /var/log/auth.log | grep 'sudo'

# ssh を使って不審なコマンドを実行していないか
> sudo cat /var/log/auth.log | grep 'ssh'

●ログインされたユーザが判明した場合

 ユーザ毎にhomeディレクトリに、コマンドの実行履歴が保存されたhistoryが作成されるので、このファイルを確認することでコマンドの実行履歴を確認することができます。

# 対象アカウントがログアウト済
> cd /home/アクセスされたユーザ
> cat .bash_history

# 対象アカウントがログイン中
> HISTTIMEFORMAT="%F %T "
> history
  823  2024-09-16 21:19:36 users
  824  2024-09-16 21:19:36 lsb_release -a
  825  2024-09-16 21:19:36 exit
  826  2024-09-16 21:19:36 ps

※アカウントをログアウトする際に、history -> .bash_history に保存される仕様となっている為です

最後に

ローカル上のサーバに誰もアクセスしていないことがわかり、少し安心できたので休みたいと思います。