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

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

계정에 접속하는데 사용된 SSH 키를 알아낼 수 있나요? 저는 SSH를 통해 몇 명의 (신뢰할 수 있는!) 사람들에게 액세스 권한을 부여하는 서버 계정을 가지고 있습니다. 누가 언제 로그인했는지 알 수 있어서 유용하다고 생각합니다. 루트 액세스 권한이 있어 로그를 볼 수 있지만 거기에는 아무 것도 없는 것 같습니다. 로그에서 키를 식별하는 방법을 추가하는 구성 스위치가 있습니까?

답변1

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

LogLevel VERBOSE

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

6월 24일 22:43:42 localhost sshd[29779]: 일치하는 RSA 키를 찾았습니다: d8:d5:f3:5a:7e:27:42:91:e6:a5:e6:9e:f9:fd: d3:
ce 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.

답변2

다소 비슷하다@ user37161의 답변. 공유 계정이 사용자 정의 셸을 실행 중이고 해당 셸이 어떤 사용자가 있는지 알아야 하는 경우 "래퍼" 스크립트를 실행하는 것만으로는 충분하지 않을 수 있습니다. 경쟁 조건.

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

.ssh/authorized_keys파일 에서 다음과 같이 각 줄 앞에 환경 변수 세트를 추가합니다.

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

그러면 사용자 정의 셸이나 다양한 rc 스크립트가 $REMOTEUSER변수를 읽고 적절한 조치를 취할 수 있습니다.

그러나 표준 쉘을 사용하는 경우 로그인한 사용자가 파일을 수정하여 다양한 작업을 방지할 수 있다는 점에 유의하세요. 또한 사용자는 환경 변수를 설정할 수 있습니다(예: 이에 대한 설명서 LDPRELOAD참조 ) .sshd_configPermitUserEnvironment

답변3

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

키를 통해 SSH 연결을 추적/기록하고 사용자 이름을 확장하는 완전히 작동하는 방법이 있습니다.

소개하다

@Caleb의 답변 외에도 몇 가지 팁을 공유하고 싶습니다.

노트:저는 데비안 6.0에서 작업 중입니다..

서버 설치

SSHD 로그 수준

먼저 서버 구성에 적절한 로깅 수준이 있는지 확인하십시오.

루트로서 이는 자세한 로깅을 설정하고 활성화합니다:

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

sshdusers.logSSH에서 (재)로그인하여 새 파일이 생성되었는지(그리고 일부 콘텐츠가 포함되어 있는지) 확인한 다음

chmod 644 /var/log/sshdusers.log

마지막 단계: 회전시키세요.

참여하다 /etc/logrotate.d/:

cat >/etc/logrotate.d/sshdusers <<eosshdusers
/var/log/sshdusers.log {
  rotate 3
  daily
  compress
  missingok
  postrotate
        touch /var/log/sshdusers.log
        chmod 644 /var/log/sshdusers.log
        /usr/lib/rsyslog/rsyslog-rotate
  endscript
  notifempty
}
eosshdusers

용법

그러면 현재 세션의 지문이 인쇄됩니다.

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.

답변4

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

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

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

관련 정보