it-swarm-vi.com

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?

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ý?

62
Andrew Stacey

Nếu bạn đi vào tệp cấu hình sshd (thường là /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 tháng 6 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.
39
Caleb

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 tùy chọn environment= Trong tệp ủy quyền để đặt biến môi trường, sau đó Shell tùy chỉnh có thể đọc.

Trong tệp .ssh/authorized_keys 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 đó, Shell tùy chỉnh hoặc bất kỳ tập lệnh RC nào khác nhau có thể đọc biến $REMOTEUSER 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 Shell 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 tài liệu sshd_config Về PermitUserEnvironment.

18
Chris Cogdon

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ỏ ở đó:

Nota: Tôi đang làm việc trên Debian 6..

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 tập lệnh 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 cho kích hoạt 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

Trình cắm cho .bashrc

Và cuối cùng, có một tiện ích bổ sung để đặt ở cuối /etc/bash.bashrc Hoặc người dùng .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'
[email protected]
SSH_TTY=/dev/pts/2

Nota Trong 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 ...

15
F. Hauri

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's .ssh_authorized_keys bạ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 đã sử dụng ssh vào một ngày và giờ cụ thể bằng lệnh $ORIGINAL_COMMAND.

10
user37161

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

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

Điều này sẽ:

  • ssh-add -L: Liệt kê các khóa công khai
  • awk '{ print $2 }': Chỉ lấy dấu vân tay
  • xargs -i grep '{}' ~/.ssh/authorized_keys: Với mỗi phím, kiểm tra xem cái nào đang bật authorized_keys
  • head -n 1: Chỉ nhận cái đầu tiên
3
pci

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 xâm nhập và bảo mật của họ có tại đây: http://vpathak.tumblr.com/post/121343814158/Fedora-audit-log-with-love-from-russia = =

3
vpathak

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):

[email protected] kszumny
[email protected] kszumny
[email protected] tom
[email protected]
[email protected] chris
[email protected] chris

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

Kết quả

enter image description here

0
noisy