Corredor

ウェブ、プログラミングの勉強メモ。

Linux サーバに「いつ」「どの SSH 鍵を使って」ログインされたか調べる方法

  • 普段、ある Linux サーバに SSH 鍵を使って接続して作業している
  • サーバで使うユーザは、単一のシステム用ユーザ (仮に devuser) を複数の開発メンバで共用している

コレまでの運用からこんな状況なので、$ last -w コマンドで過去に SSH ログインしたユーザ情報を調べたところで、devuser という名前が並ぶばかりで、実際のところ誰がログインして作業したのかが分からない。

そこで考えたのは、「いつ」「どの SSH 鍵を使って」ログインしたか、が分かれば、使用するユーザは devuser で同じでも、作業者が特定できるのではないか、ということだ。今回はこの情報をログ出力する方法を紹介する。

色々おさらい

そもそも、「公開鍵認証方式」を使って、サーバに SSH 接続するための諸々をおさらいしておく。

SSH 鍵の発行方法

SSH 鍵は以下のように作成する。

  • $ ssh-keygen -t rsa -b 4096 -C 'コメント'
    • -t rsa は生成する鍵の種類の指定。一般的には RSA 鍵を生成して使う
    • -b 4096 はビット数。2048 以上にしないと簡単すぎて解読される恐れがある
    • -C 'コメント' は単なるコメント。なくても大丈夫だが、このあと話す内容に関わるので指定しておく
$ ssh-keygen -t rsa -b 4096 -C 'NeosKey'
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/Neo/.ssh/id_rsa):  # ★ 鍵ファイルの出力先を指定する
Enter passphrase (empty for no passphrase):  # ★ パスフレーズ・空欄で良い
Enter same passphrase again:  # ★ パスフレーズ再確認
Your identification has been saved in /Users/Neo/.ssh/id_rsa.
Your public key has been saved in /Users/Neo/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:p+Y+E/dih2xOAOz1aCClx1MtSEEXSY6rhagYVbdceiA NeosKey
The key's randomart image is:
+---[RSA 4096]----+
|    EoB+*+       |
|   . O.Xo .      |
|  . o % +.       |
| . . = B o       |
|. . . + S o      |
|.o   o ..+.      |
|o   .   o+.o     |
|       oo.* o    |
|       .o*.o     |
+----[SHA256]-----+

このようにすると、~/.ssh/ 配下に id_rsa (秘密鍵)id_rsa.pub (公開鍵) のペアが生成される。

  • id_rsa (秘密鍵) の例
    • 秘密鍵は外部に漏らしてはならないモノ
    • 秘密鍵ファイルさえあれば公開鍵はまた生成できる
$ cat ~/.ssh/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjVAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACFwAAAAdzc2gtcn
……中略……
CpL4jB7tMfEAAAAJTmVvJ3MgS2V5AQV=
-----END OPENSSH PRIVATE KEY-----
  • id_rsa.pub (公開鍵) の例
    • 公開鍵を、通信したい相手に教えておくことで、暗号化したり復号したりできる
    • 公開鍵は、知られたところで、秘密鍵を復元することはできないので、あまり気にせず配布して大丈夫 (GitHub で管理している人もいる)
    • ssh-rsa (スペース) の直後に始まる長い文字列が公開鍵
    • そこからさらにスペースを挟んで書かれた NeosKey 部分はただのコメントなので、あってもなくても変わらない
$ cat ~/.ssh/id_rsapub
ssh-rsa AAANB3NzaC1yc2EA……(中略)……PLtSQ2oQH2m3s67FQ== NeosKey
  • フィンガープリント (指紋) の確認方法
    • フィンガープリントとは、公開鍵のハッシュ値
    • 秘密鍵ファイル、公開鍵ファイルのいずれからも同じフィンガープリント文字列が取得できる
    • このフィンガープリントの突合をもって正しいものか確認している
# 秘密鍵からフィンガープリントを確認
$ ssh-keygen -lf ~/.ssh/id_rsa
4096 SHA256:p+Y+E/dih2xOAOz1aCClx1MtSEEXSY6rhagYVbdceiA NeosKey (RSA)

# 秘密鍵からフィンガープリントを確認 (コマンド自体は同じ)
$ ssh-keygen -lf ~/.ssh/id_rsa.pub
4096 SHA256:p+Y+E/dih2xOAOz1aCClx1MtSEEXSY6rhagYVbdceiA NeosKey (RSA)

クライアントサイドで SSH 鍵を作る方法は以上。

SSH 鍵の管理方法

クライアントで SSH 鍵を作ったはいいけど、コレだけではサーバに SSH 接続できない。「その鍵を使えばウチのサーバに接続して良いよ」とサーバ側が許可を下ろすには、どうしたら良いのか。

あるサーバに SSH 接続するためには、公開鍵の情報が ~/.ssh/authorized_keys に記録されている必要がある。サーバにあるこのファイルを開いてみると、以下のように公開鍵が羅列されているだろう。

$ cat ~/.ssh/authorized_keys
ssh-rsa AAANB3NzaC1yc2EA……(中略)……PLtSQ2oQH2m3s67FQ== NeosKey
ssh-rsa xxxxxxxxxxxxxxxxxx== AdamsKey
ssh-rsa yyyyyyyyyyyyyyyyyy== TimsKey

要はこのファイルに公開鍵を追記していけば良い。そうすれば、

$ ssh -i ~/.ssh/id_rsa devuser@10.200.100.100

といった書式で SSH 接続できるようになる。

どの SSH 鍵を使ってログインされたかログを残すには

SSH 鍵の生成方法と鍵ペアの存在、authorized_keys というファイルの存在を確認したところで、本題に入る。

前述の例に出した authorized_keys ファイルには、NeosKeyAdamsKeyTimsKey という3つの公開鍵が設定されていた。開発メンバが3人いて、3人が devuser ユーザに SSH ログインできる状態、と考えられる。コレをログに残したいワケだ。

サーバの /etc/ssh/sshd_config というファイルを開く。恐らく root ユーザ権限が必要なので sudo vi しよう。

中を見ると色々設定があると思うが、以下の2行を記述すれば良い。

SyslogFacility AUTHPRIV
LogLevel VERBOSE

このように設定しておくと、/var/log/secure というファイルに、SSH ログイン時に以下のようなログが出力されるようになる。

$ sudo cat /var/log/secure

# 抜粋
Apr  9 04:33:18 myhost sshd[27711]: Accepted publickey for devuser from 10.200.100.100 port 50177 ssh2: RSA SHA256:p+Y+E/dih2xOAOz1aCClx1MtSEEXSY6rhagYVbdceiA

/var/log/secure というログファイルに、SSH ログイン時に使用された SSH 鍵のフィンガープリントが記録されるのだ。

フィンガープリントを確認するには、authorized_keys ファイルを読み込んで以下のように叩けば良い。

$ ssh-keygen -lf ~/.ssh/authorized_keys
4096 SHA256:p+Y+E/dih2xOAOz1aCClx1MtSEEXSY6rhagYVbdceiA NeosKey (RSA)
4096 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx AdamsKey (RSA)
4096 SHA256:yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy TimsKey (RSA)

コレを突合すれば、コメント欄から、誰が生成した SSH 鍵のフィンガープリントかは特定できるので、NeosKey の生成者である Neo 氏がログインした形跡が分かる。

コメント欄には個人を特定できる情報を入れてもらう

というワケで、ssh-keygen コマンドの -C オプションに渡すコメント欄には、その開発者のメールアドレスや社員番号なんかを入れてもらうのが分かりやすいのではないだろうか。

コレなら、サーバ側に用意するユーザは1つでも、どの開発者が SSH ログインしたかは追跡できるようになる。

OpenSSH[実践]入門 Software Design plus

OpenSSH[実践]入門 Software Design plus