[Linux] inetd 데몬과 Tcpwrapper
보안 쉘 SSH
보안 쉘 SSH
이란 암호통신을 이용하여 네트워크상의 다른 컴퓨터에 접속하여 원격으로 명령을 실행하거나 파일을 조작하는 응용 프로그램 또는 프로토콜을 의미한다. 기존의 Telnet
FTP
rlogin
rsh
등 평문 송수신 서비스의 취약점을 대체하기 위해 설계 되었으며 디폴트로 22/tcp
포트를 사용한다.
- 암호화된 원격 터미널 서비스 제공 + 암호화된 파일 송수신 서비스 제공
💡 평문 송수신 서비스는 스니핑 공격, 재전송 공격에 취약하다. 특히 r계열 서비스는 IP spoofing 에 취약
다수의 클라이언트가 원격접속 및 동시요청 ⇒ 다중 접속 서버
fork()
기반의 multi-tasking 서버thread
기반의 multi-thread 서버select()
poll()
기반의 multiplexing I/O 서버
네트워크 서버/클라이언트 구조에서 다양한 서비스의 서버 프로세스(데몬) 동작방식은 클라이언트의 접속 요청이 있을 때까지 대기하다가 요청이 들어오면 해당 요청을 처리할 서비스 프로세스를 실행하는 구조이다. 이러한 방식은 요청이 있든 없든 데몬을 계속 띄우고 있어야 하므로 서버 리소스를 많이 차지한다.
여기서 드는 생각💡 하나가 요청을 다 처리해주고 각각의 서비스 프로세스만 호출해주면 되지 않을까?
효율적인 서버자원 활용을 위해 슈퍼 데몬(데몬의 데몬 프로세스)를 만들어 개별 서비스를 등록하게 하여 클라이언트 요청은 슈퍼 데몬이 모두 처리하고 개별 서비스를 호출해주는 방식 inetd 데몬 방식이다.
슈퍼 서버 inetd 데몬
inetd 데몬은 개별 서버를 하나로 통합하여 클라이언트로부터 서비스 요청이 올 때마다 해당 서비스에 관련된 실행 모듈을 실행해준다. inetd 데몬은 최초 실행 시 /etc/inetd.conf
파일의 정보를 참조하여 서비스할 프로그램들에 대한 정보를 얻는다.
Tcpwrapper 서비스 tcpd
와 연동하여 서비스별 호스트 접근 제어를 수행할 수 있다.
💡 최근엔 Secure OS 주로 사용 ➜ 서비스별 접근제어, 명령어 제한, su 명령 제어
Stand-Alone 방식 vs inetd (xinetd) 방식
- Stand-Alone : 개별 서비스별로 서버 프로세스(데몬)가 동작하는 방식으로 처리속도가 빠르지만 서버 리소스를 많이 점유한다.
- inetd(xinetd) : 슈퍼 데몬을 이용하여 개별 서비스를 동작시키는 방식으로 상대적으로 처리속도가 느리지만 서버 리소스를 절약할 수 있다.
inetd.conf 파일 구조
ftp stream tcp nowait root /usr/sbin/in.ftpd in.ftpd -l -a
①서비스명 ②소켓타입 ③프로토콜 ④플래그 ⑤사용자 계정 ⑥실행경로 ⑦실행인수
다 이해하기✨
① 서비스명 : inetd 데몬은 /etc/services 파일에 등록된 포트번호를 참조하여 서비스할 프로세스의 포트를 결정한다.
② 소켓타입 : TCP 기반 서비스는 stream, UDP 기반 서비스는 dgram(datagram)
③ 프로토콜 : 사용가능한 프로토콜 설정
④ 플래그 : 서비스 요청을 받은 이후 즉시 다음 서비스 요청을 처리할 것인지(nowait) 요청처리가 완료될 때까지 대기하였다가 다음 요청을 처리할지(wait) 설정
⑤ 사용할 사용자계정
⑥ 실행경로명 : 해당 서비스를 처리하는 실행 모듈의 경로를 절대경로로 설
⑦ 실행 인수 : 프로그램의 인수 설정
stream은 전화같고 datagram은 편지같다.
TCP
는 stream 전송방식 및 nowait 플래그UDP
는 dgram 전송방식 및 wait 플래그
불필요한/취약한 서비스 확인 및 비활성화 처리
Dos 공격에 취약한 Simple TCP 서비스, r계열 서비스, 불필요한 rpc(remote procedure call)서비스 등 불필요하고 취약한 서비스들은 삭제하거나 앞에 #
처리를 해서 비활성화한 후 inetd 데몬을 재가동한다.
💡 설정파일 → 서비스가동 → 메모리 참조
즉, 설정파일을 바꾸게 된다면 서버 프로그램을 재가동해야한다.
Tcpwrapper(tcpd)
Tcpwrapper는 외부에서 들어오는 클라이언트에 대해 접근통제 기능을 제공한다. 클라이언트 IP 주소를 확인하여 시스템 관리자가 접근을 허용한 호스트들에 대해서만 서비스를 허용한다.
접근허용 및 하단에 대한 판단은 /etc/hosts.allow
/etc/hosts.deny
파일에 정의된 IP 주소를 기준으로 한다. hosts.allow
- hosts.deny
순서로 참조 후 두 파일에도 호스트 정보가 없다면 default로 모든 접근을 허용한다.
✨ Tcpwrapper를 사용할 경우 해당 서비스의 ⑥실행경로에 usr/sbin/tcpd
를 명시한다.
⚙️ 설정방법
hosts.allow에 허용해줄 ip 등록하고 hosts.deny는 ALL:ALL 로 설정하여 허용해줄 ip를 제외한 모든 ip는 차단하는 것이 일반적이다.
in.telnetd : 192.168.1.
: 192.168.1 로 시작하는 IP 주소를 갖는 모든 호스트는 Telnet 서비스가 가능하다.ALL : 192.168.1.0/255.255.255.0
: 192.168.1.0 네트워크에 속한 모든 호스트는 모든 서비스가 가능하다.