모든 로그인 시도 모니터링

모든 로그인 시도 모니터링

몇 주 전에 나는 사용자가 내 서버에 로그인할 때 나에게 이메일을 보내는 스크립트를 작성하는 것이 좋은 생각이라고 생각했습니다.

그래서 완벽하게 작동하는 스크립트를 제공한 notifyLogin.sh다음 각 사용자의 스크립트에서 이를 호출하기로 결정했습니다 .bash_login.

ssh -t하지만 누군가가 스위치를 사용하여 내 서버에 로그인하는 데 사용 가능한 쉘을 선택할 수 있다는 것을 발견했습니다. 예를 들어:

ssh user@myserver -t sh

이런 식으로 .bash_login실행되지 않으면 실행되지 않습니다 /etc/profile.

notifyLogin.sh쉘 유형에 관계없이 로그인 시 이를 호출 할 수 있는 방법이 있습니까 ? (항상 작동해야 함)

답변1

바퀴를 재발명하지 말고 rsyslog모든 것이 당신을 위해 이루어지도록 하십시오. 파일에 도달하기 전에 syslog 메시지의 패턴이 일치하면 이메일을 보낼 수 있습니다.

아래에 이메일 주소와 SMTP 서버를 설정하고 입력 /etc/rsyslog.conf하거나 입력 /etc/rsyslog.d/하고rsyslog 다시 시작

$ModLoad ommail
$ActionMailSMTPServer localhost
$ActionMailFrom [email protected]
$ActionMailTo [email protected]
$template mailSubject,"Login Alert on %hostname%"
$template mailBody,"\n\n%msg%"
$ActionMailSubject mailSubject
$ActionExecOnlyOnceEveryInterval 1
# the if ... then ... mailBody mus be on one line!
if $msg contains 'session opened for user' then :ommail:;mailBody

메시지의 문자열과 일치하면 rsyslog이메일이 트리거됩니다 .session opened for user

/var/log/auth.log메시지를 보고 sshd패턴으로 사용할 수 있는 다른 내용을 확인할 수 있습니다.

원천:rsyslog 메일

답변2

첫째, 사용자가 변경할 수 있으므로 사용자의 .profile에 의존해서는 안 됩니다. 그것이 사실이라면당신의서버에서는 다음을 수행할 수 있습니다.

  • auth.log, utmp 등의 항목을 주기적으로 테스트합니다(또는 inotify에 의해 트리거됨).
  • /bin/login작업을 수행한 다음 실제 작업을 수행하는 래퍼를 작성합니다 /bin/login. (예를 들어 ssh가 수행하는지 확실하지 않지만 /bin/login그렇게 되기를 바랍니다.) 하지만 추천할 수는 없습니다. 너무 위험합니다.

답변3

/var/log/auth.log

시스템에서의 시도 추적

cat /var/log/auth.log grep sshd.\*Failed 

실패한 시도를 grep할 수 있고 타임스탬프도 사용할 수 있으므로 이를 스크립트에 적용하거나 다음을 사용할 수 있습니다.

tail -f /var/log/auth.log 

입력을 추적한 다음 일부 정규식을 실행할 수 있습니다.

답변4

@Creek의 답변에 따라 rsyslog를 사용하여 여러 사용자 일치(최상의 구현은 아니지만 정규식으로 대체될 수 있지만 작동함)

$ModLoad ommail
$ActionMailSMTPServer localhost
$ActionMailFrom [email protected]
$ActionMailTo [email protected]
$template mailSubject,"Login alert on %hostname%"
# mailBody must be on one line!
$template mailBody,"\n\n%msg%"
$ActionMailSubject mailSubject
$ActionExecOnlyOnceEveryInterval 1

if $msg contains 'session opened for' then {
        if $msg contains 'USER1' then :ommail:;mailBody

        # Repetition required (did not investigate why)
        $ActionMailSMTPServer localhost
        $ActionMailFrom [email protected]
        $ActionMailTo [email protected]
        $template mailSubject,"Login alert on %hostname%"
        $template mailBody,"\n\n%msg%"
        $ActionMailSubject mailSubject
        $ActionExecOnlyOnceEveryInterval 1

        if $msg contains 'USER2' then :ommail:;mailBody
}

관련 정보