본문 바로가기
정보보안기사 필기/1. 정보보안 일반

정보보안기사 필기 4-6. 유닉스/리눅스 서버 보안(Stand-alone/슈퍼데몬, TCP Wrapper)

by kkmin93 2022. 4. 19.
반응형

정보보안기사 필기 4-6. 유닉스/리눅스 서버 보안(Stand-alone/슈퍼데몬, TCP Wrapper)

1. 네트워크 보안

 1) 보안 쉘(SSH)

  1-1) 보안 쉘(Secure Shell)이란 암호 통신을 이용하여 네트워크상의 다른 컴퓨터에 접속하여 원격으로 명령을 실행하거나 파일을 조작하는 응용 프로그램 또는 프로토콜을 의미한다.

  • 암호화된 원격 터미널 서비스 제공
  • 암호화된 파일 송수신 서비스 제공

  1-2) 기존의 rsh, rlogin, Telnet, FTP 등 평문 송수신 서비스의 취약점을 대처하기 위해 설계되었으며 디폴트로 22/tcp 포트를 사용한다.

  • 평문 송수신을 하게되면 도청(Sniffing), ID/PW가 보내지게 된다면 재전송 공격(Replay Attack) 공격에 취약하게 된다. 소켓 네트워크 통신을 하기위한 소프트웨어 모듈 커널이 소켓 라이브러리를 지원

 

 2) 서버 프로세스(데몬)

  2-1) 서비스 프로세스 만드는 과정

[ 그림 1-1. 클라이언트와 서버간 서비스 제공 과정 ]

  • ① 각 서버 프로세스(데몬)에서는 네트워크 통신을 하기위한 소프트웨어 모듈인 Socket 생성, 소켓 라이브러리는 커널이 지원을 해준다. 
  • ② 생성한 Socket에 로컬 주소정보(IP/Port)를 bind 작업 진행
  • ③ 생성한 Socket을 Listen Socket으로 만들어 클라이언트 1의 연결요청을 받아줄 수 있는 Socket으로 만들어 준다. Socket은 크게 두 가지 종류로 구분할 수 있다.(Listen, Connect).
  • ④ 이렇게 만들어진 Socket은 클라이언트 1의 연결요청이 올 때까지 대기하고 있다가 연결요청이 오면 처리를 진행한다.
  • ⑤ 클라이언트 1과 3-Way Handshake로 연결이 성립이되면 서버 프로세스(데몬)는 새로운 연결 Socket을 생성을 하고 fork()를 통해서 서비스 프로세스를 만든 다음에 생성한 연결 Socket을 서비스 프로세스에게 넘겨준다.
  • 실제로는 fork()를 통해 서비스 프로세스를 만들게 되면 너무 느리기 때문에 서버 프로세스(데몬)은 미리 서비스 프로세스를 만들어 놓는다.
  • ⑥ 이렇게 되면 실제로 클라이언트와 통신을 하며 서비스를 제공해주는 것은 서비스 프로세스가 되는 것이다.
  • ⑦ 클라이언트 2도 연결요청을 하게되면 ① ~ ⑤까지의 과정을 처리해주어 fork()를 통해서 서비스 프로세스를 만든 다음에 연결 Socket을 서비스 프로세스에 넘겨주어 클라이언트 2에게 서비스를 제공해주게 되는 것이다.

 

  2-2) 다양한 서버 프로세스(데몬)를 동작시키는 방식 - Stand-alone 방식

[ 그림 1-2. Stand-alone 방식 ]

  • 개별 서비스 별로 서버 프로세스(데몬)를 독립적으로 띄워서 동작시키는 방식으로 속도가 빠른 장점이 있지만 서버 리소스도 많이 점유하고 있는 단점이 있다.
  • 상대적으로 클라이언트 요청이 덜 한 FTP, Telnet 서버 프로세스(데몬)의 경우 안띄어 놓을 수도 없기 때문에 대부분의 시간을 "대기"상태로 보낸다.
  • 각 서비스 프로세스들의 하는 역할은 다 다르지만 FTP, HTTP, Telnet 등 다양한 서버 프로세스(데몬)들이 하는 역할은 연결요청을 수락한 다음 서비스 프로세스를 생성해주는 것으로 동일하다.
  • 여기서 "어차피 서버 프로세스(데몬)들이 하는 역할은 동일한데 하나의 서버 프로세스(데몬)에서 수행하게 해주면 좋지 않을까?" 라는 생각에서 나온것이 슈퍼데몬(inetd) 방식이다.

 

  2-3) 다양한 서버 프로세스(데몬 프로세스)를 동작시키는 방식 - inetd 방식

[ 그림 1-3. 슈퍼데몬(inetd) 방식 ]

  • 효율적인 서버자원의 활용이라는 측면에서 공통적인 부분을 처리하는 '슈퍼데몬(데몬의 데몬 프로세스를 의미)을 만들어 개별 서비스를 등록하게 하여 클라이언트 요청은 슈퍼 데몬이 처리하여 개별 서비스 프로세스를 호출해주는 방식이다.
  • inetd 데몬은 최초 실행 시 설정파일(/etc/inetd.conf)의 정보를 참조하여 서비스할 프로그램들에 대한 정보를 얻는다.  클라이언트 연결요청이 들어오면 설정파일(/etc/inetd.conf)의 목록을 확인 한 후 해당 서비스 포트를 열어주게 되는 것이다.
  • 여러 Listen Socket으로 클라이언트 요청이 오는지 감시하며 클라이언트 요청이 들어오면 해당 서비스 프로세스를 생성해주는 방식인데, 이러한 여러 Listen Socket에서 클라이언트 요청이 들어오는지 감시하는 부분에 있어 커널의 도움이 필요하게되며 Multiplex I/O 방식이라고 한다.
  • TCP Wrapper 서비스(tcpd 서비스)와 연동하여 서비스별 호스트 접근 제어를 수행할 수 있다.
  • 서버 리소스를 절약할 수 있는 장점이 있지만, HTTP 요청과 같이 다수의 클라이언트의 요청에 대해 처리하지 못하며 서비스 처리속도가 느린 단점이 있다.

.

  2-4) /etc/inetd.conf 파일의 구조

ftp stream tcp nowait root /usr/sbin/in.ftpd in.ftpd -l -a
  • 서비스명 : inetd 데몬은 /etc/services 파일에 등록된 포트번호를 참조하여 서비스할 프로세스의 포트를 결정한다. /etc/inetd.conf와 /etc/services 파일은 서비스명을 인덱스로 하여 해당 서비스의 정보를 서로 연계한다.
  • 소켓타입 : 해당 서비스에 대한 소켓유형을 설정한다. TCP 기반 서비스는 stream(전화)을 사용하고, UDP 기반의 서비스는 datagram(편지/택배)을 사용한다.
  • 프로토콜 : /etc/protocols 파일에 주어진 프로토콜 중 사용가능한 프로토콜을 설정한다. 또한 /etc/services 파일에 설정한 프로토콜과 일치해야 한다.
  • 플래그 : 서비스 요청을 받은 이후에 즉시 다음 서비스 요청을 처리할 것인지(TCP, nowait) 아니면 요청처리가 완료될 때까지 대기하였다가 다음 요청을 처리할지(UDP, wait) 설정한다.

[ 그림 1-4. /etc/inetd.conf 플래그 설정된 모습 ]

  • 사용할 사용자 계정 : 프로그램을 실행시킬 사용자를 설정한다.
  • 실행 경로명 : 해당 서비스를 처리하는 실행 모듈의 경로를 절대경로로 설정한다.
  • 실행 인수 : 프로그램의 인수를 설정한다. 첫 번째는 응용 프로그램 자신의 이름이 된다.
  • inetd.conf 파일에 실행할 서비스를 활성화(# 주석 제거) 한 후 inetd 데몬을 재시작 한다.
※ 서버 프로세스(데몬) 재시작 하는 이유?
서버 프로세스(데몬)들의 다양한 설정파일들은 최초로 서비스가 기동할 때 파일을 읽은 후 메모리에 상주시켜 참조하게 된다. 설정파일의 변화가 있을 때마다 파일 I/O를 발생시켜 서버 프로세스(데몬)이 읽는다면 속도가 매우느리기 때문이다. 설정파일의 내용을 변경한다고 해도 서버 프로세스의 동적인 부분에 반영되지 않고 일반적으로 해당 서버 프로세스(데몬)은 재시작해줘야 반영이 된다.

  2-5) 불필요한/취약한 서비스 비활성화

  • DoS 공격에 취약한 Simple TCP 서비스 : echo(7/tcp), discard(9/tcp), daytime(13/tcp), chargen(19/tcp) 등
  • r 계열 서비스 : rlogin, rsh, rexec 등, r 계열 서비스는 인증 없이 관리자의 원격접속을 가능하게 하는 명령어들로 이기종 운영체제간 백업 등의 용도로 사용되는 경우가 있으나 보안상 매우 취약하기 때문에 사용하지 말아야 한다.
  • 불필요한 RCP(Remote Procedure Call) 서비스 : rpc, cmsd, rusersd 등 분산 환경에서 서버 응용프로그램에 접근하여 작업 호출(Call)을 할 수 있는 서비스로 버퍼 오버플로우 등 다수의 취약점이 존재하여 침해사고발생 위험이 있으므로 서비스를 중지해야한다.
  • /etc/inetd.conf 파일에서 취약한 서비스를 grep하여 활성화되어 있으면 이를 주석처리하여 비활성화 한다.
  • EX) cat /etc/inetd.conf | egrep "echo|discard|daytime"

 

2. 접근통제(TCP Wrapper)

 1) 개요

[ 그림 2-1. inetd 데몬과 TCP Wrapper ]

  • 외부에서 들어오는 클라이언트에 대해 접근통제 기능을 제공한다. 클라이언트의 IP 주소를 확인하여 시스템 관리자가 접근을 허용한 호스트들에 대해서만 서비스를 허용하기 때문에 외부의 해킹으로부터 시스템을 보호할 수 있다.
  • 접근허용 및 차단에 대한 판단은 /etc/hosts.allow와 /etc/hosts.deny 파일에 정의된 호스트 정보(IP 정보)를 기준으로 한다.(hosts.allow → hosts.deny → default 동작(허용))
  • TCP Wrapper를 사용하기 전과 후의 Telnet 서비스에 대한 /etc/inetd.conf 파일 구조
구분 서비스 소켓 타입 프로토콜 플래그 사용자 실행경로 실행인수
사용전 Telnet stream TCP nowait root /usr/sbin/in.telnetd in.telnetd
사용전 Telnet stream TCP nowait root /usr/sbin/tcpd in.telnetd
  • TCP Wrapper를 사용할 경우 해당 서비스의 실행경로에 "usr/sbin/tcpd"를 명시한다. inetd 데몬은 외부로부터 서비스 요청이 올 경우 inetd.conf 파일을 참조하여 실행경로에 설정된 /usr/sbin/tcpd(TCP Wrapper 프로세스)를 실행한다. 반드시 재시작을 해야 적용이 된다.
  • tcpd는 hosts.allow 및 hosts.deny 파일을 참조하여 접근제어를 수행한 후 실행인수로 설정된 서비스를 실행한다.

  1-1) host.allow와 hosts.deny

  • 보통 운영할 때 화이트리스트 방식으로 운영을 진행한다. hosts.allow 파일에 허용할 호스트를 명시한 후 hosts.deny 파일에 그 외의 모든 호스트를 차단하도록 설정한다. 결과적으로 먼저 처리되는 hosts.allow 파일에 허용하지 않는 호스트들은 모두 차단하게 된다.

[ 그림 2-2. 화이트리스트 구성 ]

  • ALL은 모든 서비스 또는 모든 호스트를 의미, LOCAL은 같은 네트워크에 있는 모든 호스트를 의미, B EXCEPT A는 리스트 B에서 A를 제외한 모든 B를 의미한다.
hosts.deny hosts.allow 설명
ALL : ALL ALL : 1.1.1.1 IP 1.1.1.1에 대해 모든 서비스가 허용된다. 
ALL : ALL in.telnetd : 1.1.1.1
in.ftpd : 1.1.1.1, 1.1.1.2
IP 1.1.1.1에 대해 telnet과 ftp 서비스가 가능하고 IP 1.1.1.2에 대해서는 ftp 서비스만 가능하며, 그 외 호스트들에 대해서는 어떤 서비스도 불가능 하다.
ALL : ALL ALL EXCEPT in.telnetd : ALL 모든 호스트에 대해 telnet 서비스를 제외한 모든 서비스가 가능하다.
ALL : ALL in.telnetd : 1.1.1. IP 1.1.1로 시작하는 IP 주소로 갖는 모든 호스트는 telnet 서비스가 가능하다.
ALL : ALL in.telnetd : .kkmin.com kkmin.com 도메인에 속한 모든 호스트는 telnet 서비스가 가능하다.
ALL : ALL in.telnetd : .kkmin.com EXCEPT www.kkmin.com www.kkmin.com 을 제외한 kkmin.com 도메인의 모든 호스트에 대해 telnet 서비스가 가능하다

 

반응형