번역 : 서정룡(dreamsoh@orgio.net)
|
||||||||||||||||||||||||
6월초에 출시된 Bastille-Linux 버전 1.1은 새로운 리눅스 배포판이 아닌 잠재적인 공격 위협으로부터 시스템을 보호하기 위한 일련의 스크립트로 본 문서는 교육적으로 작성되었기 때문에 리눅스 시스템에 이러한 스크립트를 설치함으로써 보안에 관한 많은 노하우를 배울 수 있다.
서문 보안문제와 관련해서 리눅스는 다른 여타 운영체제보다 우수함에도 불구하고 각각의 배포판은 이러한 보안문제에 대해 각각 다르다. Bastille-Linux는 리눅스 시스템을 보호할 수 있는 방법을 제공하는데, 처음에는 레드햇 리눅스 배포판을 위해 쓰여졌으나 최신 버전은 다른 배포판에서도 마찬가지로 원활하게 작동한다. 본 프로젝트는 주책임자 Jon Lasser와 주개발자 Jay Beale에 의해 진행되고 있으며 많은 개발자, 소프트웨어 디자이너 및 베타 테스터들이 참여하고 있다. 무엇보다도 Bastille-Linux는 새로운 리눅스 배포판이 아니라 리눅스 보안을 향상시키기 위해 perl로 쓰여진 일련의 스크립트라는 것을 명확히 하자. 물론 보안은 컴퓨터 보안을 의미한다(원치않는 사람이 리눅스 박스에 엑세스하는 것을 어떻게 피할 수 있겠는가?). Bastille-Linux는 리눅스 배포판의 초기 설치를 수정함으로써 일련의 보안문제에 대한 답변을 제공한다. 모든 시스템관리자의 기본 업무는 사용자들의 요구를 파악하여 그 요구에 부응할 뿐만 아니라, 네트워크상에서 보안 구멍을 가질 수 있는 사용되지 않는 프로그램이 계속해서 작동되는 것을 억제하는 것이다. “여러분이 가장 적게 할수록 보안은 더욱 향상된다” 물론 알고리즘 복잡성에 관한 우스개 소리지만 네트워크 관리에도 적용된다. 많은 서비스는 더욱 많은 공격장소를 제공하기 때문에 해가 되는데 공격 위협을 줄이기 위해서는 정말로 필요한 서비스만 설치하는 것이 중요하다. Bastille-Linux는 공격의 가능성을 줄이려고 하며 이를 위해 소프트웨어 디자이너는 무엇을 하는 지를 단계적으로 설명하는 매우 교육적인 접근방법을 취하고 있다.
Presentation 이 기사를 쓰는 당시 Bastille-Linux의 버전은 1.1.0으로 6월 초반에 출시되었다. 명백한 유용성 외에도 Bastille-Linux는 매우 교육적인데 스크립트는 세부적이고 정확한 질문을 던지며 이렇게 함으로써 개발자는 사용자를 가르치려고 한다. 개발자는 질문의 세부사항 및 가능한 해결방법을 설명하며 따라서 Bastille-Linux를 사용하기 쉽게 만든다. 보다 상급 사용자에 대해 perl로 작성된 소스 코드는 투명함의 전형으로 각각의 주석은 명령이 어떻게 작동하는 가를 설명하고 있다.
1.1.0 버전의 특징은 다음과 같다. - 스크립트는 기존 사용중인 시스템에서 작동한다. Bastille-Linux는 여러 가지 모듈을 갖고 있다. 4개의 일반 모듈과 특별한 업무를 위한 모듈(sendmail, FTP 등의 소프트웨어, 부트 또는 쓸모없는 데몬) 일반 모듈은 방화벽설치, 시스템 소프트웨어 업데이트, SUID-루트 프로그램의 감시, 쓸모없는 서비스의 비활성화와 제한을 위해 사용된다. 다른 모듈은 더욱 명백한 문제를 다루고 있다. 그들 중의 일부는 sendmail 또는 ftp 등 올바르지 않게 구성된 소프트웨어에 의한 보안 구멍을 위한 것이며 다른 것들은 PAM, syslog 등의 서비스 구성을 보다 적게 허용된 방식으로 수정한다. 어떤 보안 함수들은 여러 가지 보호 레벨을 단계적으로 제공한다. 모든 서비스와 잠정적 보안 구멍은 어떤 방법으로든 보호해야 하며 따라서 한 방법이 실패했을 경우 다른 방법이 시스템을 계속해서 보호할 것이다.
Installation or "let's go for a walk into the scripts while the wolf is not there" Bastille-Linux의 이전 버전은 새로운 시스템에서만 작동되었지만 최신 버전은 그렇지 않다. 그러나 시스템이 이미 (보안관련 패키지를 설치해서) 가동중이라면 Bastille이 하는 일이 쓸모없을 수 있음을 밝힌다. 따라서, 소프트웨어때문이 아니라 보안을 위해 새로운 시스템(freshly installed)에 Bastille-Linux을 설치하는 것을 권장한다. Bastille-Linux는 bastille-linux.source.net에서 .tgz tarball 형태로 구할 수 있는데 아카이브의 크기는 단지 134 Ko이다. 파일을 전송받았다면 tar xzf Bastille-1.1.0.tgz 의 명령어를 사용하여 압축을 푼다.
네 개의 스크립트가 Bastille-Linux를 다룬다. - InteractiveBastille.pl : 시스템에서 무엇을 할지를 결정하기 위해 사용자에게 Bastille-Linux를 설치하기 위해서는 스크립트가 설정 파일을 수정할 수 있게 root 사용자여야 한다. 그후 설치를 위해 우선 InteractiveBastille.pl 을 실행시키며, 다음(아래서 더욱 자세히 설명될) 일련의 질문들에 답을 한 후 최종적으로 BackEnd.pl을 실행시키면 된다. 설치후 변경사항은 /root/Bastille/undo 디렉토리에서 찾을 수 있다.
설치에 앞서 1. /root/Bastille 디렉토리에서 스크립트를
실행한다고 가정한다. 2. 두 모듈은 시스템에 섀도우 패스워드를 설치하자마자
계정 생성을 허용하는데 3. Bastille-Linux는 아직까지 (추후 버전에서
가능해질) 커널 설정에서와 같이 모듈 사이의
단계별 Step by step 여러가지 단계들을 이해하기 위해 Bastille-Linux가 제기하는 질문들을 보자. [ ] 사이의 문자는 디폴트 답변을 나타낸다 ( N -> No, Y -> Yes ).
IPChains 본 모듈은 방화벽 설정에 사용되는데 시스템
보호를 위해 필수적이지는 않을 지라도 머신간의 네트워크 트래픽
제어를 허용한다. 방화벽 트래픽 제어는 실제 보안을 위해 충분하지
않은데 데몬의 재설정이 필요하다 (여러가지 보안 레벨이 쓸모없는
것은 아니다). 스크립트는 TCP, UDP 와 ICMP프로토콜을 다루는데 각 프로토콜에 대해 감시 또는 회피해야 할 서비스 목록을 제공한다. 방화벽 설치를 위한 Bastille-Linux의 접근방법을 세부적으로 설명하는 것은 무척이나 장황할 것이지만 스크립트와 그 주석이 많은 도움이 될 것이다. 그러나 본 모듈을 사용하기 위해서는 최소한의 지식이 필요하다.
패치 다운로드(PatchDownload) 시스템의 무결성을 유지하기 위해서 시스템 갱신은 매우 중요하다. 지난 몇개월 동안 예를들어 bind와 piranha는 중요한 보안문제를 갖고 있었지만 소스코드가 공개되어 많은 사람들이 즉각적으로 패치를 작성하였기 때문에 빠르게 수정되었다. 불행히도 본 스크립트가 훌륭하게 작동하지는 않는데, 직접 설치되는 패키지 및 그 중 갱신되어야 하는 패키지를 결정해야 하기 때문에 약간은 복잡하다. 그 다음 패치를 전송받아 설치전에 해커에 의해 또는 전송중에 변경되지 않았는지를 확인해야 한다. 물론 사용하는 리눅스 배포판에 따라 다를 것이다. 현재 Jay Beale은 본 스크립트를 무시하기 보다는 수작업으로 실행하는 것을 추천하고 있다. 현재 보다 기능이 향상된 모듈 버전이 개발중이며 조만간 이용가능할 것이다.
파일 허가권(FilePermissions) 본 모듈은 SANS 팀의 문서에 기초하는데 단지
루트(또는 루트 그룹 멤버)에 허용가능한 프로그램, SUID 비트를
유지할 필요가 있는 프로그램 등을 결정하기 위한 것이다. - 다음은 SUID 비트에 관한 것으로 이 비트는
루트 허가권을 갖는 사용자가 프로그램을 이 비트는 편리한 반면 보안문제를 야기한다. 즉, 만약 어떤 사용자가 버퍼 오버플로우(buffer overflow)와 같은 약점을 발견한다면 그는 곧 루트 권한을 획득할 수 있을 것이다. Bastille-Linux는 mount/umount, ping, dump/restore,
cardctl 들의 프로그램들 중에서 이 비트를 제거하도록 제안하는데,
이들중에는 서버 상태 확인에 이용될 수 있는 ping과 traceroute
유틸리티가 포함되어 있다. 이들의 SUID 비트 제거는 paranoiac
모드에 해당하지만 리눅스 머쉰을 일반적으로 사용할 수 있다.
계정 보안(AccountSecurity) 해킹은 사용자 계정 또는 시스템 계정 획득에서 시작하는데, 이러한 해킹을 어렵게 하고 침입을 탐지할 수 있는 간단한 방법들이 있다. - Would you like to set up a second UID 0
account [N]? - May we take strong steps to disallow the
dangerous r-protocols [N]? - Would you like to enforce password aging
[Y]? - Would you like to create a non-root user
account [N]? - Would you like to restrict the use of cron
to administrative accounts [Y]?
부트 보안(BootSecurity) 본 모듈에서 제공되는 옵션들은 머쉰의 물리적 보안과 관련이 있는데 이전 버전의 보안 구멍을 수정하려는 것이다. 컨솔에 물리적으로 억세스할 수 있는 사용자는 루트 권한을 획득할 수 있었다. LILO : linux single 같이 single 모드로 LILO를 구동하는 것은 루트에 속하는 새로운 셀을 사용할 수 있도록 한다. 명백히 이것은 충분치 않다. 물리적으로 컴퓨터를 보호하기 위해 BIOS는 패스워드로 보호되어야 하며 하드디스크만으로 부팅할 수 있어야 한다. 또한 리눅스 박스는 어떤 사용자가 새로운 하드디스크를 끼우지 못하도록 보호되어야 한다. 물론 이것은 편집광들의 행동으로 적당한 이유없이 그렇게까지 할 필요는 없다. 소프트웨어적 관점으로 얼마간의 제한들은 위에 언급내용들과 비교해 좋은 타협점을 제공한다. - Would you like to password-protect the LILO
prompt [N]? - Would you like to reduce the LILO delay
time to zero [N]? - Do you ever boot Linux from the hard drive
[Y]? - Would you like to write the LILO changes
to a boot floppy [N]? - Would you like to diable CTRL-ALT-DELETE
rebooting [N]? - Would you like to password protect single-user
mode [N]?
Inetd 보안화(SecureInetd) 본 모듈은 불필요한 서비스 제한 및 비활성화를 하기 위한 것으로 해커는 손쉽게 어떤 특권을 갖는 서비스에서 보안구멍을 찾을 수 있기 때문에 이러한 서비스와 특권을 제한해는 것이 필요하다. 예를 들면 RedHat 6.0에서 DNS 설정의 실수는 원격적으로 루트가 되는 것을 허용하는데 이러한 서비스를 비활성화하거나 권한을 축소하는 것이 보안에 도움이 된다. 이미 언급한 r-명령어와 같은 프로토콜 및 ftp 또는 telnet은 종종 공격받기 쉬우며 예를 들어 finger 또는 identd들은 머신 계정 등에 대한 정보를 쉽게 얻을 수 있도록 한다. 이러한 다수의 서비스들은 주어진 서비스에 누가 억세스 하는 지를 제어하는(주로 /etc/host.{allow, deny} 에 의해) tcp_wrapper에 의해 다루어진다. 따라서 wrapper가 클라이언트의 서비스 억세스를 허용했다면 해당 서버에 서비스 요청을 보낸다. 본 부분은 아직까지는 엄격하며 추후 버전에서 변경될 것이다. - Would you like to modify inetd.conf and
/etc/host.allow to optimize use of Wrappers - Would you like to set sshd to accept connections
only from a small list of IP addresses - Would you like to make “Authorized Use”
banners [Y]? 계속하기 전에 네트워크는 클라이언트-서버 모델에 입각함을 기억하자. 따라서 각 서비스에 대해 클라이언트 쪽인지 또는 서버 쪽인지를 알아야 한다. 예를 들어 웹서버 정지는 브라우저가 클라이언트이기 때문에 웹 브라우징을 방해하지는 않는다.
사용자 도구 불가(DisableUserTools) 본 모듈은 간결하며 서버에 필수적이다. 대개 해커는 정상적인 사용자 계정을 이용하여 머신에 억세스한 후 시스템의 약점을 활용하기 위해 머신에 존재하는 소수의 프로그램들을 다시 컴파일한다. 본 모듈은 루트를 제외한 모든 사용자에 대해 C 컴파일러를 비활성화시킨다. 따라서, 리눅스 머신이 어떤 프로그램도 컴파일할 필요가 없는 서버라면 컴파일러는 제거해라.
PAM 설정(ConfigureMiscPAM) 본 모듈은 파티션을 코어 파일로 채우기, 죽음의 핑 등 시스템을 과부하상태로 유지되도록 하는 서비스 불능 공격(Deny of service : DOS)의 위협을 제한하는 것이다. PAM은 장착식 인증 모듈, pluggable authentication module의 약자로 시스템 관리자에게 각 어플리케이션에 대한 사용자 인증 형태, 사용자 권한, 사용자 억세스 자원 등을 선택할 수 있도록 허용하는 라이브러리이다. - Would you like to put limits on system resource
usage [Y]? - Should we restrict console access to a small
group of user accounts [N]?
Logging syslog는 머신이 손상되었는지를 알아내기 위해
수행되는 가장 중요한 서비스 중의 하나이다. 이 데몬은 시스템
사건을 기록하는데 기록된 정보의 레벨을 선택적으로 변경할 수
있다. 본 모듈은 /etc/syslog.conf 파일에 다음의 새로운 사항을 첨가한다. - Would you like to add addintional logging
[Y]? - Would you have a remote logging host [N]? - Would you like to set up process accounting
[N]?
기타 데몬들(MiscellaneousDaemons) 본 모듈은 항상 최소화와 관련하여 단지 부팅시
실제로 필요로 하는 서버들 만을 활성화한다. 디폴트로 거의 모든
서비스는 필요없으며 따라서 비활성화된다. chkconfig 명령어를
사용하여 서비스를 재활성화시킬 수 있다.
Sendmail 앞에서 언급했듯이 sendmail은 메일을 다루는
서비스로 그 역사는 메일 서버가 취급해야 하는 많은 업무와 네임
해석(name resolution), syslog 정보 등을 수행하기 위해 필요한
권한에 의해 야기된 보안 구멍으로 점철되어 있다. 약점과는
달리 sendmail은 주어진 서버의 특정 사용자에 대한 정보 획득을
허용한다. 에를 들면 sendmail EXPN과 VRFY 명령어는 특정 사용자
계정의 존재유무를 알 수 있도록 한다. - Do you want to leave sendmail running in
daemon mode [Y]? - Would you like to run sendmail via cron
to process the queue [N]? - Would you like to disable the VRFY and EXPN
sendmail commands [Y]?
원격 접속(RemoteAcces) 원격 머신에 연결할 수 있는 것이 종종 유용한데, r-명령어들은 비보안적인 방법으로 이를 허용한다. Bastille-Linux는 연결을 통해 전송되는 자료(와 패스워드)를 암호화하는 소프트웨어인 ssh를 전송받아 설치하기를 권한다. 세션키 길이가 128 비트를 초과하지 않는 소프트웨어를 사용할 수 있는데 세션키는 자료를 암호화하는데 사용되는 키이다. 세션키는 클라이언트와 서버에 의해 단계적으로 만들어진다.: 세션키는 키 교환 프로토콜(대부분의 경우 Diffie-Hellman)에서 생긴 것으로 모든 구성원들의 키로부터 키를 생성하는데 그 목적이 있다. 그 후 세션키는 대칭 알고리듬에 따라 자료를 암호화하는데 사용된다(자료의 암호화와 복호화에 같은 키가 사용된다). 따라서 유닉스 패스워드를 암호화하는데 사용되는 DES(Data Encryption System, 자료 암호 시스템)는 56 비트 키를 갖는 대칭 알고리듬이다. 현재 128비트 키는 거래 기밀과 보안을 보장할수 있을 만큼 충분히 크다. 오늘날 DES가 그렇게 안전하지 않다고 알려져 있어도 최선의 공격은 대부분 사람들이 갖고 있는 CPU 파워의 범위내에 있지 않다. 반면 2k 길이의 키가 k 길이 키보다 두배 이상 알아내기 어렵다고 믿는 것은 실수이다. 사실 그 어려움은 지수 함수적으로 키 크기보다 더욱 빨리 증가한다. k 길이 키에 대해 2k 개의 가능한 키가 존재하며 2k 길이 키에 대해서는 22k 개의 가능한 키가 존재한다. 따라서 키 크기를 2배 증가시키면 우리는 2k 개의 가능한 키를 더하는 것이다. 56비트 DES를 깨는 것이 어렵다는 것을 알아차릴 때 암호화/복호화 알고리듬이 보안 구멍을 갖고 있지 않다면 128비트 키는 침범할 수 없다고 예상할 수 있다. 공격의 관점에서 이러한 키크기 제한을 증가시키는 것은 그 어려움을 불가능 수준에서 더욱 불가능 수준으로 만든다. 다음 4가지 소프트웨어 패키지도 비슷한 서비스를
제공한다. 다음의 모듈도 서비스와 연관이 있는데 이들에 대한 보안 정책은 놀랄 만한 것이다: 서비스 권한 제한과 서비스 중지. 두 정책이 다르게 보일지라도 이러한 두 조치가 상반되지는 않는다. 이러한 서비스들은 우연히 또는 탐탁치 않은 사용자들에 의해 재활성될 수 있는데, 따라서 서비스에 대한 권한 제한보다는 서비스들을 제한하는 것이 더욱 좋을 듯하다.
도메인 네임서버(DNS) DNS는 IP 주소와 머신 네임의 연계될 수 있도록 하는데 예를 들어 198.186.203.36은 www.bastille-linux.org에 해당한다. 본 서버의 주기능은 BIND로 불리는데 최근 BIND에 대한 DoS(서비스 거부공격) 형태의 공격이 발견되었다. DoS 공격은 소수의 디렉토리 그룹에 DNS 억세스를 줌으로써 예방할 수 있다(chroot 명령어를 이용하여 명령어 또는 스크립트 실행 전에 루트 디렉토리를 디폴트인 / 에서 다른 것으로 변경할 수 있다). Bastille-Linux 작동상태를 설명하기 전에 약간의 기술적 세부사항을 첨가하자. 본 서비스를 다루는 데몬은 named로 /etc/named.conf 파일을 통해 설정할 수 있다. - Would you like to chroot named and set it
to run as a non-root user [N]? - Would you like to deactivate named, at least
for now [Y]?
아파치(Apache) Apache는 가장 널리 사용되고 있는 인터넷 웹서버로 다음 두 가지 경우에 있어서 매우 유용하다. 1. 사이트 운영 : 고정 IP 주소가 필요. 본 데몬의 구성 파일은 디폴트로 /etc/httpd/conf 내에 있다. - Would you like to deactivate the Apache
web server [Y]? - Would you like to bind the web server to
listen only to the localhost [N]? - Would you like to bind the web server to
a particular interface [N]? - Would you like to deactivate the following
of symbolic links [Y]? - Would you like to deactivate server-side
includes [Y]? - Would you like to disable CGI scripts, at
least for now [Y]? - Would you like to disable indexes [N]? 다른 서버와 마찬가지로 웹서버가 적절히 구성되지 않는다면 머신을 손상시킬 수 있는 출발이 될 수 있다. 이는 어떤 경우 약간은 곤혹스러울 수 있는데 은행을 예를 들어보자. 고객 이름(아마도 그들의 패스워드)을 읽을 수 있다면? 다음의 http://www.kitetoa.com을 접속해봐라.
프린팅(Printing) 머신에서 인쇄작업을 할 것인가? 라는 단 한가지 질문이 있는데, 답변이 “아니오”라면 Bastille-Linux는 lpd 데몬을 비활성시키고 lpr과 lprm으로부터 SUID 비트를 제거한다.
FTP 보안 관점에서 ftp는 많은 문제의 소지가 될 수 있는데 예를 들어 연결을 초기화할 때 패스워드가 평문으로 전송된다. 물론 자료들에 대해서도 마찬가지이며 따라서 재무 또는 의료 자료등의 민감한 자료라면 보안에 심각한 문제를 야기할 수 있다. 더구나 최근 wu-ftpd에서 보안 구멍이 발견되었는데 ftp 서버를 가동할 필요가 있다면 Bastille-Linux는 어떤 기능을 제한할 수 있도록 한다. ftp 서버 억세스를 다루는 파일은 /etc/ftpaccess 이다. - Would you like to disable user privileges
on the FTP daemon [N]? - Would you like to disable anonymous download
[N]?
약간의 트릭과 팁들(A few more tricks and tips) 전에 언급했듯이 Bastille-Linux는 우수한 교육적 도구이다. 질문과 주석은 큰 의미를 갖으며, 이런 것들이 명확하지 않을 경우 올바른 답변을 찾을 수 있도록 많은 자료가 존재한다. 주어진 주제에 대해 배우는 가장 좋은 방법은 바라는 모듈을 사용해 보는 것이다. 우선 질문을 포함하는 파일을 백업한 후 Question.txt
파일을 편집하라. 모든 모듈은 FILE 키워드로 시작되는데 그중 필요한
것들만을 남긴다. 물론 Bastille-Linux의 조치가 시스템을 안전하게 할만큼 충분하지는 않다. 1. 어떠한 시스템도 100% 안전하지 않다. 로그 파일 분석기, 포트 스캔 탐지 (portsentry, snort, snplog, 등), www.openwall.com 커널 패치 사용(비실행 스택, /tmp와 /proc 디렉토리의 권한 제한 등) 등의 조치가 있다. 시스템을 안전하게 보호하는 것은 장황하고 힘든 업무이다. 따라서 보안구멍에 대해 자신이 잘 알고 있어야 한다 (securityfocus사이트로부터의 bugtraq같은 메일링 리스트를 통해)
결론 Bastille-Linux는 널리 알려진 배포판을 안전하게 하는데 도움을 준다. 여러분은 "왜 이것을 사용하는가?"라고 질문을 던질 수 있는데, RedHat(Mandrake 도 유사)도 상당히 우수한 특징을 갖고 있다. 본 기사는 배포판을 장려(또는 비방)하려고 쓰여진 것은 아니다. 결국 선택의 자유는 자유 소프트웨어가 갖는 장점중의 하나이다. 사실 본 기사는 다양한 목적을 갖고 있다. 우선 짜릿함을 즐기는 누군가에 의해 파괴된 네트워크를 볼까 두려워하며 지내는 시스템 관리자의 영원한 걱정거리를 보여주고자 하는 것이다. 반면 본 도구를 통해 리눅스 시스템의 설정을 깊게 알아볼 수 있다. 이 점에서 초보자와 상급자에 모두에 대해 리눅스 설정의 신비를 깨닫게 하는 좋은 방법이다. 두 개의 기본적이고 일반적인 개념은 최소화주의와 깊이로 더 적은 서비스를 가동하는 것이 더 적은 보안구멍을 의미한다. 각 서비스들을 하나가 아닌 여러 방법에 의해 보호하는 것이 보다 바람직하지만 이 방법은 올바르게 설정되지 않은 보호방법이 시스템을 손상시킬 수 있기 때문에 애매할 수 있다. 마지막으로 다음 버전은 BUS (Bastille Unix Security)로 명명될 것임을 언급하자. BUS는 Bastille-Linux와 Usec (Unix Security Project)로 재명명된 Msec(Mandrake Security Project)의 결합체이다.
참고자료(References) ● http://bastille-linux.sourceforge.net :
Bastille-Linux official site --------------------------------------------------- |