레이블이 보안인 게시물을 표시합니다. 모든 게시물 표시
레이블이 보안인 게시물을 표시합니다. 모든 게시물 표시

2012-09-10

FreeBSD]FreeBSD 무장하기


FreeBSD 무장하기

Markus Fluid Delves mailto:markus@fluidenterprises.net 저.

OpenBIRD, Inc. mailto:editors@openbird.com 역.

새로운 script가 계속 생겨남에 따라 우리는 자신을 보호할수 있는 몇가지 기본적인 법칙을 배울 필요가 있습니다. 이 가이드는 FreeBSD 보안의 기본에 대해 개략적으로 알려줄 것이며 FreeBSD 4.x에서 가장 잘 동작할 것입니다.

1. 일반적 인 보안 지식
1.1 Superuser
1.2 su
1.3 SSH2 키 인증 사용하기

2. 소스를 최신버젼으로 유지하기
2.1 최 신으로 유지하기
2.2 CVSUP
2.3 컴파일과 인스톨

3. Firewall 사용하기
3.1 IPFW 소개
3.2 Kernel 고치기
3.3 Firewall 셋팅하기
3.4 IPFW 사용하기

4. Services
4.1 INETD
4.2 Standalone 데몬

5. DES vs MD5
5.1 비 밀번호 암호화

6. 결론
6.1 기 억해야 할 규칙들
6.2 참고자료


Chapter 1. 일반적인 보안 지식

1.1 Superuser

기본적으로 FreeBSD에서 superuser 계정은 root입니다. root 계정은 생성, 삭제, 편집, 중지, 조정등 모든 것이 가능하며 컴퓨터를 완벽하게 조정할수 있습니다. 여러분의 보안을 증진시킬 수 있는 가장 좋은 방법 중의 하나는 정말 필요할 때만 root를 사용하는 것입니다. 일상적인 작업을 할 때는 자신이 가지고 있는 특권이 없는 계정을 사용해야 합니다. root로 작업할 때는 안전하다고 확신하지 않는 한 소스코드로 만들지 않은 실행화일은 절대로 실행시키지 말아야 하며 root로 실행해야만 하는 프로그램들만 실행하십시요. ; 다른 프로그램들은 root가 아닌 여러분 계정을 사용해 실행시켜야 합니다.

1.2 su

여러분은 SSH 같은 보안 프로토콜을 통하지 않으면 root로 절대 로그인해선 안되며 보안 프로토콜을 통해 들어가더라도 그건 좋은 생각이 아닙니다. 대신 여러분은 자신의 일반 개인 계정으로 로그인한 후 su를 이용하여 root로 들어가야 합니다.
뜻밖의 root 로그인 공격을 당했다 할지라도, 이렇게 하여야 문제를 추적할 수 있습니다. 익명 사용자로 부터의 root 로그인 메시지 대신, 누가 로그인 하였는지 그리고 누가 su를 시도하였는지 알 수 있을 것입니다.
주요 그룹에 속한 username 만이 root로 su가 가능하기 때문에 진행하기 전에 username이 그룹에 등록되어 있는지 확인합니다. /etc/group을 수정하여 여러분의 username을 추가하면 되는데 그 첫번째 문장을 다음과 같습니다.:

wheel:*:0:root,your_username

위의 문장에 space를 사용하면 안되며 username을 여럿 열거할때는 콤마로 구분합니다.
root로 직접 로그인 못하게 하려면 /etc/ttys 아래 있는 문장을 고쳐주어야 합니다.:

console none unknown off secure
#
ttyv0 "/usr/libexec/getty PC" cons25 on secure
ttyv1 "/usr/libexec/getty PC" cons25 on secure
[...]

root로 직접 로그인 못하게 하려면, 문장안의 모든 secure를 insecure로 고치면 됩니다. 여러분은 가상 터미날에서 root로 바로 로그인이 불가능 합니다. 모든 가상 터미날로 들어오는 것은 secure로 되어 잇기 때문에 이런 터미날에서의 root 로그인은 불가능합니다. 실재로 이 말은 여러분이 telnet 세션을 통해 root로 로그인 하는것은 불가능하다는 이야기입니다.

1.3 SSH2 키 인증 사용하기

SSH2를 사용하는 것이 telnet 상으로 개인 프라이버시를 더욱 더 보호할 수 있지만 이론적으로 그것은 해독될 수도 있습니다. 만일 네트워트를 타고 보내지는 데이타를 상대편 머신에서 public key로 받아들이도록 암호화 할수 있다면 우리의 프라이버시는 훨씬 보호될 수 있습니다. 여기 unix에서 ssh2 key authentication을 셋팅한 예를 보십시요.

일단 로칼 머신에 ssh2를 인스톨하면 http://www.bsdnet.co.kr/articles/ftp.cis.fed.gov/pub/ssh/ssh-2.4.0.tar.gz에 서 아래 사항을 찾아 볼수 있습니다. 아니면 간단히 /usr/ports/security/ssh2에 있는 포트를 사용해도 됩니다.
ssh-keygen2을 실행시키세요.

markus@fluidenterprises:~$ ssh-keygen2
Generating 1024-bit dsa key pair
1 oOo.oOo.oKey generated.
1024-bit dsa, markus@fluidenterprises, Mon Dec 25 2000 00:13:43 +0200
Passphrase : ***********
Again : **********
Private key saved to /home/markus/.ssh2/id_dsa_1024_a
Public key saved to /home/markus/.ssh2/id_dsa_1024_a.pub

자신만의 identification file을 만드세요.

markus@fluidenterprises:~$ echo "IdKey id_dsa_1024_a" > ~/.ssh2/identification

자신의 public key를 리모트 호스트에 복사하고 자신의 .ssh2 디렉토리에 놓습니다.
authorization file을 리모트 호스트에 만듭니다.

fluid@watchtower:~/.ssh2$ echo "Key id_dsa_1024_a.pub" >> authorization

로칼 머신으로 되돌아가 로그인 해보세요. 그러면 다음과 같이 나옵니다.:

markus@fluidenterprises:~$ ssh2 -l fluid remote_host
Passphrase for key "/home/markus/.ssh2/id_dsa_1024_a" with comment "1024-bit dsa, markus@fluidenterprises.net, Sat Dec 16 2000 02:56:47":

pass 문을 입력하시고, 자, 어때요.

secure ftp 2 사용법.

markus@fluidenterprises:~$ sftp2 fluid@remote_host
Passphrase for key "/home/markus/.ssh2/id_dsa_1024_a" with comment "1024-bit dsa, markus@fluidenterprises.net, Sat Dec 16 2000 02:56:47":
sftp>

sftp2의 명령들은 ftp와 굉장히 유사합니다.
이제 우리는 안전한 public key authorization 시스템을 어떻게 사용하는 건지 알았으니 여러번 테스트 해 보시기 바랍니다. 익숙해지면 passwd 화일에서 여러분의 패스워드를 *로 고치세요. 모든 사람들이 public key authorization으로 권한 check를 한다면 우리의 보안성은 아주 높아질 겁니다. id_dsa_1024_a는 업로드 해선 안됩니다. 이것은 여러분의 개인적인 key이며 여러분은 어느 누구도 그것에 접근하는 것을 원하지 않을테니까요.

Chapter 2. 소스를 최신 버젼으로 유지하기

2.1 최신버젼 유지하기

보안을 유지하는 가장 좋은 방법은 소스를 항상 최신버젼으로 유지하는 것입니다. 저는 freebsd-security@freebsd.org를 받아보라고 강력하게 권하고 싶습니다. 그곳에서 뭔가 취약점이 발견되어 수정사항이 생길 때마다 여러분은 cvsup을 실행하여 소스를 업데이트 하고 make buildworld와 make installworld을 사용할수 있습니다. 이 과정을 이번 단원에서 설명하겠습니다.

2.2 CVSup

"CVSup은 네트워크를 통해 여러 화일들을 배포하고 업데이트하는 소프트웨어 패키지입니다. 이것은 소스, 바이너리, 하드 링크, 심볼릭 링크, 심지어 디바이스 노드 등 모든 종류의 화일들을 효율적이고 정확하게 미러링 합니다. CVSup은 지속적인 통신 프로토콜과 멀티스래드 구조로 요즘 나온 tool 중 아마도 가장 빠는 미러링 tool일 겁니다. 또한 일반적 의미의 미러링 tool 이기도 하지만 CVSup은 특히 CVS repositories에 잘 맞도록 짜여졌고 최적화되어 있습니다." (/usr/ports/net/cvsup/pkg-descr 인용) 다시 말하면 CVSup은 메인 FreeBSD 소스코드 데이타베이스에 연결하여 여러분의 소스화일들을 업데이트합니다. 만일 포트 콜렉션이 설치되어 있다면 cd /usr/ports/net/cvsup;make install 라고 치면 CVSup을 설치할수 있습니다. 이렇게 하면 CVSup을 download, patch, compile, install 할 수 있습니다. (필자 주석: CVSup의 설치는 디스크 공간과 리소스를 많이 필요로 합니다. - 여러분이 cvsup을 단지 소스와 포트트리 업데이트를 위해서만 사용한다면 cvsup-bin port인, /usr/ports/net/cvsup-bin을 사용하는 편이 더 쉽습니다.) 여러분은 이제 "supfile"을 만들어야 하는데 그래야 cvsup이 어떤 화일들을 다운로드하고 어디에 그것들을 가져다 놓을지 알수 있습니다. 여기 cvsup supfile의 예가 있습니다.:

*default host=cvsup2.ca.freebsd.org
*default base=/usr
*default prefix=/usr
*default release=cvs
*default delete use-rel-suffix
*default compress
*default tag=RELENG_4
src-all
ports-all tag=.

위의 코드는 /usr/ports 와 /usr/src을 FreeBSD 4.x의 가장 최신 버젼 소스 화일로 업데이트 할 것입니다. 이 화일을 "supfile"이라 한다면 root 자격으로 cvsup supfile이라는 명령을 수행시키면 소스를 업그레이드 할수 있습니다. 이미 cvsup이 설치되어 있다면 /usr/share/examples/cvsup 에서 supfile의 예제를 찾아 볼수 있습니다. FressBSD 업데이트를 위해 cvsup의 완벽한 셋팅 가이드를 원한다면 FreeBSD 핸드북의 CVSUP 섹션을 찾아 보시기 바랍니다. (http//www.freebsd.org/handbook/cvsup.html).

2.3 컴파일과 인스톨

일단 새 소스코드를 얻었다면 여러분은 그것으로 무언가를 해 보려고 할 것입니다. 여기서는 make buildworld 와 make installworld이 동작하는 것을 알아볼것 입니다. make buildworld은 모든 소스를 조립하도록 하고 make installworld은 새롭게 컴파일된 운영시스템을 인스톨합니다. 두가지 명령 모두 /usr/src에 있습니다.(아니면 여러분이 지정한 소스파일 위치에) 여러분은 시스템을 업데이트 하기 전에 시스템 혹은 적어도 중요한 화일들은 백업해 놓는 것이 좋습니다. 뭔가 잘못되진 않겠지만 그래도 걱정하느니 안전한 게 더 낫습니다. 또한 싱글 유저 모드로 인스톨하는 것이 더 안전하고 빠릅니다. 싱글 유저 모드로 나오려면 root 권한으로 shutdown now 라고 치면 됩니다. 싱글 유저 모드에선 네트워킹이 불가능하므로 싱글 유저 모드를 사용하려면 자신의 콘솔을 사용해야 합니다.
컴파일 전에 여러분은 기존의 오브젝트 화일들을 삭제해야 합니다. 루트 권한으로 cd /usr/obj;chflags -R noschg *;rm -rf *라고 치면 삭제되는데 이 명령은 /usr/obj 밑의 모든 것을 삭제합니다. 이제 여러분은 여러분의 운영시스템을 재 컴파일 할 준비가 다 되었습니다. 컴파일 하려면 root 권한으로 cd /usr/src;make buildworld라는 명령을 실행시킵니다. 일단 에러 없이 완료되면 역시 root 권한으로 cd /usr/src;make installworld라는 명령을 실행시킵니다. 이것 역시 성공적으로 끝나면 여러분의 운영시스템은 업데이트 된 것입니다. 더욱 자세한 것은 FreeBSD 핸드북을 찾아 보시기 바랍니다. (http://www.freebsd.org/handbook/makeworld.html).
make installworld를 실행한 후에 kernel을 다시 컴파일 해 주는 것이 좋습니다. 그렇게 하지 않으면 어떤 tool들은(ps 와 top 같은) 제대로 동작하지 않을 수 있습니다. 여러분이 GENERIC kernel을 사용한다면(무얼 사용하는지 모른다면 아마도 GENERIC kernel 일 겁니다.) root 권한으로 cd /usr/src; make buildkernel KERNEL=GENERIC; make installkernel KERNEL=GENERIC 을 실행시키면 kernel은 재 컴파일 됩니다. 이제 리부팅하세요; 이제 여러분의 운영시스템은 업데이트 되었습니다.!

Chapter 3. Firewall 사용하기

3.1 IPFW 소개

FreeBSD은 kernel firewall인 IPFW에 적합합니다. IPFW은 kernel을 구성하는 패킷 필터링과 어카운팅 시스템입니다. IPFW는 두 부분으로 나뉘는데 패킷 필터링부분과 라우터의 사용처를 추적 가능하게 하는 어카운팅 시스템 부분입니다. 우리는 패킷 필터링 부분만 보도록 합시다.
IPFW을 사용하기 위해 우리는 두가지 새로운 옵션으로 kernel을 재 컴파일 해야 합니다. 아직 custom kernel을 만들어 보지 않았다면 다음 섹션을 읽어 보시고 이미 custom kernel을 만들어 사용한다면 다음 섹션은 그냥 지나쳐도 좋습니다.

3.2 Kernel 고치기

전에 한번도 kernel을 고치지 않았다면 지금 GENERIC이 실행되고 있을 것입니다. GENERIC은 FreeBSD의 기본 config 화일입니다. 모든 kernel config 화일들은 /sys/i386/conf에 있습니다. GENERIC을 여러분이 만들 kernel 이름으로 복사한 후 편집합니다.
여기 ipfw를 지원하도록 수정된 kernel을 생성시키는 빠른 방법을 소개합니다.

# cd /usr/src/sys/i386/conf
# cp GENERIC KERNEL_NAME
# echo "options IPFIREWALL" >> KERNEL_NAME
# echo "options IPFIREWALL_VERBOSE" >> KERNEL_NAME
# echo "options IPFIREWALL_VERBOSE_LIMIT=200" >> KERNEL_NAME
# echo "options IPFIREWALL_DEFAULT_TO_ACCEPT" >> KERNEL_NAME(주의 : 기본적으로 모든 패킷을 받길 원한다면 위의 문장을 포함시켜야 합니다.)
# cd /usr/src
# make buildkernel KERNEL=KERNEL_NAME
# make installkernel KERNEL=KERNEL_NAME

위의 명령들은 GENERIC을 여러분이 만들 kernel 이름으로 복사하고 firewall 옵션들을 추가하고 컴파일해서 새 kernel을 인스톨합니다. 새로운 kernel의 config 화일을 주의깊게 읽어 보시기 바랍니다. 커널 수정에 관한 자세한 사항은 FreeBSD 핸드북을 보시기 바랍니다. (http://www.freebsd.org/handbook/kernelconfig.html).

3.3 Firewall 셋팅하기

여러분이 일단 firewall의 규칙과 동작에 관하여 익숙해지고 나면 아마도 여러분은 IPFIREWALL_DEFAULT_TO_ACCEPT 옵션을 사용하지 않을 것입니다. 모든 걸 여러분 방식대로 하고 싶어 할테니까요.

3.4 IPFW 사용하기

IPFW은 처음에는 아주 복잡해 보이지만 점점 더 쉬워집니다. 컴퓨터가 부팅될 때 /etc/rc.firewall에 있는 firewall 규칙들이 동작하게 하려면 /etc/rc.conf에 firewall_enable=YES을 추가하면 됩니다. 또한 logging이 가능하게 하려면 firewall_logging_enable="YES"를 추가하고 부팅시 규칙들이 세팅되고 있는 동안 firewall을 그대로 두려면 firewall_quiet="YES"을 추가합니다. 이제 /etc/rc.firewall을 열어 이런 문장이 있는 곳을 찾습니다.:

# Everything else is denied by default, unless the
# IPFIREWALL_DEFAULT_TO_ACCEPT option is set in your kernel
# config file.

여러분은 바로 위의 예제처럼 rc.firewall에 규칙들을 추가하면 됩니다. IPFW를 위한 구문은 ipfw [-N] command [index] action [log] protocol addresses [options] 입니다.
 규칙을 추가하려면 {$fwcmd}로 시작해야 하는데 이것은 ipfw와 같은 말로 rc.firewall에서 사용됩니다. command에는 만일 우리가 규칙을 추가한다면 add 라고 칩니다. action에는 패킷을 드롭시키고 패킷이 드롭된 소스 주소를 icmp로 알려주려면 reject를 사용하고 패킷 전달을 허용하려면 allow를, 패킷을 거부하고 소스 주소를 알리지 않으려면 deny를 사용합니다. protocol에는 tcp, udp, icmp 또는 모두 를 사용할수 있습니다. address의 문법은 from source_address [port,[port-port]] to destination_address [port,[port-port]] 입니다. 어드레스에 호스트네임이나 ip 를 쓰지 않고 any을 사용해도 됩니다. 아래의 예제는 보안을 염려하는 사람이나 서버를 운영하지 않는 사람에게 추천할 만 합니다.

# ipfw add deny tcp from any to localhost 1-1024 setup

(위 의 문장은 1-1024 포트로 들어오는 모든 트래픽을 차단할수 있는데 여러분이 제공하는 서비스를 누군가 사용하는 걸 원하지 않는다면 이렇게 하는 것이 좋습니다. 단 이렇게 되면 현 시스템이 외부세계와 접속이 불가능하다는 것을 알아야 합니다.)

# ipfw add deny tcp from any to localhost 6000-6063

(위의 문장은 X 윈도우를 이용하여 외부로 나가는 트래픽을 차단합니다.)
위의 예제들은 기초적인 몇가지 일 뿐입니다. 적절한 firewall 셋업은 여러분의 보안성을 높여주지만 그렇다고 결코 뚫을 수 없는 무적은 아닙니다. IPFW에 대해서 더 많은 정보를 원한다면 FreeBSD 핸드북을 보시기 바랍니다.(http://www.freebsd.org/handbook/firewalls.html).


Chapter 4. Services

4.1 INETD

Inetd는 telnet, ftp, sendmail 등을 포함하여 여러가지 시스템 서비스를 구동시키는 데몬입니다. inetd의 configuration 화일은 /etc/inetd.conf 인데 이 화일안에는 아래와 같이 엔트리를 가지고 있습니다.:

ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
telnet stream tcp nowait root /usr/libexec/telnetd telnetd
#shell stream tcp nowait root /usr/libexec/rshd rshd

가장 중요한 규칙은 원하지 않는 문장 앞에는 '#' 표시가 있다는 겁니다. 만일 어떠한 서비스도 원하지 않을 경우에는 보안성을 높이기 위해 inetd_enable="YES"을 inetd_enable="NO"로 바꾸어 줍니다. 컴퓨터에서 단지 shell 만을 원할 때는 inetd를 오프시키고 /usr/ports/security에서 ssh2를 설치하는 편이 낫습니다.
여러분이 telnetd만 사용하기로 했다면 몇가지 flag를 추가시켜야 하는데 그 중 두가지는 -h와 -U입 니다. -h는 사용자들이 완전히 로그인할때 까지 호스트의 특정 인폼을 보지 못하도록 하는 것이고 -U는 호스트네임으로 전환되지 않는 ip들을 막아줍니다.

telnet stream tcp nowait root /usr/libexec/telnetd telnetd -h -U

ftp 문장을 보면 -l 옵션이 붙은것을 알수 있습니다. 이 옵션은 logging이 가능토록 하는 것인데 ftp가 syslogd에 로그인 가능해야만 합니다. 이렇게 하려면 아래의 문장을 /etc/syslog.conf 에 추가해야 합니다. :

ftp.* /var/log/ftpd

ftpd의 추가적인 logging을 위해 -l을 추가 할수도 있습니다.

4.2 Standalone 데몬

여러분은 INETD를 사용하는 것 보다 대신 standalone daemon을 실행하는 것이 낫습니다.
 /etc/rc.conf의 아래 문장을 수정해서 INETD를 사용하지 않도록 할 수 있습니다.

inetd_enable="YES"

이렇게 바꾸세요.

inetd_enable="NO"

INETD 는 다음 리부팅 할때 부터는 동작하지 않을 것입니다. 지금 바로 동작하지 않게 하려면 이렇게 하면 됩니다.:

killall inetd

이제 rc.network의 아랫부분에 daemons을 추가해 보기로 하겠습니다. 제가 INETD 대신 standalone daemon을 실행시키라고 강조했던 프로그램이 바로 ssh2 입니다. standalone을 실행시키면 훨씬 빨라집니다.

Chapter 5. DES와 MD5

5.1 비밀번호 암호화

4.2-RELEASE 이전에 FreeBSD는 기본 시스템 패스워드 암호화 기법으로 DES를 사용했습니다. 현재는 MD5가 기본입니다. FreeBSD는 DES에 대한 US 수출법의 규제 때문에 MD5로 바꾸게 되었습니다. MD5는 DES 보다 더욱 보안성이 좋다고 여겨졌기 때문에 MD5로 바꿔 사용하는 것에 별 손해는 없습니다. DES is there strictly for backward compatibility.
여러분이 사용하고 있는 패스워드 형태는 쉽게 알수 있습니다. 한 예로 /etc/master.passwd file을 보면 MD5 패스워드는 $1$로 시작하고 그 문장이 DES보다 길다는 것을 알수 있습니다.
여러분의 시스템이 사용하는 패스워드 형태를 알려면 아래와 같이 해서 libcrypt*가 가리키는 곳을 보십시요.

ls -l /usr/lib/libcrypt*

심볼릭 링크가 libdescrypt*을 가리킨다면 여러분은 DES를 사용하는 것이고 libmd5crypt*를 가리킨다면 MD5를 사용하는 것입니다.

DES를 사용하는 시스템 예제

          bash# ls -l /usr/lib/libcrypt*

          lrwxr-xr-x  1 root  wheel       13 Dec  6 22:18 /usr/lib/libcrypt.a -> libdescrypt.a

          lrwxr-xr-x  1 root  wheel       14 Dec  6 22:18 /usr/lib/libcrypt.so -> libdescrypt.so

          lrwxr-xr-x  1 root  wheel       16 Dec  6 22:18 /usr/lib/libcrypt.so.2 -> libdescrypt.so.2

          lrwxr-xr-x  1 root  wheel       15 Dec  6 22:18 /usr/lib/libcrypt_p.a -> libdescrypt_p.a

          -r--r--r--  1 root  wheel  1259976 Dec  6 22:38 /usr/lib/libcrypto.a

          lrwxr-xr-x  1 root  wheel       14 Dec  6 22:38 /usr/lib/libcrypto.so -> libcrypto.so.1

          -r--r--r--  1 root  wheel   782240 Dec  6 22:38 /usr/lib/libcrypto.so.1

          -r--r--r--  1 root  wheel  1341942 Dec  6 22:38 /usr/lib/libcrypto_p.a

          bash#
         
Chapter 6. 결론

6.1 기억해야 할 규칙들

위의 방법을 따라하면 안전한 FreeBSD를 구축할 수 있습니다. 잊지말아야 할 중요한 사항은 새로운 취약점들이 지속적으로 대두되고 있다는 것입니다. 이 말은 여러분은 항상 최신 소스 코드를 유지해야한다는 말이며 freebsd-security@freebsd.org을 받아보길 진심으로 바랍니다.

기억해야 할 것은 :

소스를 최신 버젼으로 유지하기
불필요한 suid-root 프로그램은 설치하지 않기
firewall 규칙들을 최신으로 유지하기
범용적인 것을 사용하기 - 소스 없는 프로그램은 실행시키지 않기

6.2 참고자료
FreeBSD Handbook

2012-09-07

Linux]리눅스보안의 기초




          리눅스 보안의 기초

         

          보안

  리눅스 운영체제가 인기가 좋은 이유 중 하나는 다른 서버 운영체제에 비해 저렴하다는 것과, 기능과 성능에 있어서 강력하다는 것일 것입니다. 그러나 강력한 시스템인 동시에 관리하기 어렵고, 그에 따른  보안 위험도 크다는데 문제가 있습니다. 본 기사는 리눅스 시스템에 있어 기본적이면서 일반적인 보안에 대해 설명하고자 합니다. 본문은 또한 와우리눅스 7.0 까치를 기준으로 설명하고 있지만 다른 레드햇 계열 리눅스 시스템에도 적용이 가능합니다.
         


          물리적 보안

  보통 서버가 연구실이나 외부 사람이 많이 오가는 곳에 설치되어 있다면 그 사람들 중 물리적인 크래킹을 하려는 사람이 있는데 이에 대한 방어를 할 수 있는 것은 주로 BIOS와 LILO(리눅스 부트 로더)에 대한 패스워드를 설정하는 작업과 콘솔에서 root로 로그인을 못하게 설정하는 것으로 구성됩니다.
       


          ■ BIOS


  콘솔로의 접근을 막기 위해서는 BIOS 에 암호를 설정해두고, 플로피와 CD-ROM으로의 부팅은 하지  못하도록 설정합니다. 일단 물리적으로 시스템에 접속하게 되면 시스템을 보호할 방법은 없다는  것을 명심해야 합니다.


          ■ LILO


   다음과 같이 lilo 설정 파일 (/etc/lilo.conf)을 수정하여 부팅시 암호를 걸 수 있습니다.           

               password=xxx

   와 같이 패스워드를 설정함으로써 부팅 프로세스가 진행되는 동안 시스템을 보호할 수 있습니다.    restricted 옵션을 사용하여 싱글 유저모드로 부팅할 때와 같이 특별한 옵션을 사용할 때에 대비하여 패스워드를 물어보도록 설정합니다.
         

          boot=/dev/sda
          map=/boot/map
          install=/boot/boot.b
          prompt
          message=/boot/message
          default=linux
          timeout=00 # 대기 시간을 00초로 설정합니다.
          restricted # 특수한 옵션을 사용할 경우 암호를 묻습니다.
          password=openlinux # 이 라인을 추가하고 암호를 설정합니다.
          image=/boot/vmlinuz-2.2.17-8wl2smp
          label=linux
          initrd=/boot/initrd-2.2.17-8wl2smp.img
          read-only
          root=/dev/sda6

         
  리로(LILO) 설정파일의 암호가 암호화되지 않은 일반 텍스트이므로, 루트만이 억세스 할 수 있도록  다음과 같이 합니다.

          # chmod 600 /etc/lilo.conf
         

   리로(LILO) 설정 파일을 수정한 다음 리로를 실행하여 갱신합니다.

          # /sbin/lilo  -v

         

  마지막으로 리로 설정 파일의 변경을 막기 위해  lilo.conf 파일을 chattr 명령으로 변경 불가로          만듭니다. (이 명령은 ext2 파일 시스템에서만 사용 가능합니다.)
         

          # chattr  +i /etc/lilo.conf
         


          ■ Control-Alt-Delete


  리눅스에서는 Ctrl + Alt + Del 키 조합을 사용하여 시스템을 리부팅 시킬 수 있습니다. 문제는 이러한 기능을 로그인 대기 상태에서도 사용할 수 있고 내부의 다른 사람이 이러한 기능을 이용하여 콘솔에서 서비스중인 시스템을 리부팅 시킬 수 있다는 점입니다. 따라서 Control-Alt-Delete 키 조합을 사용하지 못하도록 합니다.
   /etc/inittab 파일에서 다음과 같은 라인을 찾아 주석처리 합니다.

          #ca::ctrlaltdel:/sbin/shutdown -t3 -r now


  수정한 것을 리부팅하지 않고 바로 적용하려면,

          # /sbin/telinit  q

  와 같이 합니다.

         
          패치 설치

    설치 후 시스템이 재시동되고 나면 반드시 패치를 설치합니다.  패치는 OS별로 제공되어지는데 레드햇 리눅스는 다음 사이트를 참조하기를 바랍니다.


          레드햇 리눅스 패치 사이트 : http://www.redhat.com/support/errata/

  여기에 있는 보안, 버그 패치들을 적용하지 않으면 시스템은 쉽게 침해 당할 것입니다. 또한 리눅스   시스템은 고립된 네트워크에 연결된 채 중계 서버를 통해 패치되어야 함을 잊지 말도록 합니다.  레드햇의 경우 rpm 파일을 다운받으면 다음의 명령어를 통해 쉽게 설치할 수 있습니다.

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


        사용하지 않는 서비스 제거

  리눅스 시스템을 보안 위험으로부터 보호하는데 있어, 제일 처음으로 하는 작업이 바로 불필요한 서비스를  제거하는 것입니다. 리눅스 시스템은 디폴트로 여러 유용한 서비스를 설정하고 실행하도록 되어 있습니다.
  그러나, 이 서비스들의 대부분은 일반적인 환경에서는 필요하지 않으며, 보안측면에서 볼 때, 잠재적인 위험을 지니고 있습니다. 이러한 서비스를 제거함으로써 보안 영역을 크게 넓힐 수 있습니다.


          ■ xinetd 서버를 사용하는 경우


  리눅스 6.2까지는 네트워크 연결을 처리하기 위해서 inetd를 사용하였습니다. 그러나 레드햇 리눅스  7.0부터는 inetd를 사용하지 않고 보다 확장된 xinetd를 사용합니다. xinetd 서버를 사용하는 경우에는   /etc/xinetd.d/ 디렉토리 아래에 서비스 이름으로 구분되어 있으므로 서비스 파일을 열어서 수정합니다.
  텔넷 서비스의 경우 telnet 파일을 수정합니다. 다른 서비스도 동일한 방법으로 설정합니다.

          service telnet
          {
         disable = yes # 이 항목을 추가하면 서비스를 하지 않습니다.
         flags = REUSE
         socket_type = stream
         wait = no
         user = root
         server = /usr/sbin/in.telnetd
         log_on_failure += USERID
          }


          이렇게 수정한 후 아래와 같이 xinetd 서버를 재시작하면 시스템에 적용 됩니다.

          # killall -USR2 xinetd
         


          ■ inetd 서버를 사용하는 경우 (레드햇 6.2)


 먼저, /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

         

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

          1. 소유자(root)만이 읽기/쓰기가 가능하도록 퍼미션을 바꾸어 줍니다.
              또한, 반드시 /etc/inetd.conf 파일의 소유자는 root 이어야 합니다.
       

          # chmod 600 /etc/inetd.conf

          # chown root.root /etc/inetd.conf
         

          2. 편집한 후에는 다음처럼 시그널을 보내 inetd 서버를 재구동합니다.

          # killall -HUP inetd

         
          3. super-user만이 이 파일에 대해 접근할 수 있도록 'inetd.conf'파일을 셋팅하는 
             것으로 일단 셋팅되면  수정, 삭제 또는 rename할 수 없습니다. 나중에 
             inetd.conf 파일을 수정하고자하면 플래그를 -i로
             바꿔주면 됩니다.

          # chattr +i /etc/inetd.conf

         


          ■ rc 스크립트


   보안이 약한 데몬이 떠 있지 않다면 그 만큼 안전하다는 것이므로 부팅시 필요없는 데몬을 죽이는 것만으로도  80% 이상의 방어를 할 수 있습니다.
  다음은 init 프로세스에 의해 어떤 서비스가 시작될 지 결정하는 .rc 스크립트들입니다. 레드햇의 경우 이 스크립트들은 /etc/rc.d/rc3.d에 있습니다. 자동으로 Gnome이나 KDE등의 GUI 환경으로 부팅되도록 설정되어 있다면 /etc/rc.d/rc5.d에 있습니다.
  시동되도록 되어 있는 것을 멈추게 하려면 대문자 S를 소문자 s로 바꿉니다. 또 원한다면 레드햇의 유틸리티를 사용할 수 있습니다. '/usr/sbin/ntsysv' 명령을 실행하면 부트 프로세스중에 구동시킬 스크립트를 선택할 수 있습니다.
  다른 방법은 대부분의 배포판에서 볼 수 있는 '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 데몬, 시스템 관련 정보를 원격 사용자에게 보냄
         

  이름에 포함된 숫자들은 초기화 되는 순서를 결정하는 요소로서, 이것은 어떤 배포판인지 어떤 버전인지에  따라 달라집니다.

         
          스크립트        설 명
          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



          ■ /etc/rc.d/init.d 디렉토리와 파일들의 퍼미션


   "/etc/rc.d/init.d" 디렉토리와 파일들의 퍼미션을 다음과 같이 수정하여 루트만이 억세스 할           수 있도록 합니다.

          # chmod -R 700 /etc/rc.d/init.d/*
         

  부트 타임때 필요로 하는 모든 표준의 프로세스들의 시작, 중지를 위한 책임이 있는 스크립트들은 루트만이 억세스 할 수 있도록 퍼미션을 고정시켜야 합니다.

         


          계정관리 보안



          ■ 암호시스템 보안


  첫 번째는 /etc/passwd 파일을 안전하게 하는 것입니다. 우선 시스템이 /etc/shadow를 사용하는지  확인합니다. 이것은 모든 사용자의 패스워드를 root만이 접근 할 수 있는 파일에 해쉬형태로 안전하게 저장한다는 것을 의미합니다. 또한 해커들이 제일 먼저 노리는 패스워드가 손쉽게 접근되고 크랙되는 것을 방지합니다. 쉐도우 패스워드 파일을 사용하는 것이 레드햇 리눅스의 디폴트이지만 확인을 해야 합니다.
  다음 명령어를 실행하면 자동으로 패스워드 파일을 /etc/shadow 파일로 변환해 줍니다.

          # pwconv
         


          ■ 기본 시스템 계정 관리


  두 번째는 /etc/passwd 파일에서 대부분의 디폴트 시스템 계정들을 제거하는 것입니다. 리눅스는 이런 계정들을 불필요할지도 모르는 시스템 작업을 위해 제공합니다. 필요하지 않다면 제거해야 합니다. 계정을 많이 가지면 가질수록 침입될 가능성은 높아집니다. 'news' 계정이 그 한 예입니다. 뉴스그룹 서버로 사용하기 위해 nntp를 서비스하는 경우가 아니면 이 계정은 불필요합니다. ftp 서버를 운영하지 않는다면 익명 ftp 접속에 사용되는 'ftp' 계정도 삭제해야 합니다. /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:/:

  ftp 서버를 운영한다면 /etc/ftpusers 파일도 수정해야 합니다.
         

          [ /etc/ftpusers 파일의 예 ]

          root
          bin
          daemon
          adm
          lp
          mail
          uucp
          nobody


  이 파일에 기록된 계정은 ftp를 사용해서 이 시스템에 접속할 수 없습니다. 이것은 root, bin과 같은 공통의 시스템 계정을 사용해 ftp로 연결하는 것을 제한합니다. 리눅스는 디폴트로 이 파일을 가지고 있습니다. root 권한으로 이 시스템에 ftp를 통해 접속하는 것을 막으려면 이 파일에 root가 포함되어 있는지 확인합니다. ftp 접속시 사용할 계정은 이 파일에 포함되면 안됩니다.


  또 root로는 시스템에 telnet 접속을 못하도록 합니다. root로 작업 할 때는 따로 일반계정을 두어 자기의 계정으로 접속한 뒤 su를 사용해 root로 전환하도록 합니다.

         


          ■ 일반 유저의 su root 방지


  특정 유저만 su root 할 수 있도록 설정하려면 다음과 같이합니다. 이런 종류의 명령어를 실행시킬 수 있는 사용자들을 제한함으로써 시스템의 보안성을 향상시킬 수 있습니다. /etc/pam.d/su 파일의 처음에 다음을 추가합니다.

          auth sufficient /lib/security/pam_rootok.so debug
          auth required /lib/security/Pam_wheel.so group=wheel


  /etc/group 의 wheel 그룹에 su root를 허용하고자 하는 사용자 그룹을 등록합니다. 즉, wheel 그룹에 속한 유저만이 su 명령을 사용하여 root 로 로그인 할 수 있습니다.

          wheel:x:10:root,junilove,juni8004
         


          ■ 쉘 로그 파일


 bash 쉘은 사용자가 입력한 500여개의 지난 명령어를 ~/.bash_history 에 남기게 됩니다.         이는 내가  사용한 명령어들을 다른 사람들이 알게 됩니다. 다음과 같이 크기를 줄이거나,          0으로 설정해 아예 로그를  남기지 않도록 하여 크래커가 로그 파일의 내용을 이용할 수          없도록 합니다. 이러면 .bash_history 파일에  아무런 기록이 남지 않습니다.  이렇게 해도 HISTSIZE라는 환경변수가 있기에 키스트로크에 대한 히스토리 관리는 유지됩니다. 단지 .bash_history 파일에 저장되지 않을 뿐입니다.

          HISTFILESIZE=30
          HISTSIZE=30

 또는 로그아웃 할 때마다 로그 파일을 삭제하도록 다음과 같은 라인을 ~/.bash_logout 에 추가합니다.
         
          # rm -f $HOME/.bash_history



          ■ root 계정 환경 설정


  루트 계정은 유닉스 시스템에서 가장 강력한 권한을 가지고 있는 계정입니다. 만약  관리자가 콘솔로의  접속 후, 로그아웃 하는 것을 잊고 루트 프롬프트를 그대로 놔두었다면, 위험한 상황이 벌어질수도 있습니다. 이런 상황을 피하기 위해 TMOUT  변수를 사용할 수 있습니다. /etc/profile 파일 또는 루트의 해당 쉘의 설정파일,  예를 들어, bash 라면 ~/.bash_profile 에 다음과 같이 설정합니다.

          HISTSIZE=0
          HISTFILESIZE=0
          TMOUT=300

   숫자는 초단위입니다. 300초 즉, 5분동안 아무런 입력이 없다면 자동으로 로그아웃 합니다. HISTSIZE 와 HISTFILESIZE 를 0으로 해두는 것도 만약을 위한 조치입니다.



          파일 시스템 마운트


  잘못된 파일 시스템 마운트 옵션도 보안에 문제가 될 수 있습니다.

          [ 파일 시스템 마운트 설정 파일(/etc/fstab)의 옵션 ]

          옵  션            설  명

          defaults        기본 옵션, 쓰기,읽기 가능, quota, suid 가능
          noquota       유저 쿼타가 적용되지 않음
          nosuid          SUID/SGID 억세스 불가, SUID/SGID를 사용자의 
                               홈 디렉토리에서 쓰게 할 이유는 전혀 없습니다.
          nodev           특별한 장치 또는 문자 사용 불가 (예를 들어 /dev 같은)
          noexec         이 파티션상의 모든 바이너리 실행 불가
          quota            유저 쿼타 사용
          ro                  읽기 전용으로 마운트
          rw                  읽기, 쓰기 허용
          suid               SUID/SGID 억세스 허용

         
 /etc/fstab 의 형식은 다음과 같습니다

          [ /etc/fstab의 예 ]

          /dev/hda9 /tmp ext2 defaults,rw,nosuid,nodev,noexec 1 2
          /dev/fd0 /mnt/floppy auto sync,user,noauto,nosuid,nodev 0 0
          /dev/cdrom /mnt/cdrom auto user,noauto,nosuid,exec,nodev,ro 0 0


  fstab의 수정 후에는 파일 시스템을 다음과 같이 다시 마운트 합니다.

          # mount -oremount /tmp/
         

          시스템 정보 숨기기

  기본적으로 리눅스 서버로 로그인 할 때, 배포본, 버전, 커널 버전, 서버이름 등이 나타나도록 되어 있습니다. 이것은 서버를 노리는 크랙커들에게 더 많은 정보를 줄 뿐입니다.


          ■ "/etc/rc.d/rc.local" 의 수정


    rc.local 에는 매 부팅시마다 /etc/issue 파일을 생성하는 루틴이 있습니다.  이 부분을 모두 주석처리 합니다.


          # This will overwrite /etc/issue at every boot. So, make any changes you
          # want to make to /etc/issue here or you will lose them when you reboot.
          #echo "" > /etc/issue
          #echo "$R" >> /etc/issue
          #echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue
          #
          #cp -f /etc/issue /etc/issue.net
          #echo >> /etc/issue

  그런 다음, /etc 디렉토리 아래에 있는 "issue.net" 와 "issue" 파일들을 삭제합니다.


          # rm -f /etc/issue
          # rm -f /etc/issue.net
         


          SUID/SGID 프로그램 찾기


   일반 유저가 루트 권한으로 실행 시킬 수 있는 불필요한 SUID/SGID 프로그램들을 최소화 합니다. SUID와 SGID는 잠재적인 보안 위험 요소이기 때문에 철저하게 감시되어야만 합니다. 이러한 프로그램들은 이들을 사용하는 사용자들에게 특별 권한을 부여해 주기 때문에, 보안에 불안 요소를 주는 이러한 프로그램들이 설치되는 일이  없도록 해야 합니다. 크랙커들이 좋아하는 트릭중의 하나는 SUID 루트 프로그램을 침탈하고, 그 후에 SUID 프로그램을 통해 백도어로 들어오는 것입니다. 다음의 명령어를  사용하면 시스템에 있는 모든 UID/SGID 프로그램을 찾아낼 수 있습니다.

          # find / -type f  ( -perm -04000 -o -perm -02000  ) -exec  ls  ­lg {} ;

  그런 다음 퍼미션을 바꾸어 줍니다.

          # chmod a-s [프로그램]


  어떠한 프로그램인지 잘 모를 경우에는 man [프로그램] 또는 info [프로그램] 등으로  확인한 후  변경합니다.


  중요한 시스템 파일의 퍼미션

          파일           퍼미션    설명

          /var/log       751     모든 로그 파일을 담고 있는 디렉토리
          /var/log/messages 644 시스템 메시지
          /etc/crontab 600 시스템 크론탭 설정
          /etc/syslog.conf 640 Syslog 데몬 설정파일
          /var/log/wtmp 660   who 명령에 의해 보여지는 현재 로그인한 유저가 
                                             누구인지  기록하는 파일
          /var/log/lastlog 640 last 명령에 의해 보여지는 마지막에 로그인한 
                                               유저가  누구인지 기록하는 파일
          /etc/ftpusers 600 FTP 서버에 접속할 수 없는 유저 리스트
          /etc/passwd 644 시스템의 유저 계정 리스트
          /etc/shadow 600 암호화된 계정 패스워드를 담고 있는 파일
          /etc/pam.d 750 PAM 모듈 설정 파일
          /etc/hosts.allow 600 접근 설정 파일
          /etc/hosts.deny 600 접근 설정 파일
          /etc/lilo.conf 600 부트로더 설정파일
          /etc/securetty 600 root 로그인을 허가하는 TTY 인터페이스 리스트
          /etc/shutdown.allow     400 ctrl+alt+del 사용을 허가하는 유저 리스트
          /etc/security 700 시스템 접근 보안 정책 파일들
          /etc/rc.d/init.d 750 시작 부트 스크립트 파일
          /etc/sysconfig 751 시스템과 네트워크 설정 파일
          /etc/services 600 서비스명과 포트를 나타내는 파일입니다.
          /etc/inetd.conf 600 인터넷 슈퍼서버 데몬 설정파일
          /etc/cron.allow 400 cron 사용을 허가하는 유저 리스트
          /etc/cron.deny 400 cron 사용을 불허하는 유저 리스트
          /etc/ssh 750 보안쉘(ssh) 설정 파일
          /etc/sysctl.conf 400 최근 레드햇 리눅스에서 커널 tunable 옵션을 담고 있는 파일

         

   레드햇 리눅스를 기반으로 리눅스 시스템을 안전하게 하기 위한 기본적인 조치사항들을           살펴 보았습니다.



   100% 안전한 시스템은 없지만 여기서 기술된 것만 적용해도 리눅스 시스템의 안전성은 상당히 높아질 것입니다. 시스템의 안전한 보호를 위해서는 지속적으로 보안 사항들을 살펴보아야 할 것입니다. 또한 CERT 홈페이지(http://www.certcc.or.kr/)를 위시한 보안 전문 컨설팅 사이트와 시스템 벤더 사이트를 정기적으로 방문하여 보안 권고 사항들에 대해서 주의깊게 살펴보며, 새로운 취약성이 발견되면 그에 따른 패치설치 및 보안 권고에 충실히 따르도록 해야 합니다.


          참고자료

          리눅스 시스템 관리자를 위한 보안 지침Ⅰ, CERTCC-KR, http://www.certcc.or.kr
          Linux Security Tips, 임은재님 번역, http://kltp.kldp.org
          리눅스 보안 하우투, http://kldp.org/HOWTO/html/Security/Security-HOWTO.html