2012-09-12

FreeBSD ]보안- A basic guide to securing FreeBSD 4.x-STABLE



장창균 님께서 남기신 글 (2002-03-12 02:31:11, Hit : 2377)

[번역] A basic guide to securing FreeBSD 4.x-STABLE


+===================================================================+
+           A basic guide to securing FreeBSD 4.x-STABLE            +
+-------------------------------------------------------------------+
+                                                                   +
+              Written by Marc Silver            +
+                   http://draenor.org/securebsd/                    +
+                                                                   +
+                                                                   +
+===================================================================+


Marc Silver <marcs@draenor.org> 저.

http://draenor.org/securebsd

2002년 02월 04일


장창균<ckchang@seoul.com> 역.

2002년 03월 12일


주의 : 저자와의 약속으로 인해 본 문서의 수정을 허용하지 않습니다.

$Id: secure,v 1.10 2002/02/04 11:30:01 marcs Exp $;

Table of Contents:

  ==> Overview
  ==> The Foundation for a secure system
      -> File System Layout

  ==> Post Installation
      -> System Secure Levels
      -> Removal of the toor user
      -> Shut down services that you dont need/want
         -> syslogd
         -> portmap
         -> telnetd
         -> sshd
         -> inetd
         -> ftpd
      -> Log in vain
      -> Blackhole
      -> Crontabs
      -> Secure the console
      -> Process accounting
      -> ipfw
      -> Mail aliases

  ==> Kernel changes
      -> Disable bpf if you dont need it
      -> Disable Ctrl-Alt-Del
      -> Quota Support
      -> ipfw/ipf support

  ==> Managing user accounts
      -> User quotas
      -> Home directory permissions
      -> Hiding processes
      -> Disabling procfs
      -> login.conf(5)

  ==> Stay up to date
      -> Keep your packages current
      -> Keep your OS current

  ==> Be Vigilant

  ==> Topics of Interest
      -> Jail

  ==> Other documents about FreeBSD Security

  ==> Thanks

Overview
========


보안이란 단어는 사람마다 다르게 받아들인다. 이 문서는 여러가지 상황을 설명하며 기본으로 설치된 FreeBSD의 보안을 강화할 수 있는 것들을 제안하지만, FreeBSD 보안을 강화하는 공식적인 가이드는 아니다. 단지 내 자신의 시스템에서 사용되고 대단히 성공적으로 수행되었던 모델에 관해서만 논의하는 것이다. 또한 내가 보안 ‘전문가’라고 말하는 것이 아님을 밝히고 싶다. 나는 단지 지나치게 조심스럽고 서버의 보안에 굉장한 자부심을 갖는 시스템 어드민일 뿐이다.

FreeBSD의 보안을 더 넓게 전망하기 위함과 아울러, 본론으로 들어가기 전에 FreeBSD 시스템에서 security(7)의 man page를 모든 이들이 읽어 볼것을 제안한다.  

본 문서 작업은 아직 진행중이다. 그러기 때문에 이 문서는 수정되고 증본되며 발전될 것이다. 더 추가 또는 수정할 사항이 있거나, 주석을 필요한 부분이나 문제가 되는 사항이 있다면, 메일을 보내주기 바란다
(marcs@draenor.org). 이 문서의 공식 홈페이지는 http://draenor.org/securebsd 이다.

또한 이 문서를 통해서 원격이나 로컬 DoS 공격을 막을 수 있음을 뜻하는 것은 아니다. 단지 기본으로 기본으로 설치된 FreeBSD 보안을 강화하는 데 도움을 주고자할 뿐이다. FreeBSD 보안에 관한 고급수준의 문서 또한 아니다. 단순히 자신의 머신을 안전하게 지키는데 사용할 수 있는 기본적인 아이디어를 설명한다.

이점을 인지하고 시작하기로 하자.

보안 시스템에 관한 기초
The Foundation for a secure system
==================================

시스템은 아주 초기부터 안전하게 설정되어야 한다. FreeBSD를 설치하는 동안 설치 이후의 골칫거리에서 피할 수 있도록 수행할 여러가지 것들이 있다. 내 생각으로는, 공격자가 시스템에 로컬 로그인을 이미 가지고 있다고 생각되는 곳에서는 파일 시스템 설정이 크게 다를 수 있다.

o  파일 시스템 레이아웃
o  File System Layout

아래의 파일 시스템 레이아웃은 어느 시스템에서든 가이드 라인으로 사용될 수 있다. 명백한 것은 디스크 레이아웃은 머신의 기능에 따라 달라질 수 있지만 이는 기본 가이드로 도움이 된다.

자신의 필요에 따라 적합하게 적용할 수 있다.

   Filesystem  1K-blocks     Used    Avail Capacity  Mounted on
   /dev/ad0s1a    128990    31390    87282    26%    /
   /dev/ad0s1f     49583    27879    17738    61%    /tmp
   /dev/ad0s1d  12348393  2563101  8797421    23%    /usr
   /dev/ad0s1h   4065262    97983  3642059     3%    /home
   /dev/ad0s1g   2032623     6026  1863988     0%    /var
   procfs              4        4        0   100%    /proc



이제, mount(8) 명령의 출력을 보자:


   /dev/ad0s1a on / (ufs, local)
   /dev/ad0s1f on /tmp (ufs, local, nodev, nosuid, soft-updates)
   /dev/ad0s1d on /usr (ufs, local, soft-updates)
   /dev/ad0s1h on /home (ufs, local, nosuid, with quotas, soft-updates)
   /dev/ad0s1g on /var (ufs, local, soft-updates)
   procfs on /proc (procfs, local)


이제, 왜 이렇게 설정했는지를 논의해보자.

루트 파티션은 128MB로 적합하다(tuning(7) man page에서 추천한 대로이다) 그리고 KLD 그리고 상당히 중요한 여러 디렉터리뿐 아니라 커널이 저장되어 있는 곳이다. (/sbin이 유일하게 머리에 떠오르는 것이다). 이를 염두에 두고, 나중에 fstab(5) 파일을 수정하여 루트 파티션을 읽기전용으로 마운트가 가능하다.

임시 파일들은 /tmp에 저장된다. 그리고 이 디렉토리는 일반적으로 누구나가 기록할 수 있기때문에, 이 디렉토리에서 특정 파일이 사용되지 않도록하는 것이 중요하다. Fstab(5) 파일을 사용하여 (또한 mount(8)을 참고하라) /tmp에 NOSUID와 NODEV 플래그를 추가해주어 suid 프로그램을 사용할 수 없도록하고 캐릭터나 블록 특수 장치를 이 파일 시스템에서 정지하도록 해야한다. /tmp에 NOEXEC 플래그를 추가하기를 원할지도 모르지만 이는 여러가지로 제한적이며 일반 사용자에게 어려움을 가져다 줄지 모른다. NOEXEC는 ‘make install world’의 작업을 할 때 문제를 발생할 수 있다. NOEXEC는 또한 침입자를 찾아내는 기량을 제한할 수 있다. /usr/tmp와 /var/tmp를 /tmp 파티션에 심볼릭 링크를 걸어두어야 함을 인지하는 것이 중요하다. 그렇지 않으면 사용자에게 tmp 디렉토리를 아무런 제약없이 제공해야 한다.

사용자 디렉토리는 /home에 위치하며 이 파티션에 NOSUID 플래그를 추가하는 것은 좋은 아이디어 있다.

또한 QUOTA를 추가하여 사용자가 사용할 디스크 공간을 제한하라. /usr와 /var 모두 soft-updates를 사용할 수 있는 표준 파티션이다.

또한 procfs를 사용하지 않도록 선택할 수 있다. 자세한 사항은 ‘Disabling procfs.’
이 모델은 본인의 필요에 맞게 변경할 수 있다.

설치후 작업
Post Installation
=================

일단 FreeBSD 시스템을 설치한 후에 머신을 안정화하는데 도움이 될 여러가지가 있다.

시스템 보안 레벨
o  System Secure Levels

보안 레벨은 FreeBSD 보안의 핵심이다. FreeBSD 보안에서 매우 강력하고 기본적인 것이다.

대부분의 머신에서, X-Window를 실행하려하지 않는다면 보안 레벨 -1로 운영할 이유가 없다. X-Window를 실행하지 않는다면, sysctl(8) 변수 kern.securelevel을 수정하여 보안 레벨을 1로 변경할 것을 추천한다.

보안 레벨 1로 변경하되면 싱글 유저 모드가 아니고는 커널을 변경할 수 없고 KLD도 load/unload될 수 없으며 /dev/mem과 /dev/kmem은 쓰기모드로 오픈될 수 없다. 시스템을 재부팅하지 않기 위해서는 다음과 같이 명령을 실행한다.  

   sysctl kern.securelevel=1

이 변경을 지속하고자 한다면 다음을 /etc/rc.conf에 추가하라.

   kern_securelevel_enable="YES"
   kern_securelevel="1"

보다 중요한 머신에서는 보안 레벨을 2나 3로 올리고자할 것이다. 이 문서에서는 이들 상위 보안 레벨을 논의하지 않을 것이다. 여러 보안 레벨에 관한 자세한 정보와 작업사항은 init(8)의 man page 를 읽기 바란다.


Toor 유저의 삭제

o  Removal of the toor user

기본적으로, FreeBSD는 UID가 0인 부수적인 사용자계정이 함께 존재한다. 이 계정은 toor(root의 반대방향)이며, 백업 유저의 용도라서, 루트의 셀이 동작하지 않으면 이 유저로 로그인하여 문제를 해결할 수 있다. 이 계정은 기본으로 사용불가로 되어 있기때문에 패스워드를 변경하지 않는다면 사용할 수 없다.

이 계정에 패스워드를 설정하거나 삭제할 수 있다. 필자는 삭제하는 것을 선호하지만 선택은 전적으로 자신에게 달려있다.

Rmuser(8) 명령은 UID가 0인 계정의 삭제를 허용하지 않으니 주의하며, 이 계정을 삭제하기 위해 vipw(8)을 사용해야 할 것이다.

필요치 않거나 원치 않은 서비스들을 종료하라.

머신에서 필수적이지 않거나 모르는 서비스들은 실행하지 않도록 한다. 이를 수행하는 가장 좋은 방법은 머신에서 실행되는 모든 서비스들을 종료한 후에, 실행하고자 하는 것들만 사용하도록 한다. 이 방법으로 자신의 머신에서 실행되는 서비스들을 확실히 알 수 있다. Netstat(1) 명령으로 자신의 머신에서 오픈되어 있는 TCP 포트들을 알 수 있다. 즉:

   secure-me (1) :  netstat -na | grep LIST
   tcp4       0      0  *.80                   *.* LISTEN
   tcp4       0      0  *.25                   *.* LISTEN
   tcp4       0      0  *.22                   *.* LISTEN


위의 예는 TCP 포트 22(ssh), 25(smtp), 80(http)가 머신에서 대기상태이며 모든 IP에 반응할 것임을 나타낸다. 대기상태의 프로세스가 있으며 어떤 프로세스가 포트를 오픈하고 있는지 불확실하다면 sockstat(1)를 사용하여 오픈되어 있는 소켓를 나열하고 관련된 정보를 제공할 것이다.

Rc.conf(5)를 사용하여 기본적으로 사용할 서비스를 쉽게 설정할 수 있을뿐 아니라, /usr/local/etc/rc.d 디렉토리에서 볼 수 있는 로컬 패키지 init 스크립트도 마찬가지다.

비슷하게 UDP를 통해 대기상태에 있는 것들에 관해서도 볼 수 있다. Netstat(1)를 통해 이들 정보를 얻을 수 있다.


   secure-me (2) :  netstat -na | grep -i udp
   udp4       0      0  *.514                  *.*



위에서 syslogd가 514(UDP) 포트에서 대기상태에 있음을 알 수 있다.

이제 몇개의 공통적인 서비스들과 이들 서비스를 보다 안전하게 할 수 있는 것들에 관해 논의해보겠다.

   - syslogd ::

     syslogd는 UDP 514를 사용하지만, syslogd을 명령행으로 시동시킬 때 ‘-s’플래그를 사용하여 사용하지 않을 수 있다. 이는 네트워크 소켓을 사용하지 않게하며 간단히 /etc/rc.conf에 다음을 추가하면된다.

     syslogd_flags="-ss"
 

syslogd(8)를 참고하라.

     See the syslogd(8) man page for more information.

   - portmap ::

portmap은 원격 프로시져 호출에 사용되며 FreeBSD에서의 대부분의 일반 프로그램은 NFS와 함께 사용한다.

Portmap을 disable상태로 만들기 위해서는 /etc/rc.conf에 다음을 추가한다.



     portmap_enable="NO"

   - telnetd ::

이 서비스는 어떻게 해서든 사용을 피하라. telnet이 유용하기는 하지만, 더이상 사용할 이유가 없다.

telnet 세션을 통해 전송되는 모든 데이타는 일반 텍스트이다. (사용자명, 비밀번호도 포함한다)

inetd(8)을 완전히 종료하거나 /etc/inetd.conf에서 telnetd행을 제거하여 이 서비스를 제거할 수 있다.

본 서비스를 실행해야만 한다면 login.access(5)나 ipfw(8) 등의 사용법을 주지하여 접속을 제한할 수 있다.

FreeBSD는 sshd(8)를 포함한다. 이 대몬은 더 강력한 보안성을 갖는 telnetd의 대안이다.


   - sshd ::

FreeBSD 4.1.1부터 OpenSSH를 기본 시스템으로 포함하며 sshd(8)는 이제 telnetd의 확실한 대안이다.

하지만 암호화를 사용하므로서 접속 세션을 보호하여 더 안전하게 할 수 있다. RSA/DSA 키를 사용하여 더 견고한 암호화가 가능한 프로토콜이다.

대부분의 OpenSSH의 현재 버전들은 SSH 프로토콜 버전 2를 사용하지만 좀 오래된 버전을 사용하는 시스템에서는 버전 2만을 허용하도록 권한다. 이를 위해, /etc/ssh/sshd_config에 다음 문자열이 있는지 확인한다.



     Protocol 2



이는 sshd가 서버로의 SSH2 접속만을 허용한다는 것을 알려준다. 변경사항을 적용하기 위해 sshd를 재시작해야한다.

비슷하게, 서버로부터의 모든 SSH 접속을 기본으로 SSH2를 사용하도록 설정할 수 있다. 이는 /etc/ssh/ssh_config를 수정하여 할 수 있다.

보안을 더 향상시킬 수 있는 곳에서 DSA 키의 사용은 바람직하다. 이 문서는 DSA 키의 사용에 관해 설명하지 않을 것이다. 관련 정보는 http://www.openssh.com/에서 볼 수 있다.

OpenSSH, RSA/DSA 키와 이들 사용법에 관한 자세한 사항은 http://www.openssh.com/을 방문해보라.



   - inetd ::

inetd는 임의의 수개의 소켓에서 접속을 대기하도록 설계되었다. Telnetd(8), qpopper그리고 ftpd(8)와 같은 대중적인 응용프로그램들이 사용한다. 최소한, 필요하지 않거나 실행하려하지 않는 서비스들은 주석처리해야 한다(원치않는 행 앞에 #을 추가하여). Inetd 가 실행하는 대몬이 더이상 필요치 않다면, /etc/rc.conf에 다음을 추가하여 완전히 사용정지할 수 있다.



     inetd_enable="NO"



inetd를 사용한다면, 인바운딩 접속을 제한하기 위해 /etc/hosts.allow 파일을 살펴보라.



     ftpd ::

FreeBSD는 기본적으로 ftpd를 포함한다. FTP는 사용자 이름과 패스워드가 일반 텍스트로 전송되기 때문에 안전하지 않은 프로토콜이다. FTP의 대안으로 sftp(1)가 있으며 이 대몬은 모든 FTP의 이점과 함께 SSH의 암호화 기능도 제공한다. 또는 scp(1)를 사용할 수 있다.

그러나, ftpd를 서비스하기로 결정했다면 서버를 견고히 할 수 있는 몇가지 것들이 있다. 기본적으로 ftpd는 “-l”플래그와 같이 실행하며 이는 서버에 사용자가 실행하는 명령에 관한 더 많은 정보를 제공한다. “-r”플래그를 추가하여, ftpd를 읽기전용 모드로 설정할 수 있으며 이는 파일시스템을 변경하는 모든 명령들을 사용할 수 없게 할것이다. 또한 나는 익명 로그인만 허용하기 위해 “-A”플래그를 추가한다.

Ftpd 행은 /etc/inetd.conf에서 다음과 같이 보일것이다.


     ftp  stream  tcp  nowait  root  /usr/libexec/ftpd   ftpd -l -l -r -A

LOG_FTP 메시지는 기본적으로 syslogd(8)이 기록하지 않으며 enable해야함을 주의하라. 더 자세한 사항은 ftpd(8) man page를 참조하라. 명백한 이유때문에 사용자 로그인을 허용하도록 추전하지 않는다. 사용자 로그인을 필요하다면 ncftpd의 사용을 추천한다. 이 프로그램으로 별도의 사용자/패스워드 데이타베이스를 사용할 수 있으며 시스템의 사용자명과 독립적이며 다른 패스워드를 가질 수 있다.


o  Log in vain

많은 서비스들을 사용하지 않게 되었을 지라도 listeners/daemons이 없는 포트로의 접속시도를 기록해야 한다. 이를 위해 간단히 /etc/rc.conf에 다음을 추가한다.



   log_in_vain="YES"



서버를 재부팅하지 않고 변경하기 위해서는 아래와 같이 명령을 실행한다.



   sysctl net.inet.tcp.log_in_vain=1
   sysctl net.inet.udp.log_in_vain=1



listeners가 없는 포트로의 접속 시도 실패는 /var/log/messages에 기록될 것이다.
:

블랙홀



FreeBSD에는 대몬이나 listeners에 묶이지 않은 포트로의 모든 TCP/UDP 정보를 그러 모으는 옵션이 있다.

‘log in vain’과 같이 접속을 기록하는 대신, 블랙홀을 생성하여 패킷들이 블랙홀을 통해 묵살된다. 이 기능과 관련된 man page 또한 시스템을 목표로 한 DoS 공격을 지연시킬 수 있다고 서술한다. 블랙홀 MIB는 다음 명령으로 쉽게 enable할 수 있다.


   sysctl net.inet.tcp.blackhole=1
   sysctl net.inet.udp.blackhole=1

 

한가지 주의할 점은 UDP에서 블랙홀을 사용하게 되면 타 시스템에서 블랙홀이 enable된 시스템으로 traceroute(8)를 사용할 수 없게된다. TCP 값 역시 2로 증가된다. 자세한 정보는 blackhole(4) man page를 참고하라.

재부팅 후에도 계속 설정을 유지하기 위해서는 아래 설정을 /etc/sysctl.conf에 추가하라.


   net.inet.tcp.blackhole=1
   net.inet.udp.blackhole=1


이것은 ipfw/ipf의 대안이 아님을 주의하라.

주의 : James Lawrence에 따르면, 이것은 Konqueror에 문제가 있을 수 있다.


o  Crontabs

먼저, 일반적으로 사용자가 열람하지 않으면 하는 파일들이 있다. Root의 crontab이 바로 그러하다.

/etc/crontab을 0640으로 파일 모드를 안전하게 변경할 수 있으며 root와 wheel 그룹의 사용자만이 열람할 수 있다. 사용자가 어떤 작업이 cron으로 동작되는지 알 필요는 없다.

동시에, crontab(1)을 사용자가 사용하지 않기를 원할 수 있다. 간단히 /var/cron/deny 파일을 생성하고 파일에 사용자 리스트를 추가하여 원하는 것을 얻을 수 있다. 리스트에 오른 사용자들은 아래와 같은 메시지를 볼 것이다.

   crontab: you (marcs) are not allowed to use this program


비슷하게, /var/cron/allow를 생성하여 crontab을 사용할 수 있는 사용자를 추가할 수 있다. 자세한 사항은 crontab(1) man page를 참고하라.


콘솔 보안


많은 사람들이 물리적 접근이 가능한 악의적인 사용자가 싱글 유저 모드로 재부팅하여 루트 패스워드를 변경하는 것을 걱정한다. 하지만 침입자가 서버로 물리적 접근이 가능하다면 할 수 있는 일은 없다.

단순히 싱글 유저 모드로 부팅하여 root 패스워드를 변경하는 것을 막을 수 있을 뿐이다. /etc/ttys를 수정하여 ‘console’행의 ‘secure’단어를 ‘insecure’로 변경한다. 이렇게 되면 싱글 유저 모드로 들어갈때 root 패스워드를 입력해야 한다. 해당 라인은 다음과 갈다.


   console none                            unknown off insecure


또한 콘솔 보안을 설정하고 root 패스워드를 잊는다면, 패스워드를 초기화하기 위해 fixit 플로피를 사용해야 한다. 이는 싱글 유저 모드로 접속하게 되면 패스워드를 변경할 수 없기 때문이다.  


프로세스 어카운팅

머신에서 무슨일이 일어나는지 정확히 아는 것은 지극히 좋은 일이며 머신에서 프로세스 어카운팅을 enable하도록 권장한다. 이 기능을 사용하여 사용자가 실행한 명령을 살펴볼 수 있으며, 또한 어떤 문제들을 디버깅할 때 꽤 유용하기도 하다. 약간의 부하가 걸리지만 일반적으로 저하된 성능을 알아차릴 수 있는 정도는 아니다. Enable하기 위해서 단순히 다음의 명령을 실행한다.


   secure-me (1) :  touch /var/account/acct
   secure-me (2) :  accton /var/account/acct



재부팅 후에도 계속 설정을 유지하기 위해서는 아래 설정을 /etc/rc.conf에 추가하라.


   accounting_enable="YES"


어카운팅이 enable되면 lastcomm(1)과 sa(8)를 사용하여 프로세스 어카운팅 데이타베이스에서 유용한 통계자료를 얻을 수 있다.


o  ipfw

ipfw는 이 문서의 범위를 벗어나기는 하지만 머신을 안전하게 지키고자 할 것이며 ipfw를 사용하여 공격 패턴에 관한 정보를 얻고자 할 것이다. 때때로 당신의 머신에 관심을 갖는 누군가가 관심 이상의 의도를 갖는지를 알려줄 수도 있다. Ipfw(8) man page를 참고하라.


메일 얼라이어스

자신의 시스템에서 일어나는 일들을 감시하라. FreeBSD는 일/주/달 단위로 동작하는 많은 스크립트를 가지며(periodic(8)의 man page와 /etc/periodic 파일을 살펴보라) 이 스크립트들이 추출하는 정보들은 SUID 프로그램이나 커널 메시지 그리고 다른 유용한 정보와 같은 시스템에 관한 것들이다. 이 때문에 이러한 정보들을 메일로 받아보는 것이며 스크립트들의 출력이 root 계정으로 발송되지만 여러개의 이메일 주소로 발송할 수도 있다. /etc/mail/aliases를 수정하여 아래와 같은 행을 추가한다.


   root:   localuser, remoteuser@yourdomain.com


로컬 관리자뿐 아니라 별도의 메일 서버에 위치하는 곳에서도 결과물을 받아 볼 수 있다.



커널 변경
==============

필요치 않다면 bpf를 disable 상태로 하라.

FreeBSD을 설치한 후 가장 먼저 할 것 중 하나는 커널 컴파일이다. 공격자가 네트워크 카드를 정상적인 요청에 응답할 수 없는 상태로 만들 수 있기 때문에 커널에서 disable 상태로 설정하는 것중 하나가 bpf 장치이다. 서버 자체가 위험에 놓여 있기 때문에 유용하다. 간단히 커널 파일에서 다음 행을 주석처리하면 된다.


   #pseudo-device   bpf             #Berkeley packet filter


DHCP를 사용하는 사용자는 bpf를 diable하면 안된다. BPF를 diable상태로 설정하면 snort와 같은 프로그램에 영향을 줄 것이다.

또한 이 옵션에  ipfw, ipfilter를 추가할 수 있으며 동시에 쿼터설정을 지원할 수 있다.


Ctrl-Alt-Del 사용금지

물리적 접근이 가능한 사용자가 Ctrl-Alt-Del 키를 사용하여 시스템을 재부팅하지 못하게 할 수 있다.

다음을 커널 파일에 추가하기만 하라.


   options         SC_DISABLE_REBOOT       # disable reboot key sequence



이 설정은 모든 사용자가 시스템을 재부팅하는 것을 방지한다는 것을 명심하라. 또한 콘솔을 insecure로 설정했다면 재부팅하여 root 패스워드를 변경하지 못하게 한다. 즉, 물리적으로 접근할 수 있는 누군가가 악의적인 일을 하고자 한다면 당신은 상당한 곤란에 처하게 된다.


o  Quota Support

파일 시스템이 쿼터를 지원하기 위해서는 커널에 옵션을 enable해야 한다. 아래의 옵션으로 이를 설정할 수 있다.


   options         QUOTA                   #enable disk quotas


o  ipfw/ipf support

방화벽 지원 또한 커널에 추가할 수 있다. 무엇을 추가할 지는 자신에게 달려 있다. FreeBSD는 기본 시스템에 ipfw와 ipf가 포함된다. 자세한 사항은 LINT를 참고하라.


사용자 계정 관리
======================

사용자 쿼터

임의의 파일시스템에서 사용자 쿼터를 설정함으로써 한 사용자가 디스크 공간을 소모해버리는 위험을 덜 수 있다. 사용자가 모든 디스크 공간을 잡아먹을 가능성이 있는 곳에 설정하라. 또한 디스크 사용을 효육적으로 관리할 수 있는 장점이 있다.

쿼터는 커널에서 지원하도록 컴파일한 경우에 사용할 수 있다. 쿼터를 지원하도록 컴파일한 경우에는 다음을 /etc/rc.conf에 추가해야 할 것이다.


   enable_quotas="YES"
   check_quotas="YES"


edquota(8), qoutacheck(8), qoutanon(8), qoutaoff(8), repqouta(8)를 사용하여 쿼터 파일시스템을 관리할 수 있다.


홈 디렉토리 권한

사용자가 무엇을 열람할 수 있는지 알고 있어야 한다. 사용자가 Root의 crontab을 열람하기를 원치않는 것과 마찬가지로 root 디렉토리의 내용을 열람할 수 있는 걸 원치않을 것이다. ‘chmod 0750 /root’명령은 wheel 그룹의 사용자가 아니라면 디렉토리의 내용을 볼 수 없을 것이다.

또한 파일 권한을 0700으로 설정하여 사용자 홈 디렉토리들을 제한할 수 있다. 이렇게 되면 사용자들은 자신의 홈 디렉토리를 다른 사용자가 열람할 수 있도록 직접 변경해 주어야 한다.


프로세스 숨기기

ps(1) 명령을 사용하여 사용자가 볼 수 있는 프로세스를 제한할 수 있다. 기본적으로 FreeBSD 는 자기가 소유하지 않는 프로세스를 포함하여 시스템의 모든 프로세스를 볼 수 있다. 자기 소유의 프로레스만을 열람할 수 있도록 하고자한다면 kern.ps_showallprocs sysctl 변수를 변경하라. 시스템이 실행중인 상태에서 아래의 명령으로 변경할 수 있다.


   sysctl kern.ps_showallprocs=0


재부팅 후에도 변경사항을 유지하고자 한다면 /etc/sysctl.conf에 아래와 같이 추가한다.


   kern.ps_showallprocs=0

root는 kern.ps_showallprocs 변수에 영향을 받지 않고 모든 프로세스를 볼 수 있다.



이 방법은 ps(1)의 출력을 제한하는 반면 공격자가 어떤 프로세스가 실행되고 있는지 알아내기 위해 /proc를 접근을 막을 수는 없다. 이에 관한 정보는 ‘Disabling procfs’를 살펴보라.


o  Disabling procfs

procfs를 사용하여 실행되고 있는 프로세스에 관한 정보를 얻을수 있다. 이것은 또한 ps(1), w(1), truss(1)와 같은 프로그램이 완전히 동작하기 위해 필요하다. Procfs가 포함하고 있는 많은 정보들로 인해 많은 관리자들이 이 파일시스템을 disable로 설정하는 데 유익하다고 생각하고 있다.

이 설정은 본인에 달려있다. 원치 않으면 disable 상태로 설정할 필요는 없다.

Procfs를 disable상태로 설정하기 위해서는 /etc/fstab에서 procfs 파일시스템에 NOAUTO 옵션을 추가하라.
필요하다면 수동으로 마운트할 수도 있다.


o  login.conf(5)

‘login classes’에 사용자를 추가하여 사용자가 사용할 수 있는 CPU/memory 등을 제 한할 수 있다. 이 기능은 로컬 DoS 공격자를 제한하는 데 매우 효과적이다. 더 자세한 사항은 login.conf(5) man page를 참고하라.



최신 상태로 유지하라.
===============

패키지를 최신으로 유지하라.

외부에서 노출되어 있고 접근가능한 대몬들을 실행할 때는 자신의 패키지가 항항 최신 상태로 유지하는 것은 중요하다. 설치되 패키지의 새 버전이 나오면 포트 트리를 이용하여 항상 최신 버전을 유지하라.

대부분의 경우 몇분도 걸리지 않지만 골치거리로부터 해방되기 위한 최소한의 노력이다. 보안 권고에 관해서는 bugtraq과 같은 리스트를 살펴보는 것도 도움이 될 것이다.

패키지를 항상 최신 상태로 유지하기위해서 FreeBSD  핸드북을 참고하기 바란다.


   http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/


운영체제를 최신 상태로 유지하라.

비슷하기, FreeBSD 자체를 최신 상태로 유지하는 것 또한 중요하다. 소스 트리를 최신 상태로 유지하고 새 보안 패치가 나오면 ‘make world’를 수행하라. 보안 권고에 관해서는 bugtraq과 같은 리스트를 살펴보는 것도 도움이 될 것이다.

운영체제를 항상 최신 상태로 유지하기위해서 FreeBSD  핸드북을 참고하기 바란다.


   http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/


또한 FreeBSD 보안 권고 메일리스트에 가입하도록 하라.


   http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/eresources.html


조심성을 갖는다.

===========


이상 징후를 발견했을 때 시스템에서 낯선 점들을 탐색해야 한다. 특히 다음과 같을 때 주의한다.

최근 재부팅된 시스템

시스템이 재부팅되었다면 심각한 무언가가 변경되었는지를 체크하라. 특히 시스템 보안레벨에 주의를 기울여라. 이는 공격자가 커널이나 KLM등과 같은 것을 수정하기 위해 변경할 것이며, 변경 불가 시스템이나 추가 전용 플래그 시스템을 통과할 수 있는 기회를 갖게 되기 때문이다.


SUID 파일들의 변경

일단위 레포트는 SUID 파일에서 변화에 관한 정보를 담고 있다. 이 레포트에 상당한 관심을 기울여라.

중요한 시스템 파일에서의 변경

커널과 같은 중요한 시스템 파일들의 변경을 항상 주지하라. FreeBSD를 설치할 때, 이들 파일의 MD5 값을 구한후 안전한 곳에 저장하라. 그리고 수시로 이 값을 비교하라. 알수 없는 이유로 일치하지 않는다면 조사하라. 이를 위해 /usr/ports/security/tripwire를 사용할 수 있다. 물론 다른 툴을 사용할 수 있다.



Topics of Interest
==================

당신이 중요하게 생각하는 다른 토픽들이 있지만 그것들은 이 문서의 범위를 벗어 난다.


o  Jail

jail 환견은 chroot(8)와 비슷하지만 더 많이 향상되는 것을 경험할 수 있다. Jail이 무엇이며 어떻게 사용하는 지에 대한 설명은 jail(8) man page에서 찾을 수 있으며 아래 링크에서도 볼 수 있다.


   http://docs.freebsd.org/44doc/papers/jail/jail.html


FreeBSD 보안에 관한 다른 문서들
======================================

다음 사이트들은 FreeBSD 보안에 관한 정보를 가지고 있다.

   - http://www.freebsd.org/security/
   - http://www.freebsd.org/~jbk/howto.html
   - http://www.subterrain.net/presentations


FreeBSD 보안에 도움이 되는 툴들

   - http://www.openssh.com/ - 현재 FreeBSD 기본 배포에 포함되어 있다..


다른 유용한 프로그램들

-        http://www.ncftpd.com/ - 안전한 FTP 대몬


감사의 말
======

이 문서를 개선할 수 있는 제안을 하고 문제점을 지적해준 다음의 사람들에게 감사하고 싶다.



   Hiten Pandya  (who is converting this document to DocBook for addition as an article on the FreeBSD website)
   Gary W. Swearingen
   Tom Rhodes
   Nick Cleaton
   Sean Lewis
   Jean-Michel Amblat
   Dominic Marks
   Seth
   Chris Phillips
   Sebastian Benner
   Trevor Johnson
   James Lawrence

댓글 없음:

댓글 쓰기