ฉันสามารถหาคีย์ ssh ที่ใช้ในการเข้าถึงบัญชีได้หรือไม่?


56

เป็นไปได้ไหมที่จะใช้คีย์ ssh ที่ใช้ในการเข้าถึงบัญชี ฉันมีบัญชีบนเซิร์ฟเวอร์ที่ให้คน (เชื่อถือได้) หลายคนเข้าถึงผ่าน ssh ฉันคิดว่ามันมีประโยชน์ที่จะรู้ว่าใครเข้าระบบและเมื่อไหร่ ฉันมีสิทธิ์เข้าถึงรูทดังนั้นฉันจึงสามารถดูบันทึกได้ แต่ดูเหมือนจะไม่มีอะไรเลย มีสวิตช์การกำหนดค่าบางอย่างที่จะใช้ในการระบุคีย์ในบันทึกหรือไม่


คุณลองเล่นกับ LogLevel ใน sshd_config แล้วหรือยัง?
EightBitTony

มันจะมีประโยชน์อย่างน่าอัศจรรย์ที่จะสามารถค้นหาคีย์ที่ใช้ในการอนุญาตเซสชันปัจจุบัน - ในกรณีของฉันสำหรับการควบคุมการเข้าถึงในที่เก็บ Mercurial ที่เข้าถึงได้ผ่านการล็อกอินที่ใช้ร่วมกัน เทคนิคที่มีอยู่ทั้งหมดเกี่ยวข้องกับการทำเกลียวข้อมูลประจำตัวผ่านตัวเลือกคำสั่งซึ่งเป็นบิต clunky
Tom Anderson

5
มีคำขอคุณลักษณะ OpenSSH เกี่ยวกับสิ่งนี้: โปรดเพิ่มลายนิ้วมือ pubkey ไปยังข้อความบันทึกการตรวจสอบ
Steffen

คำตอบ:


38

หากคุณเข้าไปในไฟล์กำหนดค่า sshd (โดยปกติ/etc/ssh/sshd_config) และเปลี่ยนคำสั่ง LogLevel เป็น VERBOSE:

LogLevel VERBOSE

... คุณสามารถเห็นสิ่งนี้ในบันทึก:

24 มิถุนายน 22:43:42 localhost sshd [29779]: พบคีย์ RSA ที่ตรงกัน: d8: d5: f3: 5a: 7e: 27: 42: 91: e6: a5: e6: 9: fd: d3: ce
Jun 24 22:43:42 localhost sshd [29779]: publickey ที่ยอมรับสำหรับ caleb จาก 127.0.0.1 พอร์ต 59630 ssh2

จาก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.

ที่ดูมีแนวโน้ม ลายนิ้วมือนั้นบอกฉันว่าใช้คีย์ใด เยี่ยมมากขอบคุณ
Loop Space

สำหรับการพิมพ์ลายนิ้วมือของเซสชันปัจจุบัน:sed -ne "/sshd.$PPID.:.*matching DSA key/{s/^.* //g;p;q}" /var/log/auth.log
F. Hauri

ฉันชอบGNU sed !
F. Hauri

3
@ F.Hauri, ถ้าฉันไม่มีอะไรหายไปนั่นจะไม่ส่งคืนสิ่งผิดปกติหาก PID ถูกนำกลับมาใช้ซ้ำสำหรับเซสชันที่สองของ SSH หรือไม่ ดูเหมือนว่าจะส่งคืนลายนิ้วมือที่เร็วที่สุดสำหรับ PID ที่ระบุใน auth.log แทนที่จะเป็นลายล่าสุด
godlygeek

@godlygeek โอ้ใช่! ฉันควรที่จะปัดqคำสั่งให้ดีกว่าเก็บบรรทัดไว้จนสุดไฟล์ ... บรรทัด sed กลายเป็น: sed -ne "/sshd.$PPID.:.*matching DSA key/{s/^.* //g;h};\${x;p}" /var/log/auth.log. แตกหัก: ฉันรัก sed!
F. Hauri

15

ค่อนข้างคล้ายกับ@ user37161 ของคำตอบ หากบัญชีที่ใช้ร่วมกันกำลังเรียกใช้เชลล์แบบกำหนดเองและเชลล์จำเป็นต้องรู้ว่ามีผู้ใช้ใดอยู่การเรียกใช้สคริปต์ "wrapper" อาจไม่เพียงพอเนื่องจากข้อมูลไม่ได้ถูกส่งผ่านไปยังเชลล์แบบกำหนดเองยกเว้นผ่านวิธีการที่อาจทำให้เกิดการแข่งขัน เงื่อนไข

แต่คุณสามารถใช้environment=ตัวเลือกในไฟล์ authorized_keys เพื่อตั้งค่าตัวแปรสภาพแวดล้อมซึ่งเชลล์แบบกำหนดเองสามารถอ่านได้

ใน.ssh/authorized_keysไฟล์ของคุณให้เติมแต่ละบรรทัดด้วยชุดตัวแปรสภาพแวดล้อมดังต่อไปนี้:

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

จากนั้นเชลล์ที่กำหนดเองหรือสคริปต์ rc ต่างๆสามารถอ่าน$REMOTEUSERตัวแปรและดำเนินการตามความเหมาะสม

อย่างไรก็ตามโปรดทราบว่าหากคุณใช้เชลล์มาตรฐานผู้ใช้ที่ลงชื่อเข้าใช้จะสามารถแก้ไขไฟล์เพื่อป้องกันสิ่งต่าง ๆ ได้ LDPRELOADนอกจากนี้ยังมีความเสี่ยงในการช่วยให้ผู้ใช้สามารถตั้งค่าตัวแปรสภาพแวดล้อมเช่น ดูเอกสารเกี่ยวกับsshd_configPermitUserEnvironment


13

อัปเกรด 2016-10-31 เกี่ยวกับรูปแบบบันทึก

สคริปต์บางตัวสำหรับการติดตั้งที่เหมาะสม

มีวิธีใช้เต็มรูปแบบในการติดตาม / บันทึกการเชื่อมต่อ ssh โดยใช้คีย์พร้อม expention to username

บทนำ

นอกเหนือจากแอนเนอร์ของ @Caleb แล้วฉันต้องการแบ่งปันเคล็ดลับเล็ก ๆ น้อย ๆ ที่นั่น:

หมายเหตุ: ผมทำงานใน Debian 6.0

การติดตั้งเซิร์ฟเวอร์

ระดับการบันทึก SSHD

ก่อนอื่นให้แน่ใจว่าการกำหนดค่าเซิร์ฟเวอร์มีระดับการบันทึกที่เพียงพอ:

ในฐานะที่เป็น root นี้จะตั้งค่าและเข้าสู่ระบบ verbose verbose:

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

กว่าที่เปิดใช้งานสิ่งนี้:

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

และในที่สุดก็มีAdd-onเล็ก ๆ น้อย ๆสำหรับวางไว้ที่ส่วนท้ายของ/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...


เมื่อเป็นเช่นนี้ถูกตีพิมพ์ฉันถูกภายใต้GNU / Linux Debian 6แต่งานนี้ค่อนข้างเดียวกันภายใต้Debian 7 ...
เอฟ HAURI


อัปเกรดเนื่องจากมีการเปลี่ยนแปลงในรูปแบบบันทึก
F. Hauri

ดี patchSshdConfigLogLevel.sed ของคุณไม่ควรมี ".sed" ในตอนท้ายเนื่องจากจะทำให้รายละเอียดการใช้งานไม่จำเป็น The #! สายเพียงพอทั้งหมด
Alex North-Keys

@ AlexNorth-Keys ส่วนขยายภายใต้UN * Xนั้นเป็นเรื่องทางเทคนิคทั่วไปเนื่องจากเราชอบใช้mimeและfileรู้จักประเภทไฟล์ แต่เป็นมนุษย์ที่เรียกดูระบบไฟล์ที่มีนามสกุลเหมือน.pl, .py, .sh, .awk, .sed, .tar.gzหรือแม้กระทั่ง.png.b64.gzจะเป็นประโยชน์!
F. Hauri

8

สมมติว่าผู้ใช้ "joe" และ "deb" มีสิทธิ์เข้าถึงบัญชี "x" จากนั้นในบัญชี x .ssh_authorized_keysคุณเพิ่มบรรทัด:

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

นอกจากนี้ในสคริปต์เสื้อคลุมที่คุณสามารถทำสิ่งที่คุณต้องการเข้าสู่ระบบที่คีย์ส่วนตัวของโจได้รับการใช้ที่เฉพาะวันที่และเวลาที่มีคำสั่งssh$ORIGINAL_COMMAND


3

ใน fedora 20+ ความพยายามในการเข้าสู่ระบบและความสำเร็จจะได้รับการบันทึกไว้ใน /var/log/audit/audit.log บันทึกนี้จะบันทึกความพยายามในการเข้าสู่ระบบ (ความล้มเหลวและความสำเร็จ) และลายนิ้วมือสำคัญที่ใช้สำหรับความพยายามในการเข้าสู่ระบบจะถูกบันทึกไว้ในฟิลด์ชื่อ fp

คุณสามารถเปรียบเทียบลายนิ้วมือเข้าสู่ระบบที่สำคัญกับลายนิ้วมือใน authorized_keys โดยใช้มันทีละบรรทัดผ่าน ssh-keygen -l

คำอธิบายโดยละเอียดเกี่ยวกับการล็อกอินของ ssh และการตรวจจับความปลอดภัยและการบุกรุกอยู่ที่นี่: http://vpathak.tumblr.com/post/121343814158/fedora-audit-log-with-love-from-russia


2

คุณสามารถลองสิ่งนี้:

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

เนื้อหามีความแม่นยำมากขึ้นและใช้ CPU น้อยลง: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 สวัสดีตอบฉันเตรียมที่มีประโยชน์ "พรอมต์ LoggedIn"

ไฟล์เพิ่มเติมหนึ่งไฟล์เป็นทางเลือก ($ 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\$ '

ผลลัพธ์

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.