ssh接続先のサーバーで独自に接続のログを取るため、接続元を記録したいです。
who am i
ではプロバイダの情報までしか確認できなかったため、それがどの接続者であるかを特定するには不十分でした。
どの公開鍵を使用しているかを記録することなどができればいいと思ったのですが、方法はありますでしょうか。
サーバーのOSはlinux、シェルはbashです。
追記
レンタルサーバーなのでログの閲覧ができず、.bashrc
にログ保存のスクリプトを組もうとしています。
一般ユーザーがアクセスできる場所にログを保存できるならどの方法でも構わないので、もしあれば教えていただけたら幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/08 16:34
回答4件
0
ベストアンサー
まず状況を簡単にまとめると、
- 共用アカウントで誰がssh接続してきたかを記録したい。
- 接続元IPアドレスでは不完全なので、ログイン時に利用した公開鍵で判断したい。
- レンタルサーバでroot権限を持っていないので、認証ログの参照やsshdの設定変更は出来ない。
という事でしょうか。
コメントで書きましたが、root権限が有るならば簡単にできますが、root権限が無い場合にはちょっと強引な手法を取る必要が有ります。
(ちょっと)強引な手法
まずは質問に対する回答として、(ちょっと)強引な手法について書きます。
他の人の参考になるかもしれないので、後ろにroot権限が有る場合の方法も書きます。
方針
OpenSSHでは、「ユーザが指定したコマンドやシェルではなく、代わりに特定のコマンドを強制的に実行する」事を公開鍵毎に設定出来ます。
今回はこの機能を利用して、公開鍵毎に別のスクリプトを起動するよう設定し、それらのスクリプトの中でユーザ情報をログに残した後にシェルを起動するという手段を取ります。
共通設定
まず、以下の内容のスクリプトを ~/.ssh/scripts/user.sh
として作成します。
shell
1#!/bin/sh 2 3# 起動するシェル(オプション込み) 4shell="/usr/local/bin/zsh -li" 5 6# SFTPサーバコマンドの位置 7sftp_server="/usr/libexec/sftp-server" 8 9# ログを記録しておくファイル 10logfile=".ssh/userlog" 11 12# スクリプト名をユーザ名として扱う 13user=${0##*/} 14 15# ログ記録用関数 16log() { 17 echo "$(date +"%Y-%m-%d %H:%M:%S") $user $@" >> $logfile 18} 19 20case "$SSH_ORIGINAL_COMMAND" in 21"") log "SHELL" 22 exec $shell ;; 23 24internal-sftp|$sftp_server) 25 log "SFTP ($SSH_ORIGINAL_COMMAND}" 26 exec $sftp_server ;; 27 28*) log "Remote Command ($SSH_ORIGINAL_COMMAND)" 29 exec echo "Remote command execution is not supported." >&2 ;; 30# exec /bin/sh -c "$SSH_ORIGINAL_COMMAND" ;; 31esac
作成したスクリプトに、実行権限を付与します。
shell
1chmod 755 ~/.ssh/scripts/user.sh
ログを記録しておくファイルを作成します。
shell
1touch ~/.ssh/userlog
ユーザ(公開鍵)毎設定
方針では「公開鍵毎に別のスクリプトを起動する」と書きましたがそれでは管理が煩雑となるので、スクリプト自体は共通にしておき、起動された時のファイル名で処理を変えるようにしています。
ユーザ(公開鍵)毎に起動するファイル名を変える為、Symbolic Linkを作成します。
shell
1cd ~/.ssh/scripts 2ln -s user.sh user1
ここで作成したSymbolic Linkのファイル名(上記ではuser1)がログに記録されます。
Symbolic Linkを作成したら、対象の公開鍵利用時は作成したSymbolic Linkを実行するよう~/.ssh/authorized_keys
を編集します。
authorized_keys
1command=".ssh/scripts/user1" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI~略~
これを各ユーザ(公開鍵)に対して繰り返します。
注意点
- 悪意の有るユーザはいない事を仮定しています。悪意の有るユーザがログを書き換えたり、
~/.ssh/authorized_keys
を書き換えてスクリプトの実行自体を回避する事は簡単にできます。 shell
やlogfile
の設定は好みに応じて書き換えてください。- sftp-serverコマンドが別の場所にインストールされている場合は、それに合わせて
sftp_server
を書き換えてください。 - サーバがSFTPでinternal-sftpを起動するようになっていて、かつ(externalな)sftp-serverコマンドがインストールされていない場合は SFTP でのログインは出来ません。
- scp や
ssh user@host date
のようなコマンド直接実行には対応していません。スクリプトのエラーを表示している行をコメントアウトし、次の行のコメントアウトを外すと scp やコマンド直接実行も使えるようになるかもしれません。 - 全体として、私の方ではほとんど動作確認をしていないので、問題が無いか十分に評価した後に自己責任で利用して下さい。
root権限が有る場合
root権限が有るならば、もっと簡単に利用された公開鍵の情報が確認できます。ここでは、以下の二種類の方法について書きます。
- ユーザ認証ログを確認する方法
- sshdの設定ファイル(/etc/ssh/sshd_config) で
ExposeAuthInfo yes
に設定する方法
ユーザ認証ログ
Openssh 6.3以降では、以下のように認証時のログに公開鍵の情報も記録されるようになりました。
May 12 23:00:00 host sshd[1000]: Accepted publickey for doda from 192.0.2.1 port 63085 ssh2: ED25519 SHA256:OZ8OZ0BunODz5keIpVUqOqJEm7q3/5uhYfj+t4DiPTc
必要な時に認証ログ(/var/log/secure, /var/log/auth.log等)を確認すれば、どの公開鍵でログインして来たかを確認できます。
ExposeAuthInfo yes に設定する方法
OpenSSH 7.6以降ならば、/etc/ssh/sshd_config
に ExposeAuthInfo yes
を追加する事によって、ログイン後にユーザ認証時の情報を知る事が出来ます。
この情報は一時ファイルに書き込まれ、そのファイル名が環境変数 SSH_USER_AUTH
に格納されます。
例えば以下のような内容の ~/.ssh/rc
を作成すれば、~/.ssh/userlog
に接続元のIPアドレスと認証時に使われた公開鍵が記録されます。
echo "$(date +"%Y-%m-%d %H:%M:%S") $SSH_CLIENT $(cat $SSH_USER_AUTH)" >> ~/.ssh/userlog
投稿2022/05/12 14:32
総合スコア947
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
script ログファイル名
でいかかでしょうか?
投稿2022/05/06 06:34
総合スコア261
0
opensshだとは思いますが…。
ログにユーザー名と接続元IPが記録されていますが、それではだめなんですか?
使用された公開鍵の情報も…というのであれば、
https://qiita.com/xtetsuji/items/b5a15f6d1ad3f6091baf
の方法で。(まぁ、こちらもログに記録される…ですが)
共有アカウントでログインしたときにかなにかでシェルスクリプトで判別したい…ってことでしょうかね?
一般ユーザーでopensshのログの閲覧は…できたかなぁ??
投稿2022/05/02 21:50
総合スコア291
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/03 03:21
2022/05/08 15:40
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。