계정에 액세스하는 데 사용 된 ssh 키를 찾을 수 있습니까?


56

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


sshd_config에서 LogLevel을 사용해 보셨습니까?
EightBitTony

현재 세션을 승인하는 데 사용 된 키를 찾을 수있는 경우 (나의 경우 공유 로그인을 통해 액세스 한 Mercurial 저장소의 액세스 제어에 대해) 매우 유용합니다. 기존의 모든 기술은 명령 옵션을 통해 ID를 스레딩하는 것과 관련이 있습니다.
Tom Anderson

5
이에 대한 OpenSSH 기능 요청이 있습니다. 인증 로그 메시지에 pubkey 지문을 추가하십시오
Steffen

답변:


38

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.

유망 해 보인다. 지문이 사용 된 키를 알려줍니다. 감사합니다
루프 공간

현재 세션의 지문을 인쇄하려면 :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 아 그래! 내가 whipe 더 나은이 q지시어, 파일의 마지막까지 저장 라인을 ... SED 라인이 될 : sed -ne "/sshd.$PPID.:.*matching DSA key/{s/^.* //g;h};\${x;p}" /var/log/auth.log. 확실히 : 나는 sed를 좋아한다!
F. Hauri

15

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

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

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

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

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

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


13

로그 형식에 대한 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.


이것이 출판되었을 때 나는 GNU / Linux 데비안 6 하에 있었지만이 작업은 데비안 7 하에서 매우 동일합니다 .
F. Hauri


로그 형식 변경으로 업그레이드
F. Hauri

좋은. patchSshdConfigLogLevel.sed에는 구현 세부 정보가 불필요하게 노출되므로 끝에 ".sed"가 없어야합니다. #! 줄이면 충분합니다.
Alex North-Keys

UN * X 하의 @ AlexNorth-Keys 확장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

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


3

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


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 이외에. 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\$ '

결과

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.