강좌
클라우드/리눅스에 관한 강좌입니다.
해킹&보안 분류

리눅스보안강좌#1: 사용하지 않는 서비스 중지

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

 

어떤 목적이든 관계없이 누군가의 요청이 있어 리눅스 시스템에 로그인 한 후 필자가 제일 먼저 입력하는 명령어는 먼저 “HISTFILE=/dev/null”로 입력한 명령어를 history에 남기지 않도록 한 후 “netstat -lnp”을 실행해 보는 것이다.

 

이 명령어는 현재 어떤 서비스가 시스템에 리슨(대기)하고 있는지 상태를 알려주는데, 정말로 필요로 하는 서비스만 떠 있는지 아니면 불필요한 서비스도 작동하고 있는지 확인해 보기 위해서이다.

 

사실상 이 하나의 명령어만으로도 관리자가 보안에 대한 기본적인 개념이 있는지 여부를 대략 판단할 수 있는데, 그만큼 반드시 필요한 서비스만 제공한다.”라는 원칙은 매우 중요하다. 그 다음으로는 관심을 갖고 정기적인 관리를 하고 있는지 여부를 확인하기 위해 각종 권한 설정이나 시스템 업데이트 여부 등을 확인하는데, 이러한 부분은 초기 시스템 구축시 서비스를 제공하기 전에도 반드시 검토하여야 할 사항이다.

 

만약 서버가 많아 이러한 점검사항을 정기적으로 관리하기 힘들다면 cron과 스크립트를 활용하여 상당 부분은 자동화를 하거나 단순화하는 것도 좋은 방법이 될 수 있을 것이다.

 

 

 

1.1.1 사용하지 않는 서비스 중지

 

리눅스 시스템을 설치 후 가장 먼저 하여야 할 일은 사용하지 않는 서비스에 대한 중지이다.

 

필자의 경우도 아무리 내부에서만 사용하는 시스템이라도 설치 후 제일 먼저 하는 일이 바로 사용하지 않는 서비스를 중지하는 것이다.

 

왜냐하면 이러한 서비스들로 인하여 시스템의 보안을 위협하는 요인이 될 수 있기 때문인데, 이는 굳이 사용하지도 않는 문을 만들어 두는 것과 같은 이치이다.

 

일반적으로 리눅스를 설치하는 과정에서 필요한 패키지만 설치하지만 경우에 따라서는 모든 패키지(Everything)를 설치하거나 패키지가 어떤 역할을 하는지 몰라 함께 설치하는 경우도 적지 않고, 설사 꼭 필요한 패키지만 선택하여 설치했다 하더라도 기본적으로 불필요한 서비스가 제공되는 경우가 많으므로 불필요한 서비스를 찾아 중지하도록 하는 것이 좋다. 이를 위해서는 통상적으로 다음과 같이 세 가지 방법을 사용하는데 이는 재부팅 시 적용된다.

 

.

 

ntsysv 실행

 

터미널 상에서 직접 ntsysv를 실행하거나 setup을 실행 후 “System services”를 선택하면 된다.

 

. 여기에서 부팅 시 자동으로 시작되기를 원하는 서비스를 스페이스 바로 선택한 후 OK를 선택하면 된다.

 

 

 

 

8fbf1bfe7faf246d2e517e6d05a2ca70_1654672922_0643.png
 

[그림] ntsysv 실행화면

 

chkconfig 이용

 

chkconfig는 시스템 서비스에 대한 런레벨(runlevel)을 질의하고 업데이트 하는 명령어로서 chkconfig --list를 실행하면 각각의 런레벨에서 해당 서비스가 어떻게 설정되어 있는지 알려준다. 통상적으로 서버용으로 많이 사용하는 런레벨 3번에서 작동하는 서비스에 대한 정보를 보려면 다음과 같이 확인하면 된다.

 

.

 

# chkconfig --list | grep 3:on

sshd2 0:off 1:off 2:off 3:on 4:on 5:on 6:off

keytable 0:off 1:off 2:on 3:on 4:on 5:on 6:off

crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off

syslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off

network 0:off 1:off 2:on 3:on 4:on 5:on 6:off

random 0:off 1:off 2:on 3:on 4:on 5:on 6:off

sendmail 0:off 1:off 2:off 3:on 4:off 5:off 6:off

proftpd 0:off 1:off 2:off 3:on 4:on 5:on 6:off

xinetd 0:off 1:off 2:off 3:on 4:on 5:on 6:off

 

만약 특정한 서비스를 특정 런레벨에서 off로 설정하려면 다음과 같이 하면 된다.

 

.

아래의 경우 런레벨 3번에서 xinetdoff로 설정하는 예이다.

 

 

# chkconfig --level 3 xinetd off

 

설정 이후 확인해 보면 런레벨 3번에서 xinetdoff로 바뀐 것을 알 수 있다.

 

 

 

# chkconfig --list xinetd

 

xinetd 0:off 1:off 2:off 3:off 4:on 5:on 6:off

 

아울러 chkconfig와 비슷한 명령어로 service라는 명령어도 있는데, 이를테면 “service --status-all”을 실행하면 흥미로운 결과를 볼 수 있을 것이다.

 

service에 대한 자세한 사용법은 service --help를 참고하기 바란다.

 

마지막 방법으로는 필자가 주로 사용하는 방법인데, /etc/rc.d/rc3.d (또는/etc/rc3.d) 디렉토리로 이동하여 “ls -la S*”를 실행하여 S로 시작되는 서비스명을 확인해도 된다.

 

. 따라서 S로 되어있는 서비스를 해제하려면 K, K로 되어있는 서비스를 가동하려고 하면 S로 변경해 주면 된다.

 

. 참고로 여기에서 3Full multiuser mode로서 일반적으로 서버로 이용할 때 사용되는 런레벨이다.

 

그리고 Sstart로서 부팅 시 작동할 서비스, Kkill의 의미로 작동하지 않을 서비스를 뜻하며 SK뒤에 있는 숫자는 실행될 번호로서 낮은 번호가 먼저 실행된다.

 

. 이를테면 웹서버와 DNS서버가 함께 작동한다면 DNS가 먼저 실행 후 웹 서버가 실행되어야 할 것이다.

 

 

대표적으로 kill 하여야 하는 서비스에 대해 알아보도록 하자.

 

S05apmd : laptop에서 전원관리를 위해 필요하므로 서버에서는 필요없다.

S10cups : Common UNIX Printing System 으로 서버에서는 필요없다.

S10xntpd : Network time protocol이다.

 

사용할 경우가 없으므로 필요없다.

S11portmap : NISNFS 서비스 이용시 R로 시작되는 서비스에 대한 portmapping 시켜주는 서비스이므로 보안상 문제가 많다. 필요없다.

S15sound : 서버에서 Sound를 서비스 하지 않으므로 필요없다.

S15netfs : nfs clientnfs server를 마운트 할 때 필요하므로 역시 필요없다.

S20rstatd, S20rusersd, S20rwhod, S20rwalld :

R로 시작하는 서비스는 인증과정이 취약하고 Remote에서 실행하는 것이 므로 반드시 서비스를 하지 않도록 하여야 한다.

S20bootparamd : 하드나 플로피 등 부팅 수단이 없을 때 이용하는 것으로 반드시

서비스하지 않아야 한다.

S25squid : squid 프록시 서버를 가동하는 설정이므로 사용하지 않는다면 필요없다.

S34yppasswdd : NIS server에서 필요하므로 필요없다.

S35ypserv : 역시 NIS에서 필요한 설정이므로 필요없다.

S35dhcpd : dhcp(ip 동적 할당 서비스)에서 필요하므로 일반적으로 필요없다.

S40atd : cron과 같은 서비스인데, cron 서비스를 이용하므로 이 서비스는 필요없다.

S45pcmcia : 노트북에서 필요하므로 삭제한다.

S50snmpd : 원격의 이용자가 트래픽이나 시스템에 대한 정보를 필요로 할 때 필요한데,

사용한다면 snmp community string을 엄격하게 설정하고 사용하지 않는다면 삭제한다.

S55named : DNS 서비스를 제공한다면 이용하지만 그렇지 않으면 삭제한다.

S55routed : 라우터가 아닌 이상 일반 서버에서는 삭제한다.

S60lpd : 프린트 서버가 아닌 이상 반드시 삭제한다.

S60mars-nwe : Netware 에서 쓰는 file이나 printer server 이므로 삭제한다.

S60nfs : NFS server 에서 필요하므로 nfs를 서비스하지 않는다면 삭제한다.

S72amd : AutoMount daemon으로 원격지의 File systemmount 할 때 필요하다. amd는 전통적으로 보안 취약성이 있으므로 삭제한다.

S80sendmail : sendmail 데몬이다.

 

메일 서비스를 제공한다면 삭제하지 않는다.

S85httpd : Apache 웹서버이다.

 

컴파일 하여 설치하였을 경우에는 이 부분을 삭제하고 해당 부분을 /etc/rc.d/rc.local에 추가한다.

S87ypbind : NIS를 쓸 때 필요하다. 사용하지 않는다면 반드시 삭제한다.

S90xfs : X font server, 서버에서는 X-Windows 서비스를 하지 않으므로 삭제한다.

S95innd : News serverNews 서비스를 하지 않으므로 삭제한다.

S99linuxconf : 원격지에서 브라우저를 통해 리눅스 시스템의 설정을 변경할 수 있는 것으 로 보안상 취약성을 가지고 있으므로 반드시 삭제하여야 한다.

 

런레벨(run level)이란?

 

/etc/inittab 파일을 보면 다음과 같은 부분이 있는데, 이 부분은 pid1init 프로세스가 어떤 모드로 부팅할 것인지 지정하는 것이다.

 

런레벨은 보는 바와 같이 0부터 6까지 있는데, 일반적으로 사용되는 런레벨은 3: Full multiuser mode이다.

 

이 부분은 “id:3:initdefault:”에서 지정된 값을 의미하는데, 3번 런레벨로 부팅할 경우 /etc/rc.d/rc3.d/ 이하의 스크립트를 실행하게 된다.

 

. 런레벨 1은 흔히 싱글모드라고도 하며 주로 관리 용도로 사용되는데, 네트워크 등 어떠한 서비스도 시작되지 않는다. 만약 부팅시 LILO:에서 “linux init=1" 또는 "linux root=/bin/bash"를 실행하면 암호 입력 없이 쉘 로그인을 할 수 있게 된다.

 

.

 

# Default runlevel. The runlevels used by RHS are:

# 0 - halt (Do NOT set initdefault to this)

# 1 - Single user mode

# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)

# 3 - Full multiuser mode

# 4 - unused

# 5 - X11

# 6 - reboot (Do NOT set initdefault to this)

#

id:3:initdefault:

 

그리고, 현재 부팅된 런레벨을 알려면 단순히 runlevel을 실행하기만 하면 된다.

 

.

 

# runlevel

N 3

또는 다음과 같이 who 명령어로도 확인 가능하다.

# who -r

run-level 3 2008-02-17 06:06 last=S

 

이곳에서는 언급되지 않았지만 알고 넘어가야 할 서비스가 하나 있다.

 

바로 identd(113/tcp)인데, 이 서비스에 대해 제대로 알지 못하거나 잘못 알고 있는 경우가 많은 것 같다. identdinetd(또는 xinetd)에서 작동하는 데몬으로 113/tcp 포트에서 리슨하며 종종 인증(AUTH) 데몬이라고도 불린다. 참고로 여기에서 인증이란 원격지 서버에 로그인하기 위한 일반적인 아이디/암호와 같은 인증의 의미가 아니라는 점에 주의하기 바란다.

 

서버에서 작동하는 어떤 서비스들은 접속을 요청하는 클라이언트에게 클라이언트 유저에 대한 신원 확인(유저네임이 무엇인가 등)을 위해 identd에 질의를 하게 되는데, 클라이언트의 identd에게 요청하는 가장 대표적인 데몬인 telnet이나 sendmail등의 서비스를 예로 들어 설명해 보도록 하겠다.

 

만약 telnet 데몬에 접속 요청이 들어왔을 때 해당 데몬은 클라이언트의 identd 포트에 "이 프로세스를 요청한 원격지 클라이언트의 프로세스 소유자가 누구인가?"를 질의하게 된다.

 

. 만약 클라이언트의 인증 데몬이 username@nodename으로 응답했다면 이 응답은 서버의 syslog등에 전달되고 연결 요청은 telnetd 데몬에 전달된다.

 

.

 

만약 응답이 null 또는 클라이언트에서 인증 데몬이 작동하지 않을 경우 서버의 telnet 데몬은 timeout이 될 때까지 기다린 후 연결을 받아들이게 된다.

 

.

 

이 때의 지연 현상은 심할 경우 레드햇 계열에서는 대략 2분 정도 소요된다.

 

.(물론 이는 DNS의 역질의(Reverse Lookup)에 의해서도 영향을 받는다.) 그런데 여기에서 주목할 것은

 

응답을 받을 때 유효성을 체크하지 않고

또 응답은 전적으로 클라이언트에게 달려 있으므로

 

username@nodename 결과값은 충분히 위조될 수 있다는 것이다.

 

(물론 root만이 이를 위조할 수 있는 권한이 있다.

 

) 또한 FreeBSDWindows와 같은 많은 시스템에서는 root가 아닌 일반 유저도 그들이 원하는 어떠한 identd를 명시할 수 있는 것으로 알려져 있다.

 

물론 이 프로토콜은 멀티 유저환경에서 문제가 있는 유저를 찾아내는데 유용하게 사용될 수 있는데, 이를테면 identd가 설치되어 있는 특정 클라이언트에서 악의적인 유저가 자신이 관리하는 서버로 nmap 스캔을 한다면 원격지 클라이언트에 identd가 작동하고 있으므로 nmap 스캔을 하는 유저가 root인지 아니면 uid가 어떤 유저인지 알 수 있는 것이다.

 

다시 돌아와서 그렇다면 identd를 실행하여야 할까? 아주 가끔 어떤 IRCFTP 서버에서는 identd가 작동하지 않는 접속을 허용하지 않을 수도 있으나 만약 identd를 서비스할 경우 이를테면 "root 권한으로 작동하는 프로세스는 무엇이 있는가?", "어떤 OS가 작동하고 있는가?", "어떤 username이 있는가?"등과 같이 시스템의 민감한 정보를 외부에 제공하게 된다.

 

. 만약 identd-n 옵션을 줄 경우에는 username 대신 username id를 보내게 된다.

 

.

 

기타 identd에 대한 더 많은 설정은 /etc/identd.conf에 설정 할 수 있는데, identd 프로세스는 kill로 죽이거나 tcp wrapper를 사용하여 차단, 또는 방화벽을 이용해 차단할 수 있다.

 

그런데, 만약 방화벽을 이용한다면 특히 주의해야 할 점이 있다.

 

차단할 때는 반드시 deny 또는 drop을 사용하지 말고 reject로 차단하여야 하며 만약 deny 또는 drop을 이용한다면 다른 서버에 접속할 때 매우 많은 시간을 소요하게 된다.

 

.

 

identd의 또 다른 작동 예는 아래와 같이 tcp wrapper에서 찾을 수 있는데,

 

hosts.deny 파일 내에

 

telnetd: ALL: (/some/where/safe_finger -l @%h | \

/bin/mail -s %d-%h root) &

 

와 같이 설정하여 사용 중인 관리자가 있을 것이다.

 

위 설정의 의미는 누군가가 telnet으로 접속할 경우 우측의 쉘 명령어에 지정한대로 접속 시도한 클라이언트의 접속 정보를 finger 하여 root에게 메일로 통보하도록 하는 것이다.

 

그런데, 이때 클라이언트의 접속정보는 %u 변수값을 얻어오게 되는데, 클라이언트에서 identd가 제대로 작동하지 않을 경우에는 신뢰할 수 있는 정보를 얻어올 수 없게 되는 것이다.

 

결론적으로 identd가 제대로 작동하려면 상호 신뢰할 수 있는 서버 사이에서 작동하고 있어야 한다.

 

또한 identd의 정보는 충분히 위조될 수 있으며 서비스를 할 경우 불필요한 정보를 외부에 제공하게 되므로 보안과 속도 등의 문제를 고려하여 identd는 서비스 하지 않는 것이 좋다.

 

다음은 서비스를 제공하는 서버 내 각각의 응용 프로그램에서 identd 질의를 하지 않도록 하는 설정이다.

 

 

 

* proftpd에서 identd 질의를 하지 않도록 하는 설정

IdentLookups off

 

* sendmail에서 identd 질의를 하지 않도록 하는 설정 (최근 버전은 기본값임)

O Timeout.ident=0s

 

 

* 기타 inetd에서 identd 질의를 하지 않도록 하는 설정(telnet )

 

변경 전)

telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd

 

변경 후)

telnet stream tcp nowait root /usr/sbin/in.telnetd in.telnetd

 

아래는 mail.server.comsmtp 접속 시 mail.server.com에서 ident 질의를 하는 경우와 그렇지 않은 경우의 예를 각각 보여주고 있다.

 

 

* #O Timeout.ident=5s로 설정되어 있는 경우, ident 질의를 하는 경우

18:35:02.074480 eth0 < client.com.52453 > mail.server.com.smtp: S 3822906123:3822906123(0) win 5840 <mss 1460> (DF)

18:35:02.074487 eth0 > mail.server.com.smtp > client.com.52453: S 4037829438:4037829438(0) ack 3822906124 win 5840 <mss 1460> (DF)

18:35:02.074733 eth0 < client.com.52453 > mail.server.com.smtp: . 1:1(0) ack 1 win 5840 (DF)

18:35:02.078228 eth0 > mail.server.com.59305 > client.com.auth: S 4036054937:4036054937(0) win 5840 <mss 1460> (DF)

--> 메일서버에서 클라이언트의 auth(113/tcp) 에 접속을 요청하고 있다.

 

18:35:02.078485 eth0 < client.com.auth > mail.server.com.59305: S 3826488945:3826488945(0) ack 4036054938 win 5840 <mss 1460> (DF)

18:35:02.078533 eth0 > mail.server.com.59305 > client.com.auth: . 1:1(0) ack 1 win 5840 (DF)

18:35:02.080078 eth0 > mail.server.com.59305 > client.com.auth: P 1:11(10) ack 1 win 5840 (DF)

18:35:02.080418 eth0 < client.com.auth > mail.server.com.59305: . 1:1(0) ack 11 win 5840 (DF)

18:35:02.262363 eth0 < client.com.auth > mail.server.com.59305: P 1:36(35) ack 11 win 5840 (DF)

18:35:02.262769 eth0 > mail.server.com.59305 > client.com.auth: . 11:11(0) ack 36 win 5840 (DF)

18:35:02.262804 eth0 > mail.server.com.59305 > client.com.auth: F 11:11(0) ack 36 win 5840 (DF)

18:35:02.263184 eth0 < client.com.auth > mail.server.com.59305: F 36:36(0) ack 12 win 5840 (DF)

18:35:02.263222 eth0 > mail.server.com.59305 > client.com.auth: . 12:12(0) ack 37 win 5840 (DF)

18:35:02.265402 eth0 > mail.server.com.smtp > client.com.52453: P 1:26(25) ack 1 win 5840 (DF)

18:35:02.265714 eth0 < client.com.52453 > mail.server.com.smtp: . 1:1(0) ack 26 win 5840 (DF)

 

--> auth와의 통신을 완료한 후 다시 smtp로 접속하는 것을 알 수 있다.

 

 

* O Timeout.ident=0s으로 설정되어 있는 경우, ident 질의를 하지 않는 경우

 

18:39:21.361031 eth0 < client.com.52515 > mail.server.com.smtp: S 4110364058:4110364058(0) win 5840 <mss 1460> (DF)

18:39:21.361097 eth0 > mail.server.com.smtp > client.com.52515: S 30810965:30810965(0) ack 4110364059 win 5840 <mss 1460> (DF)

18:39:21.361312 eth0 < client.com.52515 > mail.server.com.smtp: . 1:1(0) ack 1 win 5840 (DF)

18:39:21.370465 eth0 > mail.server.com.smtp > client.com.52515: P 1:26(25) ack 1 win 5840 (DF)

18:39:21.370734 eth0 < client.com.52515 > mail.server.com.smtp: . 1:1(0) ack 26 win 5840 (DF)

 

--> 중간과정에 auth(113/tcp)에 접속 없이 바로 smtp에 접속을 완료한다.

 

#O Timeout.ident=5s로 설정되어 있으나 client.comidentd가 작동하지 않는 경우

 

18:46:05.497831 eth0 < client.com.52589 > mail.server.com.smtp: S 233401055:233401055(0) win 5840 <mss 1460> (DF) [tos 0x10]

18:46:05.497915 eth0 > mail.server.com.smtp > client.com.52589: S 446513482:446513482(0) ack 233401056 win 5840 <mss 1460> (DF)

18:46:05.498208 eth0 < client.com.52589 > mail.server.com.smtp: . 1:1(0) ack 1 win 5840 (DF) [tos 0x10]

18:46:05.505255 eth0 > mail.server.com.59614 > client.com.auth: S 447760091:447760091(0) win 5840 <mss 1460> (DF)

18:46:05.505534 eth0 < client.com.auth > mail.server.com.59614: R 0:0(0) ack 447760092 win 0 (DF)

 

--> auth(113/tcp)SYN 요청을 받았으나 클라이언트에서 포트가 리슨하지 않아 SYN/ACK 대신 RST로 응답하는 것을 알 수 있다.

 

 

만약 클라이언트에 방화벽이 설치되어 있고, inbound되는 113/tcp 패킷에 대한 정책이 제대로 설정되어 있지 않을 경우에는 많은 속도지연이 발생할 것이다.

 

 

18:46:05.508679 eth0 > mail.server.com.smtp > client.com.52589: P 1:26(25) ack 1 win 5840 (DF)

18:46:05.508972 eth0 < client.com.52589 > mail.server.com.smtp: . 1:1(0) ack 26 win 5840 (DF) [tos 0x10]

 

--> 이후 smtp에 대한 연결을 완료한다



홍석범부매니저  소속: 라쿠텐 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,032 명
  • 현재 강좌수 :  35,773 개
  • 현재 접속자 :  258 명