리눅스 서버 보안 강화 팁 20선

티스토리 메뉴 펼치기 댓글수4

Security

리눅스 서버 보안 강화 팁 20선

iprize
댓글수4

나의 데이터, 지적 재산, 시간을 크래커의 손에서 보호하기 위해서는 자신의 리눅스 서버의 보안을 강화하는 것이 중요하다. 시스템 관리자가 리눅스 서버 보안에 책임을 갖는다. 리눅스 보안 시리즈 중 첫 번째 포스트로 본 포스트에서는 처음 설치된 리눅스 서버의 보안을 강화하는 팁 20선을 선보인다. 


1. 데이터 통신 암호화하기

네트워크를 통해 전송되는 모든 데이터는 쉽게 모니터링된다. 가능할 경우 비밀번호나 키/인증서를 사용하여 전송되는 모든 데이터를 암호화하라. 


  1. 파일 전송에는 scp, ssh, rsync 또는 sftp를 사용하라. sshfs나 fuse 툴을 사용하여 원격 서버 파일 시스템이나 자신의 홈 디렉토리를 마운트할 수 있다. 
  2. GnuPG는 데이터나 통신을 암호화하고 서명을 추가하며 다용도 키 관리 시스템 역할뿐 아니라 모든 공개키 디렉토리의 접근 모듈 역할을 한다. 
  3. Fugu는 명령행 Secure File Transfer 프로그램(SFTP)의 그래픽 인터페이스이다. SFTP는 FTP와 유사하지만 전체 세션을 암호화하여 비밀번호가 단순 텍스트 형태로 전송되지 않아 불법 접근에 덜 취약하다. 또 다른 프로그램은 FileZilla이며 FTP, FTP over SSL/TLS (FTPS)와 SSH File Transfer Protocol(SFTP)를 지원하는 크로스 플랫폼 클라이언트이다. 
  4. OpenVPN은 비용 효과적인 경량 SSL VPN이다. 
  5. Lighttpd SSL(Secure Server Layer) Https 설정 및 설치
  6. Apache SSL(Secure Server Layer) Https (mod_ssl) 설정 및 설치


1.1 FTP, Telnet, Rlogin/Rsh의 사용을 피하라

대부분의 네트워크 환경에서 사용자 이름, 비밀번호, FTP/telnet/rsh 명령어와 전송되는 파일은 패킷 스니퍼를 사용하는 동일 네트워크 상의 누군가에 의해 가로채일 수 있다. 이 문제에 대한 해결책은 OpenSSH, SFTP, FTPS(FTP over SSL)를 사용하는 것이다. 아래 명령어는 NIS, rsh 및 다른 오래된 서비스를 삭제하는 명령어이다. 


# yum erase inetd xinetd ypserv tftp-server telnet-server rsh-serve


2. 취약점을 최소화하기 위해 소프트웨어를 최소화하라

모든 종류의 웹 서비스가 설치될 필요가 있는가? 소프트웨어의 취약점을 피하기 위해 불필요한 소프트웨어를 설치하지 않도록 한다. yum, apt-get, dpkg와 같은 패키지 매니저를 사용하여 시스템에 설치된 소프트웨어 패키지를 검토하라. 모든 불필요한 패키지를 삭제하라. 


# yum list installed

# yum list packageName

# yum remove packageName

또는 

# dpkg --list

# dpkg --info packageName

# apt-get remove packageName


3. 시스템 또는 VM 인스턴스에 하나의 네트워크 서비스

개별 서버 또는 VM 인스턴스에 서로 다른 네트워크 서비스를 운영하도록 한다. 이러한 원칙은 다른 서비스에 영향을 줄 수 있는 가능성을 제한한다. 예를 들면, 침입자가 아파치 취약점 등을 이용하여 성공적으로 침투할 경우에 침입자는 MySQL, 이메일 서버 등과 같은 다른 서비스 등 전체 시스템에 접근할 수가 있다. 가상화 소프트웨어 설치하는 방법은 아래 링크를 참조하라. 



4. 리눅스 커널과 소프트웨어를 최신 상태로 유지하라

보안 패치를 설치하는 것은 리눅스 서버를 운영하는 데 있어서 아주 중요하다. 리눅스는 시스템을 최신 상태로 유지하기 위한 툴을 제공하며 쉽게 업그레이드를 할 수가 있다. 모든 보안 업데이트는 가능한한 빠른 시일 내에 검토되고 적용되어야 한다. 보안 업데이트를 반영하기 위해 yum, apt-get, dpkg와 같은 패키지 매니저를 사용하라. 


# yum update
또는
# apt-get update && apt-get upgrade

few Red hat / CentOS/ Fedora 리눅스를 설정하여 yum 패키지 업데이트 알림을 메일로 보낼 수 있다. 또 다른 옵션은 모든 보안 업데이트를 cron 작업으로 반영하도록 하는 방법이다. Debian / Ubuntu 리눅스에서는 apticron을 사용하여 보안 알림을 보낼 수 있다. 


5 보안 확장을 사용하라. 

리눅스는 잘못 설정되거나 보안에 위협이 되는 프로그램으로부터 보호를 위한 보안 패치가 제공된다. 가능하다면 네트워크 또는 다른 프로그램에 제한을 주기 위한 SELinux 나 다른 레눅스 보안 확장을 사용하라. 예를 들면, SELinux는 리눅스 커널에 보안 정책을 설정할 수 있다. 


5.1 SELinux

유연성 있는 Mandatory Access Control(MAC)을 제공하는 SELinux를 사용할 것을 강력 추천한다. 표준 Linux Discretionary Access Control (DAC) 환경 하에서 사용자(UID 혹은 SUID) 권한으로 실행한 어플리케이션이나 프로세스는 파일이나, 소켓 및 기타 프로세스에 사용자의 권한을 가진다. MAC 커널을 실행함으로써 악의적이거나 결함이 있는 프로그램이 시스템에 손상을 주거나 파괴하지 못하도록 할 수 있다. SELinux 설정에 대한 공식 Redhat 문서를 참고하라. 


6 사용자 계정과 강력한 비밀번호 정책

사용자 계정을 생성하고 유지하기 위해서는 useradd / usermod 명령어를 사용한다. 시스템 운영을 위해 강력한 비밀번호 정책을 갖도록 한다. 예를 들어, 좋은 비밀번호는 최소 8자 이상 길이를 가지며 알파벳, 숫자, 특수 문자, 대소문자 등을 포함한다. 자신의 시스템에서 약한 사용자 비밀번호를 찾아 내기 위해 "John the ripper"와 같은 툴을 사용하라. 

chage 명령어는 비밀번호 만료일 수를 변경한다. 이는 사용자가 언제 비밀번호를 변경해야 지 시스템이 판단할 수 있는 정보를 제공한다. /etc/login.defs 파일은 비밀번호 기한 설정을 포함한 쉐도우 파일의 설정을 결정한다. 비밀번호 만료 기능을 비활성화하기 위한 명령어는 다음과 같다. 


chage -M 99999 userName

비밀번호 만료 정보를 보기 위해서는 다음 명령어를 사용한다. 


chage -l userName

또는 /etc/shadow 파일의 다음 필드를 변경할 수도 있다. 

{userName}:{password}:{lastpasswdchanged}:{Minimum_days}:{Maximum_days}:{Warn}:{Inactive}:{Expire}:

위 명령어는, 

1. Minimum_days : 비밀번호가 만료되는 최소일 수. 

2. Maximum_days : 비밀번호가 유효한 최대일 수. 즉, 이 시기가 지난 후 사용자는 반드시 비밀번호를 변경해야 한다. 

3. Warn : 비밀번호가 만료되기 전 사용자가 비밀번호를 반드시 변경하도록 경고하는 일수. 

4. Expire : 1970년 1월 1일 이후 계정이 비활성화되는 일 수. 즉 계정이 더 이상 사용되지 않는 절대 일 수. 


/etc/shadow를 직접 수정하기 보다는 chage 명령어를 사용하도록 하자. 

# chage -M 60 -m 7 -W 7 userName

 

다음 글들을 읽어보길 권한다. 


6.2 이전에 사용된 비밀번호 사용 제한하기

사용자가 이전에 사용한 비밀번호를 다시 사용하지 않도록 강제할 수 있다. pam_unix_module_parameter_remember를 사용하여 비밀번호를 재사용할 수 없도록 비밀번호 기억횟수를 설정할 수 있다. 


6.3 로그인 실패 후 사용자 계정 잠그기

리눅스에서 faillog 명령어를 사용하여 faillog 기록을 표시하거나 로그인 실패 횟수를 제한한다. faillog는 /var/log/faillog의 실패 로그 형식을 결정한다. 또한 실패 카운트와 제한을 유지하는 데 사용될 수 있다. 실패한 로그인 시도를 보기 위해서 다음을 실행한다.

faillog

로그인 실패 후 잠긴 계정을 풀기 위해서는,

faillog -r -u userName

계정을 잠그거나 풀기 위해 passwd 명령어를 사용할 수 있다.

# 계정 잠그기

passwd -l userName

# 계정 풀기

passwd -u userName

 

6.4 비밀번호가 설정되지 않은 계정 점검하기

다음과 같이 실행한다.

# awk -F: '($2 == "") {print}' /etc/shadow

 

비밀번호가 설정되지 않은 계정 모두 잠그기

# passwd -l accountName

6.5 루트가 아닌 계정의 UID가 0으로 설정되어 있는지 확인하기

오직 루트 계정만이 UID 0을 가지며 시스템 전체에 접근할 수 있는 권한을 가진다. 다음 명령어로 UID가 0인 계정을 찾아보도록 하자.

# awk -F: '($3 == "0") {print}' /etc/passwd

보통의 경우 아래와 같이 출력되어야 한다.

root:x:0:0:root:/root:/bin/bash

위와 다르게 출력이 된다면 삭제하거나 UID 0를 사용하도록 허가되었음을 확인하자.


7. 루트 로그인 비활성화하기

루트 사용자로 절대 로그인하지 마라. sudo 명령어를 사용하여 루트 레벨로 명령어를 필요할 때 실행하도록 하자. sudo는 루트 패스워드를 공유하지 않고 시스템의 보안을 향상시킨다. sudo는 또한 간단한 감사 및 추적 기능을 제공한다.


8. 물리적 보안

물리적 콘솔 접근을 방지하여야 한다. BIOS를 설정하여 DVD / CD / USB와 같은 외부 장치에서 부팅되는 것을 방지한다. BIOS와 grub boot loader password를 설정하여 이들 셋팅을 보호한다. 모든 운영 시스템은 IDC (Internet Data Center)내에 설치하여 서버에 접근할 때 일정 정도의 보안 체크를 받도록 해야 한다. 아래 글도 참고하도록 한다.

Tips To Protect Linux Servers Physical Console Access.


9. 원치 않은 서비스 비활성화하기

모든 불필요한 서비스나 데몬을 비활성화한다. 모든 불필요한 서비스를 시스템 시작시 구동되지 않도록 설정에서 제거해야 한다. 다음 명령을 사용하여 런레벨 #3으로 시작하는 모든 서비스를 나열한다.

# chkconfig --list | grep '3:on'

서비스를 비활성화하려면,

# service serviceName stop

# chkconfig serviceName off
 


9.1 Listening Network 포트 찾기

다음 명령어를 사용하여 열려 있는 포트와 관련 프로그램을 나열한다.

netstat -tulpn

또는

nmap -sT -0 localhost

namp -sT -0 server.example.com

iptables을 사용하여 열려 있는 포트를 닫고 위 service와 chkconfig 명령어를 사용하여 불필요한 네트워크 서비스를 중지한다.


9.2 참고


10. X 윈도우 삭제하기

서버에 X 윈도우는 필요하지 않다. 메일서버와 아파치 웹 서버에는 X 윈도우를 실행할 이유가 없다. X 윈도우를 비활성화하고 삭제하여 서버의 보안과 성능을 향상시킬 수 있다. /etc/inittab을 편집하여 런레벨을 3으로 설정한다. 마지막으로 X 윈도우 시스템을 삭제한다.

# yum groupremove "X Window System"


11. iptables과 TCPWrappers 설정하기

iptables는 리눅스 커널이 제공하는 방화벽(Netfilter)을 설정하는 데 사용되는 응용프로그램이다. 필요한 트래픽 이외의 트래픽을 걸러 내기 위해서는 방화벽을 사용한다. 또한 호스트 기반의 네트워킹 ACL 시스템인 TCPWrapper을 이용하여 네트워크 접근을 걸러낸다. iptales을 이용하여 서비스거부 공격을 방지할 수 있다.


12. 리눅스 커널 /etc/sysctl.conf 강화하기

/etc/sysctl.conf 파일은 부팅 과정의 커널 파라메터를 지정한다. 리눅스는 부팅과정에서 /etc/sysctl.conf를 읽고 세팅값을 적용한다. 다음은 /etc/sysctl.conf의 예이다.

# Turn on execshield
kernel.exec-shield=1
kernel.randomize_va_space=1
# Enable IP spoofing protection
net.ipv4.conf.all.rp_filter=1
# Disable IP source routing
net.ipv4.conf.all.accept_source_route=0
# Ignoring broadcasts request
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.icmp_ignore_bogus_error_messages=1
# Make sure spoofed packets get logged
net.ipv4.conf.all.log_martians = 1


13. 디스크 파티션 분리하기

사용자 파일과 운영체제를 분리하는 것은 시스템을 더 안전하고 나은 시스템을 만들 수 있다. 다음 파일 시스템을 분리된 파티션에 마운트하는 지 확인한다.

  • /usr
  • /home
  • /var and /var/tmp
  • /tmp

아파치와 FTP 서버를 위한 별도의 파티션을 생성한다. /etc/fstab 파일을 수정하여 다음 설정 옵션을 추가할 수 있다.

1. noexec - 파티션 상의 바이너리파일을 실행할 수 없도록 한다.(바이너리는 실행할 수 없지만 스크립트는 가능하다.)

2. nodev - 파티션 상에 캐릭터 혹은 특수 장비를 허용하지 않는다. (zero, sda와 같은 장치 파일의 사용을 불허한다.)

3. nosuid - 파티션의 SUID/SGID 접근을 불허한다.(setuid 비트를 불허한다)

아래 /etc/fstab 예는 /dev/sda5에 사용자 액세스를 제한한다.

/dev/sda5  /ftpdata          ext3    defaults,nosuid,nodev,noexec 1 2


13.1 디스크 쿼터

모든 사용자에 디스크 쿼터를 적용한다. 디스크 쿼터를 활성화하려면 다음 단계를 따라 설정한다.

1. /etc/fstab 파일을 수정하여 파일 시스템 마다 쿼터를 활성화한다.

2. 파일 시스템을 다시 마운트한다.

3. 쿼터 데이터베이스 파일을 생성한 후 디스크 사용 테이블을 생성한다.

4. 쿼터 정책을 할당한다.

5. 더 자세한 설정은 디스크 쿼터 구현하기를 참고하라.


14. IPv6 기능 끄기

인터넷 프로토콜 버전 6(IPv6)는 인터넷 프로토콜 버전 4(IPv4)를 대체하는 TCP/IP의 새로운 인터넷 계층이며 많은 장점을 가진다. 현재 IPv6의 보안 이슈를 체크할 수 있는 도구가 존재하지 않는다. 대부분의 관리자가 모니터링하지 않기 때문에 불량 트래픽을 IPv6로 보낼 수 있다. 네트워크 설정이 필요하지 않을 경우 IPv6를 비활성화하거나 리눅스 IPv6 방화벽을 활성화한다.


15. 불필요한 SUID와 SGID 바이너리를 비활성화

SUID/SGID에 보안 문제나 버그가 있을 경우 SUID/SGID 비트가 활성화된 파일이 잘못 사용될 수 있다. 따라서 이러한 파일들을 모두 찾아야할 필요가 있다. 아래와 같이 find 명령을 이용한다.

#See all set user id files:
find / -perm +4000
# See all group id files
find / -perm +2000
# Or combine both in a single command
find / \( -perm -4000 -o -perm -2000 \) -print
find / -path -prune -o -type f -perm +6000 -ls

검색된 각 파일을 조사할 필요가 있다. 더 자세한 내용은 검색된 파일의 맨페이지를 참고하라.


15.1 World-Writable 파일

world-writable 파일은 누구나 수정할 수 있기 때문에 보안 이슈를 만들어낸다. 다음 명령어를 사용하여 world-writable 파일 및 Sticky 비트 파일을 검색한다.

find /dir -xdev -type d \( -perm -0002 -a ! -perm -1000 \) -print

검색된 각 파일을 조사할 필요가 있으며 올바른 사용자, 그룹 권한을 설정하거나 삭제한다.


15.2 무소유 파일

누구도 소유하지 않은 파일들은 보안 문제를 가질 수 있다. 아래 명령어를 이용하여 그 누구도 소유하지 않은 파일들을 검색한다.

find /dir -xdev \( -nouser -o -nogroup \) -print

검색된 각 파일을 조사할 필요가 있으며 각각 적합한 사용자와 그룹을 할당하거나 삭제하라.


16.중앙 인증 서비스 사용

중앙 인증 시스템을 사용하지 않을 경우 사용자 인증 데이터는 일관되지 않을 수 있다. 또한 인증 정보가 사용되지 않을 수 있으며 삭제되어야 할 수도 있다. 중앙 인증 서비스는 리눅스/유닉스의 사용자 계정과 인증 데이터를 관리한다. 서버들의 인증 데이터를 유지할 수 있다. 중앙 인증 서비스로 NIS 서비스를 사용하지 마라. 클라이언트와 서버를 위해 OpenLDAP을 사용하라.


16.1 Kerberos

Kerberos는 보안이 취약한 네트워크로 이동하는 패킷은 노출되고 수정될 수 있다는 가정하에 암호화된 공유 키를 사용한 3rd 파티 인증서비스이다. Kerberos는 대칭키 암호화에 기반하며 키 배포 센터가 필요하다. Kerberos를 사용하면 원격 로그인, 시스템간 파일 복사 및 다른 고위험 업무를 더 안전하고 제어하기 쉽게 만들 수 있다. 따라서 사용자가 Kerberos를 사용하여 네트워크 서비스에 인증을 시도할 때 네트워크 트래픽을 모니터링하여 비인증 사용자가 비밀번호를 수집하려는 시도를 효과적으로 방지할 수 있다. Kerberos를 설정하고 사용하는 방법을 참고하라.


17. 로깅 및 감사

모든 해킹, 크래킹 시도를 수집하기 위해 로깅 및 감사 기능을 설정하여야 한다. 기본적으로 syslog는 /var/log/ 디렉토리에 데이터를 저장한다. 이것은 또한 잘못된 설정으로 인해 여러 가지 공격에 시스템이 노출될 수 있는 지를 찾는 데 유용하다. 로깅과 관련된 아래 글을 참고하라.

  1. Linux log file locations.
  2. How to send logs to a remote loghost.
  3. How do I rotate log files?.
  4. man pages syslogd, syslog.conf and logrotate.


17.1 Logwatch/Logcheck으로 의심되는 로그 메시지 감시하기

logwatch나 logcheck를 시용하여 로그를 감시한다. 이 도구들은 로그 파일 모니터링 작업을 간편하게 만든다. syslog에서 특이 사항에 대한 레포트를 메일로 받을 수 있다. 다음은 간단한 syslog 예시 이다.

################### Logwatch 7.3 (03/24/06) ####################
        Processing Initiated: Fri Oct 30 04:02:03 2009
        Date Range Processed: yesterday
                              ( 2009-Oct-29 )
                              Period is day.
      Detail Level of Output: 0
              Type of Output: unformatted
           Logfiles for Host: www-52.nixcraft.net.in
  ##################################################################
 --------------------- Named Begin ------------------------
 **Unmatched Entries**
    general: info: zone XXXXXX.com/IN: Transfer started.: 3 Time(s)
    general: info: zone XXXXXX.com/IN: refresh: retry limit for master ttttttttttttttttttt#53 exceeded (source ::#0): 3 Time(s)
    general: info: zone XXXXXX.com/IN: Transfer started.: 4 Time(s)
    general: info: zone XXXXXX.com/IN: refresh: retry limit for master ttttttttttttttttttt#53 exceeded (source ::#0): 4 Time(s)
 ---------------------- Named End -------------------------
  --------------------- iptables firewall Begin ------------------------
 Logged 87 packets on interface eth0
   From 58.y.xxx.ww - 1 packet to tcp(8080)
   From 59.www.zzz.yyy - 1 packet to tcp(22)
   From 60.32.nnn.yyy - 2 packets to tcp(45633)
   From 222.xxx.ttt.zz - 5 packets to tcp(8000,8080,8800)
 ---------------------- iptables firewall End -------------------------
 --------------------- SSHD Begin ------------------------
 Users logging in through sshd:
    root:
       123.xxx.ttt.zzz: 6 times
 ---------------------- SSHD End -------------------------
 --------------------- Disk Space Begin ------------------------
 Filesystem            Size  Used Avail Use% Mounted on
 /dev/sda3             450G  185G  241G  44% /
 /dev/sda1              99M   35M   60M  37% /boot
 ---------------------- Disk Space End -------------------------
 ###################### Logwatch End #########################


17.2 auditd로 시스템 Accounting

시스템 감사를 위해 auditd가 사용된다. auditd는 디스크에 감사 레코드를 기록한다. 시스템 가동 과정에서 /etc/audit.rules의 규칙들이 이 데몬을 통해서 준비된다. /etc/audit.rules 파일을 열어 셋업 감사 로그 위치와 다른 옵션들을 수정할 수 있다. auditd를 이용하여 다음 질문들에 대답할 수 있다.

1. 시스템 시작 및 정지 이벤트(reboot/halt)

2. 이벤트 일시

3. 이벤트를 발생한 사용자

4. 이벤트 구분(수정, 접근, 삭제, 기록, 업데이트)

5. 성공, 실패 이벤트

6. 날짜 및 시간 변경 이벤트 기록

7. 시스템 네트워크 설정 변경자

8. 사용자/그룹 정보 수정 이벤트 기록

9. 파일을 변경한 사용자 보기

auditd 서비스를 활성화하고 사용하는 법을 설명한  quick tutorial을 참고하라.


18. OpenSSH 서버

원격 로그인과 원격 파일 전송을 위해 SSH 프로토코을 사용하라. 하지만 ssh는 다른 많은 공격에 노출되어 있다. OpenSSH서버를 강화하는 법을 참고하라.

Top 20 OpenSSH Server Best Security Practices.


19. 침입 감지 시스템(Intrusion Detection System)을 설치 및 사용한다

네트워크 침입 감지 시스템(NIDS)은 서비스 거부 공격, 포트 스캔, 네트워크 트래픽 감시하여 감행되는 크랙 시도와 같은 활동을 감지하기 위한 침입 감지 시스템이다.

시스템을 운영 상태로 전환하기 전 통합 점검 소프트웨어(Integrity checking software)를 배포하는 것은 좋은 모범 사례라고 할 수 있다. 가능하면 시스템을 네트워크에 연결하기 전 AIDE 소프트웨어를 설치하라. AIDE는 호스트 기반 침입 감지 시스템(HIDS)이다. 이 소프트웨어는 시스템의 내부를 모니터하고 분석할 수 있다.

Snort는 IP 네트워크상에서 실시간으로 트래픽을 분석하고 로그를 기록할 수 있는 침입 감지 소프트웨어이다.


20. 파일, 디렉토리, 이메일 보호

리눅스는 허가되지 않은 데이터 접근을 방지할 수 있는 방법을 제공한다. 파일 퍼미션과 MAC는 허가되지 않는 데이터 접근을 예방한다. 하지만 공격자가 물리적으로 접근한다면 리눅스의 파일 퍼미션은 소용없어진다. 왜냐하면 단순히 컴퓨터 하드 디스크를 다른 시스템에 연결하여 민감한 데이터를 복사할 수 있기 때문이다. 다음 툴을 이용하여 파일, 파티션 등을 쉽게 보호할 수 있다.

추천 읽을 거리

  • 백업 - 리눅스 시스템의 백업을 생성하는 것은 매우 중요하다. 오프사이트 백업은 침입 등으로 인해 크랙된 서버를 복구할 수 있는 적합한 방법이다. 전통적인 유닉스 백업 프로그램인 dump와 restore도 읽어보길 추천한다.
  • Rootkits 찾기
  • ExecShield Buffer Overflows Protection 활성화하기
  • 레드햇 또는 데비안 리눅스 보안 메일링 리스트나 FSS 피드를 구독하라.

원본 : http://www.cyberciti.biz/tips/linux-security.html

 

 

 

 

 

맨위로