web-dev-qa-db-ja.com

SSHクライアント接続/コマンドをログに記録する方法は?

ユーザーがサーバーで使用しているSSHコマンドラインをログに記録する方法を教えてください。たとえば、私のサーバー上のユーザーAlexが次の一連のコマンドを実行している場合:

$ cd /tmp
$ touch myfile
$ ssh [email protected]
$ ssh [email protected]
$ vim anotherfile
$ ssh [email protected]

サーバーで使用されているsshコマンドを次のようなファイルに記録します。

[2014-07-25 10:10:10] Alex : ssh [email protected]
[2014-07-25 10:18:20] Alex : ssh [email protected]
[2014-07-25 11:15:10] Alex : ssh [email protected]

私は彼が彼のsshセッション中に何をしたか気にしません、私はいつ、どこで彼が別のサーバーに接続したかを知りたいだけです。

ユーザーはbashを使用しておらず、ユーザーが変更できるため、とにかく.bash_historyを操作しないようにしたいと思います。

これに関する手がかりはありますか?

ありがとうございました :)

編集:より具体的に:

ユーザーがサーバーAに接続し、サーバーAからサーバーBに接続します。サーバーAからsshを介して接続するサーバーを追跡したいと思います。

5
Kevin Merigot

あなたが私がそれを見るように、あなたはそれを3つの異なる方法で行うことができました-同様にそれを行う他の多くの方法が最もありそうです!最良の方法は、カーネルsysexec呼び出しに監査ツールをアタッチして、ユーザーが追跡できないようにすることです。他の2つの方法は、シェル環境を変更してログに記録することです。

私の代わりに(Googleからコード/回答を取得)、その方法を示します。これをすでに詳細に説明しているサイトへのリンクを提供します。それがまさにあなたが必要とするものであることを願っています。

ところで、最も簡単な方法は、メインのbashrc/profileに何かを含めてすべてのユーザーに影響を与えることです。

とにかく、ここにbashrcソリューションへのリンクがあります。

1)Bashrcソリューション: Linuxですべてのユーザーが実行したコマンドをログに記録する方法 2)Bashrc/trapソリューション: Bash:Syslogの履歴

もう1つの方法(カーネルレベル)は、ツールの監査またはアカウントを調べることです。カーネルのsysexec呼び出しを介してコマンドのロギングを設定する方法を教えてくれるサイトがたくさんあります。

3
davidbl

Sshを開始する前に、ユーザーIDとその他の情報を取得してログファイルに書き込むために使用できるスクリプトを次に示します。いくつかの非常に複雑な複数行のsshコマンドでテストしました。

#!/bin/bash

# Title......: ssh (wrapper)
# Description: this script replaces the ssh binary and runs the real binary after logging the connection attempt

# variables
#----------------------------------
REALBINARY=/usr/bin/sshu
THISHOST=$(uname -n)
LOGFILE=/var/log/sshclient.log
CALLINGPROC=$(ps -o comm= $PPID)

log() {  # creates a basic log entry; $LOGFILE must be defined
 echo "$(date '+%Y-%m%d %H:%M:%S %Z') $$  $*">>$LOGFILE
}

SSHTARGETOPTS=$(echo "$@" | head -1)
while getopts :l: OPT 2> /dev/null
do
 case "$OPT" in
  l) TARGETUSER="$OPTARG" ;;
 esac
done

#after parsing with getopts, OPTIND will be the positional parameter number of the first argument after the options
FIRSTARG=$(echo $SSHTARGETOPTS | awk "{print \$$OPTIND}")
#if there is an '@' symbol in the FIRSTARG, parse out the LOGIN and TARGETSERVER, if not, TARGETSERVER is FIRSTARG
if [[ "$FIRSTARG" =~ '@' ]] ; then
 TARGETUSER="${FIRSTARG%@*}"
 TARGETSERVER=${FIRSTARG##*@}
else
 TARGETSERVER="$FIRSTARG"
fi
TARGETUSER="${TARGETUSER:-$LOGNAME}"

if [[ "$Sudo_USER" ]] ; then
 log "$THISHOST CallingProc='$CALLINGPROC' Sudo_USER='$Sudo_USER' became LOGNAME='$LOGNAME' ssh to TARGETSERVER='$TARGETSERVER' as TARGETUSER='$TARGETUSER' with command '$0 $SSHTARGETOPTS'"
else
 log "$THISHOST CallingProc='$CALLINGPROC' LOGNAME='$LOGNAME' ssh to TARGETSERVER='$TARGETSERVER' as TARGETUSER='$TARGETUSER' with command '$0 $SSHTARGETOPTS'"
fi

exec $REALBINARY "$@"
2
raker