사이트 내 전체검색
[linux] 해킹을 막아봅시다
로빈아빠
https://cmd.kr/server/325 URL이 복사되었습니다.

본문

해킹을 막아봅시다

어제 제 서버에 해킹흔적이 발견되어 외부로부터의 모든 텔렛 등의 접속을 막았답니다.

하지만 막는것으로는 직성이 풀리지 않아 간단한 스크립트을 제작하기에 이르렀죠.

내용인 즉슨, 외부에서 접근을 시도할 경우 특정 서비스 (telnet, ftp, imap, finger 등)를 원초적으로 막는 대신에 접속시도자의 접속정보를 화면에 보여주고 (일종의 경고 내지 안내목적이 되겠죠) 운영자에겐 메일로 세부 내역이 발송되도록 하였습니다.

이것은 tcp_wrapper에 의해 서비스를 제한하는 것으로서도 이미 보안의 효과가 있지만, 일반적으로 해킹타겟을 정하면 여러 서비스를 뒤지다 구멍이 있는 부분을 파고드는 해커들의 습성을 고려해볼 때 허용되지 않는 서비스에 한번이라도 접근을 시도한 경우 시간, 시도 서비스, 시도 서버 ip 또는 도메인, 시도 서버의 finger 정보 등을 운영자에게 알려 사전에 경계할 수 있도록하는데 목적이 있습니다. (오늘 이 스크립트를 짜면서 제 서버의 로그파일을 분석해보니까 텔렛으로 접근을 시도해보고, ftp, pop, imap, finger 등을 차례로 접근해보는 형태가 더러 눈에 띄더군요. 이는 서버의 구멍을 찾기 위해서겠죠.  --; )

레드햇과 같은 배포본에서는 tcp_wrapper를 이용해 inet 슈퍼서버를 통하는 각종 서비스에 대해 접근제한을 둘수 있습니다.

식상한감이 없진 않지만 제가 작성한 스크립트을 이용하기 위해서는 이부분이 선행되어야 하기 때문에 간략하게나마 설명하겠습니다.

/etc/hosts.allow <- 접속을 허용할 조건을 지정하는 파일
/etc/hosts.deny  <- 접속을 거부할 조건을 지정하는 파일


/etc/hosts.allow
in.telnetd: LOCAL 210.100.100.1
위 내용은 텔렛 접속에 있어 local과 210.100.100.1만을 허용한다는 것이죠.

/etc/hosts.deny
in.telnetd: ALL:
위 내용은 텔렛 접속에 있어 모든 서버로부터의 접속을 거부한다는 것이죠.


하지만 위와 같은 경우 hosts.allow가 우선하기 때문에 local, 210.100.100.1 은 접속이 허용되고 그 외에는 모두 거절한다는 것으로 해석할 수 있겠습니다. (실은 저도 예전부터 위 내용은 알고 있었지만 오늘 처음 적용한거라 혹시 틀릴 수도 있겠지만, 저는 위와 같이 했는데 원하는대로 작동하고 있죠. ^^)

자세한 것은 man hosts.allow 해보시면 됩니다.

hosts.deny에는 hosts.allow에 없는 한가지 특수한 옵션이 있는데, 이는 접속을 거절함과 동시에 특정 명령을 실행하도록 지정할 수 있다는 것입니다. (현재 제가 설명하고 있는 버전은 알짜 5.2 삽입분인 tcp_wrappers-7.6-5입니다. 그 이전 버전은 잘 모르겠습니다. 써보지 않아서... --; )

또 명령 실행 방법도 약간 특이하답니다.

아무튼 제 /etc/hosts.deny 파일을 보여드리죠.(실제와는 약간 차이가 있답니다 ^^)
#서비스: 거부주소: 쉘명령 in.telnetd: ALL: twist ( /etc/hosts.denyck Y Y %a %c %d %h %n %p %s %u ) & ipop3d: ALL: twist ( /etc/hosts.denyck Y Y %a %c %d %h %n %p %s %u ) &

설명하자면 모든 접속을(위에서 설명했듯이 hosts.allow에서 지정한것을 제외한) 거부하며, 거부시 /etc/hosts.denyck 라는 스크립트을 실행하라는 겁니다. 그 우측에 Y Y %a %c %d %h %n %p %s %u 라고 되어 있는 부분은 실행될 스크립트에 인자를 전달하는 것(argument)으로서, 이 값은 거부시에 접속시도자의 정보를 tcp_wrapper가 습득한 것인데 이를 그대로 스크립트로 전달하기 위해 순서대로 인자값으로 나열한 것입니다.

순서대로 보면, 제일 앞의 Y는 접속거부에 대한 아래와 같은 메세지를 화면에 나타내주는 것으로서 경고의 의미가 내포되어 있다고 볼 수 있습니다. 다른 안내메세지 등을 추가하고 싶거나 일부 항목을 지우고 싶을 때도 제공되는 스크립트를 약간 변형하는것으로 가능합니다. 만약 아래 메세지를 보이지 않으려면 N이라고 입력해야합니다.
[abcdef@open ~]$ telnet domain.co.kr Trying 210.216.184.2... Connected to domain.co.kr. Escape character is '^]'. =================================== 접속이 허용되지 않습니다. =================================== Access Time : Tue Jan 19 04:08:52 KST 1999 Client host address : 210.126.123.123 Client information : 210.126.123.123 Client host name(or IP) : 210.126.123.123 Client host name : unknown Client user name : unknown Connection closed by foreign host. [abcdef@open ~]$

두번째 Y는 상세한 접속시도 내용을 운영자에게 메일로 전달할것인지를 지정하는
인자로서 Y로 지정할 경우 메일로 아래와 같이 전달됩니다.
Date: Tue, 19 Jan 1999 04:08:53 +0900 (KST) From: root <root@domain.co.kr> To: root@domain.co.kr Subject: tcp_wrapper report [in.telnetd] =============================== 접속 거부자 상세정보 =============================== Access Time : Tue Jan 19 04:08:52 KST 1999 Access client host address : 210.126.123.123 Access client information : 210.126.123.123 The daemon process name : in.telnetd Access client host name(or IP) : 210.126.123.123 Access client host name : unknown The daemon process id : 7373 Server information : in.telnetd@210.216.184.2 Access client user name : unknown -------------------------------------------------------------------------- Access client finger information -------------------------------------------------------------------------- [210.126.148.110] --------------------------------------------------------------------------

나머지 인자 %a %c %d %h %n %p %s %u 은 man hosts.allow 페이지의 EXPANSIONS 부분에 기록되어 있는 내용입니다.

주의할 점은 아래 실행될 스크립트에서 순서대로 인자를 볼러서 활용하므로 인자들의 나열순서를 바꾸거나 일부 인자를 빼버리게 되면 오작동을 일으킬 수 있다는 겁니다.



마지막으로 접근 거부시 hosts.deny로 부터 인자를 넘겨받아 실행될 /etc/hosts.denyck 스크립트입니다.
#!/bin/sh ################################ 변수정의부문 # 메일 수신자 mailto=root # 화면출력 여부, 메일전송 여부 dsp=${1}; msg=${2} # 접속자 정보 등 a=${3}; c=${4}; d=${5}; h=${6}; n=${7}; p=${8}; s=${9}; u=${10} # 현재 시간 time=`date` # 접속시도자 소속 서버의 finger 정보 finger=`/usr/bin/finger -l @$h 2> /dev/null` ################################ 화면 출력부문 if [ $dsp = Y ] then /bin/echo " ===================================n 접속이 허용되지 않습니다. n ===================================n n Access Time : $timen Client host address : $an Client information : $cn Client host name(or IP) : $hn Client host name : $nn Client user name : $unn" fi ################################ 메일 송신부문 if [ $msg = Y ] then /bin/echo " ===============================n 접속 거부자 상세정보 n ===============================n n Access Time : $timen Access client host address : $an Access client information : $cn The daemon process name : $dn Access client host name(or IP) : $hn Access client host name : $nn The daemon process id : $pn Server information : $sn Access client user name : $un n --------------------------------------------------------------------------n Access client finger information n --------------------------------------------------------------------------n $fingern --------------------------------------------------------------------------n nn" | /bin/mail -s "tcp_wrapper report [$d]" $mailto fi

댓글목록

등록된 댓글이 없습니다.

1,139 (12/23P)

Search

Copyright © Cmd 명령어 3.141.12.30