質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

4回答

2566閲覧

sshの接続元を特定する

ex025

総合スコア179

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2022/05/02 14:06

編集2022/05/12 23:32

ssh接続先のサーバーで独自に接続のログを取るため、接続元を記録したいです。

who am i ではプロバイダの情報までしか確認できなかったため、それがどの接続者であるかを特定するには不十分でした。
どの公開鍵を使用しているかを記録することなどができればいいと思ったのですが、方法はありますでしょうか。

サーバーのOSはlinux、シェルはbashです。

追記
レンタルサーバーなのでログの閲覧ができず、.bashrcにログ保存のスクリプトを組もうとしています。
一般ユーザーがアクセスできる場所にログを保存できるならどの方法でも構わないので、もしあれば教えていただけたら幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

doda

2022/05/08 15:38

sshdの設定(/etc/ssh/sshd_config)を変更できますか? レンタルサーバだというので難しいかもしれませんが、これが可能ならばかなりやりやすくなります。逆に無理ならば、かなり強引な方法を取る必要が出てくると思います。
ex025

2022/05/08 16:34

その設定には変更どころかアクセスもできません。 強引な方法というのはどのようなものがあるのか教えていただけるとありがたいです。
guest

回答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 を書き換えてスクリプトの実行自体を回避する事は簡単にできます。
  • shelllogfile の設定は好みに応じて書き換えてください。
  • 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_configExposeAuthInfo 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

doda

総合スコア947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

script ログファイル名
でいかかでしょうか?

投稿2022/05/06 06:34

okakemetal

総合スコア261

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ex025

2022/05/08 16:25

scriptでは操作のログのみで、公開鍵の情報などは記録されないかと思っていましたが、何か方法があるのであれば教えていただきたいです。
guest

0

1つのアカウントを共有していると言うことですかね。
IPアドレスでの特定で不十分と言うことであれば、.bash_profileの中で追加の情報(パスワード相当)を入力させるくらいでしょうか。

ただ、ログインした後で誰でもそこを書き換えたり出来ますが。

投稿2022/05/03 04:22

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

opensshだとは思いますが…。
ログにユーザー名と接続元IPが記録されていますが、それではだめなんですか?
使用された公開鍵の情報も…というのであれば、
https://qiita.com/xtetsuji/items/b5a15f6d1ad3f6091baf
の方法で。(まぁ、こちらもログに記録される…ですが)

共有アカウントでログインしたときにかなにかでシェルスクリプトで判別したい…ってことでしょうかね?
一般ユーザーでopensshのログの閲覧は…できたかなぁ??

投稿2022/05/02 21:50

setoppu

総合スコア291

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ex025

2022/05/03 03:21

ありがとうございます。 レンタルサーバーなのでログの閲覧ができず、`.bashrc`にログ保存のスクリプトを組もうとしています。 一般ユーザーがアクセスできる場所にログを保存できるならどの方法でも構わないので、もしあれば教えていただけたら幸いです。
doda

2022/05/08 15:40

> https://qiita.com/xtetsuji/items/b5a15f6d1ad3f6091baf この記事は6年前に書かれた物で、古くて現在とは前提条件が違うので参考にしない方がいいと思います。 現在は上記記事の方法を使わなくても、デフォルトで以下のようにユーザ認証成功時のログに使われた鍵の情報も一緒に出力されます。 > Accepted publickey for doda from 192.0.2.1 port 63085 ssh2: ED25519 SHA256:OZ8OZ0BunODz5keIpVUqOqJEm7q3/5uhYfj+t4DiPTc
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問