본문으로 바로가기

[리눅스] 데몬에 대해서

category 리눅스/리눅스마스터 2016. 6. 21. 17:38

원본 : http://geundi.tistory.com/43


1. 데몬이란?

데몬(daemon)이란 시스템에 관련된 작업을 하는 후위 프로세스(background process)를 말한다. 대부분의 데몬들은 시스템이 부팅되면서 시작되고 데몬들에는 우리가 자즈 듣고 접하는 telnet, ftp, http, sendmail 등이 있다. 대부분의 데몬은 시스템에 관련된 작업을 하게 되는데, 서비스 요청이 없을 때는 후위 프로세스로서 유휴(idle) 상태에 들어가 있게 되어 시스템의 CPU를 차지하지 않지만 메모리와 기타 자원을 상당수 차지하게 된다. 그렇기에 많은 데몬을 띄울려면 그 만큼 시스템에 자원을 많이 가지고 있어야 한다.


2. 인터넷 슈퍼 데몬(Internet Super Daemon)이란?


그런데 데몬 중에 슈퍼 데몬이라는 것이 있다. xinetd(커널 2.4버전 이전은 inetd, xinetd는 eXtended Internet Services daemon의 약자이다)는 인터넷 수퍼 데몬(Internet Super Daemon)을 의미하는 것으로서, SENDMAIL, HTTPD 등과 같이 리눅스 시스템에서 실행되는 데몬의 일종이다. 그런데 이를 다른 데몬들과 달리 슈퍼 데몬이라고 부르는데에는 특별한 이유가 있다. 이 슈퍼 데몬은 리눅스 서버에서 서비스되는 다른 여러가지 데몬들 을 제어하면서 각각의 서비스들의 연결을 담당하고 있기 때문이다. 예를 들어 xinetd 슈퍼 데몬에 의해 제어되는 서비스중에 telnet(하나의 데몬)이라는 서비스가 있다고 하자. 누군가가 telnet서비스에 접속을 시도하면 바로 telnet으로 연결이 되는 것이 아니라 슈퍼데몬인 xinetd에 의해 허가된 사용자인가를 검사받은 후에 xinetd의 telnet설정파일(/etc/xinetd.d/telnet)에 정의되어 있는 telnet서비스 데몬과 연결되어 비로소 사용자는 telnet을 이용하게 되는 것이다. 이처럼 리눅스의 데몬중에는 슈퍼데몬에 의해 제어가 되는 데몬에는 telnet 이외에 ftp, finger, login, shell 등이 있다.


3. 데몬의 실행모드 두가지(standalone과 xinetd환경)

데몬들의 실행 모드에는 크게 두가지가 잇다. 하나는 독립적으로 실행되는 standalone모드이고, 또 다른 하나는 수퍼 데몬(xinetd)에 의해 관리되는 모드이다. 

Standalone모드로 실행되는 데몬은 독립적으로 실행되며 항상 메모리에 상주하여 서비스용청이 있을 때 언제든 바로 응답을 한다. 즉, 빠른 응답속드를 요하는 경우에 이 모드를 이용한다. 단점은 메모리에 항상 상주해 있으므로 메모리 점유로 인한 서버 부하를 준다는 것이다. 슈퍼 데몬도 standalone모드로 실행이 된다.

xinetd모드로 실행이 되는 데몬은 슈퍼 데몬에 의해 관리가 되며, 필요한 경우에만 메모리로 적재되어 실행이 되어 응답을 한다. 즉, 빠른 응답속도를 요하지 않는 경우에 이 모드를 이용한다. 단점은 응답속도가 standalone 보다 느리나, 서버부하를 상대적으로 줄일 수 있다.

----------------------------------------------------------------

Xinetd모드의 서비스 흐름도

  서비스가 이루어 지는 절차는 다음과 같다. (telnet의 경우)

     1. 외부에서 telnet 서버스의 요청이 들어돈다.
     2. xinetd 데몬이 /etc/xinetd.conf에 등록되어 있는 telnet 프로그램을 호출한다.
         ex.) telnet    stream    tcp    nowait    root    /usr/sbin/telnetd    telnetd
     3. 외부의 telnet 요청과 내부프로그램을 연결시텨 서비스요처에 대한 처리를 해주게 된다.


   TCP wrapper를 설치하여 tcpd를 운용할 경우에는 위의 순서와는 조금 다른 절차를 통해서 실행된다. 우선 tcpd가 설치가 되면 /etc/inetd.conf의 모양이 조금 바뀌게 되는데 예를 들어보면 다음과 같습니다.

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

     1. 외부에서 telnet 서비스의 요청이 들어온다
     2. xinetd 데몬은 외부에서 요청된 서비스를 tcpd에 넘겨준다.
     3. tcpd는 /etc/hosts.allow를 먼저 검사하여 허가된 접속인지를 체크한다.
     4. 3.에서 허가되지 않은 요청일 경우에는 /etc/hosts.deny를 검사하여 거부된 요청일 경우에는 이 요청을 최종적으로 거부하게 된다.
     5. 3.과 4.에서 검사하여 허거된 요청일 경우에는 /etc/syslog.conf에 설정되어 있는 /var/log/secure 파일에 접속요청에 대한 정보를 기록하고 in.telnetd를 호출하여 서비스를 제공한다.


xinetd에 관련된 파일들

  /etc/xinetd.d/내의 각서비스 파일들    : xinetd로 서비스될 파일들이 존재하는 디렉토리
  /usr/sbin/xinetd                      : xinetd 데몬
  /etc/services                         : 서비스포트 설정파일
  /etc/protocols                        : 프로토콜 설정파일
  /etc/syslog.conf                      : 시스템로그 설정파일
  /usr/sbin/tcpd                        : tcpd 데몬
  /etc/hosts.allow                      : 서비스별 허용목록 파일 (tcpd)
  /etc/hosts.deny                       : 서비스별 거부목록 파일 (tcpd)
  /var/log/secure                       : tcpd 로그파일 (접근기록 파일)
  /etc/rc.d/init.d/xinetd               : xinetd 시작/종료 스크립트 파일


/etc/xinetd.conf 의 이해
default 설정으로 /etc/xinetd.d/ 디렉토리내에 존재하는 xinetd 서비스파일들에 공통적으로 적용하는 설정 내용이 저장되어 있다.

이전에는 다음 박스안의 모습처럼 이곳에 각 서비스들의 설정을 모두 적용한것 같다. inetd 슈퍼데몬을 직접 접해본 경험이 없어 실제 본적은 없지만 인터넷의 자료들을 보면 다음과 같은 모습이었던것 같다.


inetd.conf 파일 정보를 보는 방법

   service  socket_type  protocol  wait_flag  login_name  server               argument

   ftp         stream         tcp         nowait     root             /usr/sbin/tcpd   in.ftpd -l -a

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


현재 이용되고 있는 xinetd 슈퍼데몬의 장점중의 하나로 각 서비스에 대한 설정들을 구별하여 별도로 설정할 수 있도록 한 것이 꼽히고 있다. 따라서 현재는 xinetd.conf에서는 모든 데몬에 공통적으로 적용되는 defaulr을 설정하고 xinetd.conf 설정 내용에 includedir /etc/xinetd.d 라는 문구를 추가함으로써, 각 데몬에 대한 구체적인 설정은 /etc/xinetd.d 디렉토리안에서 각 파일로써 설정을 하고 있다. 

다음 설명은 inetd 시절의 inetd.conf에 각 서비스별로 설정할 내용이다.

     service : 서비스이름. /etc/services에 등록되어 있어야한다.
     socket type : TCP일 경우에는 stream이며, UDP일 경우에는 dgram이라고 명시되어 있다.
     protocol : tcp 혹은 udp의 프로토콜을 명시하며 /etc/protocols에 등록되어 있다.
     wait flag : inetd가 서비스 요청을 받은 경우, 이후에 즉시 또 다른 요청을 처리할 것인지 아닌지의 여부에 따라 nowait 또는 wait로 구분한다. stream일 경우에는 반드시 nowait이어야 한다.

     # 한가지 중요한 것은 1분에 최대 허용 접속수를 몇 회까지 제한할 것인가에 대한 설정이다. 이에 대한 설정이 없다면 1분에 40회가 기본설정값이다. 만약 40회 이상요청이 있을 경우에는 관련 서비스를 내려 버린다. 만약, 잦은 접속이 있을 경우에는 이 값을 다음과 같이 설정해 주어야 한다. nowait.100 또는 nowait.200

     login name : 어떤 사용자의 권한으로 프로그램을 실행시켜 줄 것인가를 명시
     server : 어떤 응용프로그램을 실행시킬 것인가를 명시. 절대경로를 모두 명시해야 한다.
     argument : 응용 프로그램의 인자를 지정하며 5개까지 가능하다. 일반적으로 argv[0]는 프로그램 자신의 이름이 되므로 첫 번째 인자는 응용 프로그램 자신의 이름이 된다.


 
xinetd 의 시작과 종료

 xinetd를 구동하거나 종료 및 실행상황를 점검할 수 있는 스크립트파일이 /etc/rc.d/init.d/xinetd 이다.
 이 스트립트는 서버부팅과 함께 자동으로 실행된다. 하지만 재시작하거나 종료를 하고자 할 때는

   - 시작 : /etc/rc.d/init.d/xinetd start
   - 종료 : /etc/rc.d/init.d/xinetd stop
   - 재시작 : /etc/rc.d/init.d/xinetd restart
   - 상황점검 : /etc/rc.d/init.d/xinetd status


xinetd에 의한 접속 제어 (tcpd)

 xinetd모드에서 실행되는 서비스들은  거의 대부분 tcpd이라는 TCP_WRAPPER의 데몬에 의해 접속 제어를 받게 된다. 쉽게

말해서 개별 서비스들의 접근 허용을 설정하는 파일은 /etc/hosts.allow이며 접근허용이 되지 않도록 하는 설정은

/etc/hosts.deny이다.

  hosts.deny의 예를 보면 아래와 같다.

     in.telnetd: 123.124.125.156 111.111.111.111 222.333.444.555
     in.ftpd: 777.888.999.111
     ipop3d: ALL

  ':' 을 기점으로 왼쪽에는 서비스될 대상 데몬들이고 오른쪽은 대상 IP 및 호스트들이다.
  tcpd에 의해서 접근된 로그와 접근이 허용되지 않은 로그들이 기록된느 파일은 /var/log/secure 이다.


xinetd 의 핵심 tcpd

  tcpd(TCP_WRAPPER)는 서버관리자에게는 없어서는 안될 필수 도구로서 크게 다음과 같은 역할을 한다.

  - 특정 IP나 도메인으로부터 서버의 telnet ftp pop등의 접속을 차단할 수 있다.
  - 접속 기록이나 접속 시도 기록을 특정한 파일에 로그로 기록한다.


/etc/services 파일

  이 파일은 리눅스서버에서 사용하는 모든 포트들에 대한 정의가 설정되어 있다.
  보안을 위하여 이 파일을 적절히 조절하면 기본 사용 포트를 변경하여 사용할 수 있다.
  이는 기본적인 공격시도나 해킹등이 대부분 알려져 있는 포트를 통해 이루어지고 해킹툴들의 기본 셋팅값들이 대부분 거

의 변경없이 사용되는 기본포트번호를 그 공격통로 삼는다는 점 때문이다.

 이 파일에 설정되는 각 서비스 포트들의 형식은 다음과 같다

     서비스이름    포트/사용프로토콜유형        별칭
     ftp                 21/tcp
     fsp                21/udp                             fspd


/etc/protocols 파일

  앞서 설명한 /etc/services 파일에서 정의되는 프로토콜의 정의가 되어 있는 파일이다. 
  포트번호에 대한 상세정보 및 업데이트정보는 아래의 URL에서 볼 수 있다.
  http://www.isi.edu/in-notes/iana/assignments/protocol-numbers 



POP3의 xinetd 설정 파일은 아래와 같다.

     service pop3

     {    
         disable=yes

         socket_type=stream

         wait=no

         user=root

         server=/usr/sbin/ipop3d

         log_on_success+=USERID

         log_on_failure+=USERID

     } 


서비스는 service 라는 예약어로 시작되어 서비스명을 적어주어야 한다. 여기서 서비스명은 /etc/services 파일내에 있는 service-name 필드와 일치해야 한다.

그 다음, 서비스가 가질 각 속성과 값을 대입 한다. 특이한 것은 += , -= 와 같은 연산을 지원하는 점이다. 이 연산자는 기존 값의 목록에 새로운 값을 추가/제거 하는 연산이다. 

다음은 서비스가 가질 수 있는 속성의 목록과 설명입니다.

속  성            의미 / 값 

service          서비스 이름, /etc/services 파일에 등록된 이름과 동일해야 한다.

disable         xinetd의 제어를 받지 않을 것을 결정, yes이면 xinetd의 제어를 받지 않겠다라
                   는 뜻, no이면 xinetd의 제어를 받겠다는 뜻
 
socket_type   사용하는 TCP/IP 소켓, stream(TCP), dgram(UDP), raw, seqpacket이 올 수
                    있다. 
 
protocol        서비스가 이용하는 protocol 지정.  /etc/protocols 에 있다.  지정되지 않으면
                   서비스가 이용하는 protocol이 디폴트로 지정된다. 
 
server          서비스가 실행될 때 어떤 위치의 프로그램을 불러와 연결할 것인지 지정한다.
                   반드시  절대경로로 지정되어야 한다. 
 
server_args    Daemon 에 넘겨질 인수 지정한다. 
 
port              서비스하는 포트번호  /etc/services 에 있는 내용과 일치해야 한다. 
 
wait            yes나 no.
                  yes 이면 xinetd 가 요청된 한 daemon 이 끝날 때까지 다른 요청을 받지 않는
                  다. 즉,  single-thread service 이다.  no 이면 각 요청에 대해  daemon 이 작동
                  한다. 즉 multi-thread service 이다. 
 
user            daemon 의 UID를 설정, xinetd의 UID가 0이 아니면 의미가 없다. 
 
group           daemon 의 GID를 설정, xinetd의 GID가 0이 아니면 의미가 없다. 
 
nice            daemon 의 우선순위 (nice)를 지정. 
 
access_times    서비스를 이용할 수 있는 시간 간격을 설정. hh:mm-hh:mm형식. 
                       예) 08:00-18:00