Tôi có thể tìm ra khóa ssh nào được sử dụng để truy cập tài khoản không?


56

Có thể tìm ra khóa ssh nào được sử dụng để truy cập tài khoản không? Tôi có một tài khoản trên một máy chủ mà tôi cho phép một số người (đáng tin cậy!) Có quyền truy cập thông qua ssh. Tôi thấy hữu ích khi có thể biết ai đã đăng nhập và khi nào. Tôi có quyền truy cập root để tôi có thể xem nhật ký, nhưng dường như không có gì ở đó. Có một số chuyển đổi cấu hình sẽ đặt một số cách xác định khóa trong nhật ký?


Bạn đã thử chơi với LogLevel trong sshd_config chưa?
EightBitTony

Sẽ rất hữu ích khi có thể tìm ra khóa nào được sử dụng để ủy quyền cho phiên hiện tại - trong trường hợp của tôi, để kiểm soát truy cập trên kho lưu trữ Mercurial được truy cập thông qua đăng nhập được chia sẻ. Tất cả các kỹ thuật hiện có liên quan đến việc xâu chuỗi danh tính thông qua một tùy chọn lệnh, điều này hơi khó hiểu.
Tom Anderson

5
Có một yêu cầu tính năng OpenSSH về điều này: Vui lòng thêm dấu vân tay pubkey vào thông điệp nhật ký xác thực
Steffen

Câu trả lời:


38

Nếu bạn đi vào tệp cấu hình sshd (thường /etc/ssh/sshd_config) và thay đổi chỉ thị LogLevel thành ĐỘNG TỪ:

LogLevel VERBOSE

... bạn có thể thấy một cái gì đó như thế này trong nhật ký:

24
tháng 6 24 22:43:42 localhost sshd [29779]: Khóa công khai được chấp nhận cho caleb từ cổng 127.0.0.1 59630 ssh2

Từ 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.

Điều đó có vẻ đầy hứa hẹn. Dấu vân tay sau đó cho tôi biết phím nào được sử dụng. Cảm ơn rất nhiều.
Vòng lặp không gian

Để in dấu vân tay của phiên hiện tại:sed -ne "/sshd.$PPID.:.*matching DSA key/{s/^.* //g;p;q}" /var/log/auth.log
F. Hauri

Tôi thích GNU sed !
F. Hauri

3
@ F.Hauri, Trừ khi tôi thiếu một cái gì đó, điều đó sẽ không trả lại điều sai nếu một PID được sử dụng lại cho phiên SSH thứ hai? Có vẻ như nó sẽ luôn trả lại dấu vân tay sớm nhất cho PID đã cho trong auth.log chứ không phải mới nhất.
trời ơi

@godlygeek ơi! Tôi có tốt hơn để thực hiện qchỉ thị, lưu trữ dòng cho đến khi kết thúc tập tin ... dòng sed trở thành : sed -ne "/sshd.$PPID.:.*matching DSA key/{s/^.* //g;h};\${x;p}" /var/log/auth.log. Chắc chắn: Tôi yêu sed!
F. Hauri

15

Khá giống với câu trả lời của @ user37161 . Nếu tài khoản dùng chung đang chạy shell tùy chỉnh và shell cần biết người dùng ở đó là gì, thì việc chạy tập lệnh "trình bao bọc" có thể không đủ, vì thông tin không được truyền vào shell tùy chỉnh ngoại trừ thông qua các phương thức có thể gây ra cuộc đua điều kiện.

Thay vào đó, bạn có thể sử dụng environment=tùy chọn trong tệp ủy quyền để đặt biến môi trường mà vỏ tùy chỉnh có thể đọc được.

Trong .ssh/authorized_keystệp của bạn , hãy thêm trước mỗi dòng với một bộ biến môi trường, như sau:

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

Sau đó, vỏ tùy chỉnh, hoặc bất kỳ tập lệnh RC khác nhau, có thể đọc $REMOTEUSERbiến và thực hiện hành động thích hợp.

Tuy nhiên, lưu ý rằng nếu bạn đang sử dụng trình bao tiêu chuẩn, thì người dùng đã đăng nhập có khả năng sửa đổi tệp để cản trở nhiều thứ khác nhau. Ngoài ra, có một số rủi ro trong việc cho phép người dùng đặt các biến môi trường như LDPRELOAD. Xem sshd_configtài liệu về PermitUserEnvironment.


13

Nâng cấp 2016-10-31 về định dạng nhật ký

Một số tập lệnh để cài đặt đúng

Có một phương pháp có thể sử dụng đầy đủ để theo dõi / đăng nhập các kết nối ssh bằng khóa với tên người dùng.

Giới thiệu

Ngoài anwer của @Caleb, tôi muốn chia sẻ một số mẹo nhỏ ở đó:

Lưu ý: Tôi đang làm việc trên Debian 6.0 .

Cài đặt máy chủ

Cấp độ nhật ký SSHD

Trước tiên, đảm bảo rằng cấu hình máy chủ có đủ mức ghi nhật ký:

là root, điều này sẽ thiết lập và loggin verbose hoạt động:

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

Có thể được viết:

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

hoặc trong một kịch bản sed :

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

Mà có thể được chạy như:

patchSshdConfigLogLevel.sed -i /etc/ssh/sshd_config

Hơn để kích hoạt điều này:

service ssh restart

Syslog: giúp người dùng có thể đọc dấu vân tay

Bây giờ lấy dấu vân tay trong tập tin người dùng có thể đọc được:

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

Hãy thử (đăng nhập lại) từ ssh để đảm bảo tệp mới sshdusers.logđược tạo (và chứa một cái gì đó), sau đó

chmod 644 /var/log/sshdusers.log

Sử dụng

Điều này sẽ in dấu vân tay của các phiên hiện tại:

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 cho .bashrc

Và cuối cùng, có một tiện ích nhỏ để đặt ở cuối của /etc/bash.bashrcngười dùng hoặc của bạn .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

Vì vậy, sau khi đăng nhập lại từ SSH, bạn sẽ thấy:

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

Lưu ý Trên một số cài đặt, tệp khóa được ủy quyền có thể đôi khi được đặt tên khác, như $HOME/.ssh/authorized_keys2...


Khi điều này được xuất bản, tôi đã sử dụng GNU / Linux Debian 6 , nhưng nó hoạt động khá giống với Debian 7 ...
F. Hauri


Nâng cấp do thay đổi định dạng nhật ký
F. Hauri

Đẹp. Bản váSshdConfigLogLevel.sed của bạn không nên có ".sed" ở cuối, vì nó sẽ làm lộ ra một chi tiết triển khai không cần thiết. Các #! dòng là hoàn toàn đủ.
Alex North-Keys

@ AlexNorth - Các tiện ích mở rộng khóa theo UN * X là vô cùng kỹ thuật, vì chúng tôi thích sử dụng mimefileđể biết các loại tệp. Nhưng như đối với con người duyệt hệ thống tập tin, có phần mở rộng như .pl, .py, .sh, .awk, .sed, .tar.gz, hoặc thậm chí .png.b64.gzlà hữu ích!
F. Hauri

8

Giả sử rằng người dùng "joe" và "deb" có quyền truy cập vào tài khoản "x". Sau đó, trong tài khoản x, .ssh_authorized_keysbạn thêm các dòng:

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

Ngoài ra, trong tập lệnh bao bọc, bạn có thể làm bất cứ điều gì bạn muốn, ghi nhật ký khóa riêng của joe đã được sử dụng sshvào một ngày và giờ cụ thể bằng lệnh $ORIGINAL_COMMAND.


3

Trên fedora 20+, các nỗ lực và thành công đăng nhập được lưu trong /var/log/audit/audit.log. Nhật ký này lưu các lần thử đăng nhập (thất bại và thành công) và dấu vân tay chính được sử dụng cho lần thử đăng nhập được lưu trong trường có tên fp.

Bạn có thể so sánh dấu vân tay đã đăng nhập với dấu vân tay trong ủy quyền bằng cách chạy từng dòng một qua ssh-keygen -l

Một lời giải thích chi tiết liên quan đến thông tin đăng nhập ssh và phát hiện bảo mật và xâm nhập của họ có tại đây: http://vpathak.tumblr.com/post/121343814158/fedora-audit-log-with-love-from-russia


2

Bạn có thể thử điều này:

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

Chính xác hơn và ít cpu chuyên sâu hơn: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

Ngoài @F. Hauri trả lời, tôi chuẩn bị "LoggedIn prompt" hữu ích.

Một tệp bổ sung là tùy chọn ($ HOME / .ssh / users):

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

Phần này nên được dán vào /etc/profile(cho tất cả người dùng) hoặc~/.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\$ '

Kết quả

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.