번역: 윤봉환 / el@linuxlab.co.kr
|
이 기사에서 나는 리눅스 박스를 안전하게 만드는 기초를 설명하려 한다. 레드햇 리눅스 박스 보안을 염려하는 모든 이들에게 유용할 것이다.
BIOS 보안 플로피디스크로 부트하거나 BIOS 설정 값을 바꾸지 못하도록 BIOS에는 항상 패스워드를 설정해 두어야 한다. 이렇게 해 두면 여러분의 몰래 특별한 목적으로 만들어진 부트 디스크를 이용해 리눅스 시스템을 부트하려는 이들을 막고, 플로피 디스크 드라이브로 부트하거나 패스워드를 묻는 프롬프트 없이 서버를 부트하려는 이들로부터 시스템을 보호할 수 있다.
LILO 보안 "/etc/lilo.conf" 파일에 time-out, restricted, password 등 패러미터 세 개를 추가한다. 이 옵션들을 설정하면 부트할 때에 특별한 옵션들을(예를 들어 "linux single" 등) 넣어 패스워드 없이 루트로 로긴하려 할 때에도 패스워드를 묻는다. Step 1 boot=/dev/hda Step 2 [root@kapil /]# chmod 600 /etc/lilo.conf root를 제외한 다른 이들은 이제 "/etc/lilo.conf" 파일을 읽지 못할 것이다. Step 3 [Root@kapil /]# /sbin/lilo -v Step 4 * 파일을 바꿀 수 없게 만들려면(immutable) 다음 명령을 사용한다: 이렇게 설정해 두면 어떻게 해도 "lilo.conf" 파일을 바꿀 수 없을 것이다.(우연히 혹은 그 밖의 다른 이유로) lilo 보안에 대해 더 많은 정보가 필요하면 http://www.linux4biz.net/articles.htm을 읽어본다.
특수한 계정을 모두 막는다 리눅스를 설치하면 자동으로 생성되는 계정 가운데 lp, sync, shutdown, halt, news, uucp, operator, games, gopher 등 여러분이 실제로 사용하지 않는 계정은 모두 없애는 것이 좋다. 사용자 계정을 없앨 때에는: 그룹을 없앨 때에는:
좋은 패스워드를 고른다 좋은 패스워드를 고르기 전에 아래 규칙에 따라 패스워드 최소 길이를 설정한다. 패스워드 길이: PASS_MIN_LEN 5 숫자 5들 아래처럼 8로 바꾼다: "login.defs" 파일은 로긴 프로그램의 환경 설정 값을 넣어두는 파일이다.
섀도우 패스워드를 활성화한다 섀도우 패스워드도 설정해야 한다.
root 계정 "root" 계정은 유닉스 계열 시스템에서 매우 강력한 권한을 가진 계정이다. root로 로긴한 시스템 관리자가 로그아웃하는 것을 깜빡 잊고 root 프롬프트를 남겨둔 채 떠나버렸다면, 타임아웃을 설정해 두고 일정한 시간이 지나서 자동으로 로그아웃하도록 설정할 수 있다. "TMOUT" 변수에 초단위로 타임아웃 시간을 설정하면 된다. "vi /etc/profile" 명령으로 프로파일을 열어서 아래 설정을 적당한 곳에 덧붙인다. "HISTFILESIZE=" "TMOUT=" 변수에 설정한 값은 1 시간을 뜻한다. (60 * 60 = 3600 초) 이 줄을 "/etc/profile"에 넣어 두면 사용자가 접속해서 한 시간이 지나도록 아무 것도 하지 않을 때 자동으로 로그아웃한다. 사용자 홈 디렉토리 아래 ".bashrc " 파일에 넣어두고 개인적으로 사용할 수도 있다.
일반 사용자에 대해 모든 콘솔 접속을 제한한다 shutdown, reboot, halt 등 프로그램은 일반사용자가 콘솔을 통해 접근할 수 없도록 만들어야 한다. 그렇게 하려면, 다음 명령을 실행한다: [root@kapil /]# rm -f <servicename>에는 콘솔-을 통해 접근할 수 없도록 설정할 프로그램을 써 넣는다.
사용하지 않는 모든 프로그램을 제한하거나 지워버린다 여러분 서버에서 사용하지 않는 서비스는 제한하고 제거한다. "/etc/inetd.conf" 파일을 열어서 여러분에게 필요 없는 서비스가 등록된 줄 맨 앞에 # 문자를 넣어 접속을 막는다. 그리고 inetd 프로세스에 SIGHUP 시그널을 보내서 "inetd.conf"파일을 새로 읽어들이게 한다. 다음과 같은 절차를 따른다: Step 1 [Root@kapil /]# chmod 600 /etc/inetd.conf Step 2 Step 3 ftp, telnet, shell, login, exec, talk, ntalk, imap, pop-2, pop-3, finger, auth Step 4 [root@kapil /]# killall -HUP inetd Step 5 [root@kapil /]# chattr +i /etc/inetd.conf 이제부터는 "inetd.conf" 파일이 바뀌지 않도록(고의든 아니든) 보호될 것이다. 슈퍼유저인 root만 이 속성을 설정하거나 제거할 수 있다. inetd.conf 파일을 고쳐야 할 일이 생긴다면 다음 명령으로 불변(immutable) 플래그를 제거한다: * 불변 속성을 제거하려면 다음 명령을 실행한다: [root@kapil /]# chattr -i /etc/inetd.conf
TCP_WRAPPERS TCP_WRAPPERS를 이용하면 허용하지 않는 외부 주소로부터 들어오는 침입을 막아 보안을 강화시켜 준다. 가장 좋은 정책은 "/etc/hosts.deny" 파일을 열어 "ALL: ALL@ALL, PARANOID" 줄을 추가해서 모든 호스트를 기본적으로 거부(deny)한 다음, "/etc/hosts.allow" 파일을 열어 신뢰할 수 있는 호스트만 열어주는 것이다. TCP_WRAPPERS는 아래 두 파일로 제어되는데 일단 일치하는 규칙을 찾으면 다른 규칙들은 비교하지 않는다.(규칙을 찾는 순서는 아래 순서대로이다) /etc/hosts.allow Step 1 # 모든 접속을 거부 Which means all services, all locations is blocked, unless they are permitted access by entries in the allow file. Step 2 예를 들어: Step 3 * tcpd 래퍼를 설정한 다음에 tcpdchk 프로그램을 실행한다.
시스템 issue 파일을 외부에 노출시키지 말라 외부에서 여러분의 서버에 로그할 때 시스템 issue 파일이 노출되지 않도록 설정해야 한다. 이렇게 하려면 "/etc/inetd.conf" 파일을 편집해서 telnet 옵션을 바꾼다. telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd 위 줄을 다음처럼: telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h 줄 끝에 덧붙인 "-h" 플래그는 (hush) 텔넷 데몬이 시스템 정보를 보여주지 않도록 설정하므로 사용자는 login: 프롬프트만 만나게 될 것이다. 그러나 이 것만으로는 안전하지 않다. 오고 가는 데이터를 암호화하는 sshd를 사용하라고 권하고 싶다.
"/etc/host.conf" 파일을 바꾼다. "/etc/host.conf" 파일은 이름을 해석하는 방법을 지정한다. host.conf 파일을 열어 (vi /etc/host.conf) 다음 줄들을 추가한다: # 먼저 DNS를 통해 이름을 검색하고 다음에 /etc/hosts로 돌아간다. 첫 번째 옵션은 호스트 이름을 해석할 때 DNS를 먼저 찾아보고 hosts 파일을 이용하도록 설정한다. multi 옵션은 "/etc/hosts" 파일에서 한 머신에 IP 주소 여러 개를 설정할 수 있도록 허용한다. (eth0, eth1, ... ethN 등 인터페이스가 여러개)
"/etc/services" 파일을 감염되지 않도록 보호한다. "/etc/service" 파일은 함부로 지워지거나 서비스를 추가하지 못하도록 반드시 보호해야 한다. * "/etc/services" 파일을 보호하려면 다음 명령을 사용한다:
다른 장치에서는 root로 로긴하지 못하게 만든다 "/etc/securetty" 파일은 "root" 사용자로 로긴 할 수 있는 TTY 장치를 지정한다. "/etc/securetty" 파일을 열어서 필요 없는 tty는 모두 주석으로 바꾼다. (# 문자를 줄 처음에 끼워 넣는다)
다른 사용자가 su 명령으로 root가 되는 것을 막는다 su (substitute user) 명령은 한 사용자가 같은 시스템 안에 있는 다른 사용자가 될 때 사용하는 도구이다. 여러분이 허용한 사용자가 아니라면 su 명령을 사용할 수 없도록 설정하려면 "/etc/pam.d/" 디렉토리 아래 "su" 설정 파일을 열어 맨 꼭대기에 다음 두 줄을 덧붙인다. Step 1 이 설정은 "wheel" 그룹의 사용자만 su 명령으로 root가 될 수 있도록 허용한다; 그리고 누군가가 root로 su 했다면 기록을 남긴다. 이제부터는 su 명령으로 root가 되는 것을 허용할 사용자를 wheel 그룹에 추가하기면 된다.
셸을 사용한 기록 bash 셸은 자주 사용하는 명령이나 긴 명령들을 나중에 또 써먹을 수 있도록 "~/.bash_history" 파일에 유저가 사용한 명령을 500 개 저장한다.( "~/"은 여러분의 홈 디렉토리를 나타낸다, 혹은 1000 이 기본 값일 수도 있다) 그래서, 시스템에 계정을 가지고 있는 사용자마다 홈 디렉토리에 "bash_history"라는 이름을 가진 파일이 생기게 된다. 시스템 자원을 아끼고, 사용기록을 노출하지 않기 위해 bash 셸이 명령을 조금만 저장하고, 로그아웃할 때에는 이 것을 지우도록 만든다. Step 1 profile 파일을 열어 (vi /etc/profile) 아래처럼 바꾼다: HISTFILESIZE=30 이 설정은 각 사용자마다 홈 디렉토리에 있는 "Bash_history" 파일에 지나간 명령을 조금만 저장할 수 있도록 설정한다. Step 2 rm -f $HOME/Bash_history
Control-Alt-Delete 키를 눌러도 셧다운 되지 않게 만든다 여러분 시스템에서 "/etc/inittab" 파일을 열어 (vi /etc/inittab) 관련된 줄을 주석으로 처리한다 ("#" 문자를 이용). 먼저 다음 줄을 찾는다: ca::ctrlaltdel:/sbin/shutdown -t3 -r now 위 줄을 아래처럼 바꾼다: #ca::ctrlaltdel:/sbin/shutdown -t3 -r now 바뀐 설정을 시스템에 적용하려면 프롬프트에서 다음 명령을 실행한다: [root@kapil /]# /sbin/init q
"/etc/rc.d/init.d" 디렉토리 아래 스크립트 파일들에 설정된 퍼미션을 "/etc/rc.d/init.d" 디렉토리 아래에는 시스템이 부트할 때 띄워야 하는 모든 프로세스를 실행하거나 멈추는 역할을 하는 스크립트들이 들어 있다. 아래 명령을 실행해서 퍼미션을 조정한다: [root@kapil/]# chmod -R 700 /etc/rc.d/init.d/* 이 디렉토리에 있는 모든 파일은 root 사용자만 읽고, 쓰고, 스크립트를 실행할 수 있도록 허용한다는 뜻이다.
시스템 정보를 감추자 여러분이 리눅스 박스에 로긴할 때 리눅스 배포판 이름, 버전, 커널 버전, 서버 이름 등 시스템 정보가 기본적으로 표시된다. 이런 정보들은 크래커에게 필요한 정보를 제공하기에 충분한 것으로 이 설정을 바꾸어 "Login:"프롬프트만 나타나도록 설정해야 한다. Step 1 # 이 곳에는 부트할 때마다 /etc/issue 파일을 덮어쓰도록 설정되어 있다. Step 2 [root@kapil /]# rm -f /etc/issue
사용하지 않는 SUID/SGID 프로그램을 막아둔다. root가 소유한 프로그램에 SUID 가 설정되어 있고 이 것을 일반사용자가 실행할 수 있다면 루트 권한을 얻는데 이용할 수 있다. 그래서, 시스템 관리자는 SUID/GUID가 설정된 프로그램은 최소한으로 유지하고 필요 없이 SUID가 설정된 것들은 막아두어야 한다. Step 1 [root@kapil]# find / -type f \( -perm -04000 -o -perm -02000 \) \-exec ls lg {} \; * 아래 명령으로 위에서 찾아낸 프로그램들에서 suid 비트를 벗겨낸다: [root@kapil /]# chmod a-s [program] 위에서 제안하는 보안 권고를 모두 설정했다면 시스템 관리자가 마땅히 해야 할 기본적인 수준의 시스템 보안을 갖추게 된 것이다. 어떤 작업들은 한 번 설정한 것으로 다시 손대지 않을지 모르지만 몇 가지는 계속해서 관심을 가지고 관리해야 할 것이다. 아무튼, 시스템 관리자의 최고 덕목은 부지런함이다. Written by: Kapil Sharma [Kapil Sharma는 리눅스와 인터넷 보안 컨설턴트이다. 2년 넘게 다양한 리눅스/유닉스 시스템에서 인터넷 보안 작업을 해왔다. 무료로 리눅스와 유닉스 솔루션을 제공하는 http://www.linux4biz.net 웹 사이트를 관리한다] ------------------------------------------------------- Copyright ⓒ 2000, Kapil Sharma translation: el@linuxlab.co.kr |
Fogeaters, Light The World.
역으로 생각하면 위의 항목들은 해킹시 시도해볼만한 서버의 취약점, 침입로가 될 수 있다는 거다