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

56

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 saklar konfigurasi yang akan menempatkan beberapa cara untuk mengidentifikasi kunci dalam log?

Loop Space
sumber
Sudahkah Anda mencoba bermain dengan LogLevel di sshd_config?
EightBitTony
Akan sangat berguna untuk mengetahui kunci mana yang digunakan untuk mengesahkan sesi saat ini - dalam kasus saya, untuk kontrol akses pada repositori Mercurial yang diakses melalui login bersama. Semua teknik yang ada melibatkan threading identitas melalui opsi perintah, yang agak kikuk.
Tom Anderson
5
Ada permintaan fitur OpenSSH tentang ini: Silakan tambahkan sidik jari pubkey ke pesan log otentikasi
Steffen
Mekanisme Centos: unix.stackexchange.com/questions/147295/…
jhfrontz

Jawaban:

38

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
Jun 24 22:43:42 localhost sshd [29779]: Publickey yang 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.
Caleb
sumber
Itu terlihat menjanjikan. Sidik jari kemudian memberi tahu saya kunci mana yang digunakan. Terima kasih banyak.
Loop Space
Untuk mencetak sidik jari dari sesi saat ini:sed -ne "/sshd.$PPID.:.*matching DSA key/{s/^.* //g;p;q}" /var/log/auth.log
F. Hauri
Saya suka GNU sed !
F. Hauri
3
@ F. Hauri, Kecuali saya kehilangan sesuatu, bukankah itu mengembalikan hal yang salah jika PID digunakan kembali untuk sesi SSH kedua? Sepertinya itu akan selalu mengembalikan sidik jari paling awal untuk PID yang diberikan di auth.log daripada yang terbaru.
godlygeek
@godlygeek Oh ya! Saya harus lebih baik untuk whipe qdirektif, toko online sampai akhir file ... sed baris menjadi: sed -ne "/sshd.$PPID.:.*matching DSA key/{s/^.* //g;h};\${x;p}" /var/log/auth.log. Definitif: I Love sed!
F. Hauri
15

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

Alih-alih, Anda dapat menggunakan environment=opsi dalam file otor_keys untuk mengatur variabel lingkungan, yang dapat dibaca oleh shell kustom.

Di dalam .ssh/authorized_keysfile Anda , 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 $REMOTEUSERvariabel dan mengambil 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_configdokumentasi tentang PermitUserEnvironment.

Chris Cogdon
sumber
13

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

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

Pengaya untuk .bashrc

Dan akhirnya, ada sedikit tambahan untuk diletakkan di akhir /etc/bash.bashrcpengguna atau Anda .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'
SSH_KEY_USER=user@mydesk
SSH_TTY=/dev/pts/2

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

F. Hauri
sumber
Ketika ini diterbitkan saya berada di bawah GNU / Linux Debian 6 , tetapi pekerjaan ini sama dengan Debian 7 ...
F. Hauri
Ditingkatkan karena perubahan dalam format log
F. Hauri
Bagus. PatchSshdConfigLogLevel.sed Anda seharusnya tidak memiliki ".sed" di akhir, karena itu akan memaparkan detail implementasi yang tidak perlu. #! garis sepenuhnya memadai.
Alex North-Keys
@ AlexNorth-Keys ekstensi di bawah UN * X pada umumnya tidak teknis, karena kami lebih suka menggunakan mime dan fileuntuk mengetahui jenis file. Tapi untuk manusia yang isi filesystem, memiliki ekstensi seperti .pl, .py, .sh, .awk, .sed, .tar.gz, atau bahkan .png.b64.gzberguna!
F. Hauri
8

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

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

Juga dalam skrip pembungkus Anda dapat melakukan apa pun yang Anda inginkan, mencatat kunci pribadi joe telah digunakan sshpada tanggal & waktu tertentu dengan perintah $ORIGINAL_COMMAND.

pengguna37161
sumber
3

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 serta deteksi intrusi ada di sini: http://vpathak.tumblr.com/post/121343814158/fedora-audit-log-with-love-from-russia

vpathak
sumber
2

Anda dapat mencoba ini:

ssh-add -L | awk '{ print $2 }' | xargs -i grep '{}' ~/.ssh/authorized_keys  | head -1
pci
sumber
Boleh dibilang lebih tepat dan kurang cpu intensif: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

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

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

kszumny@laptop kszumny
kszumny@comp2 kszumny
tom@laptop tom
pati@home
chris@workstation1 chris
chris@workstation2 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)\u@\h:\w\$ '

Hasil

masukkan deskripsi gambar di sini

berisik
sumber