[Service] xinetd, tcp_wrapper, hosts.allow, hosts.deny

markyang92·2021년 6월 27일
0

network

목록 보기
11/21
post-thumbnail

그림 및 내용 출처

  • 전통적으로 inetd 대몬을 활용해 서버의 활용을 간소화한다.
    네트워크 포트 접속을 표준화하며, 서버 프로그램들과 네트워크 포트 간의 인터페이스를 표준화하도록 만들어진 슈퍼 서버의 일종이다.
  • 현재는 xinetd 대몬이 사용되고 접속 제어 한다.
  • 하지만 xinetd 또한, systemd에 밀려서 단계적으로 폐지되고 있다.
    • systemd가 소켓 유닛을 통해 동일한 기능을 제공할 수 있다.

이 글은 xinetd 에 관해 다룬다.


inetd

  • 위 그림은 init 프로세스에 의한 서비스 실행 흐름도
  • inetd, xinetd 들 모두 systemd에 의해 대체되어 가지만 아직도 inetd, xinetd에 의해 관리되는 경우가 많다.

inetd 설정

  • inetd의 설정 파일은(시스템이 inetd를 사용한다면) /etc/inetd.conf에 있다.
ident	stream	tcp	nowait	root	/usr/sbin/sshd	sshd -i
  • 7개의 필드가 왼쪽 부터 있다.
    • 서비스 명: /etc/services의 서비스 명
    • 소켓 타입: tcp(stream), udp(dgram)
    • 프로토콜: tcp, udp
    • 데이터 그램 서버 작용: udp의 경우 wait 또는 nowait. 다른 프로토콜은 nowait
    • 사용자: '서비스를 실행하는 사용자 명'
    • 실행 프로그램: inetd가 서비스에 연결해야하는 프로그램
    • 인수: 실행을 위한 인수. 첫 번째 인수로는 프로그램의 이름이 와야한다.

tcp_wrapper

  • 저수준 레벨 방화벽들이 인기를 얻기 전에 많은 관리자들은 네트워크 서비스의 호스트를 제어하기 위해 tcp_wrapper 라이브러리와 대몬을 사용했다.
  • inetd는 tcpd 프로그램을 실행했다.
    • 이 프로그램은 유입되는 연결을 살피고, /etc/hosts.allow/etc/hosts.deny 파일의 접속 제어 목록들을 살핀다.
    • tcpd 프로그램은 해당 연결을 기록한다.
    • 만약 유입되는 연결의 상태가 괜찮으면, 최종 서비스 프로그램으로 이를 전달한다.

수퍼대몬(xinetd), standalone 대몬 차이

  1. 수퍼데몬방식과 독립데몬방식 서비스 차이점
  • httpd, sendmail과 같은 그 자체적으로 항상 메모리에 상주해 서비스 요청 시 실시간으로 응답하는 독립방식 서비스(standalone)
  • xinetd라는 수퍼대몬에 의해 실행되고 제어되는 xinetd 수퍼 대몬방식의 서비스
    • telnet
    • rsync
  1. xinetd 서비스와 standalone 서비스의 비교
구분xinetd 환경 서비스standalone 서비스
의미xinetd 수퍼 대몬에 의해 제어되는 서비스들의 대몬독립적으로 실행되는 서비스들의 대몬
실행방법필요할 때, xinetd에 의해 수행됨독립적으로 수행됨
대몬 상주 여부xinetd에 의해 call되고, 서비스 완료 후 자동 종료항상 메모리에 상주
실행속도느림빠름
자원 사용적음많음
기타/etc/xinetd.d/서비스명
으로된 xinetd 제어 파일이 존재함
/etc/rc.d/init.d/서비스명
과 같은 파일명으로 존재함
접근제어tcp_wrapper에 의해 접근 제어됨
/etc/hosts.allow, /etc/hosts.deny 파일로 접근 제어 가능
자체 설정 파일에 의해 접근 제어할 수 도 있음
tcp_wrapper에 의한 접근 제어 가능
로깅/etc/syslog.conf 파일에 따름/etc/syslog.conf 파일에 따름
대표적 서비스ipop3d
telnetd
rsync
ftpd
httpd
sendmail
named
xinetd(xinetd 자체는 독립 방식 서비스)
  • 참고 사항
  1. standalone 대몬들도 xinetd 환경으로 변경할 수 있고, xinetd 환경에서 서비스되는 대몬들도 독립적인 실행모드로 변경할 수 있음
  2. sshd의 경우, standalone이지만 /etc/hosts.allow, /etc/hosts.deny의 접근 제어 받음. 따라서 standalone 대몬도 tcp_wrapper의 영향을 받을 수 있음
  • 즉, 다음의 고려사항이 요구됨
  1. 얼마나 많은 서비스 요청을 받는가?
  2. 얼마나 자주 서비스 요청을 받는가?
  3. 시스템 자원 사용, 특히 메모리 사용이 얼마나 되는가?
  4. 보안이 필요한 경우와 비교적 그렇지 않은 경우

xinetd

xinetd의 특징

  1. xinetd는 internet super daemon을 의미함
  2. xinetd 자체는 sendmail, httpd등과 같이 standalone 서비스이다.
  3. xinetd 자체는 다른 서비스들을 관리하는 역할을 한다.
  4. 각각 서비스 별로 별도의 파일에 설정가능하다(/etc/xinetd/*).
  5. tcp_wrapper를 내장하고 있기 때문에 접근제어를 할 수 있다.
  6. timeout 설정으로 서비스 접근 제어 할 수 있다.
  7. 접속 시도 횟수로 접근 제어를 할 수 있으므로 무차별 서비스 거부 공격(DoS)를 방지할 수 있다.
  8. 동일한 IP를 가진 호스트에서 동시 접속 수를 제어하여 접근 제어를 할 수 있다.
  9. 로그파일의 크기를 제한 할 수 있다.
  10. xinetd에서 제어되는 각 서비스들에 대한 syslog 로깅 레벨 설정 가능
  11. 접속하는 클라이언트들의 서비스 이용시간을 기록 할 수 있음
  12. 서비스를 거부하거나 서비스 접근제어가 되었을 경우 상세로그를 기록함

xinetd 방식 주의 사항

  • xinetd는 외부에서 서비스 요청이 있을 때, /etc/xinetd.d/ 디렉토리 내의 각 서비스 파일들에 정의되어 있는 내부 프로그램(대몬)을 실행시켜주는 역할을 한다.
    xinetd가 없다면 ftp, telnet 대몬들은 자기들을 호출하는가를 항상 확인해야한다. 하지만 xinetd가 그 역할을 대신해서 해당 서비스 요청이 들어올 때마다, 요청 대몬을 실행시켜준다.
  1. /etc/xinetd.d 디렉토리 내의 서비스 파일들에 등록되어 있는 대몬들이 root 계정으로 실행되고 있는지 꼭 확인해봐야한다.
  2. /etc/xinet.d 디렉토리의 각 서비스 파일들의 퍼미션에서 일반유저들에게 실행은 물론이고 읽기권한까지도 빼버려야한다.
    2-1. 일반 userr 권한이 있는 경우
    서버에서 어떤 서비스를 하고 있는지를 모두 알 수 있음
    실행파일의 위치까지도 파악할 수 있음
    2-2. 일반 userw 권한이 있는 경우
    어떤 프로그램이든지 만들어서 이 파일에 등록해두면 root권한으로 실행이 가능하게 된다.

xinetd 방식의 서비스 흐름

  • xinetd 기반 대표 서비스인 telnet 서비스의 경우
  1. 외부에서 telnet 연결 요청(서비스 요청)
  2. xinetd 대몬은 외부에서 요청된 서비스를 tcp_wrapper에게 넘겨준다.
  3. tcp_wrapper/etc/hosts.allow/etc/hosts.deny 파일의 설정을 확인 해, 해당 요청자의 접근을 허용할 것인가? 허용하지 않을 것인가?를 결정한다.
  4. 허가된 요청일 경우 /etc/syslog.conf에 설정되어 있는 /var/log/secure 파일에 해당 접속에 대한 정보를 기록, /etc/xinetd.d/telnet 파일을 불러 서비스를 연결한다. 이 때, /etc/xinetd.d/telnet 파일내의 server 지시자행에 설정되어 있는 telnet 대몬의 위치를 찾아서 요청을 처리한다.
  5. 허가되지 않은 요청일 경우, /etc/syslog.conf 파일에 설정되어 있는 /var/log/secure 파일에 허가되지 않은 접속이 있었다는 로그를 남기고 접속 요청을 거부하게된다.

log: /var/log/secure

  • 위 본문에 설명한대로, 로그를 /var/log/secure에 남긴다.

xinetd 서비스 관련 파일들

파일역할
/etc/xinetd.confxinetd 서비스에 공통으로 적용되는 설정 파일
xinetd최 상위 설정 파일. 아래 각 서비스 설정 파일에 global 한 영향을 준다.
/etc/xinetd.d/[SERVICE_FILES]xinetd 기반 서비스들 개별 설정 파일
/usr/sbin/xinetdxinetd 대몬 파일
/etc/sbin/tcpdtcp_wrapper 대몬 파일
/etc/rc.d/init.d/xinetdxinetd 시작/ 종료 스크립트 파일
/etc/hosts.allow서비스별 허용할 host, ip 리스트(tpc_wrapper)
/etc/hosts.deny서비스별 허용 하지 않을 host, ip 리스트(tpc_wrapper)
/etc/syslog.conf시스템 로그 설정 파일
/var/log/securetcp_wrapper 로그 파일(접근 기록 파일)
/etc/services서비스 포트 설정 파일
/etc/protocols프로토콜 설정 파일

telnet

  • xinetd에 의해 관리되는 서비스
  • 원격지의 서버나 pc에서 누군가 telnet으로 접속을 시도할 때, xinetd에 의해 허가된 사용자인지를 검사 받은 후, xinetd의 telnet설정 파일(/etc/xinetd.d/telnet)에 정의 되어 있자가 telnet 서비스를 이용하게 된다.

/etc/xinetd.conf

  1. 본인 PC의 /etc/xinetd.conf
  2. 다음과 같이 수정 함

  1. 교재/etc/xinetd.conf
#
# This is the master xinetd configuration file. Settings in the
# default section will be inherited by all service configurations
# unless explicitly overridden in the service configuration. See
# xinetd.conf in the man pages for a more detailed explanation of
# these attributes.


defaults
{
# The next two items are intended to be a quick access place to
# temporarily enable or disable services.
#
#            enabled               =
#            disabled =

# Define general logging characteristics.
             log_type  = SYSLOG daemon info
             log_on_failure       = HOST
             log_on_success    = PID HOST DURATION EXIT

# Define access restriction defaults
#
#            no_access           =
#            only_from              =
#            max_load              = 0
             cps                     = 50 10
             instances             = 50
             per_source           = 10

# Address and networking defaults
#
#            bind                     =
#            mdns                   = yes
             v6only                  = no

# setup environmental attributes
#
#            passenv               =
             groups                 = yes
             umask                  = 002
 
# Generally, banners are not used. This sets up their global defaults
#
#            banner                 =
#            banner_fail           =
#            banner_success   =
}

includedir /etc/xinetd.d
  • default 설정
    • /etc/xinetd.d/[SERVICE FILE]의 서비스 파일들에 공통적으로 적용하는 설정 내용.
    • 개별 설정 항목이 존재할때는 이 기본 설정은 무시되고 개별 설정 값이 적용된다.
  • 마지막 행의 includedir /etc/xinetd.dxinetd 서비스의 작용을 받는 개별 서비스 설정 파일들을 /etc/xinetd.d 디렉토리에서 불러오는 것이다.

rsync 개별 설정 파일(/etc/xinetd.d/rsync)

[root@os3 ~]# cat /etc/xinetd.d/rsync
# default: off
# description: The rsync server is a good addition to an ftp server, as it \
#            allows crc checksumming etc.

service rsync
{
             disable   = yes
             socket_type     = stream
             wait            = no
             user            = root
             server          = /usr/bin/rsync
             server_args     = --daemon
             log_on_failure  += USERID

}
  • 위 파일은 /etc/xinetd./rsync 파일, rsync의 개별 설정이다.
    • service [NAME]: 서비스 이름. 가능한 파일이름과 /etc/services 파일에 등록된 서비스 이름과 동일해야함
    • disable: 해당 서비스를 서비스 할 것인가? 아닌가?
      • no: 서비스를 하도록 설정
      • yes: 서비스 하지 않음
    • socket_type:
      • TCP: stream
      • UDP: dgram
      • others: raw, rdm, seqpacket...
    • wait: xinetd가 서비스 요청을 받은 경우, 이후에 즉시 또 다른 요청을 처리할 것인지(no) 아닌지(yes) 여부 지시
      • 위에서 socket_typestream일 경우 반드시 no
    • user: 이 서비스를 어떤 사용자 권한으로 서비스 할 것인가?
      • root로 되어 있다면 root로 설정
    • server: 해당 1)서비스 요청이 들어왔을 경우, 해당 2)서비스를 담당하게 될 대몬 파일의 위치를 절대 경로로 지정
      즉, 해당 서비스를 실행할 때 어떤 위치에 존재하는 프로그램(대몬)을 불러와 연결할 것인가?
    • log_on_failure: 서버 접속에 성공하지 못하였을 때 로그파일(대부분 /var/log/secure)에 기록하는 내용들을 설정할 수 있다.
      • HOST, USERID, ATTEMPT, RECORD 등을 추가로 설정할 수 있다.
        • HOST: 접속을 시도한 클라이언트의 IP
        • USERID: 접속한 사용자 ID
    • +=: /etc/xinetd.conf 파일의 기본설정항목에 추가할 항목을 지정할 때 사용하는 것
      • 위에서 log_on_failure += USERID라고 한 경우는 해당 서비스 접속 시도에 실패하였을 경우에 /etc/xinetd.conf 파일에 정의된 기복항목 외에도 USERID 값, 즉 접속한 사용자의 ID를 로그파일에 추가로 기록하라는 의미
    • log_on_success: 서버 접속에 성공하였을 경우에 기록할 내용을 설정
      • PID: 프로세스 ID
      • HOSTID: 클라이언트의 IP 주소
      • USERID: 접속한 사용자의 ID
      • EXIT: 프로세스의 종료 상태
      • DURATION: 연결 지속 시간
    • only_from: "only_from = 192.168.1.0/24"와 같이 설정이 가능하다. 현재 이 서버로 해당 서비스 접속이 가능한 곳은 192.168.1.0 네트워크내의 호스트들로 제한한다.
    • no_access: "no_access = 192.168.0.100"과 같이 설정이 가능하며, 접속 가능한 호스트 중에서 192.168.1.100번 IP주소를 가진 호스트는 제외되어 접속하지 못한다는 의미
    • instances: "instances = 60" 등과 같은 설정이 가능하며, 해당 서비스로 접속이 가능한 총 접속자 수는 60명까지로 제한된다. 따라서, 현재 접속자 수 60명'까지'는 접속을 허용하지만 61번 째 접속자는 접속을 거부한다.
    • access_times: "access_times = 08:00-18:00" 와 같은 설정이 가능하다. 해당 서비스 이용 가능 시간을 오전 08시~오후 06시로 제한하는 설정이다.
    • per_source: "per_source = 5와 같은 설정이 가능하며, 동일한 호스트에서 해당 서비스로의 접속 시 동시에 5번 이상 접속할 수 없ㅏ. 이 서비스는 서비스 거부 공격(DoS)를 차단하기 위해 사용될 수 있다.

xinetd의 시작과 종료

  • xinetd 서비스를 위해서는 xinetd 대몬이 실행되어 있어야한다.
    xinetd 대몬을 실행하려면 /etc/rc.d/init.d/xinetd 스크립트 파일을 이용한다.

  • 이 스크립트는 서버 부팅과 함께 자동으로 실행된다.

    • xinetd 관련 파일들을 수정한 후, xinetd를 재시작하거나 상태를 점검할 필요가 종종있게 마련이다.
      이 때 간단히 이 스크립트를 다음과 같이 사용하면 매우 효과적이다.

xinetd 시작

$ sudo /etc/rc.d/init.d/xinetd start
xinetd ()를 시작 중:	[OK]
$ sudo ps -ef | grep xinetd
root      5073     1  0 04:32 ?        00:00:00 xinetd -stayalive -pidfile /var/run/xinetd.pid
root      5076  5036  0 04:32 pts/0    00:00:00 grep --color=auto xinetd

xinetd 종료

  • 종료는 stop을 사용하면 된다.
$ sudo /etc/rc.d/init.d/xinetd stop
xinetd ()를 정지 중:	[OK]
$ sudo ps -ef | grep xinetd
root      5086  5036  0 04:34 pts/0    00:00:00 grep --color=auto xinetd
  • xinetd 대몬이 종료되어 ps 명령어로 확인이 되지 않는다.

xinetd 재시작

  • 재시작은 restart 옵션을 사용하면 된다.
$ sudo /etc/rc.d/init.d/xinetd restart
xinetd ()를 정지 중:	[OK]
xinetd ()를 시작 중:	[OK]

xinetd의 상태 확인

  • 상태 확인은 status를 사용하면 된다.
$ sudo /etc/rc.d/init.d/xinetd status
xinetd (pid 5107)를 실행 중...

tcp_wrapper

  • tcpd(tcp_wrapper)는 서버 관리자에게는 없어서는 안될 필수도구로 다음과 같은 두 가지 역할 한다.
  1. 특정 IP나 도메인으로부터 telnet, ftp, pop 등의 접속을 차단할 수 있다.
  2. 접속 기록이나 접속시도기록을 특정 로그 파일에 로그로 기록
  • xinetdtcp_wrapper를 내장
    • xinetd모드에서 실행되는 서비스들(ex: ftp, telnet, ssh 등)은 거의 대부분 tcpd라는 tcp_wrapper의 대몬에 의해 접속 제어를 받게된다.
      • 개별 서비스들의 접근 허용을 설정하는 파일은 /etc/hosts.allow
        • 접근 허용이 되지 않게 설정하는 파일은 /etc/hosts.deny

  • 주의 할 것: tcp_wrapper의 제어 파일인, /etc/hosts.allow, /etc/hosts.deny 에 의해 제어되는 서비스가 xinetd기반 서비스에 한정되어 있지 않다
    • 위에서도 보았는데, standalone서비스들 도tcp_wrapper의 제어 파일인 /etc/hosts.allow, /etc/hosts.deny파일의 접근 제어를 설정할 수 있다.

/etc/hosts.{allow,deny}

  • /etc/hosts.allow, /etc/hosts.deny 파일의 설정
구분왼쪽부분 설정 항목오른쪽 부분 설정 항목
대상대상서비스접근 제어 대상(host, IP주소, 네트워크 주소 등)
설정 값tcpd에 의해 제어되는 모든 서비스 명
xinetd 기반의 서비스들 뿐 아니라 standalone 대몬들의 서비스들도 가능함
특정 도메인명(domain name)
특정 호스트명(hostname)
특정 IP주소(IP Address)
특정 네트워크(Network)
설정 예telnet
rsync
sshd
proftpd
linux.co.kr
web1
192.168.0.100
192.168.1.0/24
192.168.2.0/255.255.255.0

실제 예

proftpd: 192.168.10.0/255.255.255.0 EXCEPT 192.168.10.100
proftpd: 192.168.10.100 : twist /bin/echo "Access Denied!"
sshd: 192.168.0.100

다음은 접근제어 설정 시 주의사항 및 규칙이다.
1. 왼쪽 항목과 오른쪽 항목은 콜론(:)으로 구분한다. 세번째 항목을 계속 설정할 때도 콜론으로 구분한다.
2. /etc/hosts.allow의 설정과 /etc/hosts.deny 설정이 중복되었을 경우 /etc/hosts.allow파일의 내용이 우선 적용
3. # 문로 시작하면 주석문
4. 각 대상 리스트들의 나열은 space( )나 콤마(,)로 구분한다.


hosts.deny의 예

ALL:ALL
  • /etc/hosts.allow, /etc/hosts.deny의 해석은 콜론(:)을 기점으로 하여 왼쪽에는 서비스될 대상 서비스, 오른쪽에는 대상 IP 및 호스트 정보
  • 위와같이 설정시 모든 서비스들에 대해, 모든 곳으로부터의 접근을 차단한다.

hosts.allow의 예

in.telnetd : 210.101.112.240 210.101.112.241 211.123.12.12 168.126.3.1
in.ftpd : 210.101.112.240 210.101.112.241 211.123.12.12 168.126.3.1
ipop3d : ALL
  • 위의 hosts.allow 파일에 설정되어 있는 첫번째 행의 설정은 telnet 서비스에 대해 오른쪽에 나열되어 있는 ip에 대해서만 허용
  • 두번째 행은 ftp 서비스로서 오른쪽에 나열된 IP에 대해서만 허용
  • 세번 째 행 ipop3d에 대해서는 모든 곳에서의 접근 허용

tcp_wrapper에 의해 접근제어(허용 또는 차단)가 된 후에는 그 기록을 /var/log/secure 파일에 남긴다.

profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글