달력

42024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
리눅스 시스템 관리자를 위한 보안 지침Ⅰ

 

 

CERTCC-KR

 

전병기 (bkjeon@certcc.or.kr) 2001. 03. 29

 

1. 리눅스 서버 운영체제의 Security Risk

 

리눅스는 지난해 세계 서버 OS시장 점유율이 27%로 전년(25%)에 비해 증가세를 나타냈다. 이는 1999년 가장 성장속도가 빠른 OS로 기록된 리눅스가 지난해에도 꾸준한 성장세를 유지했음을 의미한다. 이와 관련, MS의 스티브 발머 CEO는 최근 리눅스가 윈도에 대한 최대의 위협요소라고 말했다.

국내에서도 리눅스를 탑재한 중소형 서버가 꾸준히 증가하는 추세이다.

이는 벤처를 포함한 국내 중소기업과 초중고등학교등을 포함한 교육기관등이 전산망 구축을 위해 상대적으로 저렴한 리눅스 서버를 채택하면서 증가세를 부추기고 있는 것으로 풀이된다. 이런 추세라면 리눅스 서버는 엔터프라이즈급 서버에서 MS를 누르고 정상을 차지할 날도 머지않다고 본다.

리눅스 OS가 이렇게 인기가 좋은 이유중 하나는 저렴하다는 것과 쓰임새에 있어 강력하다는 것일 것이다. 그러나 강력한 시스템인 동시에 관리하기 어렵고, 그에 따른 Security Risk도 크다는데 문제가 있다. 리눅스 시스템은 본질적으로 취약성을 지니고 있는데, 이런 취약성을 이용한 악의적인 공격이 날로 증가하는 추세이다.

리눅스 서버의 보급이 확대됨에 따라, 악의적인 공격자(해커)에 의한 시스템 침입, 정보 변조 및 유출등 침해 사고가 잇따르고 있다. 이에 리눅스 서버에 대한 보안 문제가 크게 대두되고 있는 실정이다. 이에 시스템 관리자는 단순한 시스템 관리뿐만 아니라 시스템 보안까지도 염두해 두어야 한다.

본문은 리눅스 시스템 관리자에게 있어 기본적이면서 일반적인 보안 가이드를 설명한 문서로서, 침해사고대응팀내 사고 처리시 피해 기관 관리자에게 구체적이면서 일반적인 보안 가이드로 제공가능한 문서이다. 본문은 또한 RedHat 6.0 기준으로 설명하고 있지만 다른 리눅스 시스템에도 적용 가능하다.

 

2. 리눅스 시스템의 일반적인 보안 지침

 

1) 시스템 설치

시스템의 안전에 있어, 최상의 시점은 설치 시점이다.
설치함과 동시에 보안 조치를 취하지 않으면 공격자의 표적이 되기 십상이기에 시스템의 안전을 위해 설치 시점에서부터 보안을 고려하여 관리해야 한다.
시스템을 고립된 네트워크에 위치시켜 한시도 이 시스템을 네트워크에 연결하거나 연결 가능한 위험에 노출시켜서는 안된다. 그래서 중요한 파일과 패치를 받기 위해서는 중간에서 중계를 해줄 또하나의 시스템이 필요하다.
이 두 번째 시스템은 인터넷으로부터 필요한 파일을 다운받아 CDROM에 저장하거나 외부와 차단된 네트워크에 연결해 파일을 전송하는 등의 방법으로 필요한 파일을 전달한다.
일단 고립된 네트워크에 위치시키고 나면 설치할 준비는 끝난다.
첫 번째 단계는 로드할 OS 패키지를 선택하는 것이다. 레드햇 6.0은 Workstation, Server, Custom의 3가지 옵션이 있는데 디폴트로 Custom이 설정되어 있다.
Custom을 선택하기를 권하는데, 그래야 실행하고자 하는 서비스를 선택할수 있고 시스템 파티션의 설정도 자신이 선택할수 있다.
잠재적인 보안 취약점을 줄이면서 최대의 효과를 보기 위해 최소한의 패키지만을 설치한다.
옵션을 선택하였다면, 매뉴얼 페이지와 HOWTO 문서를 필히 추가하도록 한다.
온라인 매뉴얼과 문서들은 주요한 보안 자원이다.

Top

2) 파티션 구성

Custom 옵션을 선택하였으면, 파티션 구성 화면이 나타난다.
루트 파티션은 가능한 크게 만들고 모든 것은 루트 파티션에 설치한다.
또한 시스템 로그와 e-mail이 저장되는 /var 파티션 분할을 권장한다.
루트 파티션만이 존재하면 시스템 로그와 e-mail등의 데이터들에 의해 루트 파티션이 가득차서 서비스 거부 상태가 될 수 있으므로 /var 파티션을 분할 사용해야 한다. 용량은 대체로 400MB 정도로 한다.
그런데 특정 어풀리케이션을 위해 또는 사용자가 많은 경우 /home 파티션을 별도로 운영하든지, 로그 파일만 따로 저장하기 위해 다른 파티션도 고려할수도 있다.

 

3) 패치 설치

설치후 시스템이 재시동되고 나면 패치를 설치한다.

패치는 OS별로 제공되어지는데 참고로 레드햇 리눅스는 다음 사이트를 참조하기를 바란다.

 

▶ 레드햇 리눅스 패치 사이트

http://www.redhat.com/support/errata/

 

이 패치들을 적용하지 않으면 시스템은 쉽게 침해당할 것이다.

또한 리눅스 시스템은 고립된 네트워크에 연결된 채 중계 서버를 통해 패치되어야 함을 잊지말도록 한다.

레드햇의 경우 rpm 파일을 다운받으면 다음의 명령어를 통해 쉽게 설치할수 있다.

rpm -Uvh wu-ftpd-2.6.0-l.i386.rpm : wu-ftpd 패치하는 명령어

 

네트워크에 연결된 시스템이라면 ftp를 이용해 다음과 같이 설치할수도 있다.

rpm -Uvh ftp://updates.redhat.com/5.2/i386/wu-ftpd-2.6.0-l.i386.rpm

 

레드햇 6.1의 경우 'up2date'라는 패치 유틸리티가 있는데 이 툴을 사용할 것을 강력하게 추천한다. 이툴을 로컬 시스템에서 실행하면, 업데이트되어져야 할 rpm 파일이 어떤 것인지 결정하고 레드햇 웹사이트에서 찾아 스스로 다운로드 받고 설치할 정도로 사용하기 쉽다.

Top

4) 서비스 제거

리눅스 시스템을 보안 위험으로부터 보호하는데 있어, 제일 처음으로 하는 작업이 바로 불필요한 서비스의 제거하는 것이다. 이는 주로 불필요한 서비스를 제거하고 로깅을 추가하며, 몇 개의 파일 수정 및 SSH 또는 TCP Wrapper를 설정하는 작업이다.

리눅스 시스템은 디폴트로 여러 유용한 서비스를 설정하고 실행하도록 되어있다.

그러나 이서비스들의 대부분은 필요하지 않으며 보안측면에서 볼 때, 잠재적인 위험을 지니고 있다.

먼저 /etc/inetd.conf 파일을 보자. 이화일에는 디폴트로 여러 다양한 서비스들이 설정되어 있으나 대부분 ftp와 telnet만이 필요하다. 다른 불필요한 서비스들은 코멘트(#)로 처리하여 제거하도록 한다.

 

예)

# ...
# ....
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -L -i -o
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
#gopher stream tcp nowait root /usr/sbin/tcpd gn
#smtp stream tcp nowait root /usr/bin/smtpd smtpd
#nntp stream tcp nowait root /usr/sbin/tcpd in.nntpd

 

pop, imapd, rsh과 같이 inetd에 의해 실행되는 많은 서비스들이 보안 취약점에 노출되어 있다. 다음 명령어를 이용하면 코멘트 처리된 서비스들을 확인할수 있다.

이 명령어는 코멘트 처리되지 않은 서비스들을 보여 준다.

grep -v "^#" /etc/inetd.conf

 

▶불필요한 서비스 제거를 위한 단계별 명령어 순서

① [root/]#chmod 600 /etc/inetd.conf : 소유자(root)만이 읽기/쓰기가 가능하도록 퍼미션을 바꿔준다.

 

② [root/]#stat /etc/inetd.conf : 소유자가 root인지 보증한다.

 

③ inetd.conf 파일을 위와 같이 코멘트 처리 및 편집한다. 편집이후에는 다음처럼 시그널을 보내야 한다.

[root/]#killall -HUP inetd

Top

④ [root/]#chattr +i /etc/inetd.conf : super-user만이 이 파일에대해 접근할수있도록 ‘inetd.conf’파일을 셋팅하는 것으로 일단 셋팅되면 수정, 삭제 또는 rename할수 없다. 셋팅은 super-user만이 할수 있다.

나중에 inetd.conf 파일을 수정하고자하면 플래그를 -i로 바꿔주면 된다.
다음은 init 프로세스에 의해 어떤 서비스가 시작될지 결정하는 .rc 스크립트들이다.
레드햇의 경우 이스크립트들은 /etc/rc.d/rc3.d에 있다.
자동으로 Gnome이나 KDE등의 GUI 환경으로 부팅되도록 설정되어 있다면 /etc/rc.d/rc5.d에 있다. 시동되도록 되어 있는 것을 멈추게 하려면 소문자 s를 대문자 S로 바꾼다.
또 원한다면 레드햇의 유틸리티를 사용할수 있다. 명령행에서 “/usr/sbin/setup”라고 쓰고 “System Services”를 선택하면 부트 프로세스중에 구동시킬 스크립트를 선택할수 있다.
다른 방법은 대부분의 배포판엣 볼수 있는 ‘chkconfig’를 사용하는 것이다.
다음의 스크립트들은 디폴트로 설치되는 것들이나 시스템에서 주요한 기능은 하지 않는 것들이다. 필요하지 않다면 시동되지 않도록 설정한다.

 

스크립트
설 명
S05apmd
laptop에만 필요
S10xntpd
Network Time Protocol
S11portmap
NIS, NFS같은 rpc 서비스가 있을때만 필요함
S15sound
사운드 카드 설정 저장
S15netfs
nfs client, nfs 서버에서 파일시스템을 마운트할 때 사용
S20rstatd
r 서비스 실행을 하지 않도록 함, 원격 사용자에게 너무 많은 정보를 제공함.
S20ruserd
 
S20rwhod
 
S20rwalld
 
S20bootparamd
디스크가 없는 클라이언트에서 사용
S25spuid
프락시 서버
S34yppasswdd
NIS 서버에만 필요함, 아주 취약한 서비스
S35ypserv
NIS 서버에만 필요함, 아주 취약한 서비스
S35dhcpd
dhcpd 서버 데몬을 구동함
S40atd
크론과 비슷한 at 서비스에 이용
S45pcmcia
laptop에만 쓰임
S50snmpd
SNMP 대몬, 시스템 관련 정보를 원격사용자에게 보냄

Top

이름에 포함된 숫자들은 초기화되는 순서를 결정하는 요소로서, 이것은 어떤 배포판인지 어떤 버전인지에 따라 달라진다. 이미 구동되고 있는 서비스를 중단시키기 위해서는 대문자S대신에 대문자 K를 사용한다.

 

 

스크립트
설 명
S55named
DNS 서버, 사용한다면 최신으로 업데이트한다.http://www.isc.org/bind.html
S55routed
RIP, 정말 필요한 경우가 아니면 실행하지 않는다.
S60lpd
프리팅 서버
S60mars-nwe
Neteware file과 프린터 서버
S60nfs
NFS 서버에 사용, 꼭 필요하지 않으면 실행하지 않는다.
S72amd
AutoMount 대몬, 원격 파일시스템 마운트에 사용
S75gated
OSPF와 같은, 다른 라우팅 프로토콜 구동에 사용
S80sendmail
이 스크립트를 정지시키더라도 여전히 email를 보낼 수 있으며, 단지 수신이나 중계는 불가능할 것이다.
S85httpd
아파치 웹서버, 가장 최신 버전으로 업데이트할 것을 권고한다.http://www.apache.org
S87ypbind
NIS 클라이언트라면 필요함
S90xfs
X 폰트 서버
S95innd
News 서버
S99linuxconf
브라우져를 통해서 리눅스 시스템을 원격으로 구성하는데 사용

 

부팅시 스크립트를 변경하기 전에 얼마나 많은 서비스들이 실행되고 있는지 알려면 다음 명령어를 사용한다.

ps aux | wc -l

 

조정후 확인하기 위한 명령어는 다음과 같다.

netstat -na --ip

Top

5) Logging과 option 조정

가능한 많은 서비스들을 제거하며, 서비스에 대한 로깅을 설정해야 한다.
모든 시스템은 /var/log에 로그를 남긴다. 디폴트로 리눅스는 ftp를 제외하고는 훌륭하게 로그를 남긴다.
ftp 로깅을 하려면 두가지 방법이 있다.
/etc/ftpaccess 파일을 설정하는것과 /etc/inetd.conf 파일을 수정하는 것이다.
/etc/inetd.conf 파일을 수정하는 것이 더 간단하기 때문에 이 방법을 권한다.
FTP 세션에 대한 모든 것을 로깅하기 위해서는 /etc/inetd.conf 파일을 다음과 같이 수정한다.

ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -L -i -o

 

-l 옵션을 사용하면 각 ftp 세션이 syslog 파일에 기록된다. -L 옵션은 ftp 서버가 시동되자 마자 커멘드 로깅이 시작된다. 즉 사용자가 ftp 접속시 사용하는 모든 명령어가 syslog에 남게 된다. -i 옵션은 ftpd에 의해 파일을 받으면 xferlog(5)에 로그를 남긴다.
-o 옵션은 ftpd(8)에 의해 파일이 전송되면 xferlog(5)에 로그를 남긴다.

 

다음은 옵션 조정인데, 이것은 파일 관리와 관계가 있다.

첫 번째는 /etc/passwd 파일을 안전하게 하는 것이다.

우선 시스템이 /etc/shadow를 사용하는지 확인한다.

이것은 모든 사용자의 패스워드를 root만이 접근 할수 있는 파일에 해쉬형태로 안전하게 저장한다는 것을 의미한다. 또한 해커들이 제일 먼저 노리는 패스워드가 손쉽게 접근되고 크랙되는 것을 방지한다. 쉐도우 패스워드 파일을 사용하는 것이 레드햇 6.0의 디폴트이지만 확인을 해야 한다.

 

다음 명령어를 실행하면 자동으로 패스워드 파일을 /etc/shadow 파일로 변환해 준다.

pwconv

이것이 시스템을 안전하게 하는 주요한 조치들중의 하나라고 여겨진다.

 

두 번째는 /etc/passwd 파일에서 대부분의 디폴트 시스템 계정들을 제거하는 것이다.

리눅스는 이런 계정들을 불필요할지도 모르는 시스템 작업을 위해 제공한다.

필요하지 않다면 제거해야 한다. 계정을 많이 가지면 가질수록 침입될 가능성은 높아진다.

“news” 계정이 그 한예이다. 뉴스그룹 서버로 사용하기 위해 nntp를 서비스하는 경우가 아니면 이 계정은 불필요하다. 익명 ftp 접속에 사용되는 “ftp”계정도 삭제해야 한다.

ftpd 인증은 다음의 규칙에 따른다.

/etc/passwd 파일에 ftp 계정이 있어 익명 ftp 접속이 허용되어 있고 사용자 ID가 ‘anonymous’나 ‘ftp’이면 이 경우 어떤 패스워드라도 로그인이 허용된다. 관례상 접속자의 host명을 패스워드로 사용하기도 한다.

 

▶/etc/passwd 파일의 시스탬 계정 예

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:
adm:x:3:4:adm:/var/adm:
lp:x:4:7:lp:/var/spool/lpd:
mail:x:8:12:mail:/var/spool/mail:
uucp:x:10:14:uucp:/var/spool/uucp:
nobody:x:99:99:Nobody:/:

 

/etc/ftpusers 파일도 수정해야 한다.

Top

▶/etc/ftpusers 파일의 예

root
bin
daemon
adm
lp
mail
uucp
nobody

 

이파일에 기록된 계정은 ftp를 사용해서 이 시스템에 접속할수 없다.

이것은 root, bin과 같은 공통의 시스템 계정을 사용해 ftp로 연결하는 것을 제한한다.

리눅스는 디폴트로 이파일을 가지고 있다. root 권한으로 이 시스템에 ftp를 통해 접속하는 것을 막으려면 이 파일에 root가 포함되어 있는지 확인한다.

ftp 접속시 사용할 계정은 이 파일에 포함되면 안된다. 또 root로는 시스템에 telnet 접속을 못하도록 한다. 자기의 계정으로 접속한뒤 su를 사용해 root로 전환하도록 한다.

/etc/securetty 파일에 어떤 가상의 터미널이 root로 접속할수 있는지 설정한다. tty1, tty2와 같은 것만 이 파일에 리스트되도록 한다. 이것은 root로 접근하는 것이 로컬 접속일때만 가능하도록 제한하는 것이다. ttyp1, ttyp2는 원격에서 root가 시스템에 접근하는 것을 허용하는 임의의 터미널이다.

 

/etc/securetty 파일의 예

#
#
# WARNING : You must have specific authorization to acess
# this machine. Unauthorzed users will be logged.
# monitered, and then shot in sight!
#

 

이 법적 경고문은 어떤 사용자가 로그인을 시도할때마다 보여지게 된다.

디폴트로 리눅스는 부팅될 때마다 새로운 /etc/issue 파일을 생성하기 때문에 똑 같은 내용의 /etc/issue 파일을 계속 사용하려면 /etc/rc.d/init.d/S99local 파일을 수정한다.

Top

6) 서버 접속

원격지에서 서버를 관리하려면 안전하고 통제가 가능한 접속 방법을 찾는 것이 중요하다.

가끔 원격지에서 서버를 관리하기 위해 또는 파일을 업로드하기 위해 서버에 접속할 필요가있는데 이 통신은 안전해야 한다. 여기서는 ssh와 TCP Wrapper 두가지에 대해서만 설명할 것이다.

 

(1) SSH

사용자와 시스템과의 모든 통신을 암호화하는 ssh를 권장한다.

TCP Wrapper는 스니핑으로부터 네트워크 트래픽을 보호하지 못하며 패스워드를 포함한 키 스트로크를 캡쳐할수 있다. 이 시스템으로의 통신을 캡쳐하는 것을 우려한다면 telnet/ftp를 ssh로 대체하라. ssh는 서버로의 모든 통신을 암호화하여 안전하게 원격관리와 파일 업로드를 할수 있게한다. ssh는 고유의 로깅 레이어를 가지고 있으며, 서버로 접속할수 있는 대상을 제한할수 있다는 점에서 TCP Wrapper와 유사하다. 보다 많은 정보는 다음을 참조하기 바란다. http://www.ssh.org/download.html

ssh 2.x는 라이센스가 있으므로 버전 1.2.x를 권장한다. ssh의 또 다른 버전은 Openssh이 있고 참조 사이트는 다음과 같다. http://www.openssh.org/ 이다.

 

Ÿ 권고 사항

ssh을 인스톨하기전에 시스템상의 파일 리스트를 만들고, 이후에 무슨 파일이 어디에 위치되어 있는지 알기위해 ‘diff’ 명령어를 사용해서 인스톨전 파일 리스트와 이후 파일 리스트를 비교한다.

 

인스톨이전 파일 리스트는 다음 명령행으로 만들어진다.

find / * > ssh1

 

인스톨이후 파일 리스트는 다음 명령행으로 만들어진다.

find / * > ssh2

 

리스트 비교는 다음 명령행으로 실행된다.

diff ssh1 ssh2 > ssh : 바뀌어진 파일 리스트를 얻는다.

 

Ÿ 컴파일 및 설치

① SSH 홈페이지에서 압축 파일 다운로드

http:// www.ssh.fi/ ssh-1.2.27.tar.gz 다운로드

 

② 압축 해제

[root/]#cp ssh-1.2.27.tar.gz /var/tmp
[root/]#cd /var/tmp
[root/tmp]#tar xzpf ssh-1.2.27.tar.gz

Top

③ 컴파일 및 최적화

새로 생성된 ssh 디렉토리로 가서 다음 명령어들을 타이핑한다.

 

 

CC="egcs"\
CFLAGS="-09-funroll-loops-ffast-math-malign-double-mcpu=pentinmpro-
march=pentiumpro-fomit-frame-pointer-fno-exceptions"\
./configure\
--prefix=/usr\
--without-idea\
--with-etcdir=/etc/ssh\
--enable-warnings\
--without-rsh\
--with-libwrap\
--disable-server-port-forwardings\
--disable-client-port-forwardings\
--disable-server-x11-forwardings\
--disable-client-x11-forwardings\
--disable-suid-ssh

 

 

이것은 특정 하드웨어에 setup시키기 위해 SSH1 그자체로 setup 시키는 것으로 다음은 필드별 설명이다.

 

- 상업적 이용에서 특허문제를 피하기 위해서이다.
- gcc/egcs를 사용한다면 the-Wall(warning) 옵션을 enable 해야한다.
- 어떠한 조건하에서도 rsh를 사용하지 말아라.
- libwrap(tcp_wrappers) 지원으로 컴파일해라.
- X11은 제외하고 서버내 모든 포트 포워딩은 disable 해라.
- X11은 제외하고 클라이언트내 모든 포트 포워딩은 disable 해라.
- 서버내 X11 포워딩은 disable 해라.
- 클라이언트내 X11 포워딩은 disable 해라.
- suid bit 없이 ssh 인스톨해라.

 

다음은 불필요한 파일들을 지우는 작업이다.

 

[root/ssh-1.2.27]#make clean

: 어떠한 실수라도 피하기 위해 이전 모든 컴파일 trace를 지운다.

[root/ssh-1.2.27]#make

: 모든 소스 파일들을 실행가능한 바이너리 파일들로 컴파일한다.

[root/ssh-1.2.27]#make install

: 적합한 위치에 바이너리 파일들과 지원 파일들을 인스톨한다.

[root/]#cd /var/tmp

[root/tmp]#rm -rf ssh-1.2.27/ssh-1.2.27.tar.gz

: 컴파일과 인스톨에 사용된 소스 파일들을 제거한다.

또한 tmp 디렉토리내 압축 파일도 지운다.

Top

④ 구성화일 설정

우선 서버 구성 파일 압축화일을 다운로드한다.

http://pages.infinit.net/lotus1/opendocs/floppy.tgz

그리고 적당한 디렉토리에 복사한다.

즉, sshd_conf 파일을 “/etc/ssh/”디렉토리에 복사한다.

 

Ÿ ssh_config 파일 편집 (vi /etc/ssh/ssh_config)

구성화일은 클라이언트 프로그램의 운영을 수정하기 위해 옵션을 셋팅해야 한다.

파일은 라인별로 키워드와 값, 한쌍을 포함하고 있는데, 여기서는 중요 키워드에 대해서만 셋하고 완전한 키워드 리스트는 파일내 man 페이지를 참조하기를 바란다.

다른 다양한 옵션은 디폴트로 두고 필요하다면 수정, 추가한다.

 

Host *

ForwardAgent no
ForwardX11 no
RhostsAuthentication no
RhostsRSAAuthentication no
RSAAuthentication yes
TISAuthentication no
PasswordAuthentication yes
FallBackToRsh no
UseRsh no
BatchMode no
Compression yes
StrictHostKeyChecking no
IdentityFile ~/.ssh/identity
Port22
KeepAlive yes
Cipher blowfish
EscapeChar ~

Top

Ÿ sshd_config 파일 편집 (vi /etc/ssh/sshd_config)

 

데몬의 운영을 수정한다.

파일은 라인별로 키워드와 값, 한쌍을 포함하고 있는데, 여기서는 중요 키워드에 대해서만 셋하고 완전한 키워드 리스트는 파일내 man 페이지를 참조하기를 바란다.

다른 다양한 옵션은 디폴트로 두고 필요하다면 수정, 추가한다.

 

Port 22

ListenAddress 211.252.150.1 --> 네트워크 인터페이스의 IP 주소(예는 ‘ns.certcc.or.kr’)

HostKey /etc/ssh/ssh_host_key
RandomSeed /etc/ssh/ssh_random_seed
ServerKeyBits 1024
LoginGraceTime 600
KeyRegenerationInterval 3600
PermitRootLogin no
IgnoreRhosts yes
StrictModes yes
QuietMode no
X11Forwarding no
FascistLogging no
PrintMotd yes
KeepAlive yes
SyslogFacility DAEMON
RhostsAuthentication yes
RSAAauthentication yes
PasswordAuthentication yes
PermitEmptyPasswords no
AllowUsers admin

AllowHosts 172.16.2.123 --> 호스트 IP 주소 (예는 가상 주소임)

Top

(2) TCP Wrapper

TCP Wrapper 는 암호화는 지원하지 않지만 로그와 서버로의 접근을 제한한다.

TCP Wrapper는 telnet 또는 ftp와 같은 inetd 서비스를 둘러싸는 실행화일이다.

TCP Wrapper를 실행시키면 시스템은 inetd 커넥션들에 대한 wrapper를 실행하고 모든 접속 시도를 기록하고 접속 제어 리스트에 위배되는 접속 시도가 있는지 감시한다.

만일 접속이 허용되면 TCP Wrapper는 그 커넥션을 telnet 과 같은 적절한 실행화일로 넘겨준다. 접속 제어 리스트에 의해 접속이 거절되면 그 커넥션은 drop된다.

 

다행히도 TCP Wrapper가 이미 설치되었다면 /etc/hosts.allow 파일과 /etc/hosts.deny파일을 수정하기만 하면 된다. 이 파일들은 서버에 접속을 허용하지 않을 대상을 결정한다.

TCP Wrapper는 베너, spawn, safe_finger 과 같은 부가적인 프로그램을 제공한다.

사용법은 비교적 간단하다. /etc/hosts.allow 파일에 접속을 허용할 IP나 네트워크를 기록한다. /etc/hosts.deny 파일에 접속을 금지할 IP나 네트워크를 기록한다. 디폴트로 리눅스는 모두에게 접속을 허용하므로 이 파일을 수정할 필요가 있다.

TCP Wrapper를 사용할 때의 2가지 권고 사항이다.

 

Ÿ 권고사항

1. 시스템 이름이나 도메인 이름을 사용하지말고 IP 주소를 사용한다.

2. /etc/hosts.deny을 deny ALL로 설정한 후 접속을 허용할 주소만 /etc/hosts.allow 파일에 기록한다.

Ÿ allow 파일과 deny 파일 설정 예

문법

Service:Source (IP 주소, 네트워크 또는 이름):<option>:ALLOW 또는 DENY

 

/etc/hosts.allow 예

in.telnetd:192.168.1.0/255.255.255.0:banners/etc/bannerfile:ALLOW

in.ftpd:192.168.1.30:ALLOW

imap:ALL:spawn(/usr/local/bin/ids.sh %d %h %H %u)

 

/etc/hosts.deny 예

ALL:ALL DENY

 

Top

Ÿ 파일 설정 단계별 명령어 순서

① hosts.deny 파일을 편집한다.(vi /etc/hosts.deny) 다음 행을 추가한다.

 

 

 

Access id denied by default.

#Deny access to everyone.

ALL:ALL@ALL, PARANOID

 

 

마지막 행은 모든 서비스, 모든 지역을 의미하는 것으로, allow 파일내 엔트리에 의해서 접속이 허용될지라도 명시적으로 허용되지 않은 어떠한 서비스도 block된다.

 

② hosts.allow 파일을 편집한다. (vi /etc/hosts.allow) 다음 예처럼 행을 추가한다.

명시적으로 승인된 host는 allow 파일에 저장되어있다.

 

 

 

sshd:211.252.150.1 ns.certcc.or.kr

 

 

211.252.150.1는 IP 주소이고 ns.certcc.or.kr는 sshd 사용시 허용된 클라이언트중의 한 host 이름이다.

 

③ tcpd wrapper 구성화일을 검사하는 'tcpdchk' 프로그램을 실행시킨다.

이것은 tcp wrapper 구성화일을 시험해서, 찾을수 있는 모든 잠재적이고 실제적인 문제점들을 보고한다.

 

[root/]#tcpdchk

: 구성이 끝난 후에 tcpdchk 프로그램을 실행시킨다.

 

TCP Wrapper와 관련된 보다 상세한 정보는 다음을 참조하기 바란다.

http://www.enteract.com/~lspitz/ids.html

 

7) 계정관리 보안 조치 사항

우선 wheel 그룹을 만든다. wheel 그룹은 /bin/su 와 같은 명령어를 실행시킬수 있는 특별한 권한을 필요로 하는 사용자들로 이루어진 그룹이다. 이런 종류의 명령어를 실행시킬수 있는 사용자들을 제한함으로써 시스템의 보안성을 향상시킬수 있다. 그룹을 생성하기 위해 /etc/group 파일을 vi로 열어 wheel 그룹을 추가하고 시스템 관리자를 wheel 그룹에 추가한다. 그리고 /bin/su 와 같은 시스템 실행 파일을 구별해 group 소유권을 wheel로 바꾸어 소유자와 그룹에 실행권한만을 준다. 특정 파일의 경우 suid와 guid에 대해서도 주의한다.

 

Top

/bin/su 파일에 대해 설정할 경우 명령어 에

/bin/chgrp wheel /bin/su

/bin/chmod 4750 /bin/su

 

두 번째는 .rhosts, .netrc, /etc/hosts.eqiv 파일을 잠근다.

r 명령들이 시스템에 접근할 때 이파일들을 사용한다. 이파일들을 잠그기 위해서 각 파일에 대해 touch를 실행하고 permission을 0으로 변경한다.

이러면 아무도 이 파일을 만들수도 없고, 수정할수도 없다.

 

작업 실행 예 :

/bin/touch/root/.rhosts/root/.netrc/etc/hosts.eqiv

/bin/chmod 0/root/.rhosts/root/.netrc/etc/hosts.eqiv

 

세 번째는 /etc/shdow가 crypt(3) 함수 대신 MD5 해쉬를 사용토록 설정한다.

이러면 암호화된 패스워드 파일이 해독되기가 보다 어려워진다.

이러한 작업은 PAM 모듈을 수정함으로서 이루어진다.

PAM(Pluggable Authentication Modules)은 어떻게 어풀리케이션들의 인증방법을 선택할 수 있게 하는 라이브러리의 집합이다. PAM 모듈에 대해 상세한 정보는 다음을 참조한다. ftp://ftp.us.kernel.org/pub/linux/libs/pam/Linux-PAM-html/pam.html

 

과거에는 MD5 해쉬를 사용하려면 수동으로 PAM을 수정했으나 레드햇 6.0 이상의 버전에서는 셋업 유틸리티에서 선택하기만 하면 된다.

즉 명령행에서 setup을 실행시키고 “authentication configuration”을 선택한다.

그러면 MD5 해쉬를 선택할수 있다. 그런데 사용자가 자신들의 패스워드를 다시 입력하지 않으면 새로 적용된 MD5 해쉬는 아무런 효과가 없음에 유의하여야 한다.

셋업 유틸리티가 지원되지 않는 버전의 사용자는 다음을 참조하여 수동으로 설정할수 있다. http://www.enteract.com/~lspitz/lx_example.html#G

 

bash 사용자들은 .bash_history 파일을 내켜하지 않는데 이는 내가 사용한 명령어들을 다른사람들이 알게되기 때문이다. 그래서 .bash_profile에 다음을 추가한다.

Top

HISTFILESIZE=0

 

이러면 .bash_history 파일에 아무런 기록이 남지 않는다. 이렇게 해도 HISTSIZE라는 환경변수가 있기에 키스트로크에 대한 히스토리 관리는 유지된다. 단지 .bash_history 파일에 저장되지 않을 뿐이다.

 

마지막으로 할수 있는 것은 물리적인 접근으로부터 시스템을 보호하는 것이다.

이것은 주로 BIOS에 대해 패스워드를 설정하는 작업으로 구성된다.

/etc/lilo.conf 파일에 password=xxx 와 같이 패스워드를 설정함으로써 부팅프로세스가 진행되는 동안 시스템을 보호할수 있다. 싱글 유저모드로 부팅할 때 패스워드를 물어보게 되며 lilo.conf 파일 수정후에 ‘lilo -v’를 실행해야 수정된 사항이 적용된다. 일단 물리적으로 시스템에 접속하게 되면 시스템을 보호할 방법은 없다는 것을 명심해야 한다.

 

8) IPChain 보안 공개 도구

IPChain은 커널 2.2.x 이상에서 지원하는 패킷필터링 S/W이다. 레드햇 6.0 이상을 사용하면 리눅스 설치 킷에 포함되어있다. IPChain은 시스코 라우터의 ACL과 비슷하고 리눅스가 설치된 서버를 통과하는 패킷을 제어할수 있다.

기본적으로 방화벽처럼 사용될수 도 있으며, 스탠드 얼론으로 사용되는 리눅스 서버에서도 보안을 강화하기 위해 사용될수 있다. 스텐드 얼론 시스템을 안전하게 하기 위해서, 이 시스템에서 시작된 TCP 연결만을 허용하도록 설정한다. 다른 곳에서 어떤 TCP 연결을 시도해도 거부된다. 그러나 UDP나 ICMP 연결은 허용한다.

또한 모든 거절된 커넥션을 로깅한다. Broadcast, Multicast 트래픽의 경우, 양이 너무 많기에 ‘거부’하지만 로깅하지는 않는다.

 

Top

간단한 IPChain 설정 예(Standalone 경우) :

bash# ipchains -L
Chain input (policy DENY):
target prot opt source destination ports
DENY all ------ 0.0.0.0 anywhere n/a
DENY all ------ anywhere 255.255.255.255 n/a
DENY all ------ anywhere BASE-ADDRESS.MCAST.NET/8 n/a
ACCEPT tcp !y---- anywhere anywhere any -> any
ACCEPT udp ----l- anywhere anywhere any -> any
ACCEPT icmp ----l- anywhere anywhere any -> any
DENY all ----l- anywhere anywhere n/a
Chain forward (policy ACCEPT):
Chain output (policy ACCEPT):

 

참고 사이트

http://www.enteract.com/~lspitz/lx_example.html#H

http://metalab.unc.edu/pub/Linux/docs/HOWTO/IPCHAIN-HOWTO

 

3. 결론

 

레드햇 리눅스를 기반으로 리눅스 시스템을 안전하게 하기 위한 기본적인 조치사항들을 살펴 보았다. 중요한 것은 최소한의 소프트웨어를 설치하고 SSH나 TCP Wrapper, IPChain, Shdow password 와 같은 보안 조치 사항들을 설정하는 것이다.

tripwire, swatch 같은 추가적인 도구도 있다. 자동으로 새로운 리눅스 시스템을 단계적으로 안전하게 해주는 펄 스크립트인 Bastille linux(http://www.bastille-linux.org/)도 권고한다.

100% 안전한 시스템은 없지만 여기서 기술된 것만 적용해도 리눅스 시스템의 안전성은 상당히 높아 질 것이다.

시스템의 안전한 보호를 위해서는 지속적으로 보안 사항들을 살펴보아야 한다.

또한 CERT 홈페이지(http://www.certcc.or.kr)를 위시한 보안 전문 컨설팅 사이트와 시스템 벤더 사이트를 정기적으로 방문하여 보안 권고 사항들에 대해서 주의깊게 살펴보며, 새로운 취약성이 발견되면 그에 따른 패치설치 및 보안 권고에 충실히 따르도록 해야 한다.

Posted by tornado
|