레이블이 apache인 게시물을 표시합니다. 모든 게시물 표시
레이블이 apache인 게시물을 표시합니다. 모든 게시물 표시

2009년 12월 23일 수요일

SSH 자동으로 무단 접근 IP 막기

 출처: http://blog.naver.com/salpoosi?Redirect=Log&logNo=22951010

전제 조건
관리용으로 모든 아이피에서 접근 할 수 있도록 서버 설정이 되어 있는 경우, 불특정 IP에서 SSH 포트로 로그인 시도가 일어난다.
 
불특정 IP를 자동으로 /etc/hosts.deny 에 등록함으로서 접근 시도를 방지한다.
 
사용환경
Centos 4, Centos 5 (사용환경 변경이 되었다. /var/log/secure 에서 접근 IP 정보의 위치가 다를수 있으니 주의)
 
첫번째로 ssh 에 대한 log 기록은 /var/log/secure에 기록된다.
var/log/secure에 기록된 로그 중에서 로그인 시도를 한 IP를 찾아낸다.
 
grep "Failed password for" /var/log/secure | egrep -v "invalid user|{USERID}|{LOGINIP}" | awk '{ print $11}' | uniq | sed "s/^/all:/" > /tmp/anonymous_login 
grep "Failed password for invalid user" /var/log/secure.1 | awk '{ print $13}' | uniq | sed "s/^/all:/" >> /tmp/anonymous_login 
grep "vsftpd:auth): authentication failure" /var/log/secure | egrep -v "{USERID}|{LOGINIP}" | awk '{ print $14}' | uniq | sed "s/^rhost=/all:/" >> /tmp/anonymous_login 
 
{USERID} 부분에는 로그인 하기 위한 ID를 설정한다. 이것을 설정하지 않으면 자기가 로그인 시도를 하다가 실패를 할 경우 콘솔로 가거나 다른IP 장소에서 로그인하지 않으면 안된다.
{LOGINIP} 로그인 장소가 고정아이피이며 특정IP에서는 발생하는 로그인 실패기록은 무시를 할 경우 기록한다. 유동아이피 일 경우는 주의 하도록 한다.
 
{ print $11}{ print $13}{ print $14} 부분은 접속 실패가 일어 날 경우 접속 거부할 상대방의 IP의 위치
 
VSFTP운영중일 때 FTP로 무단 접근은 차단하지 못하여 추가
 
다른 배포판을 위하여 /var/log/secure에 기록되는 내용이 배포판마다 다를 수 있으므로 grep문에 로그를 찾기 위한 부분이나 egrep -v로 로그파일에서 취득하고 싶지 않는 내용을 적거나 awk에 의해 취득해 오기 위한 해당 열의 위치등 설정을 바꾸어 보도록 한다.
 
- 첫번째의 grep은 존재하는 user id 로 시도를 하려고 할 때 로그인 실패시 IP를 얻기 위한 명령어
- 두번째의 grep은 존재하지 않는 user id 로 시도를 하려고 할 때 로그인 실패시 IP를 얻기 위한 명령어
 
두번째로는 만들어진 접속 거부 IP와 접속거부 설정 파일과의 머지 작업을 위해 임시 파일을 만든다.
cat /tmp/anonymous_login /etc/hosts.deny | sort | uniq > /tmp/hosts.deny
 
마지막으로 만들어진 임시 파일을 접속 거부 설정 파일로 복사한다.
cp /tmp/hosts.deny /etc/hosts.deny
 
위의 내용을 crontab에 넣어 자동적으로 갱신되도록 한다.
crontab -e로 현재의 crontab 내용을 열어 다음과 같이 넣도록 한다.
 
05,35 * * * * grep "Failed password for" /var/log/secure | egrep -v "invalid user|{USERID}|{LOGINIP}" | awk '{ print $11}' | uniq | sed "s/^/all:/"  > /tmp/anonymous_login
06,36 * * * * grep "Failed password for invalid user" /var/log/secure.1 | awk '{ print $13}' | uniq | sed "s/^/all:/" >> /tmp/anonymous_login
07,37 * * * * grep "vsftpd:auth): authentication failure" /var/log/secure | egrep -v "{USERID}|{LOGINIP}" | awk '{ print $14}' | uniq | sed "s/^rhost=/all:/" >> /tmp/anonymous_login
08,38 * * * * cat /tmp/anonymous_login /etc/hosts.deny | sort | uniq > /tmp/hosts.deny
09,39 * * * * cp /tmp/hosts.deny /etc/hosts.deny
 
매 시간 한번씩두번씩 갱신이 되며 갱신 주기는 서버 로그를 보면서 조정하도록 한다.
 
각각의 클론 설정을 매 분 주기로 처리를 하지 않도록 한다. 로그 파일이 길어질 경우
기존의 hosts.deny 파일이 마지막으로 처리한 필터링으로만 설정될 수 있다.
실제 10분 단위로 설정을 하여 운영하고 있으며 10분동안 하나의 IP에서 많으면 약 500번의 공격이 이루어지고 있다.
적은 공격 수치는 아니다.
 
자기 자신도 원격에서의 접속은 필히 주의를 하도록 한다. 실수를 하게 되면 로그에
로그인 실패 로그가 남게 되며 이 로그에 의해 원격지의 IP도 블럭이 된다.
실수를 하고 로그인을 했다면 로그 파일에서 실패 로그를 지우도록 한다.
 
참조
http://kltp.kldp.org/stories.php?story=05/08/02/4164861
 
수정 2006.04.26 필요하지 않는 sort 삭제, | sed "s/^/all:/" 추가
수정 2006.06.05 주의점 추가
수정 2006.08.28 주의점 추가
수정 2007.05.11 사용환경 변경, vsftp운용시 설정 추가, crontab 설정시 시간당 복수 실행을 위한 알기 쉬운 예로 변경