web-dev-qa-db-ja.com

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

アカウントへのアクセスに使用されたsshキーを確認することはできますか?私はサーバーにアカウントを持っています。このアカウントを数人の(信頼できる!)人々にssh経由でアクセスさせています。誰がいつログインしたかを知ることができると便利です。ログを確認できるようにrootアクセス権を持っていますが、そこには何もないようです。ログでキーを識別する何らかの方法を配置する構成スイッチはありますか?

62
Andrew Stacey

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
Jun 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.
39
Caleb

@ user37161の回答 に多少似ています。共有アカウントがカスタムシェルを実行していて、シェルがそこにいるユーザーを知る必要がある場合、「ラッパー」スクリプトを実行するだけでは十分ではない可能性があります。競合を引き起こす可能性のあるメソッドを除いて、カスタムシェルに情報が渡されないためです。条件。

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

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

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

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

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

18
Chris Cogdon

ログ形式に関する2016-10-31のアップグレード

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

ユーザー名の指数を使用して、キーごとにSSH接続を追跡/ログするための完全に使用可能な方法があります。

前書き

@Calebの回答に加えて、ここでいくつかの小さなトリックを共有したいと思います。

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

サーバーのインストール

SSHDログレベル

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

ルートとして、これはアクティブな詳細ログを設定します:

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

これよりactivatingより:

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

Nota一部のインストールでは、承認されたキーファイルは$HOME/.ssh/authorized_keys2...のように名前が異なる場合があります。

15
F. Hauri

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

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

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

10
user37161

あなたはこれを試すことができます:

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

この意志:

  • ssh-add -L:公開鍵のリスト
  • awk '{ print $2 }':指紋のみを取得
  • xargs -i grep '{}' ~/.ssh/authorized_keys:各キーについて、どれがオンになっているかを確認してくださいauthorized_keys
  • head -n 1:最初のものだけを取得
3
pci

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 =

3
vpathak

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

結果

enter image description here

0
noisy