리눅스 설치와 패키지 관리

패키지 최소 설치

리눅스를 설치할 때 보안을 위해 고려해야 할 사항은 운영 체제의 사용 용도(웹 서버, 애플리케이션 서버, DB 서버등)에 맞게 필요한 패키지만 설치하는 것입니다.

예로 DB 전용 서버라면 Web Server 나 Samba 서버같은 사용하지 않는 패키지를 설치하지 않도록 해야 합니다.

FTP나 Samba, Bind 같이 사용하지 않는 서버 프로세스를 구동하는 것은 보안상 문제를 일으킬 수 있으며 운영체제 업그레이드나 패치가 힘들어 지며 재부팅시 오래 걸리는 문제가 있습니다.

특히 웹 서버나 메일 서버같이 DMZ 에 설치되는 서버는 최소 설치후 해당 패키지만 설치하는 것이 좋습니다.

같이 보기

패키지 매니저 사용

패키지를 설치할 때 source 를 다운 받아서 컴파일 해서 설치하는 것은 리눅스의 빌드 환경을 이해할 수 있고 최신 버전의 패키지를 사용할 수 있다는 장점이 있지만 버그나 보안 패치를 적용하기 어렵고 특히 서버의 대수가 늘어나면 많은 시간이 소요되는 단점이 있습니다.

새로운 패키지가 필요하거나 높은 버전의 패키지가 필요하다면 외부 저장소에서 먼저 찾아보는 것을 권장합니다.

저장소를 찾을 때는 제조사에서 직접 제공하는 저장소가 있는지 확인한 후에 없을 경우 3rd party 저장소를 찾는 것을 권장합니다.

예로 nginx 나 MySQL 은 RHEL/CentOS 와 Ubuntu용 저장소를 제공합니다.

RHEL/CentOS 는 다음 저장소가 유명합니다.

Ubuntu는 PPA - Personal Package Archives 에서 패키지를 설치하면 됩니다.

같이 보기

미사용 패키지 삭제

이미 설치해서 사용중인 시스템이라면 사용하지 않는 패키지를 삭제하는 것이 좋으며 다음 명령어로 현재 설치된 패키지의 목록을 확인할 수 있습니다.

RHEL/CentOS

yum list installed

Ubuntu

apt --installed list

특히 운영 시스템은 보안을 위해서 컴파일러등의 개발 도구를 삭제하는 것이 좋습니다.

RHEL/CentOS

yum groupremove "Development tools"

Ubuntu

sudo apt-get purge gcc g++ gdb

X Windows 삭제

이미 설치되어 운영을 하고 있는 서버라면 X-Windows 가 설치되어 있는지 확인하고 설치되어 있다면 삭제하는 게 좋습니다.

X-Windows 는 용량이 크고 의존성 있는 패키지가 많으므로 잦은 업데이트가 발생하게 되며 XDM 은 보안상 문제가 발생할 수 있습니다.

만약 X-Windows 가 없으면 명령어를 입력하지 못하는 운영자라면 계속 같이 일하는 것을 고민해 보기 바랍니다.

X-Windows 가 설치되어 있다면 먼저 telinit 3 명령어로 런 레벨을 3으로 변경한 후에 삭제해야 합니다.

우분투 서버는 X Windows 를 포함하고 있지 않으며 CentOS 에서는 다음 명령어로 X-Windows 패키지를 삭제할 수 있습니다.

yum groupremove "X Window System"

같이 보기

구동 프로세스 최소화

부팅시 자동 구동되는 데몬 프로세스중 사용하지 않는 프로세스는 자동 구동을 끄는 것이 좋습니다.

배포판 및 버전마다 자동 구동 프로세스 관리 방법이 다르므로 아래 내용을 참고해서 사용하는 배포판에 맞게 적용하십시요.

RHEL/CentOS 6

RHEL/CentOS 6 에서는 chkconfig 명령으로 서비스를 제어할 수 있습니다.

# chkconfig --list

auditd          0:off   1:off   2:on    3:on    4:on    5:on    6:off
blk-availability        0:off   1:on    2:on    3:on    4:on    5:on    6:off
cgconfig        0:off   1:off   2:off   3:off   4:off   5:off   6:off
cgred           0:off   1:off   2:off   3:off   4:off   5:off   6:off
crond           0:off   1:off   2:on    3:on    4:on    5:on    6:off
exim            0:off   1:off   2:on    3:on    4:on    5:on    6:off

0:off 1:off 2:on 3:on 4:on 5:on 6:off 의 의미는 run level 이 0, 1 일때는 구동되지 않고 2,3,4,5 일때는 구동된다는 의미입니다.

자동 시작을 끄려면 chkconfig 명령어 뒤에 서비스 명을 입력하고 off 옵션을 주면 됩니다.

chkconfig mysqld off

RHEL/CentOS 7, Ubutun 15+

RHEL/CentOS 7 과 ubunt 15, 16 은 systemd 관리 명령어인 systemctl 를 사용하여 서비스 목록을 확인할 수 있습니다.

# systemctl list-unit-files

UNIT FILE                                 STATE   
proc-sys-fs-binfmt_misc.automount         static  
dev-hugepages.mount                       static  
dev-mqueue.mount                          static  
proc-fs-nfsd.mount                        static  
proc-sys-fs-binfmt_misc.mount             static  
sys-fs-fuse-connections.mount             static  
sys-kernel-config.mount                   static  
sys-kernel-debug.mount                    static  
tmp.mount                                 masked
var-lib-nfs-rpc_pipefs.mount              static  
brandbot.path                             disabled
systemd-ask-password-console.path         static  
systemd-ask-password-wall.path            static  
session-1.scope                           static  
session-3.scope                           static  
arp-ethers.service                        disabled
auditd.service                            enabled

불필요한 서비스는 systemctl disable 서비스명 을 사용하여 자동 시작을 중지할 수 있으며 활성화할 경우 disable 대신 enable 을 사용하면 됩니다.

예로 다음 명령어는 mariadb 서비스를 자동 실행하지 않습니다.

systemctl disable mariadb

특정 서비스의 자동 실행 여부는 systemctl is-enabled 서비스명 을 사용하면 되며 다음 명령어는 nginx 웹 서버의 자동 실행 여부를 출력합니다.

> systemctl is-enabled nginx

disabled

Ubutun 14

우분투 14.04 는 sysv-rc-conf 명령어로 프로세스를 확인할 수 있습니다

$ sudo sysv-rc-conf --list             
apparmor     S:on
beanstalkd   0:off      1:off   2:on    3:on    4:on    5:on    6:off
blackfire-ag 0:off      1:off   2:on    3:on    4:on    5:on    6:off
console-setu
cron        
cryptdisks  
cryptdisks-e 0:on       6:on    S:on

자동 실행 여부는 sudo update-rc.d SERVICENAME defaults 를 사용하면 되며 다음은 nginx 를 부팅시 자동 실행하도록 설정합니다.

sudo update-rc.d nginx defaults 

 Adding system startup for /etc/init.d/nginx ...
   /etc/rc0.d/K20nginx -> ../init.d/nginx
   /etc/rc1.d/K20nginx -> ../init.d/nginx
   /etc/rc6.d/K20nginx -> ../init.d/nginx
   /etc/rc2.d/S20nginx -> ../init.d/nginx
   /etc/rc3.d/S20nginx -> ../init.d/nginx
   /etc/rc4.d/S20nginx -> ../init.d/nginx
   /etc/rc5.d/S20nginx -> ../init.d/nginx

자동 실행 제외는 sudo update-rc.d -f SERVICENAME remove 를 사용하면 되며 다음은 nginx 를 자동 실행에서 제외합니다.

sudo update-rc.d -f nginx remove 

 Removing any system startup links for /etc/init.d/nginx ...
   /etc/rc0.d/K20nginx
   /etc/rc1.d/K20nginx
   /etc/rc2.d/S20nginx
   /etc/rc3.d/S20nginx
   /etc/rc4.d/S20nginx
   /etc/rc5.d/S20nginx
   /etc/rc6.d/K20nginx

시스템을 최신 상태로 유지

패키지 관리자를 사용하여 시스템을 상시 업데이트하여 최신 상태로 유지해야 보안 취약점을 통한 공격에 대응할 수 있습니다.

RHEL은 yum 으로 시스템을 최신 상태로 유지할 수 있습니다.

yum update

우분투는 아래 명령으로 패키지를 업데이트 할 수 있습니다.

apt-get update
apt-get upgrade

참고 자료

Last updated