lsof 사용하기

FAQ 2005/07/01 15:29
LSOF는 'List Open File'의 약자이며, 해당 System의 프로세스들에 의해서 열려진 파일들을 확인 하는 tool 이다.
시스템의 프로세스에 대한 확인시 사용된다.

사용예 :

특정 파일의 엑세스하는 프로세스 혹인
# lsof /etc/passwd
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
more 13838 j*** 3r VREG 32,0 1410 18062 /etc/passwd

특정 호스트에 대한 접속 확인
# lsof -i@210.116.*.*
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd2 13715 root 6u inet 0x3000142c3f0 0t596000 TCP inet:22->210.116.*.*:3071 (ESTABLISHED)
sshd2 13826 root 6u inet 0x3000142c2b0 0t14264 TCP inet:22->210.116.*.*:3079 (ESTABLISHED)

특정 유저가 사용하는 프로세스 확인
#lsof -u $userid

특정 프로세스가 오픈하는 파일 확인
#lsof -p $pid
2005/07/01 15:29 2005/07/01 15:29
html, cgi, text 들을 unix 서버로 upload 했을때 ^M character 가 line 의 끝에 붙어서 script 등의 실행에 문제가 될때가 있다.
이것을 삭제 하려면 tr command 나 vi 를 사용하여 지워주면 된다.

tr command 사용하기
#more index.htm |tr -d '^M' > index2.htm

vi 에서 command 사용려면 아래와 같이 type 한다.
:0,$s/^M//g

주의 : ^M 은 Ctrl v + Ctrl m 임.
2005/07/01 15:29 2005/07/01 15:29
코드레드와 Nimda 등 Windows NT/2000 기반의 IIS 를 공격하는 무차별적인 웜공격으로 인하여 부하가 유발되고 로그 파일이 불필요한 데이터로 채워지는 경우가 있다.
로그 파일의 크기가 커지는 것은 둘째치고서라도 당장 계속적으로 커지는 로그 파일 때문에 서버에 부하를 유발하는 것이 더욱 큰 문제이다. 서버에서 로그를 남기는 방식은 매번 클라이언트의 요청이 있을 때마다 웹 서버에서 패킷 헤더에 있는 클라이언트의 정보를 받아낸 후 로그 파일을 open 한 후 로그 파일을 읽어 파일의 제일 끝으로 이동하여 로그 정보를 추가한 후 파일을 close 하는 것인데, 불 필요한 요청이 있을 때마다 이 작업을 계속하여야 하므로 서버에 부하를 유발함은 당연한 현상이다. 따라서 아예 로그를 남기지 않도록 하거나 로그를 남긴다 하더라도 불필요한 정보를 남기지 않도록 하는 것이 미소하게나마 서버의 성능을 높이는 것이 될 것이다. 그럼 실제로 불필요한 정보는 아예 로그를 남기지 않는 방법에 대해 알아보도록 하자.
이를테면 코드레드의 경우 아래와 같이 무차별적인 로그가 남게 되는데
2001/08/01 23:39:50.765446 152.158.99.4:58781 -> 211.233.38.193:80 [AP]
GET/default.ida?NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN

이러한 로그를 막기 위해서는 httpd.conf 파일을 열어
CustomLog 윗 줄에
SetEnvIf Request_URI "/default.ida$" cord-red 와 같이 정의한 후
CustomLog /usr/local/apache/logs/access.log combined 라고 설정되어 있는 부분을
CustomLog /usr/local/apache/logs//access.log combined env=!cord-red 라고 수정을 한다.
! 는 not 의 의미이므로 위 설정은 환경변수 cord-red로 정의된 요청을 거부하라는 뜻이다.
위와 같이 설정 후 아파치를 재시작하면 코드 레드와 관련된 로그가 남지 않게 된다. 코드레드에 이은 Nimda 웜의 경우도 같은 방식으로 설정하여 로그에 남지 않도록 설정할 수 있다.
또한 같은 원리를 이용하여 iptables 를 이용하여 아예 패킷 자체를 차단할 수도 있는데, 코드 레드의 경우 default.ida 문자열을 요청한다는 특징을 이용하여
iptables –A INPUT -i eth0 -p tcp --tcp-flags ACK ACK --dport 80 \
-m string --string '/default.ida?' -j REJECT --reject-with tcp-reset 와 같이 iptables 의 –strings 를 이용하여 특정 문자열이 포함된 패킷을 차단하는 방법도 있기는 하지만 이 방법은 커널과 iptables 를 다시 컴파일 하여야 하는 문제가 있다. Nimda Worm 역시 이외 cmd.exe 와 root.exe 를 포함하므로 같은 방식으로
iptables -A INPUT -p tcp --tcp-flags ACK ACK --dport 80 -m string --string "cmd.exe" -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp --tcp-flags ACK ACK --dport 80 -m string --string "root.exe?" -j REJECT --reject-with tcp-reset 와 같이 차단할 수 있다
2005/07/01 15:27 2005/07/01 15:27