Computer/LINUX

아파치 보안

알찬돌삐 2012. 8. 10. 16:21

 

완벽한 보안은 없다고 생각한다. 흔히 말해 해킹과 보안을 창과 방패라고 비유하는 것과 같이 해커가 찌른 창을 한번 막았다고 해서 영원히 막을 수는 없다.

해커는 항상 새롭고 다양한 창을 가지고 또 찌를 것인데 항상 같은 낡은 방패를 사용하여 똑같은 방어만 한다면 완벽한 방어는 절대 이루어질 수 없을 것이다.

 

웹 호스팅 서버의 경우 평균적으로 한 대의 서버로 작게는 백여 개의 도메인부터 시작하여 많게는 200여 개 정도의 도메인을 관리하는데 해킹을 당했을 경우에는 호스팅 서버에서 관리되는 업체들, 즉 200여개의 홈페이지가 한 번에 모두 피해를 입을 수가 있기 때문에 그 피해는 더욱 크다고 할 수 있다.

이번 시간에는 이런 시스템의 피해를 사전에 예방할 수 있는 보안 측면에서 시스템 관리자로서 해야 하는 역할에 대해 알아보도록 하자.

 

TCP-WRAPPER를 이용한 접근 제한 강화

 

웹 호스팅 서비스를 운영하기 위해서는 보안 측면에서 경유서버를 만들어 놓는 것이 좋다. 모든 호스팅 서버들은 경유서버를 통해서만 접근할 수 있고 그 외의 모든 접근은 차단함으로써 보안을 강화하는 것이다.

그리고 경유서버는 오직 사무실 내에서만 접근할 수 있게 설정한다면 외부의 접근을 일차적으로 막음으로써 간단하지만 강력한 보안이 될 것이다.

이렇듯 특정한 곳에서의 접근, 예를 들어 사무실 내에서만 접근을 허용하기 위해서는 tcp-wrapper 또는 파이어월(firewall)을 이용해서 적용이 가능한데 이번 시간은 tcp-wrapper에 대해 알아보겠다.

tcp-wrapper는 리눅스 설치 시 기본으로 설치가 되어 있으며 /etc 디렉토리에 hosts.allow와 hosts.deny 파일에 설정을 한다. 다음은 hosts.deny에 ALL:ALL을 설정함으로써 모든 접근을 거부했으며 hosts.allow에 192.168.1.10을 넣어줌으로써 192.168.1.10의 IP를 사용하는 곳에서만 접근을 허용한다.

대부분 사무실에서는 공인 IP를 사용하고 공유기를 이용해서 사설 IP를 할당하여 사용할 것이다.

사무실 내에 사용하는 모든 컴퓨터에서 접근을 허용하기 위해서는 여기서 사설 IP 대신 공인 IP를 입력하면 사무실 내의 모든 곳에서 접근이 가능하다.

 

[root@hosting-2 public_html]# cat /etc/hosts.deny
ALL:ALL // 모든 접근을 차단한다.
in.telnetd : ALL:ALL // 텔넷 서비스에 대해서만 접근을 차단한다.
sshd : ALL:ALL // ssh 서비스에 대해서만 접근을 차단한다.
[root@hosting-2 public_html]# cat /etc/hosts.allow
######### TELNET ############
in.telnetd: 192.168.1.10
########## sshd ##############
sshd : 192.168.1.10

 

ssh 보안

 

과거에는 텔넷을 많이 사용하였는데 텔넷 사용 시 서버와 통신을 할 경우 패킷이 암호화되어 있지 않기 때문에 데이터의 흐름을 분석해서 서버의 암호를 알아낼 수 있다.

즉 시스템의 암호를 빼앗기게 되면 이미 시스템은 해커가 마음먹기에 따라 좌지우지되기 때문에 그 무엇보다 신경을 써야 할 부분이다.

그래서 최근에는 텔넷 대용으로 데이터 자체를 암호화하여 통신을 하는 ssh(secure shell)를 사용한다.

ssh는 오픈소스로 제공되는 openssh와 상용으로 SSH Communications Security에서 제공되는 ssh가 있다.

이번 시간은 오픈소스로 제공되는 openssh에 대해 살펴보도록 하자. 모든 프로그램들이 그렇듯 보안에 무엇보다 중요한 것은 항상 최신 버전의 패치를 유지하는 것이다.

이 openssh도 반드시 안정된 최신 버전의 프로그램을 사용하도록 하자. 그리고 일반적으로 우리는 텔넷은 23번 포트를, ssh는 22번 포트를 사용한다고 알고 있다.

하지만 ssh=22번 포트가 아닌 다른 임의의 포트로 접속해서 사용한다면 좀 더 보안이 강화될 수도 있다.

22번 포트가 아닌 다른 포트를 사용하기 위해서는 환경설정 파일/etc/ssh/sshd_config에서 22번 대신 다른 포트를 입력해주고 sshd를 재시작하면 적용된다.

여기서는 22번 대신 1577번의 포트를 적용하겠다.

 

 

포트 1577


sshd_config에서 설정한 특정 포트로 접속하는 방법은 다음과 같다.

[root@hosting]# ssh hosting -p 1577
root@hosting-1’s password:


 

system 파일 퍼미션 변경

 

리눅스가 설치되고 난 직후에는 관리자만 사용해야 할 파일들이 일반 사용자도 사용할 수 있게 설정되어 있는 파일들이 있다.

이렇게 일반 사용자가 system 파일을 실행할 수 있는 권한을 가지고 있는 경우 쓸데없이 일반 사용자가 시스템의 정보를 파악함으로써 해킹의 정보를 제공하게 되는데 이럴 경우 치명적인 피해를 입힐 수가 있기 때문에 불필요한 권한에 대해서는 제재를 가하는 것이 보안상 필요하다.

다음과 같은 파일들에 대해서는 될 수 있으면 반드시 퍼미션을 변경하길 권장한다.

chmod 100 /usr/bin/top chmod 660 /var/log/xferlog*
chmod 100 /usr/bin/w chmod 660 /var/log/yum.log
chmod 100 /usr/bin/uptime chmod 700 -R /etc/rc.d/
chmod 100 /usr/bin/last chmod 700 -R /etc/cron.*
chmod 100 /usr/bin/free chmod 640 /etc/fstab
chmod 100 /usr/bin/find chmod 640 /etc/redhat-release
chmod 100 /bin/ping chmod 640 /etc/proftpd.conf
chmod 100 /bin/netstat chmod 640 /etc/crontab
chmod 100 /sbin/ifconfig chmod 640 /etc/logrotate.conf
chmod 700 /proc/ chmod 640 -R /etc/xinetd.d/
chmod 700 /boot/ chmod 640 -R /etc/logrotate.d/
chmod 700 /usr/src/ chmod 640 /etc/lilo.conf
chmod 700 /usr/local/src/ chmod 640 -R /etc/snmp*
chmod 701 /www/ chmod 640 /etc/yum.conf
chmod 640 /var/log/dmesg chmod 640 -R /etc/proftpd/
chmod 640 /var/log/ksyms* chmod 640 /etc/snmpd.conf
chmod 640 /var/log/rpmpkgs* chmod 640 /etc/rsyncd.conf
chmod 640 /var/log/snmpd.log* chmod 640 /etc/xinetd.conf
chmod 660 /var/log/wtmp* chmod 640 /etc/inetd.conf

 

 

SetUid, SetGid, Sticky Bit 파일 점검

 

시스템 보안 측면상 반드시 SetUid, SetGid, Sticky Bit로 설정되어 있는 파일들은 지속적인 관리를 해줘야 할 필요가 있다. 세 가지 모두 일반 사용자가 시스템 관리자의 권한을 빌려서 실행되는 파일들이며, 각각을 살펴보면 SetUid는 실행중에 잠시 root 권한을 빌려서 실행되는 것으로 대표적인 파일로는 passwd 파일이 해당된다. SetGid는 실행 중에 잠시 root 그룹의 권한을 빌려서 실행되는 파일의 권한이며 마지막으로 Sticky Bit는 가상메모리에 로드된 자료를 가상메모리에 저장시키는 것이다. 대표적으로 /tmp 디렉토리가 이에 해당되며 /tmp 디렉토리리는 어떠한 사용자도 쓰기를 할 수가 있기 때문에 해킹시 자주 이용되는 디렉토리이므로 각별한 주의가 필요하다.
그럼 이런 파일들은 어떻게 관리를 해야 효율적인 관리가 가능할까. 먼저 이런 파일들에 대해서는 리눅스 설치 직후 find로 체크를 함으로써 파일들의 리스트를 기억하고 있다가 cron에 등록시켜 주기적으로 실행시킴으로써 파일의 변화를 주의 깊게 살펴봐야 할 것이다.

[root@hosting]# find / -type f -perm -4000 // SetUid 파일 검색
[root@hosting]# find / -type f -perm -2000 // SetGid 파일 검색
[root@hosting]# find / -type d -perm -1000 // Stiicky 디렉토리 검색

 

 

Fcheck을 이용한 파일의 무결성 체크

앞에서 살펴본 바와 같이 find와 같은 명령어로 특정 파일을 찾아 모니터링 하는 방법이 있으나 파일의 검색 범위가 커지게 되면 무결성 체크를 하는 방법이 쉽지만은 않은데 이럴 때 사용되는 유용한 프로그램이 바로 Fcheck 프로그램이다. 이 프로그램은 무결성을 체크할 디렉토리들을 선택할 수 있으며 선택된 디렉토리들에 대해 무 결성을 체크하여 DB로 저장하고 있다가 차후 실행 시 DB로 저장된 파일들과 비교 후 변화가 있을 때 알려주는 프로그램이다. 자주 변화가 있는 디렉토리 보다는 주로 시스템 파일들이 존재하는 변화가 없는 디렉토리들에 대해서 무결성을 체크할 때 유용하게 사용된다. 소스는 http://www.geocities.com/fcheck2000에서 다운받은 후 압축을 풀고 fcheck 파일에서 디폴트로 설정되어 있는 부분을 다음과 같이 자신이 압축을 푼 곳의 위치로 지정해준다.

$config=”/usr/local/fcheck/fcheck.cfg”


fcheck 환경설정 파일인 fcheck.cfg 파일에서 다음과 같이 각각의 항목을 변경하여 사용한다. Directory // 파일의 무결성을 체크하려고 하는 디렉토리를 설정한다.
일반적으로 시스템 파일 관련 파일들이 위치한 디렉토리를 체크한다.

Directory=/etc/
Directory=/bin/
Directory=/sbin/
Directory=/usr/bin
Directory=/usr/sbin/

Exclusion - 파일의 무결성을 제외할 디렉토리 설정

Database = 현재 설정한 디렉토리의 파일시스템을 DB 형태로 기억하고 있다가
차후 fsck -a 명령어를 이용해서 파일시스템 무결성 검사를 진행하면
현재 기억하고 있는 DB와 비교 후 변경된 파일을 찾아 알려준다.
만약 변경되었다고 나온 파일이 이상이 없는 파일이라면
다시 fsck -ac란 옵션을 이용해 DB를 현재 환경으로 업데이트한다.

TimeZone - 프로그램의 버그로 인해 시간이 정확히 맞지가 않는다.
그나마 현재 시간과 최대한 가까운 GMT-9로 설정한다.

그럼 프로그램을 실행시켜 보자. 먼저 fcheck -ac란 옵션을 이용하여 fcheck.cfg에 설정된 곳에 DB를 생성한다. 그리고 파일이 추가되었을 경우 어떤 결과가 나오는지를 테스트하기 위해 /sbin 아래 test란 파일을 만들어 fcheck -a로 무결성을 검사하면 생성한 test 파일이 검출될 것이다. 이런 무결성 검사를 cron에 넣어 자동화한 후 관리자에게 메일로 발송하게 되면 일일이 서버에 들어가서 작업을 하는 수고를 덜 수 있을 것이다.

[root@hosting fcheck]# ./fcheck -ac //
[root@hosting fcheck]# touch /sbin/test
[root@hosting fcheck]# ./fcheck -a
PROGRESS: validating integrity of /bin/
STATUS:passed...

PROGRESS: validating integrity of /sbin/
STATUS: ADDITION: [hosting] /sbin/test
Inode Permissons Size Created On
19615 -rw-r--r-- 0 Feb 12 10:31 2006

 

웹 서버 설정과 보안

 

최근에는 인터넷이 우리 생활에 없어서는 안될 생활의 일부가 되었고 그에 따라 웹 서버의 보안이 중요시 되고 있다. 웹 서버는 시스템과 달리 누구나 웹을 통해 접속이 가능하고 웹 서버 단독으로 쓰여지는 것이 아닌 php와 mysql 또는 FILEDB 등의 응용 프로그램들과 같이 쓰여지기 때문에 최근에는 웹을 이용한 해킹사례가 점차 늘고 있다. 아파치의 환경설정 파일인 httpd.conf를 보면 3개의 섹션으로 나누어져 있다. Section 1은 Global Enviroment 영역으로 아파치 전체적인 영향이 미치는 설정 부분이며, Section 2는 Main Server configuration 영역으로 주 서버에 대한 설정 부분이고, 마지막 Section 3는 Virtual Hosts 영역으로 웹 호스팅 서비스 제공시 반드시 설정해야 하는 영역이다. 그럼 이번 시간에는 아파치 설정과 보안에 대해 알아보도록 하겠다.

MaxClients 조절

 

아파치 설정에 보면 MaxClients란 부분이 있는데 동시에 요청할 수 있는 클라이언트의 접속 수를 말한다. 디폴트로 운영 시 최대 값은 256까지 설정이 가능하다. 그러나 호스팅 서버를 운영하게 되면 서버 사양에 따라 다르겠지만 평균적으로 100~200 도메인 정도로 운영하게 되는데 문제는 이렇게 많은 도메인이 하나의 웹 서버를 이용할 경우 256으로는 MaxClients에 자주 도달한다. 그래서 아파치 설치 시 설정 값 변경을 통해 MaxClients를 1024 이상으로 늘려 사용할 수가 있다. 설정하는 방법은 아파치 소스 디렉토리의 src/include/httpd.h에서 다음과 같이 define HARD_SERVER_LIMIT 값을 1024로 변경 후 아파치를 설치하거나 이미 설치가 되어 있다면 수정 후 재컴파일하면 동시접속자수를 1024 이상으로 늘려 사용이 가능하다.

[root@hosting] # vi /usr/local/src/apache_1.3.34/src/include/httpd.h
#define HARD_SERVER_LIMIT 1024

 

setting 페이지 설정

 

사용자들이 사용하는 웹 서버는 기본 웹 서버 포트인 80번을 사용하여 서비스를 하면 되지만 내부적으로 사용하는 웹 서버 셋팅 페이지 같은 경우는 80번 포트가 아닌 다른 포트를 이용해 특정 IP에서만 접근이 가능하게 하여 셋팅 페이지를 운영하는 것을 추천한다. 설정하는 방법은 httpd.conf를 새로운 파일명으로 복사하고(여기서는 setting.conf로 복사했다) 아파치 디렉토리의 bin 아래 위치하는 httpd 실행 파일도 setting 파일로 복사를 한다. 그후 복사한 setting.conf 파일에서 포트를 지정하고(여기선 2002로 지정했음) DocumentRoot를 설정하고, 접근 IP 대역을 사무실 IP에서만 접근 가능하게 설정 후 다음과 같이 실행시키면 <화면 1>과 같이 setting으로 실행되는 프로세스들이 보일 것이며, <화면 2>와 같이 2002번 포트가 열린 것을 확인할 수 있을 것이다. 물론 setting user는 존재해야 한다. 웹에서 페이지를 확인하는 방법은 http://도메인주소:2002로 확인할 수가 있다.

[root@hosting]# /www/bin/setting -f /www/conf/setting.conf

 

버전정보 숨기기

 

원격지에서 아파치의 버전을 볼 수가 있는데 이렇게 쓸데없이 버전 정보를 노출시킴으로써 해당 버전의 취약점을 노려 공격이 더욱 쉬워질 수 있으니 모든 서버의 버전정보는 최대한 노출을 하지 않는 방향으로 하자. 아파치에 버전정보를 보이지 않게 설정하는 방법은 아파치 소스 디렉토리의 src/include/httpd.h에서 다음과 같이 SERVER_BASEREVISION 값을 다른 문자열로 변경 후 아파치를 컴파일하거나 이미 설치가 되어 있다면 수정 후 재컴파일하면 원격에서 버전정보를 감추도록 하자.

[root@hosting] # vi /usr/local/src/apache_1.3.34/src/include/httpd.h
#define SERVER_BASEPRODUCT “Apache”
#define SERVER_BASEREVISION “1.3.34”

 

<화면 1> setting 프로세스

 

<화면 2> 2002 포트의 open 상태 확인

 

IP 접근 제한

 

setting 페이지 설정에서처럼 특정 페이지에 대해서 내부에서만 접근이 가능해야 한다거나 아니면 모두 허용하는데 특정한 곳에서의 접근만 거부하는 등의 설정을 할 수가 있다.

setting 페이지처럼 특정 디렉토리에 대해 모든 접속을 거부하고 사무실 내의 IP에 대해서만 허용가능하게 하기 위해서는 다음과 같이 설정한다.

여기서 중요한 것은 allow와 deny 순서에 주의하는데 뒤에 나온 것이 먼저 적용된다.

즉 Order allow, deny라면 deny가 먼저적용되고 allow가 후에 적용된다는 것이다.



AllowOverride None
Options None
Order allow,deny
Allow from 192.168.1.10
deny from all

 

반대로 특정 디렉토리에 대해 모두 허용하고 특정 IP만 제한하기 위해서는 다음과 같이 설정한다. 마찬가지로 allow, deny 순서에 주의하도록 하자.


AllowOverride None
Options None
Order deny,allow
Allow from all
deny from 192.168.1.10

htaccess를 이용한 특정 페이지 인증법

 

호스팅 서비스를 하다 보면 사용자가 특정 페이지에 대해서는 인증이 확인되어야만 그 페이지를 보게 하려고 인증 페이지를 건다고 문의하는 사람이 가끔 있는데 이런 독자들을 위해서 아파치 자체 내의 암호인증 방법이 있다.

설정하는 방법은 먼저 httpd.conf에 제한하려고 하는 디렉토리에 대해 AllowOverride All로 설정해야 한다.

주의할 점은 /에 AllowOverrid All로 지정하게 되면 / 아래부터 .htaccess 파일을 순차적으로 찾기 때문에 미세하나마 웹 서버의 성능에 영향을 미치게 된다.

그러기 때문에 /는 AllowOverride none으로 지정하고 제한하려는 디렉토리 예를 들어 호스팅 서버 같은 경우는 일반적으로 /home 아래 디렉토리들이 사용자들이 위치하는 장소인데 이곳에 디렉토리 설정을 allowOverride All로 한다.

그리고 인증창이 필요한 디렉토리에 .htaccess 파일을 만들어 다음과 같이 넣어준다.

 

AuthName “사용자 인증” // 패스워드 박스에 나타나는 메시지
AuthType Basic
AuthUserFile /home/LoginID/public_html/userdir/.htpasswd
// 사용자 ID와 패스워드가 있는 경로와 파일을 절대경로로 지정하고
파일 이름은 .htpasswd라고 지정
AuthGroupFile /dev/null

그 후 AuthUserFile에 설정한 것처럼 .htpasswd 파일을 생성해야 하는데 .htpasswd 파일을 처음으로 만들어 첫 사용자를 입력하기 위해서는 .htpasswd 파일을 만들고자 하는 디렉토리에서 다음과 같이 입력한다.

[hosting@hostid] /usr/sbin/htpasswd -c .htpasswd hostid
Adding user hostid
New password:
Re-type new password:

이와 같이 패스워드를 입력해주면 .htpasswd 파일이 userdir 디렉토리에 만들어진다.

여기서 .htpasswd 파일이 있는 경로는 반드시 앞서 .htaccess에 지정된 경로와 같아야 한다. 두 번째 사용자부터는 -c를 빼고 다음과 같이 하면 .htpasswd에 지정한 아이디와 패스워드가 추가로 저장된다.

[hosting@hostid] /usr/sbin/htpasswd .htpasswd hostid

CPU, 메모리 무한 소모 제한

 

사용자가 의도했던 의도하지 않았던 프로그램의 로직이 잘못된 프로그램이 사용되었을 경우 시스템의 CPU 또는 메모리의 부하로 인해 시스템이 먹통이 된다거나 다운되는 경우가 간혹 있는데 이렇게 잘못된 프로그램의 사용으로 인해서 시스템의 모든 자원을 소모하는 것을 방지하기 위해 아파치 설정파일에서 설정이 가능하다.

자원과 관련해서 설정해야 하는 부분은 총 3가지 있는데 프로세서에 할당되는 CPU 점유율을 제한하는 RLimitCPU와 프로세서에 할당되는 메모리를 제한하는 RLimitMEM, 그리고 자주 사용되지는 않는 프로세서의 수로 초당 사용자에게 할당되는 프로세서의 수를 제한하는 RLimitPROC이 있다.

아파치 추가 설정 파일인 httpd.conf에 추가
RLimitMEM 20480000 21504000 // 메모리를 최대 20~21MB까지 사용
RLimitCPU 30 // 특정 프로세스의 과도한 CPU 점유율을 제한하는 설정

 

커널 업데이트

 

F지난 시간에 얘기했듯이 필자는 처음 들어가는 리눅스 서버에 들어가서 가장 먼저 uanme -a로 현재 시스템의 커널 버전을 확인한다.

그런데 문제는 많은 리눅스 서버들이 OS가 깔릴 당시의 기본 커널을 사용한다거나 아니면 이미 보안상 문제가 발표된 오래된 버전의 커널을 사용하고 있는데 문제는 정작 시스템 관리자는 그것의 심각성을 모른다는 것이고 정작 안다고 해도 커널을 컴파일함으로써 생길 장애를 두려워하여 손을 놓고 있는 것이다.

그럼 도대체 커널의 목적은 무엇이며 무슨 역할을 하길래 커널이 이렇게 중요하다고 하는 것일까? 먼저 커널 컴파일의 목적은 간단히 말해 보안의 강화, 그리고 자신의 시스템에 맞게 커널을 설정하여 자원의 낭비를 최소화함으로써 최적의 시스템을 만드는 것에 그 목적이 있다.

그리고 커널은 메모리에 상주하여 시스템 디바이스와 메모리, 프로세스를 관리하고 입출력을 처리하는 등 운영체제의 핵심 역할을 수행하는 역할을 한다.

리눅스를 만든 창시자가 필란드 헬싱키 대학의 리누즈 토발즈라는 것은 모두가 다 알고 있을 것이다.

그럼 그가 현재 리눅스의 모든 것을 다 만들었을까? 리누즈 토발즈가 리눅스를 창시했다는 것은 리눅스의 핵심 역할을 하는 커널을 만든 것이고 이 커널을 뉴스그룹에 공개함으로써 수많은 개발자들이 관심을 가지기 시작했고 OS의 핵심인 커널을 가반으로 많은 응용 프로그램들이 개발됨으로써 현재의 리눅스가 된 것이다.

그럼 본격적으로 리눅스 커널을 업데이트하는 방법에 대해 살펴보도록 할 것인데 커널을 컴파일 하기 위해서는 자신의 시스템 사양에 대해서 반드시 알고 있어야만 자신의 하드웨어를 정확히 커널에 올릴 수 있을 뿐더러 불필요한 모듈이 올라감으로써 낭비되는 시스템 자원을 최적화할 수 있다.

커널 컴파일을 하는 방법은 소스로 컴파일하는 방법과 rpm으로 업데이트하는 방법 2가지가 존재하나 레드햇 엔터프라이즈 계열을 제외하고는 소스로 컴파일하는 방법을 추천한다.

레드햇 엔터프라이즈 계열을 제외한 이유는 레드햇 엔터프라이즈 계열 같은 경우는 레드햇 자체 내에서 패키지 형태로 커널을 포함한 업데이트 서비스를 제공하고 있고 라이선스 계약을 맺고 운영하는데 만약 소스로 커널을 컴파일해서 문제가 생겼을 경우 레드햇에서 제공하는 서비스를 받는데 어려움이 생기기 때문이다.

호스팅 서비스를 할 경우에는 비용적인 측면상 라이선스를 맺고 운영하기에는 부담이 되는 부분이기 때문에 오픈된 운영체제를 대상으로 소스 컴파일하는 방법에 대해서만 알아보도록 하겠다. 그럼 커널 공식 홈페이지인 kernel.org에서 커널 소스를 다운받아 /usr/src/로 파일을 옮기도록 하자.

<화면 3>은 ftp.kernel.org에 접속하여 커널소스를 다운받는 모습이다. 다운을 받은 후 압축된 파일을 푼 후 다음과 같이 리눅스로 심볼릭 링크를 건다.

[root@hosting src]# tar xvfpz linux-2.4.32.tar.gz
[root@hosting src]# ln -s linux-2.4.32 linux

 

리눅스 커널을 컴파일할 때 필요한 header 파일인 /usr/include를 참조하게 되는데 커널을 컴파일할 경우 header 파일의 위치는 커널 소스의 include에 존재한다. 그래서 링크를 수정하기 위해 다음의 디렉토리로 이동한 후 다음과 같이 기존의 디렉토리를 삭제하고 커널 소스를 설치한 경로로 다시 링크를 건다.

 

<화면3> kernel.org에 접속하여 커널소스를 다운받는 모습

 

<화면4> 커널 설정페이지

 

[root@hosting src]# cd /usr/include/
[root@hosting include]# rm -rf linux scsi asm
[root@hosting include]# ln -s /usr/src/linux/include/linux linux
[root@hosting include]# ln -s /usr/src/linux/include/scsi scsi
[root@hosting include]# ln -s /usr/src/linux/include/asm-i386 asm

커널 옵션을 설정하기 위해 /usr/src/linux로 이동 후 make me nuconfig 명령을 입력하면 <화면 4>와 같은 모습을 볼 수 있을 것이다.

여기서는 지면관계상 커널 컴파일시 디폴트로 선택된 것을 제외하고 반드시 수정해주거나 설정해야 하는 부분에 대해서만 살펴보도록 하겠다.

① 하드웨어 중 SCSI 컨트롤러와 하드디스크, 메인보드의 정확한 모델명을 확인한다.

② CPU 개수를 확인 후 듀얼일 경우 반드시 SMP(Symmetric Multi-Pro cessing support)에 체크를 하여 CPU가 병렬 처리될 수 있도록 한다.
옵션 : Network device support → Symmetric multi-processing support

③ 메모리의 크기가 1GB 이상일 경우 High Memory Support를 체크한다. 여기서 4GB 미만일 경우에는 4GB를 선택하고 4GB 이상일 경우 64GB를 선택한다.
옵션 : Processor type and features → High Memory Support

④ 랜카드의 모델명을 정확히 선택한다.
옵션 : Network device support → Ethernet 에서 자신의 모델명을 선택한다.

⑤ 파일시스템을 선택한다. 일반적으로 최근의 리눅스는 ext3 파일시스템을 사용한다.
옵션 : File systems → Ext3 journalling file system support

⑥ quota를 사용할 경우 반드시 설정한다.
옵션 : File systems → Quota support

⑦ RAID 카드를 사용할 경우 반드시 구현하려는 RAID 레벨을 선택한다.
옵션 : Multi-device support(RAID and LVM) → Multiple devices driver support (RAID and lLVM)

 

옵션 선택이 완료되었으면 저장을 하고 빠져나온 후 make dep 명령으로 의존성 검사를 하고 make clean 명령으로 모든 오브젝트 파일과 구 버전이 남겨놓은 것을 제거하고 마지막으로 make bzlilo 명령으로 커널 이미지를 생성한다.

[root@hosting linux]# make dep; make clean; make bzlilo

 

커널 이미지를 생성하기까지는 하드웨어의 사양에 따라 다르지만 꽤 많은 시간이 소요된다. 이때를 이용해 잠시 시간을 내어 상쾌한 바깥바람을 쐬고 오는 것도 좋을 것 같다. 커널 컴파일이 정상적으로 이루어졌으면 다음과 같은 절차에 따라 커널 이미지를 /boot 디렉토리로 복사한 후 symbolic link를 건다.

cd /boot
rm -f System.map
rm -f vmlinuz
mv /System.map System.map-2.4.32
mv /vmlinuz vmlinuz-2.4.32
ln -s vmlinuz-2.4.32 vmlinuz
ln -s System.map-2.4.32 System.map

 

부트로더의 종류는 lilo와 grub이라는 redhat7.2 버전부터 도입된 두 가지 부트로더가 존재한다. grub도 설정하는 방법은 크게 다를 게 없기 때문에 이번 시간에는 lilo에 대해서만 설명하겠다.

이제 리눅스의 부트로더 정보를 보관하고 있는 lilo.conf에 다음과 같이 새롭게 생성한 커널이미지를 등록시켜 부팅 시 메모리에 올려서 부팅하면 <화면 5>와 같이 커널 이미지를 선택할 수 있다.

[root@hosting linux]# cat /etc/lilo.conf
default=linux-2432
boot=/dev/sda

image=/boot/vmlinuz-2.4.32
label=linux-2432
read-only
[root@hosting root]# /sbin/lilo
[root@hosting root]# /sbin/lilo
Added linux
Added linux-2432 *

 

quota 설정

 

호스팅 업체의 서비스를 보게 되면 용량별로 서비스 금액이 달라지는 것을 볼 수 있을 것이다. 예를 들어 자료실을 운영하여 용량이 많이 필요한 곳에서는 용량을 많이 제공하는 상위 서비스를 받아야 하겠지만 단지 회사소개 정도의 용량이 많이 필요 없는 사이트에서는 적은 용량의 서비스를 받길 원할 것이다.

이렇게 호스팅 업체에서는 대부분 서비스별로 용량을 제한하는데 이렇게 용량을 제한할 수 있는 도구가 바로 이번에 소개할 quota란 프로그램이다. quota란 할당량이란 뜻으로 호스팅에서는 user 별로 용량 제한을 할 때 사용한다.

먼저 현재 quota가 설치되어 있는지 확인 후 설치가 되어 있지 않거나 새로운 버전의 패키지를 설치하기 위해서는 다음과 같은 방법을 이용하여 설치한다.

[root@hosting-1 root]# rpm -qa | grep quota
[root@hosting-1 root]# rpm -Uvh quota-version-xxx.rpm

quota가 적용되기 위해서는 먼저 리눅스 커널에서 quota 지원여부를 확인해야 한다.

File systems --> [*] Quota support 부분이 체크되어 있어야 한다.

체크가 되어 있지 않다면 <화면 6>과 Quota support에 체크를 한 후 재컴파일을 한다.

재컴파일이 완료되었으면 /etc/fstab에서 다음과 같이 usrquota를 추가하고 설정을 마무리짓기 위해 quota를 적용할 파티션 /home 디렉토리에 가서 aquota.user 파일을 만든 후 리부팅을 한다.

[root@hosting /]# cat /etc/fstab
/dev/sda2 /home ext3 defaults,usrquota 1 2
[root@hosting /]# touch aquota.user
[root@hosting /]# chmod 600 aquota.user

리부팅 후 mount 명령어를 이용하여 /home 파티션의 마운트 정보를 확인했을 때 다음과 같이 userquota(rw, usrquota) 부분이 보이면 제대로 설정이 된 것이다.

[root@hosting /]# mount
/dev/sda5 on / type ext3 (rw)
:
/dev/sda2 on /home type ext3 (rw,usrquota)


<화면5> 커널이미지 선택화면

 


<화면 6> 커널옵션에서 quota 설정화면

 

그럼 이제부터는 edquota란 명령어를 이용하여 사용자별로 용량 제한을 할 것이며 quotacheck이란 명령어로 /home 파티션에 존재하는 사용자들의 용량을 체크하여 현재 사용량을 기억하고 repquota 명령어로 사용자별로 할당된 용량을 확인해 보도록 할 것이다.

사용자별로 용량 제한을 하기 위해서는 ‘edquota 사용자 계정’을 입력하면 다음과 같이 편집 모드로 들어가지며 vi 에디터와 동일한 방법으로 편집할 수 있다.

먼저 맨 오른쪽에 나오는 soft와 hard는 파일의 개수에 대한 제한으로써 호스팅 서비스에서는 특별히 설정할 필요가 없다.

우리가 신경써서 봐야 할 곳은 첫 번째 나오는 soft와 hard 부분인데 이곳이 바로 용량 제한을 하는 곳으로써 단위는 KByte이다. 중요한 것은 soft에 제한된 용량은 넘어갈 수 있으나 hard에서 제한된 용량은 절대 넘을 수가 없다.

[root@hosting]# edquota ryu
Disk quotas for user ryu (uid 504):
Filesystem blocks soft hard inodes soft hard
/dev/sda2 283008 307200 3174400 0 0 0

 

우리가 실제로 설정한 것들에 대해 적용을 해보도록 하겠다. quota 설정을 적용시키기 위한 명령어는 quotacheck 명령을 사용하며 일반적인 옵션으로 avug를 사용한다. quotacheck 명령은 자주 변하는 사용자의 디스크 사용량을 체크하도록 하는 명령으로 cron에 등록하여 주기적으로 실행을 해줘야 사용자가 사용하는 용량을 정확히 알 수가 있다.

[root@hosting root]# quotacheck -avug
quotacheck: Scanning /dev/sda2 [/home] done
quotacheck: Checked 766 directories and 13033 files

용량을 체크 후 repquota를 이용하면 현재 /home 아래 모든 사용자의 현재 사용하고 있는 용량과 총 파일 개수, 그리고 제한된 용량을 확인할 수가 있다.

[root@hosting-2 pink]# repquota -a
*** Report for user quotas on device /dev/sda2
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
--------------------------------------------------------------
root -- 28 0 0 3 0 0
ryu -- 283008 0 0 13780 95000 100000
pink -- 219324 0 0 10531 195000 200000
rchwin -- 34880 0 0 16 45000 50000

호스팅 서비스를 할 경우에는 반드시 quota를 설정하고 서비스를 시작하여야 한다.

만약 관리자가 quota를 적용하지 않고 서비스를 시작했다가 특정한 사용자들이 자신들이 사용해야 할 공간을 한참 넘게 사용하는 것을 발견하고 그제서야 quota를 적용했다고 가정하자. 이럴 경우 이미 쿼터가 초과된 고객들은 쿼터가 적용되는 순간부터 게시판에 글조차도 올릴 수 없을 뿐더러 하물며 자신의 홈페이지에 로그인까지 할 수 없는 경우가 생기게 된다.

특히나 심각한 것은 메일 서버에 적용할 경우에는 정말 중요한 메일을 받지 못하는 경우도 생기게 되니 반드시 quota를 적용하고 서비스하길 바란다.

 

지속적인 관심과 정보의 습득만이

 

이번 시간에는 전체적인 보안설정과 최신 커널을 업데이트하는 방법에 대해 살펴보았다. 보안에서 무엇보다 중요한 것은 항상 최신 버전의 패치를 유지하는 것인데 이는 시스템 관리자가 얼마나 부지런하고 성실하게 시스템에 관심을 가지고 있고 얼마나 빠르고 정확하게 정보를 습득했느냐에 따라 시스템 보안이 좌우된다고 볼 수 있다.

완벽한 보안은 없다고 생각한다. 흔히 말해 해킹과 보안을 창과 방패라고 비유하는 것과 같이 해커가 찌른 창을 한번 막았다고 해서 영원히 막을 수는 없다.

해커는 항상 새롭고 다양한 창을 가지고 또 찌를 것인데 항상 같은 낡은 방패를 사용하여 똑같은 방어만 한다면 완벽한 방어는 절대 이루어질 수 없을 것이다.

이 글은 스프링노트에서 작성되었습니다.

.

'Computer > LINUX' 카테고리의 다른 글

웹 DOS 공격 막기  (0) 2012.08.10
압축전송  (0) 2012.08.10
아파치 로그 자동백업  (0) 2012.08.10
아파치 로그  (0) 2012.08.10
아파치 2 최적화  (0) 2012.08.10