5장. 서버 보안

시스템이 공중 네트워크에서 서버로 사용될 경우 공격의 대상이 되기 쉽습니다. 이러한 이유로 시스템 보안을 보강하고 서비스를 잠그는 것은 시스템 관리자에게 무엇보다 중요합니다.

특정 사항에 대하여 깊이 파고들기 이전에 서버 보안을 강화시킬 수 있는 일반적인 힌트를 다음에서 간략히 살펴보도록 하겠습니다:

5.1. TCP 래퍼와 xinetd를 사용하여 서비스 보안 강화하기

TCP 래퍼(wrappers)는 다양한 서비스에 접근 제어를 제공합니다. SSH, Telnet, FTP와 같은 대부분의 최신 네트워크 서비스는 들어오는 요청과 요청된 서비스 사이에서 감시 역할을 하는 TCP 래퍼를 사용합니다.

추가 액세스, 기록, 바인딩, 방향 전환 및 자원 활용 제어와 같은 기능을 제공하는 수퍼 서비스인 xinetd를 함께 사용하면 TCP 래퍼가 제공하는 보안 기능이 보다 강화됩니다.

힌트힌트
 

TCP 래퍼와 xinetd와 함께 IPTables 방화벽 규칙을 사용하여 서비스 접근 제어에 중복성을 갖는 것이 좋습니다. IPTables 명령을 사용하여 방화벽을 구현하는 방법에 대한 자세한 정보는 7 장을 참조하시기 바랍니다.

TCP 래퍼와 xinetd를 설정하는 방법에 대한 추가 정보는 Red Hat Enterprise Linux 참조 가이드TCP 래퍼와 xinetd 장에서 찾으실 수 있습니다.

다음 부분에서는 여러분이 각 주제에 대한 기본적인 지식을 갖추고 계신다고 간주하고 특정 보안 옵션에 중점을 두고 설명해 보겠습니다.

5.1.1. TCP 래퍼를 사용하여 보안 강화하기

TCP 래퍼는 서비스로의 액세스를 거부하는 것 이외에도 다른 많은 기능을 제공합니다. 이 부분에서는 TCP 래퍼를 사용하여 연결 배너를 보내고, 특정 호스트에서 침입자에게 경고 메시지를 보내며, 기록 기능을 강화하는 방법에 대하여 설명하고 있습니다. TCP 래퍼의 기능과 제어 언어에 대한 전체적인 목록을 보시려면 hosts_options 메뉴얼 페이지를 참조하시기 바랍니다.

5.1.1.1. TCP 래퍼와 연결 배너

서비스에 접속하는 클라이언트에 경고성 배너를 보내는 것이 서버가 어떠한 시스템을 운영 중인지 보여주지 않으면서 동시에 침입자에게 시스템 관리자가 감시 중이라고 알려줄 수 있는 좋은 방법입니다. 서비스에 TCP 래퍼 배너를 구현하시려면 banner 옵션을 사용하십시오.

이 예시는 vsftpd에 배너를 사용합니다. 먼저 배너 파일을 생성하셔야 합니다. 시스템 상 어디에서든 생성하실 수 있지만 이 파일을 사용될 데몬과 동일한 이름을 가져야 합니다. 이 예시에서 파일 이름은 /etc/banners/vsftpd 입니다.

파일의 내용은 다음과 같습니다:

220-Hello, %c
220-All activity on ftp.example.com is logged.
220-Act up and you will be banned.

%c 토큰은 사용자명, 호스트명 또는 연결 메시지에 보다 효과가 있도록 사용자명과 IP 주소와 같은 다양한 클라이언트 정보를 제공합니다. Red Hat Enterprise Linux 참조 가이드에서는 TCP 래퍼에 사용 가능한 다른 토큰 목록을 찾으실 수 있습니다.

이 배너가 들어오는 접속에 보여지도록 하시려면 /etc/hosts.allow 파일에서 다음 줄을 추가하시면 됩니다:

vsftpd : ALL : banners /etc/banners/

5.1.1.2. TCP 래퍼와 침입 경고

만일 특정 호스트나 네트워크가 서버를 침입하는 것이 발견되었다면 TCP 래퍼에 spawn 지시자를 사용하여 침입이 시도된 호스트나 네트워크의 관리자에게 경고 메시지를 보낼 수 있습니다.

예를 들어 206.182.68.0/24 네트워크에서 크래커가 서버에 침입 시도하려는 것이 발견되었다고 가정해봅니다. /etc/hosts.deny 파일에 다음과 같은 줄을 추가하시면, 연결 시도가 거부되며 특별 파일에 기록될 것입니다:

 ALL : 206.182.68.0 : spawn /bin/ 'date' %c %d >> /var/log/intruder_alert

%d 토큰은 침입자가 접근하려고 시도한 서비스의 이름을 보여줍니다.

연결을 허용 후 기록하기 위해서는 /etc/hosts.allow 파일에 spawn 지시자를 추가하시기 바랍니다.

알림알림
 

spawn 지시자는 모든 쉘 명령을 실행하므로, 특정 클라이언트가 서버에 접속을 시도할 경우 관리자에게 알리거나 여러 명령을 수행할 특수 스크립트를 작성하십시오.

5.1.1.3. TCP 래퍼와 향상된 기록 기능

만일 특정 유형의 접속이 다른 유형 보다 중요하다면 severity 옵션을 사용하여 해당 서비스에 대한 여러 다른 기록 수준을 설정하실 수 있습니다.

이 예시에서는 FTP 서버 포트 23 (Telnet 포트)로 접속을 시도하는 사용자를 크래커라고 가정합니다. 크래커가 침입하는 것을 방지하기 위하여 로그 파일에서 기본 플래그(flag)인 info 대신 emerg 플래그를 지정하시고 이 포트로 들어오는 연결을 거부합니다.

연결을 거부하기 위해서는 /etc/hosts.deny 파일에 다음 줄을 추가하시면 됩니다:

in.telnetd : ALL : severity emerg

이러한 설정은 기본 authpriv 기록 기능을 사용하지만 기록 심각성 수준을 기본 값인 info에서 emerg 수준으로 높여서 로그 메시지를 콘솔에 바로 보여줍니다.

5.1.2. xinetd를 사용하여 보안 강화하기

xinetd 수퍼 서버는 종속 서비스로의 접근을 제어하는데 유용하게 사용되는 또 다른 도구입니다. 이 부분에서는 xinetd를 사용하여 트랩(trap) 서비스를 설정하는 방법과 서비스 거부 공격을 좌절시키기 위하여 xinetd 서비스가 사용할 수 있는 자원의 양을 제어하는 방법에 대하여 중점적으로 설명해 보겠습니다. 모든 사용 가능한 옵션의 목록을 보시려면 xinetdxinetd.conf의 메뉴얼 페이지를 참조하시기 바랍니다.

5.1.2.1. 트랩(Trap) 설정하기

xinetd의 중요한 기능 중 하나는 전역 no_access 목록에 호스트를 추가할 수 있는 기능입니다. 이 목록에 포함된 호스트는 xinetd가 관리하는 서비스에 정해진 기간 동안 또는 xinetd가 재시작될 때까지 연결을 거부당합니다. 이 기능은 SENSOR 속성을 통해 실행 가능하며, 서버에서 포트를 스캔하려고 시도하는 호스트를 손쉽게 막을 수 있는 방법입니다.

SENSOR를 설정하기 위한 첫번째 단계는 사용할 계획이 없는 서비스를 선택하는 것입니다. 이 예에서는 Telnet이 사용됩니다.

/etc/xinetd.d/telnet 파일에서 flags 줄을 다음과 같이 수정하시기 바랍니다:

	      flags           = SENSOR

괄호 내에 다음 줄을 추가하십시오:

	      deny_time       = 30

이 설정은 포트로 연결을 시도하는 호스트를 30 분 동안 거부할 것입니다. deny_time 속성에 사용 가능한 다른 값에는 FOREVER와 NEVER가 있습니다. FORVER는 xinetd가 재시작될 때까지 연결을 거부하며, NEVER는 연결을 허용한 후 기록합니다.

마지막 줄을 다음과 같이 수정하십시오:

	      disable         = no

SENSOR를 사용하여 보안을 위협하는 호스트로부터 연결을 검색하여 정지시키는 것이 좋은 방법이기는 하지만, 다음과 같은 두가지 결점이 있습니다:

  • 스텔스 스캔 (쉽게 발견되지 않도록 한 스캔)을 찾아내지 못합니다.

  • 만일 침입자가 SENSOR가 실행 중인 사실을 이미 알고 있다면 자신의 IP 주소를 위장하여 특정 호스트에 서비스 거부 공격을 마운트한 후 금지된 포트에 연결할 수 있습니다.

5.1.2.2. 서버 자원을 제어하기

xinetd의 또 다른 중요한 기능은 서비스가 활용 가능한 자원의 양을 제어할 수 있는 기능입니다.

다음 지시자를 통하여 이 기능을 사용 가능합니다:

  • cps = <number_of_connections> <wait_period> — 1초당 서비스에 허용되는 연결 수를 지정합니다. 이 지시자는 반드시 정수값으로 설정하셔야 합니다.

  • instances = <number_of_connections> — 한 서비스에 허용되는 총 연결 수를 지정합니다.이 지시자는 정수값이나 UNLIMITED 값을 수용합니다.

  • per_source = <number_of_connections> — 각 호스트마다 서비스에 연결할 수 있는 수를 지정합니다. 이 지시자는 정수값이나 UNLIMITED으로 지정하셔야 합니다.

  • rlimit_as = <number[K|M]> — 서비스가 차지할 수 있는 메모리 주소 공간의 용량을 킬로바이트 또는 메가바이트 단위로 지정합니다. 이 지시자는 정수값이나 UNLIMITED로 설정하셔야 합니다.

  • rlimit_cpu = <number_of_seconds> — 서비스가 CPU를 사용할 수 있는 시간을 초 단위로 지정합니다. 이 지시자는 정수값이나 UNLIMITED으로 설정하셔야 합니다.

이러한 지시자를 사용하시면, 서비스 거부 공격을 통해 xinetd 서비스가 시스템을 마비시키는 상황을 방지하는데 도움이 됩니다.