it-swarm-id.com

Bisakah saya mencari tahu kunci ssh mana yang digunakan untuk mengakses akun?

Apakah mungkin untuk mengetahui kunci ssh mana yang digunakan untuk mengakses akun? Saya memiliki akun di server yang saya biarkan beberapa orang (tepercaya!) Memiliki akses melalui ssh. Saya merasa bermanfaat untuk mengetahui siapa yang masuk dan kapan. Saya memiliki akses root sehingga saya dapat melihat log, tetapi tampaknya tidak ada apa pun di sana. Apakah ada beberapa sakelar konfigurasi yang akan menempatkan beberapa cara untuk mengidentifikasi kunci dalam log?

62
Andrew Stacey

Jika Anda masuk ke file konfigurasi sshd (biasanya /etc/ssh/sshd_config) dan ubah arahan LogLevel menjadi VERBOSE:

LogLevel VERBOSE

... Anda dapat melihat sesuatu seperti ini di log:

24 Jun 22:43:42 localhost sshd [29779]: Ditemukan kunci RSA yang cocok: d8: d5: f3: 5a: 7e: 27: 42: 91: e6: a5: e6: 9e: f9: fd: d3: ce
24 Jun 22:43:42 localhost sshd [29779]: Publickey diterima untuk caleb dari 127.0.0.1 port 59630 ssh2

Dari 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

Agak mirip dengan @ jawaban user37161 . Jika akun bersama menjalankan Shell kustom dan Shell perlu tahu pengguna apa yang ada di sana, maka menjalankan skrip "wrapper" mungkin tidak memadai, karena informasi di sana tidak diteruskan ke shell kustom kecuali melalui metode yang dapat menyebabkan ras kondisi.

Sebagai gantinya Anda dapat menggunakan environment= pilihan dalam file Authorized_key untuk mengatur variabel lingkungan, yang kemudian dapat dibaca oleh kustom Shell.

Di dalam .ssh/authorized_keys file, tambahkan setiap baris dengan set variabel lingkungan, seperti berikut:

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

Kemudian Shell kustom, atau berbagai skrip rc, dapat membaca $REMOTEUSER variabel dan ambil tindakan yang sesuai.

Namun, perhatikan bahwa jika Anda menggunakan Shell standar, maka pengguna yang masuk dapat memodifikasi file untuk menggagalkan berbagai hal. Juga, ada beberapa risiko dalam mengizinkan pengguna untuk mengatur variabel lingkungan seperti LDPRELOAD. Lihat sshd_config dokumentasi tentang PermitUserEnvironment.

18
Chris Cogdon

Tingkatkan 2016-10-31 tentang format log

Beberapa skrip untuk pemasangan yang benar

Ada metode yang dapat digunakan penuh untuk melacak/mencatat koneksi ssh dengan kunci dengan pengeluaran untuk nama pengguna.

Pengantar

Sebagai tambahan dari @Caleb, saya ingin membagikan beberapa trik kecil di sana:

Nota: Saya sedang mengerjakan Debian 6..

Instalasi server

Tingkat Log SSHD

Pertama memastikan bahwa konfigurasi server memiliki tingkat pencatatan yang memadai:

sebagai root, ini akan mengatur dan mengaktifkan loggin verbose:

sed '/^[^#]*LogLevel.*\(QUIET\|FATAL\|ERROR\|INFO\)/{s/^/# /;h;s/$/\nLogLevel VERBOSE/};${p;g;/./!{iLogLevel VERBOSE'$'\n;};D}'  -i /etc/ssh/sshd_config

Dapat ditulis:

sed '
     /^[^#]*LogLevel.*\(QUIET\|FATAL\|ERROR\|INFO\)/{
        s/^/# /;
        h;
        s/$/\nLogLevel VERBOSE/
    };
    ${
        p;
        g;
        /./!{
            iLogLevel VERBOSE
        };
        D
    }'  -i /etc/ssh/sshd_config

atau dalam skrip sed :

#!/bin/sed -f
/^[^#]*LogLevel.*\(QUIET\|FATAL\|ERROR\|INFO\)/{
    s/^/# /;
    h;
    s/$/\nLogLevel VERBOSE/
};
${
    p;
    g;
    /./!{
        iLogLevel VERBOSE
    };
    D
}

Yang bisa dijalankan sebagai:

patchSshdConfigLogLevel.sed -i /etc/ssh/sshd_config

Daripada mengaktifkan ini:

service ssh restart

Syslog: membuat sidik jari pengguna dapat dibaca

Sekarang ambil sidik jari dalam file yang dapat dibaca pengguna:

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

Coba (kembali) login dari ssh untuk memastikan file baru sshdusers.log dibuat (dan mengandung sesuatu), lalu

chmod 644 /var/log/sshdusers.log

Pemakaian

Ini akan mencetak sidik jari sesi saat ini:

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

Plug-in untuk .bashrc

Dan akhirnya, ada sedikit add-on untuk diletakkan di akhir /etc/bash.bashrc atau pengguna .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

jadi setelah masuk kembali dari SSH, Anda akan melihat:

set | grep ^SSH
SSH_CLIENT='192.168.1.31 43734 22'
SSH_CONNECTION='192.168.1.31 43734 192.168.1.2 22'
[email protected]
SSH_TTY=/dev/pts/2

Nota Pada beberapa instalasi, file kunci yang diotorisasi mungkin bernama berbeda, seperti $HOME/.ssh/authorized_keys2...

15
F. Hauri

Misalkan pengguna "joe" dan "deb" memiliki akses ke akun "x". Kemudian di akun x .ssh_authorized_keys Anda menambahkan baris:

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

Juga dalam skrip wrapper Anda dapat melakukan apa saja yang Anda inginkan, mencatat kunci pribadi joe telah menggunakan ssh pada tanggal & waktu tertentu dengan perintah $ORIGINAL_COMMAND.

10
user37161

Anda dapat mencoba ini:

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

Ini akan:

  • ssh-add -L: Daftar kunci publik
  • awk '{ print $2 }': Dapatkan hanya sidik jari
  • xargs -i grep '{}' ~/.ssh/authorized_keys: Dengan setiap tombol, periksa yang mana yang aktif authorized_keys
  • head -n 1: Dapatkan hanya yang pertama
3
pci

Pada Fedora 20+ upaya login dan keberhasilan disimpan di /var/log/audit/audit.log. Log ini menyimpan upaya login (kegagalan dan keberhasilan), dan sidik jari kunci yang digunakan untuk upaya login disimpan di bidang bernama fp.

Anda dapat membandingkan sidik jari kunci masuk dengan sidik jari di otor_keys dengan menjalankannya baris demi baris melalui ssh-keygen -l

Penjelasan terperinci sehubungan dengan ssh login dan keamanan dan deteksi intrusi ada di sini: http://vpathak.tumblr.com/post/121343814158/Fedora-audit-log-with-love-from-russia =

3
vpathak

Selain @F. Hauri menjawab, saya menyiapkan berguna "LoggedIn Prompt".

Satu file tambahan adalah opsional ($ HOME/.ssh/pengguna):

[email protected] kszumny
[email protected] kszumny
[email protected] tom
[email protected]
[email protected] chris
[email protected] chris

Bagian ini harus ditempelkan ke /etc/profile (untuk semua pengguna) atau ke ~/.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)\[email protected]\h:\w\$ '

Hasil

enter image description here

0
noisy