アカウントへのアクセスに使用されたsshキーを見つけることは可能ですか?私はサーバー上にアカウントを持っており、そのアカウントに複数の(信頼できる!)人々にssh経由でアクセスさせています。誰がいつログインしたかを知ることができれば便利だと思います。ルートアクセス権があるので、ログを見ることができますが、そこには何も存在しないようです。ログでキーを識別するための何らかの方法を設定する設定スイッチはありますか?
アカウントへのアクセスに使用されたsshキーを見つけることは可能ですか?私はサーバー上にアカウントを持っており、そのアカウントに複数の(信頼できる!)人々にssh経由でアクセスさせています。誰がいつログインしたかを知ることができれば便利だと思います。ルートアクセス権があるので、ログを見ることができますが、そこには何も存在しないようです。ログでキーを識別するための何らかの方法を設定する設定スイッチはありますか?
回答:
sshd構成ファイル(通常/etc/ssh/sshd_config
)に移動し、LogLevelディレクティブをVERBOSEに変更すると:
LogLevel VERBOSE
...ログで次のようなものを見ることができます:
6月24日22:43:42 localhost sshd [29779]:一致するRSAキーが見つかりました:d8:d5:f3:5a:7e:27:42:91:e6:a5:e6:9e:f9:fd:d3:ce
6月24 22:43:42 localhost sshd [29779]:127.0.0.1ポート59630 ssh2からcalebの公開キーを受け入れました
からman sshd_config
:
LogLevel
Gives the verbosity level that is used when logging messages from
sshd(8). The possible values are: QUIET, FATAL, ERROR, INFO, VER-
BOSE, DEBUG, DEBUG1, DEBUG2, and DEBUG3. The default is INFO.
DEBUG and DEBUG1 are equivalent. DEBUG2 and DEBUG3 each specify
higher levels of debugging output. Logging with a DEBUG level vio-
lates the privacy of users and is not recommended.
sed -ne "/sshd.$PPID.:.*matching DSA key/{s/^.* //g;p;q}" /var/log/auth.log
sed
です!
q
ディレクティブ、ファイルの最後まで店のラインを... sedの行は次のようになります。sed -ne "/sshd.$PPID.:.*matching DSA key/{s/^.* //g;h};\${x;p}" /var/log/auth.log
。決定的:私はsedが大好きです!
@ user37161の回答とやや似ています。共有アカウントがカスタムシェルを実行していて、シェルがそこにいるユーザーを知る必要がある場合、「ラッパー」スクリプトを実行するだけでは十分ではない可能性があります。条件。
代わりにenvironment=
、authorized_keysファイルのオプションを使用して環境変数を設定し、カスタムシェルがその環境変数を読み取ることができます。
.ssh/authorized_keys
ファイル内で、次のように環境変数セットを各行の先頭に追加します。
environment="REMOTEUSER=jrhacker" ssh-rsa ....
environment="REMOTEUSER=jbloggs" ssh-rsa ....
その後、カスタムシェルまたはさまざまなrcスクリプトのいずれかが$REMOTEUSER
変数を読み取り、適切なアクションを実行できます。
ただし、標準シェルを使用している場合、ログインしているユーザーはファイルを変更してさまざまなことを阻止できることに注意してください。また、ユーザーがなどの環境変数を設定できるようにすることには、いくつかのリスクがありますLDPRELOAD
。sshd_config
に関するドキュメントを参照してくださいPermitUserEnvironment
。
ユーザー名に応じてキーごとにSSH接続を追跡/記録する完全に使用可能な方法があります。
@Calebの答えに加えて、ちょっとしたトリックを共有したいと思います。
注意:私はDebian 6.0に取り組んでいます。
最初に、サーバー構成に十分なログレベルがあることを確認します。
rootとして、これは詳細なlogginを設定してアクティブにします:
sed '/^[^#]*LogLevel.*\(QUIET\|FATAL\|ERROR\|INFO\)/{s/^/# /;h;s/$/\nLogLevel VERBOSE/};${p;g;/./!{iLogLevel VERBOSE'$'\n;};D}' -i /etc/ssh/sshd_config
書くことができます:
sed '
/^[^#]*LogLevel.*\(QUIET\|FATAL\|ERROR\|INFO\)/{
s/^/# /;
h;
s/$/\nLogLevel VERBOSE/
};
${
p;
g;
/./!{
iLogLevel VERBOSE
};
D
}' -i /etc/ssh/sshd_config
またはsedスクリプトで:
#!/bin/sed -f
/^[^#]*LogLevel.*\(QUIET\|FATAL\|ERROR\|INFO\)/{
s/^/# /;
h;
s/$/\nLogLevel VERBOSE/
};
${
p;
g;
/./!{
iLogLevel VERBOSE
};
D
}
次のように実行できます:
patchSshdConfigLogLevel.sed -i /etc/ssh/sshd_config
これをアクティブにするよりも:
service ssh restart
ユーザーが読み取り可能なファイルで指紋を取得します。
echo ':msg, regex, "Found matching .* key:" -/var/log/sshdusers.log' \
> /etc/rsyslog.d/ssh_key_user.conf
echo ':msg, regex, "Accepted publickey for" -/var/log/sshdusers.log' \
>> /etc/rsyslog.d/ssh_key_user.conf
service rsyslog restart
sshから(再)ログインして、新しいファイルsshdusers.log
が作成される(そして何かが含まれる)ことを確認してから、
chmod 644 /var/log/sshdusers.log
これにより、現在のセッションの指紋が出力されます。
sed -ne "/sshd.$PPID.:.*matching .SA key/{s/^.* //g;h};\${x;p}" /var/log/sshdusers.log
sed -ne "/sshd.\($(($(ps ho ppid $PPID)))\|$PPID\).:.*\(Accepted publickey\|matching .SA key\)/{s/^.* //g;h};\${x;p}" /var/log/sshdusers.log
.bashrc
そして最後に、あなたまたはユーザーの終わりに置く小さなアドオンがあります:/etc/bash.bashrc
.bashrc
ssh_oPwd=$OLDPWD
ssh_oUmask=$(umask)
umask 077
ssh_tempdir=$(mktemp -d /tmp/ssh-id-XXXXXXX)
cd $ssh_tempdir || exit 1
ssh_crtFp=$(
sed -ne "/sshd.\($(($(ps ho ppid $PPID)))\|$PPID\).:.*\(Accepted publickey\|matching .SA key\)/{s/^.* //g;h};\${x;p}" /var/log/sshdusers.log
)
for ((ssh_i=1;ssh_i<=$(wc -l <$HOME/.ssh/authorized_keys);ssh_i++));do
export ssh_line="$(sed -ne ${ssh_i}p <$HOME/.ssh/authorized_keys)"
echo "$ssh_line" >tempKey
export ssh_lFp=($(ssh-keygen -l -f tempKey))
if [ "${ssh_lFp[1]}" == "$ssh_crtFp" ] ;then
export SSH_KEY_USER=${ssh_line##* }
break
fi
done
cd $OLDPWD
OLDPWD=$ssh_oPwd
rm -fR $ssh_tempdir
umask $ssh_oUmask
unset ssh_lFp ssh_line ssh_i ssh_crtFp ssh_tempdir ssh_oUmask ssh_oPwd
したがって、SSHから再ログインすると、次のように表示されます。
set | grep ^SSH
SSH_CLIENT='192.168.1.31 43734 22'
SSH_CONNECTION='192.168.1.31 43734 192.168.1.2 22'
SSH_KEY_USER=user@mydesk
SSH_TTY=/dev/pts/2
注一部のインストールでは、承認されたキーファイルは、たとえば$HOME/.ssh/authorized_keys2
...
file
、ファイルの種類を知るために。しかし、人間の場合と同様のような拡張持つ、ファイルシステムを閲覧する人.pl
、.py
、.sh
、.awk
、.sed
、を.tar.gz
、あるいは.png.b64.gz
便利です!
fedora 20+では、ログインの試行と成功は/var/log/audit/audit.logに保存されます。このログはログイン試行(失敗と成功)を保存し、ログイン試行に使用されるキーフィンガープリントはfpという名前のフィールドに保存されます。
ログインしたキーフィンガープリントとssh-keygen -lを1行ずつ実行することで、authorized_keysのフィンガープリントと比較できます。
sshログインとそのセキュリティおよび侵入検知に関する詳細な説明はこちら:http : //vpathak.tumblr.com/post/121343814158/fedora-audit-log-with-love-from-russia
@Fに加えて。ハウリの答え、私は便利な「LoggedInプロンプト」を用意しています。
1つの追加ファイルはオプションです($ HOME / .ssh / users):
kszumny@laptop kszumny
kszumny@comp2 kszumny
tom@laptop tom
pati@home
chris@workstation1 chris
chris@workstation2 chris
この部分は/etc/profile
(すべてのユーザーに対して)または~/.bashrc
other_users_prompt()
{
pids=`ps fx | grep "sshd:\s" | awk '{print $1}'`
users=""
for uid in $pids
do
ssh_crtFp=`sed -ne "/sshd.$uid.:.*matching .SA key/{s/^.* //g;p;q}" /var/log/sshdusers.log`
for ((ssh_i=1;ssh_i<=$(wc -l <$HOME/.ssh/authorized_keys);ssh_i++));do
export ssh_line="$(sed -ne ${ssh_i}p <$HOME/.ssh/authorized_keys)"
echo "$ssh_line" >tempKey
export ssh_lFp=($(ssh-keygen -l -f tempKey))
if [ "${ssh_lFp[1]}" == "$ssh_crtFp" ] ;then
export SSH_KEY_USER=${ssh_line##* }
ST_USER=`cat $HOME/.ssh/users | grep "${SSH_KEY_USER}" | awk '{print $2}'`
if [ -z "$ST_USER" ]; then
ST_USER=$SSH_KEY_USER
fi
if [ -z "$users" ]; then
users="$ST_USER"
else
users="$users\n$ST_USER"
fi
break
fi
done
done
if [ `echo -e "$users" | sort | uniq -c | wc -l` == 1 ]; then
exit
fi
users=`echo -e "$users" | sort | uniq -c | awk '{print $2"("$1")"}' | xargs echo -e`
echo -e "[LoggedIn:$users] "
}
PS1='$(other_users_prompt)\u@\h:\w\$ '
結果