계정에 액세스하는 데 사용 된 ssh 키를 찾을 수 있습니까? 서버에 여러 사람 (신뢰할 수있는 사람들)이 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.
sed -ne "/sshd.$PPID.:.*matching DSA key/{s/^.* //g;p;q}" /var/log/auth.log
sed
!
q
지시어, 파일의 마지막까지 저장 라인을 ... SED 라인이 될 : sed -ne "/sshd.$PPID.:.*matching DSA key/{s/^.* //g;h};\${x;p}" /var/log/auth.log
. 확실히 : 나는 sed를 좋아한다!
@ user37161의 답변 과 다소 비슷합니다 . 공유 계정이 사용자 정의 셸을 실행 중이고 셸에서 사용자가 무엇인지 알아야하는 경우 "래퍼"스크립트를 실행하면 충분하지 않을 수 있습니다. 정보가 경쟁을 일으킬 수있는 방법을 통해 사용자 지정 셸로 전달되지 않기 때문입니다. 정황.
대신 environment=
authorized_keys 파일 의 옵션을 사용 하여 사용자 정의 쉘이 읽을 수있는 환경 변수를 설정할 수 있습니다.
.ssh/authorized_keys
파일 내부 에서 다음과 같이 환경 변수 세트를 각 줄 앞에 추가 하십시오 .
environment="REMOTEUSER=jrhacker" ssh-rsa ....
environment="REMOTEUSER=jbloggs" ssh-rsa ....
그런 다음 사용자 정의 쉘 또는 다양한 rc 스크립트 중 하나가 $REMOTEUSER
변수를 읽고 적절한 조치를 취할 수 있습니다.
그러나 표준 셸을 사용하는 경우 로그인 한 사용자는 파일을 수정하여 다양한 내용을 차단할 수 있습니다. 또한 사용자가와 같은 환경 변수를 설정할 수있게하는 위험이 LDPRELOAD
있습니다. 에 대한 sshd_config
설명서를 참조하십시오 PermitUserEnvironment
.
사용자 이름이 expention 인 키를 사용하여 ssh 연결을 추적 / 로그하는 데 유용한 방법이 있습니다.
@Caleb의 anwer 외에도 몇 가지 작은 트릭을 공유하고 싶습니다.
참고 : 데비안 6.0에서 일하고 있습니다 .
먼저 서버 구성에 충분한 로깅 레벨이 있는지 확인하십시오.
루트로서, 이것은 자세한 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
이제 사용자가 읽을 수있는 파일에 지문을 찍습니다.
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
.
file
.pl
.py
.sh
.awk
.sed
.tar.gz
.png.b64.gz
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
@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\$ '
결과