it-swarm-tr.com

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

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

62
Andrew Stacey

Sshd yapılandırma dosyasına girerseniz (genellikle /etc/ssh/sshd_config) ve LogLevel yönergesini VERBOSE olarak değiştirin:

LogLevel VERBOSE

... günlüklerde böyle bir şey görebilirsiniz:

Jun 24 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
24 Haz 22:43:42 localhost sshd [29779]: 127.0.0.1 port 59630 ssh2'den caleb için kabul edilen publickey

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'in cevabı . Paylaşılan hesap özel bir Kabuk çalıştırıyorsa ve Kabuk'un hangi kullanıcının orada olduğunu bilmesi gerekiyorsa, o zaman "sarmalayıcı" komut dosyasını çalıştırmak yeterli olmayabilir; koşullar.

Bunun yerine environment= Özel_ Kabuk'un okuyabileceği bir ortam değişkeni ayarlamak için yetkili_anahtarlar dosyasındaki seçenek.

İçinde .ssh/authorized_keys dosyasında, her satırı aşağıdaki gibi bir ortam değişkeni kümesiyle başa getirin:

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

Ardından özel Kabuk veya çeşitli rc komut dosyalarından herhangi biri $REMOTEUSER değişkenine gidin ve uygun işlemi yapın.

Ancak, standart bir Kabuk kullanıyorsanız, oturum açan kullanıcının dosyayı çeşitli şeyleri engellemek için değiştirebileceğini unutmayın. Ayrıca, kullanıcıların LDPRELOAD gibi ortam değişkenleri ayarlamasına izin verme konusunda bazı riskler vardır. Bkz. sshd_configPermitUserEnvironment ile ilgili belgeler.

18
Chris Cogdon

Günlük biçimi hakkında 2016-10-31 sürümünü yükseltin

Doğru kurulum için bazı komut dosyaları

Kullanıcı adı dışında ssh bağlantılarını anahtarla izlemek/günlüğe kaydetmek için tam olarak kullanılabilir bir yöntem vardır.

Giriş

@Caleb'in anwer'ına ek olarak, orada bazı küçük numaralar paylaşmak istiyorum:

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

Sunucu kurulumu

SSHD Günlük seviyesi

İlk olarak sunucu yapılandırmasının yeterli günlük düzeyine sahip olduğundan emin olun:

root olarak, bu ayrıntılı loggin ayarlayacaktı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 bir 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

etkinleştiriliyor bu:

service ssh restart

Syslog: parmak izlerini kullanıcı tarafından okunabilir yapma

Ş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 bir dosya sshdusers.log Oluşturulduğundan (ve bir şeyler içerdiğinden) emin olmak için ssh'den (yeniden) giriş yapmayı 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

.bashrc İçin eklenti

Ve son olarak, /etc/bash.bashrc Veya kullanıcının .bashrc Sonuna koymak için biraz eklenti vardır:

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 şunu 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'
[email protected]
SSH_TTY=/dev/pts/2

Nota Bazı kurulumlarda, yetkili anahtar dosyası $HOME/.ssh/authorized_keys2 Gibi farklı adlandırılmış bir şey olabilir ...

15
F. Hauri

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

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

Ayrıca sarıcı komut dosyasında, joe'nun özel anahtarının $ORIGINAL_COMMAND Komutuyla belirli bir tarih ve saatte ssh kullandığını günlüğe kaydederek istediğiniz her şeyi yapabilirsiniz.

10
user37161

Bunu deneyebilirsiniz:

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

Bu irade:

  • ssh-add -L: Genel anahtarları listele
  • awk '{ print $2 }': Sadece parmak izini al
  • xargs -i grep '{}' ~/.ssh/authorized_keys: Her tuşla hangisinin açık olduğunu kontrol edin authorized_keys
  • head -n 1: Yalnızca ilkini alın
3
pci

Fedora 20+ sürümlerinde oturum açma denemeleri ve başarılar /var/log/audit/audit.log içine kaydedilir. Bu günlük, giriş denemelerini (hatalar ve başarılar) kaydeder ve giriş denemesi için kullanılan anahtar parmak izi fp adlı alana kaydedilir.

Ssh-keygen -l üzerinden satır satır çalıştırarak, oturum açmış olan parmak izini, yetkili_anahtarlardaki parmak izleriyle karşılaştırabilirsiniz.

SSH girişleri, 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 =

3
vpathak

@F'ye ek olarak. Hauri cevabı, yararlı "LoggedIn İstemi" hazırlıyorum.

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

[email protected] kszumny
[email protected] kszumny
[email protected] tom
[email protected]
[email protected] chris
[email protected] 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)\[email protected]\h:\w\$ '

Sonuç

enter image description here

0
noisy