SYSTEM/UNIX|LINUX Server 보안

Linux Daemon - StandAlone vs. xinetd (inetd)

마띠(쥔장) 2021. 3. 25. 15:18

리눅스 환경에서의 서비스 운영 방식은 2가지로 분류할 수 있다.

(1.1) 서비스 운영 방식 - StandAlone

  • 항시 떠있으면서 서비스하는 방식 (background process)
  • /etc/initd에서 조회 가능
  • 서비스 자체를 사용하지 않아도 메모리, CPU를 점유하고 있음
    • 서비스 요청이 많은 WEB, MAIL 등이 쓰는 방식
    • 서비스 요청이 적음에도 이 방식으로 사용한다면 비효율적

StandAlone 서비스는 데몬을 구동시킬 수 있는 스크립트를 저장하는 /etc/init.d (= /etc/rc.d/init.d) 파일에서 그 목록을 확인할 수 있다.

bluetooth, httpd, network, apache 등의 서비스들이 이에 해당한다.

모든 서비스 파일들은 /etc/init.d 디렉터리의 실제 파일로 링크되어 있고, 이 곳에는 서비스 구동을 위한 스크립트가 저장되어 있다.

따라서 아래와 같이 init.d을 통해 서비스 제어가 가능하다.

# xinetd 서비스 시작
$ /etc/rc.d/init.d/xinetd start
# inetd 서비스 종료
$ /etc/rc.d/init.d/xinetd stop
# inetd 서비스 재시작
$ /etc/rc.d/initd./xinetd restart

Linux(SysV system)의 부팅 과정을 보면, 왜 /etc/init.d에 StandAlone 서비스가 저장되어 있는지 알 수 있다

  • Power On -> ROM BIOS에서 지정된 Boot Drive로 부팅 시작 -> Boot Sector 로드 -> GRUB 작동 -> Kernal 이미지 적재 -> File System 마운트 -> 시스템 초기화 프로그램 작동 -> Log On

위의 시스템 초기화 프로그램 작동 과정은 init프로세스를 실행하여 시스템을 초기화하는 것이다. /sbin/init은 PID=1을 가지는 조상 프로세스로, /etc/inittab 파일을 읽어들인다. (CentOS 7 이후 systemd로 변경됨)

/etc/inittab 파일은 init 프로세스가 해야할 일을 기록한 파일로, id:runlevel:action:command의 형식을 갖는다. 현재 시스템에서 열어보면 runlevel=5인 것을 확인할 수 있는데, 이는 X윈도우 환경으로 실행된 multi-user 모드를 뜻한다.

Linux Runlevel에 관한 위키

runlevel에 따른 서비스 실행 제어 with chkconfig

이렇게 /etc/inittab이 실행되면, 가장 처음으로 /etc/rc.sysinit 파일의 내용을 읽어온다. 이는 runlevel에 무관하게 부팅 과정에서 꼭 한 번 실행되는 파일이다. 그 후에는 명시된 runlevel에 따라 /etc/rcN.d 디렉터리의 명령을 따른다. 즉, 현재 시스템은 runlevel=5이므로 /etc/rc5.d가 실행되는 것이다. runlevel=3이라면 /etc/rc3.d가 실행될 것이다. runlevel에 따른 실행 서비스는 chkconfig를 통해 조회할 수 있다.

/etc/rcN.d디렉터리 아래에는 해당 런레벨(N)에서 실행할 서비스가 정의되어 있다. 각 파일 명에는 K 또는 S가 붙어있는데 이는 Kill과 Start의 약어로, 서비스 죽이거나 시작하는 파일이라는 의미다.

조금 더 자세히 살펴보면, 이 모든 파일이 링크 파일이라는 것을 알 수 있다. 그리고 그 링크는 /init.d로 연결되어 있다. 이런 이유로 /etc/init.d 디렉터리에서 StanAlone 서비스 목록을 조회할 수 있는 것이다.

/etc/rcN.d 디렉터리 내 파일 실행이 끝나면, 마지막으로 /etc/rc.local (=/etc/rc.d/rc.local) 파일이 실행된다.

StandAlone 서비스 관련된 과정만 정리하자면 다음과 같다.

  1. 부팅 과정 중 시스템 초기화 시 pid=1인 init 프로세스 실행
  2. init은 할 일이 정의되어 있는 /etc/inittab 실행
  3. /etc/inittab에 정의된 runlevel에 따라 /etc/rcN.d 실행
  4. /etc/rcN.d 디렉터리 내 /etc/init.d과 연결된 링크 파일 실행
  5. (결론) /etc/init.d에는 StandAlone 방식의 서비스가 정의되어 있다.

(1.2) 서비스 운영 방식 - xinetd (inetd)

xinetd vs. inetd

  1. xinetd = inetd + extended (TCP Wrapper 등)
  2. TCP Wrapper = inetd/xinetd가 관리하는 포트로 서비스 요청이 들어왔을 때 /etc/hosts.{allow|deny} 파일을 기준으로 서비스 접근을 제어하는 메커니즘
  3. inetd -> xinetd로의 확장:
    1. 접속 성공/실패에 대한 logging
    2. 총 서버 수에 대한 제한
    3. 로그 파일 크기에 대한 제한 등
  4. inetd/xinetd 서비스 실행 과정:
    1. inetd/xinetd가 관리하는 well-known 포트를 기준으로 listening
    2. 서비스 요청이 들어오면 /etc/services 파일을 읽어 port.#에 대응되는 서비스명 찾음
    3. TCP Wrapper를 통해 서비스 접근 제어 후 허용/거부 판단
    4. 허용된 요청에 대해 서비스 실행

xinetd = /etc/xinetd.conf (설정 파일) + /etc/xinetd.d (디렉터리) + /etc/rc.d/init.d/xinetd (StandAlone 데몬)

  • 항시 떠있지 않고, xinetd에 서비스를 요청하여 서비스를 띄우는 방식
  • CPU나 메모리를 점유하는 서비스가 아니므로 효율적
    • Telnet, FTP 등 간헐적으로 실행되는 서비스
  • 하지만 xinetd를 거쳐야 하므로 서비스 요청이 많으면 느려질 수 있음
  • TCP Wrapper의 ACL 기능을 사용할 수 있음

xinetd는 인터넷 기반 연결을 관리하는 수퍼 서버 데몬으로 네트워크로 들어오는 서비스 요청을 듣고 그에 맞는 적절한 서비스를 실행한다. xinetd 자체는 StandAlone 방식으로 항시 대기, 요청 시 xientd 방식으로 서비스를 띄운다.

xinetd.conf 파일은 xinetd의 글로벌 환경을 설정할 수 있는 파일로, xinetd 방식을 사용하는 서비스들의 전체적인 환경을 제어한다.

xinetd.conf 파일이 제공하는 서비스 설정은 /etc/xinetd.d에 저장된다.

각 서비스들의 설정은 xinetd가 서비스를 활성화할지 안할지에 대한 제어 변경을 포함한다. 각각의 서비스에 대한 개별 설정은 /etc/xinetd.d 안의 개별 설정 파일을 통해 제어하며, 전체적으로는 글로벌 설정인 /etc/xinetd.conf 파일을 따른다.

/etc/xinet.d 디렉터리는 xinetd 방식으로 띄워지는 서비스 목록이 정의된 곳이다. 이 곳에서 주의할 점은, 모든 파일이 root권한으로 실행되는지 확인해야 한다. 이 파일이 일반 계정에게도 읽기 권한을 가지게 한다면 해당 서버에서 어떤 서비스를 제공하는지 + 어디에 위치하는지까지 가능하기 때문이다.

728x90