grep이나 awk를 사용하여 로그 파일을 조작하는 방법은 무엇입니까?

grep이나 awk를 사용하여 로그 파일을 조작하는 방법은 무엇입니까?

/var/log/secure 로그 파일을 확인하려고 시도했는데 다음과 같이 표시되었습니다."비밀번호 오류" 로그 유형만 3회 이상 나타납니다. 리눅스 명령어만 사용하여 이를 수행할 수 있는 방법이 있습니까? 어? 포도?

보안 로그의 예,

Mar 20 08:38:28 localhost sshd[21895]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=mail.queued.net user=root 
Mar 20 08:38:31 localhost sshd[21895]: Failed password for root from 207.210.101.209 port 2854 ssh2 
Mar 20 15:38:31 localhost sshd[21896]: Received disconnect from 207.210.101.209: 11: Bye Bye 
Mar 20 08:38:32 localhost unix_chkpwd[21900]: password check failed for user (root) 
Mar 20 08:38:32 localhost sshd[21898]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=she

이 로그 파일에서 나는 기대합니다아무 말도 안 했어"비밀번호 실패"가 있는 행은 1개만 있지만 "비밀번호 실패"가 있는 행이 4개 있고 동일한 IP를 사용한다고 가정하면 내 IP 주소를 무차별 대입하려는 가능한 시도를 보여주고 싶습니다.

답변1

이는 작업을 완료하는 한 가지 방법일 뿐입니다. 나는 사용자 이름보다는 특정 IP 주소가 내 호스트에 연결을 시도하는 횟수를 세는 것을 선호합니다. 왜냐하면 결국에는 이를 금지할 수 있기 때문입니다.

awk '/Failed password/{ z[$11]++; } 
     END{ 
       for (i in z){ 
         if (z[i]>3) printf("%s attemps %s times.\n", i, z[i])
       }
}' /var/log/secure

(물론 한 줄짜리 명령일 수도 있으므로 가독성을 위해 들여쓰기했습니다.)

설명하다:

awk로그 파일을 한 줄씩 읽습니다. 행에 문자열이 포함되어 있으면 /Failed password/배열 요소 z[$11]++인덱스 $11(예: IP 주소)를 증가시킵니다. 저는 이것을 카운터로 사용합니다. 마지막으로 배열을 검색하여 z[$11]3회 이상 연결을 시도한 IP 주소만 출력합니다.
필요에 따라 확인을 사용자 정의하고 메시지를 인쇄할 수 있습니다.


귀하의 우려 사항이 무차별 대입 시도라면 기존 도구를 다음과 같이 사용하는 것이 좋습니다.실패 2 금지로그 파일을 검사하고 악의적인 징후(예: 너무 많은 비밀번호 실패, 취약점 악용 시도 등)를 보이는 IP를 차단합니다. 이해하기 쉽고 필요에 맞게 구성할 수 있습니다.

답변2

$ awk '/Failed password/{for(i=1;i<=NF;i++)if($i~/for/)user[$(i+1)]++}END{for(j in user){if(user[j]>3){printf("%s : %s times failed\n",j,user[j])}}}' /var/log/secure

관련 정보