Bir hesaba erişmek için hangi ssh anahtarının kullanıldığını bulabilir miyim?


56

Bir hesaba erişmek için hangi ssh anahtarının kullanıldığını bulmak mümkün müdür? Sunucuda, bir çok (güvenilir!) Kişinin ssh üzerinden erişmesine izin verdiğim bir hesabım var. Kimin giriş yaptığını ve ne zaman giriş yaptığını bilmek faydalı olur. Kök erişimim var, böylece günlüklere bakabilirim, ama orada hiçbir şey yok gibi görünüyor. Günlüklerde anahtarı tanımlamanın bir yolunu koyacak bir yapılandırma anahtarı var mı?


Sshd_config dosyasında LogLevel ile oynamayı denediniz mi?
EightBitTony

Geçerli oturumu yetkilendirmek için hangi anahtarın kullanıldığını bulmak benim için şaşırtıcı derecede yararlı olacaktır - benim durumumda, paylaşılan bir oturum açma yoluyla erişilen bir Mercurial deposundaki erişim kontrolü için. Mevcut tüm teknikler, kimliği biraz zor olan bir komut seçeneğiyle dizmeyi içerir.
Tom Anderson,

5
Bununla ilgili bir OpenSSH özelliği isteği var: Lütfen kimlik doğrulama günlüğü iletisine pubkey parmak izi ekleyin
Steffen

Yanıtlar:


38

Eğer sshd config dosyasına girerseniz (genellikle /etc/ssh/sshd_config) ve LogLevel yönergesini VERBOSE olarak değiştirirseniz:

LogLevel VERBOSE

... günlüklerde bunun gibi bir şey görebilirsiniz:

24 Haziran 22:43:42 localhost sshd [29779]: Bulunan eşleşen RSA anahtarı: 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 port 59630 ssh2'den caleb için publickey kabul edildi

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

Bu umut verici görünüyor. Parmak izi daha sonra hangi tuşun kullanıldığını söyler. Çok teşekkürler.
Loop Space

Geçerli oturumun parmak izini yazdırmak için:sed -ne "/sshd.$PPID.:.*matching DSA key/{s/^.* //g;p;q}" /var/log/auth.log
F. Hauri

GNU’yu severim sed!
F. Hauri

3
@ F.Hauri, Bir şey kaçırmazsam, bir PID ikinci bir SSH oturumu için tekrar kullanılırsa bu yanlış şeyi geri getirmez mi? Verilen PID için her zaman en eski parmak izini, en son değil, auth.log dosyasında döndürecektir.
godlygeek

@godlygeek Ah evet! qDirektifi kırmak , dosya sonuna kadar saklamak ... daha iyi olur sed -ne "/sshd.$PPID.:.*matching DSA key/{s/^.* //g;h};\${x;p}" /var/log/auth.log. Kesinlikle: Sed seviyorum!
F. Hauri,

15

@ User37161'in cevabına biraz benziyor . Paylaşılan hesap özel bir kabuk çalışıyorsa ve kabuğun hangi kullanıcının olduğunu bilmesi gerekiyorsa, "sarmalayıcı" komut dosyasını çalıştırmak yeterli olmayabilir, çünkü bilgi, yarışa neden olabilecek yöntemler dışında özel kabuğa iletilmez koşullar.

Bunun yerine environment=, özel kabuğun daha sonra okuyabileceği bir ortam değişkeni ayarlamak için yetkili_keys dosyasındaki seçeneği kullanabilirsiniz .

Senin İçinde .ssh/authorized_keysdosyasında aşağıdakiler gibi bir ortam değişkeni set ile her satırı prepend:

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

Daha sonra özel kabuk veya çeşitli rc komut dosyalarından herhangi biri, $REMOTEUSERdeğişkeni okuyabilir ve uygun işlemi yapabilir.

Ancak, standart bir kabuk kullanıyorsanız, oturum açan kullanıcının dosyayı çeşitli şeyleri engelleyecek şekilde değiştirebildiğini unutmayın. Ayrıca, kullanıcıların gibi ortam değişkenlerini ayarlamalarına izin vermede bazı riskler vardır LDPRELOAD. sshd_configHakkında belgelere bakın PermitUserEnvironment.


13

Günlük formatı hakkında 2016-10-31 yükseltme

Doğru kurulum için bazı scriptler

Ssh bağlantılarını takip etmek / günlüğe kaydetmek için anahtar adı ile kullanıcı adı için tam bir kullanılabilir yöntem vardır.

Giriş

@Caleb'in anwer'in yanısıra, orada bazı küçük püf noktalarını paylaşmak istiyorum:

Not: Debian 6.0 üzerinde çalışıyorum .

Sunucu kurulumu

SSHD Günlük seviyesi

Öncelikle sunucu konfigürasyonunun yeterli kayıt seviyesine sahip olmasını sağlamak:

root olarak, bu ayrıntılı ve ayrıntılı giriş yapacaktır:

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

Yazılabilir:

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

veya sed komut dosyasında :

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

Hangi olarak çalıştırılabilir:

patchSshdConfigLogLevel.sed -i /etc/ssh/sshd_config

Bunu aktive ettiğiniz için :

service ssh restart

Syslog: parmak izlerini kullanıcı tarafından okunabilir hale getirmek

Şimdi kullanıcı tarafından okunabilir dosyada parmak izi alın:

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

Yeni dosyanın sshdusers.logoluşturulmasını (ve bir şeyler içerdiğini) sağlamak için ssh'den giriş yapmayı (yeniden) deneyin , ardından

chmod 644 /var/log/sshdusers.log

kullanım

Bu, geçerli oturumların parmak izini basacaktır:

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

İçin eklenti .bashrc

Ve son olarak, sizin veya kullanıcının sonuna koymak için küçük bir eklenti/etc/bash.bashrc var .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'den tekrar giriş yaptıktan sonra göreceksiniz:

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

Not: Bazı kurulumlarda, yetkilendirilmiş anahtar dosyası belki farklı isimlerden $HOME/.ssh/authorized_keys2...


Bu yayınlandığında GNU / Linux Debian 6 altındaydım , ancak bu çalışma Debian 7 altında da aynıydı ...
F. Hauri


Günlük biçimindeki değişiklik nedeniyle yükseltildi
F. Hauri

Güzel. PatchSshdConfigLogLevel.sed'iniz sonunda bir ".sed" içermemelidir, çünkü gereksiz yere bir uygulama detayı gösterecektir. #! çizgi tamamen yeterli.
Alex North-Keys

@ AlexNorth-Keys UN * X kapsamındaki uzantılar genel olarak teknik olarak yararsızdır, çünkü mime kullanmayı ve dosya türlerini bilmeyi tercih ediyoruz . Ama insan için olduğu gibi gibi uzantıları olan dosya sistemleri göz kim , , , , , , hatta yararlıdır! file.pl.py.sh.awk.sed.tar.gz.png.b64.gz
F. Hauri

8

"Joe" ve "deb" kullanıcılarının "x" hesabına erişimi olduğunu varsayalım. Sonra x'in hesabına .ssh_authorized_keysşu satırları eklersiniz:

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

Ayrıca sarmalayıcı komut dosyasında istediğiniz herhangi bir şeyi yapabilirsiniz, bu joe'nun özel anahtarının sshbelirli bir tarih ve saatte komutla kullandığı günlüğe kaydetme $ORIGINAL_COMMAND.


3

Fedora 20+ 'de giriş denemeleri ve başarılar /var/log/audit/audit.log dosyasına kaydedilir. Bu günlük giriş girişimlerini (başarısızlıklar ve başarılar) kaydeder ve giriş girişimi için kullanılan anahtar parmak izi fp adlı alana kaydedilir.

Ssh-keygen -l üzerinden satır satır çalıştırarak, giriş yapmış olan parmak izi ile parmak izlerini yetkililerde karşılaştırabilirsiniz.

Ssh girişleri ve güvenlik ve izinsiz giriş tespiti ile ilgili ayrıntılı bir açıklama burada: http://vpathak.tumblr.com/post/121343814158/fedora-audit-log-with-love-from-russia


2

Bunu deneyebilirsiniz:

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

Muhtemelen daha kesin ve daha az cpu yoğun: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 ek olarak. Hauri cevabı, yararlı "LoggedIn istemi" hazırlarım.

Ek bir dosya isteğe bağlıdır ($ HOME / .ssh / users):

kszumny@laptop kszumny
kszumny@comp2 kszumny
tom@laptop tom
pati@home
chris@workstation1 chris
chris@workstation2 chris

Bu bölüm /etc/profile(tüm kullanıcılar için) veya~/.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\$ '

Sonuç

görüntü tanımını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.