アカウントへのアクセスに使用されたsshキーを確認できますか?


56

アカウントへのアクセスに使用されたsshキーを見つけることは可能ですか?私はサーバー上にアカウントを持っており、そのアカウントに複数の(信頼できる!)人々にssh経由でアクセスさせています。誰がいつログインしたかを知ることができれば便利だと思います。ルートアクセス権があるので、ログを見ることができますが、そこには何も存在しないようです。ログでキーを識別するための何らかの方法を設定する設定スイッチはありますか?


sshd_configでLogLevelを試してみましたか?
EightBitTony

現在のセッションを認証するために使用されたキーを見つけることができると驚くほど便利です-私の場合、共有ログインを通じてアクセスされるMercurialリポジトリのアクセス制御に。すべての既存のテクニックには、コマンドオプションを介してIDをスレッド化することが含まれますが、これは少し不格好です。
トムアンダーソン

5
これについてOpenSSHの機能要求があります:認証ログメッセージにpubkeyで指紋を追加してください
ステファン

回答:


38

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
F. Hauri

GNUが 好きsedです!
F.ハウリ

3
@ F.Hauri、私が何かを逃さない限り、PIDが2番目のSSHセッションに再利用される場合、それは間違ったものを返さないでしょうか?常に最新ではなく、auth.logで指定されたPIDの最も早いフィンガープリントを返すようです。
godlygeek 14

@godlygeekああそう!私はwhipe方が良いを持っているqディレクティブ、ファイルの最後まで店のラインを... sedの行は次のようになります。sed -ne "/sshd.$PPID.:.*matching DSA key/{s/^.* //g;h};\${x;p}" /var/log/auth.log。決定的:私はsedが大好きです!
F.ハウリ14

15

@ user37161の回答とやや似ています。共有アカウントがカスタムシェルを実行していて、シェルがそこにいるユーザーを知る必要がある場合、「ラッパー」スクリプトを実行するだけでは十分ではない可能性があります。条件。

代わりにenvironment=、authorized_keysファイルのオプションを使用して環境変数を設定し、カスタムシェルがその環境変数を読み取ることができます。

.ssh/authorized_keysファイル内で、次のように環境変数セットを各行の先頭に追加します。

environment="REMOTEUSER=jrhacker" ssh-rsa ....
environment="REMOTEUSER=jbloggs" ssh-rsa ....

その後、カスタムシェルまたはさまざまなrcスクリプトのいずれかが$REMOTEUSER変数を読み取り、適切なアクションを実行できます。

ただし、標準シェルを使用している場合、ログインしているユーザーはファイルを変更してさまざまなことを阻止できることに注意してください。また、ユーザーがなどの環境変数を設定できるようにすることには、いくつかのリスクがありますLDPRELOADsshd_configに関するドキュメントを参照してくださいPermitUserEnvironment


13

ログ形式について2016-10-31をアップグレード

適切なインストールのためのいくつかのスクリプト

ユーザー名に応じてキーごとにSSH接続を追跡/記録する完全に使用可能な方法があります。

前書き

@Calebの答えに加えて、ちょっとしたトリックを共有したいと思います。

注意:私はDebian 6.0に取り組んでいます

サーバーのインストール

SSHDログレベル

最初に、サーバー構成に十分なログレベルがあることを確認します。

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

Syslog:指紋をユーザーが読み取れるようにする

ユーザーが読み取り可能なファイルで指紋を取得します。

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...


これが公開されたとき、私は下にあったGNU / LinuxのDebianの6が、下のこの作品はかなり同じDebianの7 ...
F. HAURI


ログ形式の変更にアップグレード
F. HAURI

いいね patchSshdConfigLogLevel.sedの最後に「.sed」を付けないでください。これは、実装の詳細を不必要に公開するためです。#!行は完全に十分です。
アレックスノースキーズ

@ AlexNorth-キーの拡張機能の下UN * Xは、我々が使用することを好むよう、generaly technicaly unselessありパントマイムをしてfile、ファイルの種類を知るために。しかし、人間の場合と同様のような拡張持つ、ファイルシステムを閲覧する人.pl.py.sh.awk.sed、を.tar.gz、あるいは.png.b64.gz便利です!
F.ハウリ

8

ユーザー「joe」と「deb」がアカウント「x」にアクセスできるとします。次に、アカウントxで次の .ssh_authorized_keys行を追加します。

command='wrapper joe' joe public key
command='wrapper deb' deb public key

また、ラッパースクリプトではssh、コマンドを使用して特定の日時にjoeの秘密キーが使用していたことをログに記録して、必要な処理を実行できます$ORIGINAL_COMMAND


3

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


2

これを試すことができます:

ssh-add -L | awk '{ print $2 }' | xargs -i grep '{}' ~/.ssh/authorized_keys  | head -1

間違いなく、より正確でCPU集約度が低い:ssh-add -L | awk 'NR==FNR { k=$2;next } /^#/{next} $2==k { print $3;exit} $3==k {print $4;exit} ' - ~/.ssh/authorized_keys
Otheus

0

@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\$ '

結果

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.