계정에 액세스하는 데 사용 된 ssh 키를 찾을 수 있습니까? 찾을 수 있습니까? 서버에 여러 사람 (신뢰할

계정에 액세스하는 데 사용 된 ssh 키를 찾을 수 있습니까? 서버에 여러 사람 (신뢰할 수있는 사람들)이 ssh를 통해 액세스 할 수 있도록하는 계정이 있습니다. 누가 언제 그리고 언제 로그인했는지 알 수 있으면 도움이 될 것입니다. 루트 액세스 권한이 있으므로 로그를 볼 수는 있지만 아무것도 없습니다. 로그에서 키를 식별 할 수있는 구성 스위치가 있습니까?



답변

sshd 구성 파일 (보통 /etc/ssh/sshd_config) 로 이동 하여 LogLevel 지시문을 VERBOSE로 변경하는 경우 :

LogLevel VERBOSE

… 로그에서 다음과 같은 것을 볼 수 있습니다.

Jun 24 22:43:42 localhost sshd [29779] : 일치하는 RSA 키를 찾았습니다 : 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 포트 59630 ssh2에서 caleb에 허용 된 공개 키

보낸 사람 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.


답변

@ user37161의 답변 과 다소 비슷합니다 . 공유 계정이 사용자 정의 셸을 실행 중이고 셸에서 사용자가 무엇인지 알아야하는 경우 “래퍼”스크립트를 실행하면 충분하지 않을 수 있습니다. 정보가 경쟁을 일으킬 수있는 방법을 통해 사용자 지정 셸로 전달되지 않기 때문입니다. 정황.

대신 environment=authorized_keys 파일 의 옵션을 사용 하여 사용자 정의 쉘이 읽을 수있는 환경 변수를 설정할 수 있습니다.

.ssh/authorized_keys파일 내부 에서 다음과 같이 환경 변수 세트를 각 줄 앞에 추가 하십시오 .

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

그런 다음 사용자 정의 쉘 또는 다양한 rc 스크립트 중 하나가 $REMOTEUSER변수를 읽고 적절한 조치를 취할 수 있습니다.

그러나 표준 셸을 사용하는 경우 로그인 한 사용자는 파일을 수정하여 다양한 내용을 차단할 수 있습니다. 또한 사용자가와 같은 환경 변수를 설정할 수있게하는 위험이 LDPRELOAD있습니다. 에 대한 sshd_config설명서를 참조하십시오 PermitUserEnvironment.


답변

로그 형식에 대한 2016-10-31 업그레이드

올바른 설치를위한 일부 스크립트

사용자 이름이 expention 인 키를 사용하여 ssh 연결을 추적 / 로그하는 데 유용한 방법이 있습니다.

소개

@Caleb의 anwer 외에도 몇 가지 작은 트릭을 공유하고 싶습니다.

참고 : 데비안 6.0에서 일하고 있습니다 .

서버 설치

SSHD 로그 레벨

먼저 서버 구성에 충분한 로깅 레벨이 있는지 확인하십시오.

루트로서, 이것은 자세한 loglogose를 설정합니다 :

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

마지막으로 귀하 또는 사용자의 끝에 추가 할 약간의 추가 기능 이 있습니다 ./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

참고 일부 설치에서 권한이 부여 된 키 파일은 다음과 같이 이름이 다르게 지정 될 수 있습니다 $HOME/.ssh/authorized_keys2.


답변

“joe”및 “deb”사용자가 “x”계정에 액세스 할 수 있다고 가정하십시오. 그런 다음 계정 x에 다음 .ssh_authorized_keys줄을 추가하십시오.

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

또한 래퍼 스크립트에서 joe의 개인 키가 sshcommand로 특정 날짜 및 시간 에 사용하고 있음을 기록하여 원하는 모든 작업을 수행 할 수 있습니다 $ORIGINAL_COMMAND.


답변

fedora 20 이상에서는 로그인 시도 및 성공이 /var/log/audit/audit.log에 저장됩니다. 이 로그는 로그인 시도 (실패 및 성공)를 저장하고 로그인 시도에 사용 된 키 지문은 fp라는 필드에 저장됩니다.

ssh-keygen -l을 통해 한 줄씩 실행하여 로그인 한 키 지문을 certified_keys의 지문과 비교할 수 있습니다.

ssh 로그인 및 보안 및 침입 탐지에 대한 자세한 설명은 다음과 같습니다. http://vpathak.tumblr.com/post/121343814158/fedora-audit-log-with-love-from-russia


답변

당신은 이것을 시도 할 수 있습니다 :

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


답변

@F 이외에. Hauri는 유용한 “로그인 프롬프트”를 준비합니다.

하나의 추가 파일은 선택 사항입니다 ($ 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\$ '

결과

여기에 이미지 설명을 입력하십시오