ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리눅스 서버 관리 및 보안
    컴퓨터/서버관리 2008. 6. 19. 15:54
    리눅스 최적화 및 보안지침
     
    목차
     
    OS 설치
    1. 리눅스 설치
    2. 파티션 나누기
    3. 패키지 선택
     
    OS 설치후 기본설정
    1. 시스템정보 확인
    2. 초기 실행 데몬 선택
    3. 불필요한 패키지 제거
    4. 시스템 및 CMOS 시간동기화
    5. yum을 이용한 최신패키지 업데이트
    6. grub.conf 설정
    7. 시스템 리부팅
    8. HDD 속도체크
     
    시스템 운영 스크립트 활용
    1. addon 사용자관리 명령어
    2. mail 메일계정관리 명령어
    3. dbadd 디비계정 관리명령어
    5. APACHE, PHP, MYSQL 연동 자동인스톨
     
    시스템 보안 설정
    1. logout 시 command history 삭제하기
    2. 자동 로그아웃 환경변수 설정
    3. su 명령어 제한하기
    4. PAM 및 ulimit를 활용한 리소스(resource) 제한
    5. SUID와 SGID 파일 및 디렉토리
    6. 무소속 파일찾아 소유권 부여하기
    7. /dev 에 device 파일외의 것이 있는지 확인
    8. 원격접속허용파일 생성 여부 점검
    9. 숨김파일 또는 비정상적인 파일 존재 여부 점검
    10. 파일시스템 마운트
    11. ch_perm을 통한 파일 및 디렉토리 권한 설정
    12. ssh 무차별 dos 공격에 대한 방어
    14. 넥스트라인 방화벽(next_firewall) 정책설정
    15. 커널 변수 조정
    16. 시스템 이상시 기본적인 점검 사항 및 명령어
    17. TCP-Wrapper 구성
     
    서비스보안
    1. APACHE 보안
    2. PHP 보안
    3. SSH 보안
    4. FTP 보안
    5. SENDMAIL 보안
    6. MYSQL 보안
    7. BIND 보안
     
    보안프로그램
    1. 웹 어플리케이션 보안 KWST (KISA Web Security Template)
    2. 아파차 보안 모듈
     
    ---------------------------------------------------------------
    리눅스 최적화 및 보안지침
     
    1. OS 설치

    1) 리눅스 설치
    리눅스를 설치할 때 시스템을 어떤 용도로 사용할 것인가에 따라 파티션구성 및 패키지 선택이 달라질 수 있습니다. 서버는 여러 사용자에게 서비스를 제공하는 것을 목적으로 함으로써 X-windows나 컴파일러, 게임 등 불필요한 패키지는 설치하지 않도록 합니다.
     
    2) 파티션 나누기
    2-1 파티션닝 목적
    디스크 파티션닝을 하는 것은 시스템 보안의 시작이자 기본이며 시스템 영역과 사용자 영역을 구분하여 파티션을 나누는 목적은 다음과 같습니다.
    ① 디스크공간 고갈 유형의 DoS(Denial of Service) 공격에 대한 방어
    ② SUID 프로그램에 대한 보호
    ③ 백업과 업그레이드 관리가 용이
    ④ 빠른부팅
    ⑤ 각 파일시스템에 대한 마운트 방법 제어 가능
    ⑥ 하드링크를 통한 해킹방지
    ⑦ 각 파티션별 보안설정
     
    2-2 기본 파티션
    파티션
    권장용량
    설명
    Swap
    1 ~ 2G
    Virtual memory을 지원하기 위한 공간으로, 읽고 쓰기가 가장 빠른 HDD실린더의 가장 바깥부분에 만듭니다.
    /
    5G
    시스템 루트파티션으로, 디스크공간 고갈로 인한 시스템 다운방지
    /usr
    5G
    유틸리티 및 쉘 명령어들이 저장되는 곳입니다.
    /var
    5G
    Mail 및 log 데이터가 쌓이는 공간이며, DoS 공격에 이용될 가능성이 있으므로 반드시 파티션닝 합니다.
    /tmp
    1G
    누구나 읽고 쓸 수 있는 디렉토리로 공격자들이 일반유저 권한을 얻은 경우 이곳에 해킹소스를 구축하는 경우가 많으므로 반드시 파티션닝합니다.
    /home
    여유공간 모두 할당
    일반 유저의 홈디렉토리입니다.







     
    3) 패키지 선택
    Custom 모드로 kernel,gcc,glib 외에 서버운영에 필요치 않은 X-windoiws, 게임, 패키지등을 모두 제거하여 서버운영에 최적화 될 수 있도록 설치되어 있습니다. 시스템에 설치되어 있는 패키지 리스트는 /root/nextinstall.log에 기록되어 있습니다.
     
    ---------------------------------------------------------------------------------------

    2. OS 설치후 기본설정
    1) 시스템정보 확인
    pstree, ifconfig, netstat –anp, df –h, cat /rpoc/cpuinfo, cat /proc/meminfo, uname –a 등의 명령으로 OS설치후의 시스템의 기본정보를 체크합니다.
     
    ① 커널 버전 확인
    [root@nextline ~]# uname –a

     
     
    ② 현재 오픈된 포트와 서비스 확인
    [root@nextline ~]# netstat –anp
    [root@nextline ~]# netstat -anp|grep LISTEN
    tcp   0 0 0.0.0.0:3306   0.0.0.0:*    LISTEN 16561/mysqld  
    tcp   0 0 0.0.0.0:110    0.0.0.0:*    LISTEN 2579/xinetd   
    tcp   0 0 0.0.0.0:21   0.0.0.0:*     LISTEN 2579/xinetd   
    tcp   0 0 61.100.191.46:53     0.0.0.0:*     LISTEN 2525/named    
    tcp   0 0 127.0.0.1:53    0.0.0.0:*   LISTEN 2525/named    
    tcp   0 0 0.0.0.0:22   0.0.0.0:*      LISTEN 2579/xinetd   
    tcp   0 0 0.0.0.0:25    0.0.0.0:*     LISTEN 2598/sendmail: acce
    tcp   0 0 127.0.0.1:953  0.0.0.0:*    LISTEN 2525/named    
    tcp   0 0 :::80   :::* LISTEN 16205/httpd
     
    apache, mysql, bind, sendmail, pop3, ssh, ftp 서비스가 구동중임을 확인하실 수 있습니다.
     
    ③ 현재 실행중인 프로세스를 트리구조로 보기
    [root@nextline ~]# pstree
     

     
     
     
    ④ 네트워크 인터페이스에 설정된 아이피 주소 확인
    [root@nextline ~]# ifconfig
    HWaddr 00:0B:6A:DC:4B:FE # 인터페이스의 MAC 주소
    Inet addr: 10.0.0.52      # 인터페이스에 할당된 주소
    Bcast : 10.0.0.255             # 브로드캐스트 주소
    Mask : 255.255.255.0     # 서브넷마스크 비트
    MTU : 1500     # 최대 전송단위(Maximum Transfer Unit)
    # 부팅 후 현재까지 받은 패킷정보
    RX packets:473988 errors: 0 dropped:0 overruns:0 frame:0
    # 부팅 후 현재까지 보낸 패킷정보
    RX packets:473988 errors: 0 dropped:0 overruns:0 frame:0
    Collisions:0 : # 충돌난 패킷 수

     
     
    ⑤ 디스크 용량을 확인
    [root@nextline ~]# df –h


     
    ⑥ CPU 정보 확인
    [root@nextline ~]# cat /proc/cpuinfo

     
     
    ⑦ 메모리 정보 확인
    [root@nextline ~]# cat /proc/meminfo

     

    실 메모리와 현재 사용중인 메모리 용량 확인
    [root@nextline ~]# free –m
    실 메모리 용량 : 768M
    현재 사용중인 메모리 용량 : 94M

     
     
    2) 초기 실행 데몬 선택
    ntsysv을 통해 cron, network, xinetd, syslog 이외 시스템에 불필요한 데몬은 중지시킵니다.
    [root@nextline bin]# ntsysv

     
    부팅시 해당 서비스가 구동되도록 하시려면 해당 서비스 항목에 스페이스바를 이용하여[*] 를 체크하여 주시면 됩니다.

     
     
     
    3) 불필요한 패키지 제거
    시스템에 설치되어 있는 패키지 리스트는 /root/nextinstall.log 에 기록되어 있습니다.
    rpm 명령어를 통해 패키지를 삭제합니다.
     
    rpm 명령어 및 옵션
    새로운 패키지를 설치하거나 업그레이드, 삭제시 사용
     
    패키지 설치 옵션
    -i : 새로운 패키지를 설치할 때 사용  (--install)
    -U : 기존의 패키지를 새로운 버전의 패키지로 업그레이드할 때 사용하고 설치된 패키지가
      없을 경우 패키지를 설치( -i 옵션과 같음)
    -F : 이전 버전이 설치되어 있는 경우에만 설치 (--freshen)
    -v : 메시지를 자세히 보여줌
    -h : '#'기호로 표시해 줌
     
    --force : 기존에 설치된 패키지와 관계없이 강제로 설치 합니다.
    --nodeps : 의존성 관계를 무시하고 설치 합니다.
    -vv : 메시지를 아주 자세히 보줍니다.
    --oldpackage : 구버전으로 다운그레이드할 때 사용합니다.
    --rebuilddb : 특정한 패키지 설치후에 rpm패키지로 검색했으나 나타나지 않을 때 rpm데이
    터베이스를 업데이트합니다
     
    정리
    -ivh : 새로운 패키지 설치
    -Uvh : 업그레이드하거나 새로운 패키지 설치
    -Fvh : 이전 버전의 패키지가 있는 경우에만 패키지 설치
     
    rpm 명령어 사용 예제
     
    proftpd 패키지를 설치하거나 업데이트 합니다.
    [root@nextline ~]# rpm -Uvh proftpd-1.2.9-1.9.i386.rpm
     
    패키지 제거옵션
     
    옵션
    -e : 설치된 패키지를 제거합니다.
    --nodeps : 제거시 의존성을 무시하고 제거합니다.(해당 옵션 사용시 의존성 관련 패키지들이 오류가 발생할 수 있으니 주의 하시기 바랍니다.)
     
    rpm 패키지 제거 옵션 사용 예제
     
    sendmail 패키지 리스트를 확인합니다.
    [root@nextline ~]# rpm -qa | grep sendmail 
    sendmail-devel-8.11.6-27.73
    sendmail-8.11.6-27.73
    sendmail-cf-8.11.6-27.73
     
    sendmail-devel-8.11.6-27.73 라는 rpm 패키지를 삭제 합니다
    [root@nextline ~]# rpm -e sendmail-devel-8.11.6-27.73
     
    proftpd 패키지에 의존성이 있더라도 무시하고 제거합니다.
    [root@nextline ~]# rpm -e proftpd --nodeps
     
    rpm 패키지 검색 옵션
    설치된 패키지와 각 패키지에 포함된 파일들을 검색하여 확인해 볼 수 있습니다.
     
    관련옵션
    -q : 질의시에 꼭 써야하는 옵션입니다. 패키지를 찾으면 패키지이름과 버전만 표시합니다.
    -i : 설치된 패키지의 정보를 보여준다. -p옵션과 사용하면 패키지 파일정보를 보여줍니다.
    -l : 패키지에 포함된 모든 파일을 보여준다. 역시 -p와 사용하려면 정확한 파일명을 보여줍니다. (--list)
    -p 파일명: 패키지의 파일에 대한 정보를 보여줍니다.  정확한 이름을 입력해야 합니다.
    -a : 시스템에 설치된 모든 패키지목록을 보여줍니다. (--all)
    패키지명을 잘 모르는 경우에는 '| grep 패키지명'을 붙여 사용하면 유용합니다.
    -f 파일명: 지정된 파일이 포함된 패키지를 출력합니다.
    -c : 해당패키지의 설정파일이나 스크립트파일을 보여줍니다.
    -d : 해당패키지의 문서파일을 출력합니다.
    -R : 어떤 패키지에 의존하고 있는지를 보여줍니다. (--requires)
     
    rpm 패키지 검색 옵션 사용 예제
     
    설치된 sendmail의 패키지이름과 버전을 보여준다.
    [root@nextline ~]# rpm -q sendmail
    sendmail-8.11.6-27.73
     
    현재 설치된 모든 패키지를 보여준다.
    [root@nextline ~]# # rpm –qa
     
    sendmail관련 패키지를 보여준다.
    [root@nextline ~]# rpm -qa |grep sendmail
    sendmail-devel-8.11.6-27.73
    sendmail-8.11.6-27.73
    sendmail-cf-8.11.6-27.73
     
    sendmail이 설치되어 있는 경로를 보여준다.
    [root@nextline ~]# rpm -ql sendmail
     
    4) 시스템 및 CMOS 시간동기화
    /root/bin/timesync 스크립트를 통해 인터넷 시간서버와 매일 04시에 시스템 및 하드웨어 시간의 동기화 작업이 이루어집니다.
     
    timesync 스크립트는 /root/bin/timesync 경로에 존재합니다.

     
     
    timesync 스크립트는 crontab에 의해 매일 04시에 인터넷 시간서버와 동기화 될 수 있도록 설정되어있습니다.

     
     
    5) yum을 이용한 최신패키지 업데이트
    불필요한 패키지 제거 후 yum 서버를 통해 최신패키지로 업데이트 합니다.
     
    Yum은 지정된 서버주소로부터 업데이트된 패키지들을 검사하여 다운로드하고 설치까지 처리해주는 텍스트 기반의 업데이트 프로그램입니다. 또한 의존성 문제도 같이 검사하여 관련 패키지들을 자동으로 설치해주기 때문에 이전에 다소 불편하던 RPM 기반의 프로그램 설치 및 업데이트를 대폭 개선한 패키지 관리자입니다.
     
    ① 설정 확인
     
    yum 업데이트를 위해서는 업데이트 서버의 URL와 기타 세부적인 설정사항들을 확인해야 합니다. yum 동작에 필요한 설정은 /etc/yum.conf 파일에 기록되어 있으므로, 텍스트 편집기 등을 통해 yum 설정내용을 확인합니다. 업데이트 주소는 /etc/yum.repos.d/CentOS-Base.repo 파일에서 확인 및 수정 할 수 있습니다.
     
     
    ② 업데이트
    위와 같이 설정사항에 이상이 없다면 바로 업데이트 명령을 통해 패키지를 업데이트 할 수 있습니다.
     
    [root@nextline ~]# yum -y update

     
     
    위의 명령을 입력하면 설정파일에 있는 경로를 참고하여 업데이트 서버에 접속한 뒤, 현재 시스템의 패키지들과 업데이트 서버의 패키지들을 비교하여 최신의 패키지를 모두 업데이트 하게 됩니다. 위의 명령은 손쉽게 모든 패키지들을 업데이트 할 수 있기에 가장 많이 사용되는 업데이트 방법입니다. 만일 특정한 패키지들만 업데이트 하고자 하는 경우에는 아래와 같이 원하는 패키지를 별도로 지정해 줍니다.
     
    [root@localhost ~] # yum update [package_name1] [package_name2]...
     
    패키지를 업데이트하기 전에 업데이트된 패키지가 있는지를 체크하기 위해서는 아래와 같이 체크 옵션을 사용합니다.
     
    [rootlocalhost ~] # yum check-update
     
    단, check-update의 경우 현재 시스템에 설치된 패키지를 기준으로 업데이트 목록을 출력해주기 때문에 업데이트 서버에는 등록되어 있지만 현재 시스템에 설치되지 않은 패키지 목록은 볼 수 없습니다. 이럴 경우 아래와 같이 list 명령을 사용해서 업데이트 서버에 있는 모든 패키지 목록을 확인할 수 있습니다.
     
    [root@localhost ~] # yum list
     
    반대로 현재 시스템에 설치되어 있는 패키지 목록을 확인하기 위해서는 아래와 같은 명령을 입력합니다.
     
    [root@localhost ~] # yum list installed
     
    ③ 신규설치
     
    yum을 이용하면 기존 설치되어 있는 프로그램의 업데이트 뿐만 아니라 시스템에 아직 설치되어 있지 않은 새로운 패키지들도 검사하여 설치가 가능합니다. 앞서 말한 yum list 명령으로 업데이트 서버에 있는 패키지 리스트를 확인한 다음, 설치를 원하는 새로운 패키지가 있습니다.면 install 명령으로 설치를 진행할 수 있습니다.
    [root@localhost ~] # yum install package_name
     
    여러 패키지들을 한 번에 설치하기를 원합니다면 해당 패키지를 계속해서 적어 줍니다. (install 옵션에서는 기본적으로 하나 이상의 패키지를 지정해야 합니다.)
     
    [root@localhost ~] # yum install package_name1 [package_name2] ...
     
    ④ 패키지 삭제
     
    yum을 이용하여 패키지를 업데이트하고 신규 설치하는 것 이외에 패키지를 삭제하는 기능도 수행할 수 있습니다.
     
    [root@localhost ~] # yum remove package_name
    여러 패키지들을 삭제하고자 합니다면, 신규설치의 경우와 같이 삭제 명령 뒤에 해당 패키지를 계속해서 지정해주면 됩니다.
     
    ⑤ 기타 기능
     
    업데이트 서버에 등록되어 있는 패키지에 대한 상세한 정보를 보기 위해서는 아래와 같은 명령을 입력합니다.
    [root@localhost ~] # yum info package_name
     
    최근에 업데이트한 패키지에 대한 정보는 아래 명령으로 확인합니다.
    [root@localhost ~] # yum info updates
     
    6) grub.conf 설정
    업데이트 된 커널로 부팅하기 위해 grub.conf 파일을 수정합니다.
    [root@localhost ~] # vi /etc/grub.conf

     
     
     
    항목설명
    default=0
    기본값으로 부팅되도록 설정하는 부분입니다. grub 선택화면에서 특별히 선택하지 않으면
    여기에 설정되어진 값에 해당하는 운영체제를 로딩합니다. 현재 설정인 0값은 아래 항목중
    에서 제일 먼저 설정되어 있는 운영체제를 말합니다.
     
    timeout=10
    grub 부트화면에서의 대기시간입니다. 단위는 초입니다. 현재 설정은 10초간 선택이 없으면
    default에 설정된 값으로 부팅됩니다.
     
    splashimage=(hd0,3)/boot/grub/splash.xpm.gz
    부트 화면의 배경이미지를 지정하는 부분입니다. xpm형태의 그림이미지를 압축한 xpm.gz파일
    을 사용합니다. (hd0,3)의 뜻은 /dev/hda4라는 뜻입니다.
     
    기본구조
    title 부트_엔트리_설명
    root (하드디스크디바이스명,부트파티션명)
    kernel /커널이미지경로 ro root=루트디바이스명
    initrd /초기화에_필요한_이미지경로
     
    7) 시스템 리부팅
    업데이트된 최신커널로 부팅합니다.
     
    8) HDD 속도체크
    커널업데이트 후 하드디스크 속도체크를 합니다.
    UDMA(Ultra DMA) 사용여부 체크
    버스를 통하여 하드디스크 드라이브와 램간에 데이터를 전송하기 위한 프로토콜로서, 이전의 DMA 인터페이스 보다 2배 이상의 속도를 향상시켜 줍니다.

     
     
     
    UDMA(Ultra DMA) 설정

     
     
     
    UDMA(Ultra DMA) 해제

     
     
     
    HDD 읽기 속도 체크
    다음은 초당 24MByte 읽기 속도를 나타내고 있습니다.

     
     
    ---------------------------------------------------------------------------------------
     
    3. 시스템 운영 스크립트 활용

    1) addon 사용자관리 명령어
    addon 명령어는 일반 쉘계정 생성, 아파치 VirtualHost 및 /etc/mail/local-host-names 등록을 한번에 설정할 수 있는 명령어입니다.
    스크립트 경로 : /root/bin/addon

     
     
     
    ① 사용방법
    [root@nextline bin]# /root/bin/addon nextline[계정명] nextline.co.kr[도메인]
    위에서 입력한 계정(nextline)의 홈디렉토리가 도메인(nextline.co.kr)의 DocumentRoot 로 기본 설정됩니다.
    -> nextline 의 비밀번호를 입력하십시오 : ***** [생성한 계정의 비밀번호를 입력합니다.]
    -> 설치완료! [웹 + 메일서버 재가동 요망] [addon 명령어 실행 후 아파치와 sendmail에 적용될 수 있도록 데몬을 재가동 하시기 바랍니다.]

     
     
    ② 계정생성 확인
    ftp을 이용하여 nextline 계정이 정상적으로 생성되었는지 확인합니다.

     
     
     
    생성된 nextline 계정으로 정상적으로 ftp에 접속된 화면입니다.[도메인 리져빙 타임으로 인해 연결되지 않을 시 FTP주소란에 아이피를 기입하시기 바랍니다.]

     
     
     
    ③ 아파치 설정확인(httpd.conf)

     
     
    addon 명령어를 통해 설정한 nextline.co.kr 도메인이 VirtualHost에 자동 등록되어 있습니다.

    DocumentRoot /home/nextline/public_html
    ServerName nextline.co.kr
    ServerAlias www.nextline.co.kr


     
     
     
    ④ /etc/mail/ local-host-names 확인

     
    ⑤ 데몬 재가동
    아파치 데몬 재가동
    [root@nextline ~]# /usr/local/apache/bin/apachectl restart
    Sendmail 데몬 재가동
    [root@nextline ~]# /etc/rc.d/init.d/sendmail restart

     
     
    2) mail 메일계정관리 명령어
    mailadd 명령어는 메일계정을 자동 생성시켜주는 명령어입니다.
    ① 사용방법
    [root@nextline ~]# /root/bin/mailadd next[계정명] nextline@nextline.co.kr[메일주소]   
    next 의 비밀번호를 입력하십시오: ***** [생성한 메일계정의 비밀번호를 입력합니다.]   
    설치완료! [메일서버 재가동 요망] [메일서버에 적용하기위해 sendmail을 재가동합니다.]

     
     
    ② /etc/mail/virtusertable 확인 및 sendmail 데몬 재가동

     
     
    ③ 메일계정 작동확인
    생성한 메일계정이 정상적으로 작동하는지 아웃룩 셋팅을 통해 확인합니다.
    넥스트라인 기술문서(Outlook-Express, Microsoft Outlook 설정하기)
    http://nextline.net/?inc=support&html=manual#z
     
    3) dbadd 디비계정 관리명령어
    데이터 베이스 계정 및 디비를 자동생성해주는 명령어 입니다.
    ① 사용법
    [root@nextline ~]# /root/bin/dbadd nextline[데이터베이스명] nextline[패스워드]
    Enter password: [mysql root 패스워드을 입력합니다.]
    데이터베이스명으로 입력한 nextline가 디비유저명과 동일하게 설정됩니다.

     
    ② 데이터베이스 계정 확인
    위에서 생성한 nextline 계정으로 데이터베이스에 정상적으로 로그인 되는 화면입니다.
    [root@nextline ~]# mysql -u nextline -p
    Enter password:[nextline 데이터베이스 패스워드을 입력합니다.]

     
     
    4) set_dns 초기 네임서버관리 명령어
    set_dns 스크립트는 자체네임서버를 구축할 시 사용되는 명령어로 초기 네임서버 설정을 자동으로 설정해주는 명령어입니다.

    ① 사용방법
    [root@nextline ~]# /root/bin/set_dns nextline.co.kr
    set_dns 는 초기 네임서버 셋팅툴입니다 -> set_dns 로 네임서버 셋업을 진행하시겠습니까 ? [y/n]: [기본값 n]: y [y를 입력하여 set_dns을 이용해 네임서버 설정을 합니다.]
    설치완료! [네임서버 재가동 요망][네임서버에 적용하기위해 named을 재가동 합니다.]

     
       
    ② /etc/named.conf 확인

     
     

     
     
    ③ zone 파일확인
    [root@nextline ~]# cat /var/named/zone-nextline.co.kr

     
       
    ④ named 데몬 재가동
    네임서버에 nextline.co.kr 도메인의 설정내용을 적용시키기 위해 named 데몬을 재가동 합니다.
    [root@nextline ~]# /etc/rc.d/init.d/named restart

     
       
    5) APACHE, PHP, MYSQL 연동 자동인스톨
    ① apm_install를 이용한 A.P.M 자동설치(초기 설치에 사용)
    스크립트경로 : [root@nextline ~]# /root/bin/apm/apm_install

     
     
     
    apm_install를 이용한 A.P.M 자동설치 (넥스트라인 기술문서)
    http://nextline.net/?inc=support&html=pds_view&no=108&name=리눅스&home=Apache
    ② apm_reinstall를 이용한 A.P.M 자동설치(A.P.M 삭제 후 재설치시 사용)
    apm_install 에서 보안설정이 제외된 스크립트입니다. 초기 apm_install 스크립트를 이용하여 설치하신 경우 보안 설정이 이미 완료된 상태이므로 보안 설정 중복으로 인한 오류를 발생되지 않도록 초기 설치를 제외한 A.P.M 재설치시에는 apm_reinstall 스크립트를 이용하여 설치합니다.
    스크립트경로 : [root@nextline ~]# /root/bin/apm/apm_install

     
     
    ③ apm_uninstall를 이용한 A.P.M 자동삭제
    스크립트경로 : [root@nextline ~]# /root/bin/apm/apm_uninstall

     
       
    apm_uninstall를 이용한 A.P.M 자동삭제 (넥스트라인 기술문서)
    http://nextline.net/?inc=support&html=pds_view&no=110&name=리눅스&home=Apache
    ④ apm_phpupdate를 이용한 PHP 자동업그레이드
    스크립트경로 : [root@nextline ~]# /root/bin/apm/apm_phpupdate

     
     
    apm_phpupdate를 이용한 PHP 자동업그레이드 (넥스트라인 기술문서)
    http://nextline.net/?inc=support&html=pds_view&no=109&name=리눅스&home=PHP
    ⑤ APM 소스설치
    넥스트라인 기술문서
    http://nextline.net/?inc=support&html=pds_view&no=116&name=리눅스&home=Apache
     
    ---------------------------------------------------------------------------------------
    4. 시스템 보안 설정
     
    1) logout 시 command history 삭제하기
    root로 로그인시부터 사용했던 명령어의 사용기록을 로그아웃시에는 반드시 지우도록 설정합니다.
    설정파일 : /root/.bash_logout
    /etc/skel/.bash_logout 에 등록하면 일반계정 생성시에도 적용됩니다.

     

     
       
    2) 자동 로그아웃 환경변수 설정
    로그인후 아무런 입력이 없을 경우의 자동 로그아웃시간 등의 설정을 추가합니다.
    [root@nextline ~]# vi /etc/profile

     
     
    변경된 profile을 적용합니다.
    [root@nextline ~]# source /etc/profile
     
    3) su 명령어 제한하기
    넥스트라인 기술문서
    http://nextline.net/?inc=support&html=pds_view&no=51&name=리눅스&home=보안
     
    4) PAM 및 ulimit를 활용한 리소스(resource) 제한
    시스템 자원을 너무 많이 사용하는 특정한 유저나 프로그램의 무한루프방지하기 위한 설정입니다. 서비스 거부공격(프로세스수, 메모리사용량 등) 예방
    #사용자가 로그인시 적용됨
    [root@nextline ~]# vi /etc/pam.d/login

     
     
    [root@nextline ~]# vi /etc/security/pam_limits.so

     
     
    *     soft    core    0  #CORE 파일을 생성하지 않습니다.
    *     hard    rss     10000   #사용 가능한 메모리를 5M로 제한합니다.
    @     hard    nproc   20 # 생성 프로세스를 20개로 제한합니다.
    @nextline  soft    nproc   10 # 생성 프로세스를 10개로 제한합니다.
    @nextline  hard    nproc   30 # 생성 프로세스를 30개로 제한합니다.
    @nextline  hard    maxlogins    4  # 동시접속을 4개로 제한합니다.
    *     hard    maxlogins    6  # 동시접속을 6개로 제한합니다.
    * : 모든유저
    @users : users라는 그룹에 속하는 유저
    hard : 절대 한계를 넘을 수 없음
     
    maxlogins 에 설정된 값 이상 접속시 /var/log/messages 에 다음과 같은 로그가 기록됩니다.
    Mar 20 00:31:45 ns pam_limits[29668]: Too many logins (max 4) for nextline
     
    5) SUID와 SGID 파일 및 디렉토리
    일반 유저 권한으로 suid/sgid가 설정된 파일을 실행할 때에는 해당 파일의 소유자 또는 소유그룹 권한으로 작동하게 되므로 suid/sgid는 보안적인 관점에서 매우 중요한 역할을 합니다. 이 때문에 /usr/sbin/sendmail과 같이 전통적으로 root 권한의 suid/sgid가 설정된 파일에서 보안 취약성이 많이 발견된 것이 사실입니다. 따라서 초기 시스템 구축시 뿐만 아니라 정기적으로 시스템에서 suid/sgid가 설정된 파일을 모니터링 하여 suid/sgid가 불필요하다면 파일 자체를 삭제 하거나 s비트를 해제하는 것이 좋습니다.
     
    [root@nextline ~]# find / -type f \( -perm 4000 –o –perm -2000 \)
    또는
    [root@nextline ~]# find / -type f –perm +6000 –ls
     
    위 명령어 다음과 같은 파일들이 출력됩니다.(배포판이나 버전에 따라 결과가 다를 수 있습니다.)
     
    CenOS 4.5 (2.6.9-67.0.4.ELsmp) 기준
    /usr/lib/mc/cons.saver
    /usr/sbin/lockdev
    /usr/sbin/sendmail.sendmail
    /usr/sbin/utempter
    /usr/sbin/ccreds_validate
    /usr/libexec/pt_chown
    /usr/libexec/openssh/ssh-keysign
    /usr/kerberos/bin/ksu
    /usr/bin/ssh-agent
    /usr/bin/lppasswd
    /usr/bin/lockfile
    /usr/bin/slocate
    /usr/bin/sg
    /usr/bin/jfbterm
    /bin/su
    /sbin/pam_timestamp_check
     
    suid가 설정된 파일에서 s비트 해제
    [root@nextline ~]# chmod u-s /usr/sbin/suid_file
    suid가 설정된 파일에서 s비트 설정
    [root@nextline ~]# chmod u+s /usr/sbin/suid_file
    sgid가 설정된 파일에서 s비트 해제
    [root@nextline ~]# chmod g-s /usr/sbin/suid_file
    sgid가 설정된 파일에서 s비트 설정
    [root@nextline ~]# chmod g+s /usr/sbin/suid_file
     
    6) 무소속 파일찾아 소유권 부여하기
    [root@nextline ~]# find / -nouser -o –nogroup
    [root@nextline ~]# find / \( -nouser -o -nogroup \) \-exec chown root.root {} \;
     
    7) /dev 에 device 파일외의 것이 있는지 확인
    [root@nextline ~]# find /dev -type f
    /dev/MAKEDEV 등과 같이 device 를 관리하고자 하는 파일 이외의 것이 검색되면 일단 의심해봐야 합니다.
    CenOS 4.5 (2.6.9-67.0.4.ELsmp) 기준

     
     
    8) 원격접속허용파일 생성 여부 점검
    .rhosts 파일은 원격에서 패스워드 인증없이 바로 접속하기 위해서 사용되는 파일입니다.
     
    [root@nextline ~]# find / -name .rhosts -exec ls -l {} \;
    [root@nextline ~]# find / -name .rhosts -exec cat {} \;
     
    9) 숨김파일 또는 비정상적인 파일 존재 여부 점검
    [root@nextline ~]# find / -name ".. " -print -xdev
    [root@nextline ~]# find / -name ".*" -print -xdev | cat -v
    [root@nextline ~]# find / -name ".*" \-exec ls -alF {} \;
     
    10) 파일시스템 마운트
    웹해킹시 해킹에 필요한 파일이나 백도어 실행 파일이 업로드되는 곳으로 /tmp와 /dev/shm 디렉토리가 주로 이용됩니다.
    이 디렉토리는 누구나 읽고 쓸 수 있는 곳으로 공격자들이 일반 유저 권한을 얻은 경우 이 디렉토리에 base 기지를 구축 하는 경우가 많습니다. 그러므로, /tmp 는 서버의 경우 반드시 별도의 파티션으로 나누어 noexec, nosuid, nodev 옵션을 설정하여 해킹에 이용되는 파일이 업로드 되더라도 실행을 금지시켜 백도어 포트가 오픈되는 것을 막도록 합니다.
    마운트 옵션 설명
     
    파일시스템 마운트 : fstab
    설정화일 경로 : /etc/fstab
    LABEL=/  /  ext3    defaults   1 1
    none     /dev/pts     devpts  gid=5,mode=620  0 0
    none     /proc   proc    defaults   0 0
    none     /sys    sysfs   defaults   0 0
    LABEL=/usr    /usr    ext3    defaults,nodev   1 2
    LABEL=/var    /var    ext3    defaults,nodev   1 2
    /dev/sda2     swap    swap    defaults   0 0
    none     /dev/shm     tmpfs   defaults,noexec   0 0
    LABEL=/home   /home  ext3   defaults,nosuid,usrquota,data=journal,noatime   1 2
    LABEL=/tmp    /tmp    ext3    defaults,noexec,nosuid        1 2
     
    [파일시스템 장치명] [마운트 포인트] [파일시스템 종류] [옵션] [dump관련설정] [파일점검 옵션]
     
    -파일시스템 장치명 : 장치명을 지정
    ex) /dev/hda2
     
    -마운트 포인트 : 장치가 연결된 마운트 지점
    ex) /home
     
    -파일시스템 종류 : 파티션이 사용하는 파일시스템 지정
    ex) ext2, ext3
     
    -옵션 : 파일시스템의 속성을 설정하는 옵션
    defaults (rw, nouser,auto,exec suid 속성을 모두 가지는 옵션)
    auto : 부팅시 자동 마운트
    noauto : 부팅시 자동마운트 안함
    exec : 실행파일이 실행되는 것을 허용
    no exec : 실행파일이 실행되는 것을 허용 안함
    suid : setuid, setgid의 사용을 허용하는 옵션
    nosuid : setuid, setgid의 사용을 거부
    ro (read only) : 읽기 전용
    rw (ead write) : 읽고 쓰기 가능
    user : 일반 계정 사용자들도 마운트 할 수 있는 옵션
    nouser : root만 mount 가능
    usrquota : 일반 사용자 quota적용
    grpquota : 그룹 quota 적용
     
    -dump 관련 설정 : 0 또는 1을 지정
    0 : 덤프되지 않은 파일시스템
    1 : 데이터 백업을 위해 dump가능
     
    -파일점검 옵션 :0,1,2값을 지정
    0 : 부팅시 fsck를 사용하지 않음
    1 : 루트 파일시스템을 의미
    2 : 루트 파일시스템 이외의 파일시스템을 의미
     
    11) ch_perm을 통한 파일 및 디렉토리 권한 설정
    ch_perm 스크립트에 의해 kill, /etc/service, 등 주요 설정파일 및 명령어에 대한 퍼미션 보안이 crontab에 의해 주기적으로 실행됩니다.
     
    ch_perm 스크립트는 /root/bin/ch_perm 경로에 존재합니다.

     
     
    ch_perm 스크립트는 crontab에 의해 매일 03시에 주기적으로 갱신되어 쉘 명령어 및 주요 파티션의 퍼미션을 재설정합니다.

     
     
    ch_perm 퍼미션 조정 내용
    rm /usr/sbin/adduser > /dev/null 2>&1
    rm -rf /var/tmp /usr/tmp > /dev/null 2>&1
    chattr +i /etc/services > /dev/null 2>&1
    chmod 751 / > /dev/null 2>&1
    chmod 701 /bin > /dev/null 2>&1
    chmod 700 /boot > /dev/null 2>&1
    chmod 1777 /tmp > /dev/null 2>&1
    chmod 701 /dev > /dev/null 2>&1
    chmod 755 /dev/shm > /dev/null 2>&1
    chmod 751 /etc > /dev/null 2>&1
    chmod 751 /home > /dev/null 2>&1
    chmod 751 /lib/modules > /dev/null 2>&1
    chmod 700 /mnt > /dev/null 2>&1
    chmod 700 /root > /dev/null 2>&1
    chmod 751 /sbin > /dev/null 2>&1
    chmod 751 /usr > /dev/null 2>&1
    chmod 751 /usr/local > /dev/null 2>&1
    chmod 701 /usr/local/apache/cgi-bin > /dev/null 2>&1
    chmod 700 /usr/local/apache/conf > /dev/null 2>&1
    chmod 705 /usr/local/apache/htdocs > /dev/null 2>&1
    chmod 701 /usr/local/apache/logs > /dev/null 2>&1
    chmod 751 /usr/local/bin > /dev/null 2>&1
    chmod 751 /usr/local/sbin > /dev/null 2>&1
    chmod 700 /usr/local/src > /dev/null 2>&1
    chmod 751 /usr/sbin > /dev/null 2>&1
    chmod 750 /usr/src > /dev/null 2>&1
    chmod 751 /var > /dev/null 2>&1
    chmod 750 /var/log > /dev/null 2>&1
    chmod 751 /var/named > /dev/null 2>&1
    chmod 751 /var/run > /dev/null 2>&1
    chmod 755 /var/tmp > /dev/null 2>&1
    chmod 750 /etc/cron.* > /dev/null 2>&1
    chmod 640 /etc/crontab > /dev/null 2>&1
    chmod 750 /etc/default > /dev/null 2>&1
    chmod 600 /etc/exports > /dev/null 2>&1
    chmod 600 /etc/fstab > /dev/null 2>&1
    chmod 600 /etc/hosts.allow > /dev/null 2>&1
    chmod 600 /etc/hosts.deny > /dev/null 2>&1
    chmod 600 /etc/inittab > /dev/null 2>&1
    chmod 400 /etc/issue > /dev/null 2>&1
    chmod 400 /etc/issue.net > /dev/null 2>&1
    chmod 600 /etc/login.defs > /dev/null 2>&1
    chmod 750 /etc/logrotate.d > /dev/null 2>&1
    chmod 600 /etc/mtab > /dev/null 2>&1
    chmod 650 /etc/my.cnf > /dev/null 2>&1
    chmod 750 /etc/rc.d > /dev/null 2>&1
    chmod 600 /etc/redhat-release > /dev/null 2>&1
    chmod 750 /etc/rpm > /dev/null 2>&1
    chmod 600 /etc/rpc > /dev/null 2>&1
    chmod 600 /etc/securetty > /dev/null 2>&1
    chmod 751 /etc/security > /dev/null 2>&1
    chmod 700 /etc/skel > /dev/null 2>&1
    chmod 750 /etc/ssh > /dev/null 2>&1
    chmod 750 /etc/sysconfig > /dev/null 2>&1
    chmod 750 /etc/xinetd.d > /dev/null 2>&1
    chmod 750 /etc/vsftpd > /dev/null 2>&1
    chown named /etc/named.conf > /dev/null 2>&1
    chown named /etc/rndc.* > /dev/null 2>&1
    chmod 700 /sbin/netreport > /dev/null 2>&1
    chmod 111 /usr/bin/sudo > /dev/null 2>&1
    chmod 550 /usr/bin/last > /dev/null 2>&1
    chmod 550 /usr/bin/uptime > /dev/null 2>&1
    chmod 700 /usr/sbin/groupdel > /dev/null 2>&1
    chmod 600 /etc/httpd/conf/httpd.conf > /dev/null 2>&1
    chmod 600 /etc/lilo.conf* > /dev/null 2>&1
    chmod 600 /etc/logrotate.conf > /dev/null 2>&1
    chmod 600 /etc/mail/access > /dev/null 2>&1
    chmod 600 /etc/mail/local-host-names > /dev/null 2>&1
    chmod 600 /etc/mail/virtusertable > /dev/null 2>&1
    chmod 600 /etc/proftpd.conf > /dev/null 2>&1
    chmod 600 /usr/local/apache/conf/*.conf > /dev/null 2>&1
    chmod 600 /usr/local/apache/logs/*_log > /dev/null 2>&1
    chmod 600 /var/log/httpd/*_log > /dev/null 2>&1
    chmod 640 /etc/named.conf > /dev/null 2>&1
    chmod 700 /bin/cat > /dev/null 2>&1
    chmod 550 /bin/df > /dev/null 2>&1
    chmod 550 /bin/dmesg > /dev/null 2>&1
    chmod 700 /bin/echo > /dev/null 2>&1
    chmod 700 /bin/kill > /dev/null 2>&1
    chmod 700 /bin/ln > /dev/null 2>&1
    chmod 700 /bin/mail > /dev/null 2>&1
    chmod 700 /bin/mount > /dev/null 2>&1
    chmod 550 /bin/netstat > /dev/null 2>&1
    chmod 500 /bin/ping > /dev/null 2>&1
    chmod 550 /bin/ps > /dev/null 2>&1
    chmod 700 /bin/rpm > /dev/null 2>&1
    chmod 700 /bin/touch > /dev/null 2>&1
    chmod 700 /bin/umount > /dev/null 2>&1
    chmod 700 /bin/uname > /dev/null 2>&1
    chmod 700 /etc/logrotate.d > /dev/null 2>&1
    chmod 700 /etc/rc.d/init.d/* > /dev/null 2>&1
    chmod 700 /sbin/fdisk > /dev/null 2>&1
    chmod 700 /sbin/ifconfig > /dev/null 2>&1
    chmod 700 /sbin/pwdb_chkpwd > /dev/null 2>&1
    chmod 700 /sbin/route > /dev/null 2>&1
    chmod 700 /sbin/unix_chkpwd > /dev/null 2>&1
    chmod 700 /usr/bin/at > /dev/null 2>&1
    chmod 700 /usr/bin/c++ > /dev/null 2>&1
    chmod 700 /usr/bin/chage > /dev/null 2>&1
    chmod 700 /usr/bin/chattr > /dev/null 2>&1
    chmod 700 /usr/bin/chfn > /dev/null 2>&1
    chmod 700 /usr/bin/chsh > /dev/null 2>&1
    chmod 700 /usr/bin/crontab > /dev/null 2>&1
    chmod 700 /usr/bin/curl > /dev/null 2>&1
    chmod 700 /usr/bin/file > /dev/null 2>&1
    chmod 550 /usr/bin/find > /dev/null 2>&1
    chmod 700 /usr/bin/free > /dev/null 2>&1
    chmod 700 /usr/bin/ftp > /dev/null 2>&1
    chmod 700 /usr/bin/gcc > /dev/null 2>&1
    chmod 700 /usr/bin/gpasswd > /dev/null 2>&1
    chmod 751 /usr/bin/host > /dev/null 2>&1
    chmod 700 /usr/bin/lsattr > /dev/null 2>&1
    chmod 700 /usr/bin/make > /dev/null 2>&1
    chmod 700 /usr/bin/man > /dev/null 2>&1
    chmod 700 /usr/bin/mc > /dev/null 2>&1
    chmod 700 /usr/bin/msgfmt > /dev/null 2>&1
    chmod 700 /usr/bin/nc > /dev/null 2>&1
    chmod 700 /usr/bin/ncftp > /dev/null 2>&1
    chmod 700 /usr/bin/ncftpbatch > /dev/null 2>&1
    chmod 700 /usr/bin/ncftpbookmarks > /dev/null 2>&1
    chmod 700 /usr/bin/ncftpget > /dev/null 2>&1
    chmod 700 /usr/bin/ncftpls > /dev/null 2>&1
    chmod 700 /usr/bin/ncftpput > /dev/null 2>&1
    chmod 700 /usr/bin/newgrp > /dev/null 2>&1
    chmod 700 /usr/bin/nmap > /dev/null 2>&1
    chmod 700 /usr/bin/nslookup > /dev/null 2>&1
    chmod 700 /usr/bin/objdump > /dev/null 2>&1
    chmod 700 /usr/bin/oldps > /dev/null 2>&1
    chmod 700 /usr/bin/passwd > /dev/null 2>&1
    chmod 700 /usr/bin/patch > /dev/null 2>&1
    chmod 700 /usr/bin/pmake > /dev/null 2>&1
    chmod 750 /usr/bin/pstree > /dev/null 2>&1
    chmod 700 /usr/bin/python > /dev/null 2>&1
    chmod 750 /usr/bin/rcp > /dev/null 2>&1
    chmod 700 /usr/bin/rlog > /dev/null 2>&1
    chmod 750 /usr/bin/rlogin > /dev/null 2>&1
    chmod 750 /usr/bin/rsh > /dev/null 2>&1
    chmod 700 /usr/bin/scp > /dev/null 2>&1
    chmod 700 /usr/bin/ncftpbatch > /dev/null 2>&1
    chmod 700 /usr/bin/ncftpbookmarks > /dev/null 2>&1
    chmod 700 /usr/bin/ncftpget > /dev/null 2>&1
    chmod 700 /usr/bin/ncftpls > /dev/null 2>&1
    chmod 700 /usr/bin/ncftpput > /dev/null 2>&1
    chmod 700 /usr/bin/newgrp > /dev/null 2>&1
    chmod 700 /usr/bin/nmap > /dev/null 2>&1
    chmod 700 /usr/bin/nslookup > /dev/null 2>&1
    chmod 700 /usr/bin/objdump > /dev/null 2>&1
    chmod 700 /usr/bin/oldps > /dev/null 2>&1
    chmod 700 /usr/bin/passwd > /dev/null 2>&1
    chmod 700 /usr/bin/patch > /dev/null 2>&1
    chmod 700 /usr/bin/pmake > /dev/null 2>&1
    chmod 750 /usr/bin/pstree > /dev/null 2>&1
    chmod 700 /usr/bin/python > /dev/null 2>&1
    chmod 750 /usr/bin/rcp > /dev/null 2>&1
    chmod 700 /usr/bin/rlog > /dev/null 2>&1
    chmod 750 /usr/bin/rlogin > /dev/null 2>&1
    chmod 750 /usr/bin/rsh > /dev/null 2>&1
    chmod 700 /usr/bin/scp > /dev/null 2>&1
    chmod 700 /usr/bin/sftp > /dev/null 2>&1
    chmod 700 /usr/bin/skill > /dev/null 2>&1
    chmod 700 /usr/bin/ssh > /dev/null 2>&1
    chmod 750 /usr/bin/telnet > /dev/null 2>&1
    chmod 550 /usr/bin/top > /dev/null 2>&1
    chmod 700 /usr/bin/users > /dev/null 2>&1
    chmod 700 /usr/bin/vmstat > /dev/null 2>&1
    chmod 550 /usr/bin/w > /dev/null 2>&1
    chmod 700 /usr/bin/wget > /dev/null 2>&1
    chmod 700 /usr/bin/whereis > /dev/null 2>&1
    chmod 700 /usr/bin/which > /dev/null 2>&1
    chmod 550 /usr/bin/who > /dev/null 2>&1
    chmod 700 /usr/bin/whoami > /dev/null 2>&1
    chmod 700 /usr/bin/whois > /dev/null 2>&1
    chmod 700 /usr/bin/yes > /dev/null 2>&1
    chmod 700 /usr/local/bin/php > /dev/null 2>&1
    chmod 700 /usr/sbin/ping6 > /dev/null 2>&1
    chmod 700 /usr/sbin/sshd > /dev/null 2>&1
    chmod 700 /usr/sbin/tcpdump > /dev/null 2>&1
    chmod 700 /usr/sbin/traceroute > /dev/null 2>&1
    chmod 700 /usr/sbin/traceroute6 > /dev/null 2>&1
    chmod 550 /usr/sbin/useradd > /dev/null 2>&1
    chmod 550 /usr/sbin/userdel > /dev/null 2>&1
    chmod 700 /usr/sbin/userhelper > /dev/null 2>&1
    chmod 700 /usr/sbin/usermod > /dev/null 2>&1
    chmod 700 /usr/sbin/usernetctl > /dev/null 2>&1
    chmod 750 /bin/chmod > /dev/null 2>&1
    chmod 500 /usr/bin/wall > /dev/null 2>&1
    chmod 700 /usr/bin/write > /dev/null 2>&1
    chmod 750 /usr/include > /dev/null 2>&1
    chmod 751 /etc/mail > /dev/null 2>&1
    chmod 751 /usr/local > /dev/null 2>&1
    chmod 751 /usr/local/bin > /dev/null 2>&1
    chmod 751 /usr/local/mysql > /dev/null 2>&1
    chmod 751 /var/log > /dev/null 2>&1
    chmod 751 /var/named > /dev/null 2>&1
    chown root.users /bin/chmod > /dev/null 2>&1
    ln -s /tmp /var/tmp > /dev/null 2>&1
     
    12) ssh 무차별 dos 공격에 대한 방어
    /var/log/secure 로그를 살펴보면 일정한 ID를 이용해서 SSH 접속 시도를 하는 것을 볼 수 있으며 이런 공격은 SSH Bruteforce(무차별 공격)로서, 패스워드 사전 파일을 이용해서 미리 지정한 아이디와 대입하여, 접속 계정을 알아 내는 해킹 방법입니다.
     
    SSH Bruteforce(무차별 공격)을 차단하기 위해 넥스트라인에서는 ssh_dos_block.sh 스크립트를 crontab에 의해 주기적으로 공격시도 데이터를 주기적으로 업데이트 후 해당 아이피를 자동 차단시키는 툴을 제공하고 있습니다.
     
    ssh_dos_block.sh 스크립트는 /root/bin/ssh_dos_block.sh 경로에 존재합니다.

     
     
     
    ssh_dos_block.sh 스크립트가 매 30초마다 실행되도록 crontab에 등록되어 있습니다.

     
     
    13) 백도어나 루트킷 방어를 위한 rkhunter 방어
    백도어나 루트킷을 탐지하여 일반적으로 루트킷이 사용하는 파일 및 숨김 파일의 존재여
    부를 판별해주며, 실행 시 관리자에게 각 파트별로 체크사항을 보여주는 리포트기능을 제공하는 툴입니다.
     
    넥스트라인 기술문서(rkhunter을 통한 시스템 무결성 체크하기)
    http://nextline.net/?inc=support&html=pds_view&no=125&name=리눅스&home=기타
     
    주기적으로 rkhunter DB을 업데이트 하여 신종 루트킷이나 백도어에 대비할 수 있도록  crontab에 등록되어 있습니다.

     
     
    14) 넥스트라인 방화벽(next_firewall) 정책설정
    설정도구 : iptables
    방화벽 경로 : /root/bin/next_firewall

     
     
     
    기본 룰셋 :
    inbound  : 외부에서 서버로의 접속은 다음 서비스포트에 대해서만 허용합니다.
    ftp (21)/ ssh(22) / smtp(25) / dns(53) / http(80) / pop3(110) / mysql(3306) / ping
    outbound : 서버에서 외부로는 모든 서비스포트를 허용합니다.
     
    Next_firewall
    ### 룰셋 초기화
    $IPTABLES -F
     
    ### 기본정책 설정
    $IPTABLES -P INPUT DROP
    $IPTABLES -P FORWARD DROP
    $IPTABLES -P OUTPUT ACCEPT
     
    ### Loopback 트래픽 허용
    $IPTABLES -A INPUT -i lo -j ACCEPT
     
    ### 자기자신을 소스로 하는 트래픽 차단
    $IPTABLES -A INPUT -i eth0 -s $IP_ADDR -j DROP
    $IPTABLES -A INPUT -i eth0 -s 127.0.0.0/8 -j DROP
     
    ### 상태추적 설정
    $IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    $IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    $IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
    $IPTABLES -A INPUT -p all -m state --state INVALID -j DROP
     
    ### 비정상적 tcp-flags 차단
    $IPTABLES -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL PSH,FIN -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL URG,PSH,FIN -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL SYN,ACK,FIN -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL SYN,FIN,PSH -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL SYN,FIN,RST -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL SYN,FIN,RST,PSH -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL SYN,FIN,ACK,RST -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL SYN,ACK,FIN,RST,PSH -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP
     
    ### 서비스포트 추가/제거를 위해서는, 반드시 아래의 설정만 수정하시기 바랍니다.
    ### $IPTABLES 구문앞의 (#)주석 제거후, next_firewall 를 재가동하시면 해당포트는 활성화 됩니다..
     
    ### ftp servive
    $IPTABLES -A INPUT -p tcp --sport 1024: --dport 20 -m state --state NEW -j ACCEPT
    $IPTABLES -A INPUT -p tcp --sport 1024: --dport 370 -m state --state NEW -j ACCEPT
     
    ### ssh servive
    $IPTABLES -A INPUT -p tcp --sport 1024: --dport 37 -m state --state NEW -j ACCEPT
     
    ### telnet servive
    #$IPTABLES -A INPUT -p tcp --sport 1024: --dport 23 -m state --state NEW -j ACCEPT
     
    ### smtp servive
    $IPTABLES -A INPUT -p tcp --sport 1024: --dport 25 -m state --state NEW -j ACCEPT
     
    ### dns servive
    $IPTABLES -A INPUT -p tcp --sport 1024: --dport 53 -m state --state NEW -j ACCEPT
    $IPTABLES -A INPUT -p udp --sport 1024: --dport 53 -m state --state NEW -j ACCEPT
     
    ### http servive
    $IPTABLES -A INPUT -p tcp --sport 1024: --dport 80 -m state --state NEW -j ACCEPT
     
    ### pop3 servive
    $IPTABLES -A INPUT -p tcp --sport 1024: --dport 110 -m state --state NEW -j ACCEPT
     
    ### identd servive
    $IPTABLES -A INPUT -p tcp --syn --dport 113 -j REJECT --reject-with tcp-reset
     
    ### imap servive
    #$IPTABLES -A INPUT -p tcp --sport 1024: --dport 143 -m state --state NEW -j ACCEPT
     
    ### snmp servive
    #$IPTABLES -A INPUT -p udp --sport 1024: --dport 161 -m state --state NEW -j ACCEPT
     
    ### https servive
    #$IPTABLES -A INPUT -p tcp --sport 1024: --dport 443 -m state --state NEW -j ACCEPT
     
    ### rsync servive
    #$IPTABLES -A INPUT -p tcp --sport 1024: --dport 873 -m state --state NEW -j ACCEPT
     
    ### mysql servive
    $IPTABLES -A INPUT -p tcp --sport 1024: --dport 3306 -m state --state NEW -j ACCEPT
     
    ### ping servive
    $IPTABLES -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
     
    넥스트라인 기본룰셋 이외 포트 추가하기
     
    ### 서비스명
    $IPTABLES -A INPUT -p tcp --sport 1024: --dport "포트" -m state --state NEW -j ACCEPT
     
    방화벽(next_firewall) 사용법 :
    방화벽 시작   : next_firewall start

     
    방화벽 중지   : next_firewall stop

     
    방화벽 재가동 : next_firewall restart

     
     
    15) 커널 변수 조정
    arp 스푸핑 및 DDOS 공격을 차단하기 위한 커널변수들이 설정되어있습니다.
    설정화일 경로 : /etc/sysctl.conf
    적용방법 : sysctl –p

     
    # proxy arp를 설정하지 않습니다.
    net.ipv4.conf.eth0.proxy_arp=0
    net.ipv4.conf.lo.proxy_arp=0
    net.ipv4.conf.default.proxy_arp=0
    net.ipv4.conf.all.proxy_arp=0
     
    # 게이트웨이로부터의 redirect를 허용하지 않음으로써 스푸핑을 막기 위해 설정합니다.
    net.ipv4.conf.eth0.secure_redirects=0
    net.ipv4.conf.lo.secure_redirects=0
    net.ipv4.conf.default.secure_redirects=0
    net.ipv4.conf.all.secure_redirects=0
     
    # 스푸핑을 막기 위해 source route 패킷을 허용하지 않습니다.
    net.ipv4.conf.eth0.accept_source_route=0
    net.ipv4.conf.lo.accept_source_route=0
    net.ipv4.conf.default.accept_source_route=0
    net.ipv4.conf.all.accept_source_route=0
     
    # Broadcast로부터 오는 핑을 차단함(Smurt 공격을 차단함).
    net.ipv4.icmp_echo_ignore_broadcasts=1
     
    # IP 나 TCP 헤더가 깨진 bad icmp packet을 무시합니다.
    net.ipv4.icmp_ignore_bogus_error_responses=1
     
    # 자신의 네트워크가 스푸핑된 공격지의 소스로 쓰이는 것을 차단합니다.
    net.ipv4.conf.eth0.rp_filter=2
    net.ipv4.conf.lo.rp_filter=2
    net.ipv4.conf.default.rp_filter=2
    net.ipv4.conf.all.rp_filter=2
     
    # bootp 패킷을 허용하지 않습니다.
    net.ipv4.conf.eth0.bootp_relay=0
    net.ipv4.conf.lo.bootp_relay=0
    net.ipv4.conf.default.bootp_relay=0
    net.ipv4.conf.all.bootp_relay=0
     
    # 스푸핑된 패킷이나 소스라우팅, Redirect 패킷에 대해 로그파일에 정보를 남긴다.
    net.ipv4.conf.eth0.log_martians=1
    net.ipv4.conf.lo.log_martians=1
    net.ipv4.conf.default.log_martians=1
    net.ipv4.conf.all.log_martians=1
     
    # 1/100초에 받아들이는 igmp "memberships"의 수
    net.ipv4.igmp_max_memberships=1
     
    # 매우 복잡한 사이트에서는 이 값을 늘리는 것도 가능하지만 64로 두는 것이 적당하며
    # 더 늘렸을 경우에는 큰 문제가 발생할 수도 있습니다..
    net.ipv4.ip_default_ttl=64
     
    # 게이트웨이 서버가 아닌 이상 패킷을 포워딩 할 필요는 없다.
    net.ipv4.ip_forward=0
     
    # fragmented packet이 메모리에 존재하는 시간을 15초로 설정합니다.
    net.ipv4.ipfrag_time=15
     
    # SYN_Flooding 공격에 대한 대비로 백로그큐(Backlog Queue)가 가득차면 다른 접속 요구를 받아들이지 못합니다.
    net.ipv4.tcp_max_syn_backlog=1024
     
    # TCP 연결에서 Three-way Handshake가 성공적으로 이루어지지 않으면 더 이상 소스 경로를 거슬러 올라가지 않도록합니다.
    # 따라서 적절한 연결 요청에 대해서만 연결을 맺는다.
    # syncookies가 작동할 때 SYN Flooding 공격이 있으면 messages 파일에 아래와 같은 내용이 출력됩니다.
    # possible SYN flooding on port 80. Sending cookies.
    net.ipv4.tcp_syncookies=1
     
    # 일정한 시간과 IP별로 보내고 받는 SYN 재시도 횟수를 3회로 제한합니다.
    # 이 옵션은 스푸핑된(위조된) 주소로 오는 SYN 연결의 양을 줄여준다.
    # 기본 값은 5(180 초에 대응)이며 255를 넘지 않아야 합니다.
    net.ipv4.tcp_syn_retries=3
     
    # passive TCP 접속시도가 재접속을 하기 위한 SYNACKs의 값을 정합니다. 255 보다 높
    # 게 지정할 수 없다. 기본값은 5이며, 180초에 대응이 됩니다.
    net.ipv4.tcp_synack_retries=3
     
    # 무언가 문제가 있을 때 연결을 위해 재시도 할 횟수, 최소 값과 기본 값은 3입니다.
    net.ipv4.tcp_retries1=3
     
    # TCP 연결을 끊기 전에 재시도할 횟수.
    net.ipv4.tcp_retries2=7
     
    # 연결을 종료시 소요되는 시간을 줄여준다(기본 설정값: 60).
    net.ipv4.tcp_fin_timeout=20
     
    # 동시에 유지 가능한 timewait 소켓의 수입니다.
    # 만약 지정된 숫자를 초과하였을 경우에는 timewait 소켓이 없어지며 경고 메시지가 출력됩니다.
    # 이 제한은 단순한 DoS 공격을 차단하기 위해 존재하는데, 임의로 이 값을 줄여서는 안되며
    # 메모리가 충분하다면 적절하게 늘려주는 것이 좋은데, 64M 마다 180000으로 설정하면 됩니다.
    # 따라서 256M일 경우에는 256/4=4 4*180000=720000
     
    # 64M -> 180000
    # 128M -> 360000
    # 256M -> 720000
    # 512M -> 1440000
    # 1G -> 2880000
    # 2G -> 5760000
     
    net.ipv4.tcp_max_tw_buckets=2880000
     
    # 연결이 끊어졌다고 판단할 때까지, 얼마나 keepalive probe 를 보낼지 결정. 기본값 9회
    # 간단한 DoS 공격을 막아준다.
    net.ipv4.tcp_keepalive_probes=2
     
    # keepalive 가 활성되 되어 있을 경우, 얼마나 자주 TCP 가 keepalive 메세지를 보
    # 내게 할 것인지를 설정.
    net.ipv4.tcp_keepalive_time=30
     
    # keepalive_probes 를 보낼 간격을 정함. probe 를 보낸 후, probes * intvl 의 시
    # 간이 지나도록 응답이 없으면 연결이 해제된 것으로 간주하게 됨. 기본 값의 사용
    # 시 11분 15초 동안 재시도를 하고 연결을 취소함. 값은 초단위
    net.ipv4.tcp_keepalive_intvl=10
     
    # 서버 쪽에서 닫은 TCP 연결을 끊기 전에 확인하는 횟수를 정합니다. 기본 값은 7 로
    # RTO 50 초에서 16 분 사이에 해당합니다. 웹 서버가 운영 중 이라면 이 값을 줄여서
    # 소켓 등이 귀한 리소스를 소비하지 않도록 할 수도 있습니다..
    net.ipv4.tcp_orphan_retries=2
     
    # SYN 패킷을 전송한 후에 로스가 발생을 하여 ACK 를 일부 받지 못했을 경우, 선택
    # 적으로 (selected) 받지못한 ACK 만 받도록 요청하는 것을 허락합니다. 로스가 많은
    # 네트워크에서는 상당히 중요한 역할을 합니다.
    net.ipv4.tcp_sack=1
     
    16) 시스템 이상시 기본적인 점검 사항 및 명령어
    넥스트라인 기술문서
    http://nextline.net/?inc=support&html=pds_view&no=190&name=리눅스&home=보안
     
    17) TCP-Wrapper 구성
     
    넥스트라인 기술문서
    http://nextline.net/?inc=support&html=pds_view&no=126&name=리눅스&home=기타

     
    ---------------------------------------------------------------------------------------
    5. 서비스보안
     
    1) APACHE 보안
     
    리눅스를 사용하는 가장 큰 이유는 웹서버를 운영하기 위해서입니다. 이 웹서버를 가능하게 해주는 프로그램이 아파치입니다. 아파치의 보안에 대해 알아보도록 합니다.

    보안설정 이외의 httpd.conf 상세한 설정내용은 넥스트라인 기술문서를 참조하시기 바랍니다.

    넥스트라인 기술문서 - httpd.conf 환경설정
    http://www.nextline.net/?inc=support&html=pds_view&no=204&name=리눅스&home=


    APACHE 설정파일 : httpd.conf
    소스 설치 설정파일 경로 : /usr/local/apache/conf/httpd.conf
    rpm 설치 설정파일 경로 : /etc/httpd/conf/httpd.conf
     

    APACHE 보안

     

    1. 웹문서디렉토리(DocumentRoot)에서 불필요한 문서 제거

    소스로 아파치를 설치하게 되면 기본 웹 문서가 위치하는 디렉토리가 /usr/local/apache/htdocs입니다. htdocs 디렉토리에는 아파치 관련정보가 들어있는 문서와 공개될 필요가 없는 문서가 위치하고 있습니다. 이 문서들을 제거합니다.

     

    httpd.conf 지시자

    DocumentRoot "/usr/local/apache/htdocs"

     

    명령어

    [root@nextline ~]# cd /usr/local/apache/htdocs/

    DocumentRoot 디렉토리로 이동합니다.

     

    [root@nextline htdocs]# rm -rf *

    rm 명령어를 이용하여 /usr/local/apache/htdocs/ 하위의 모든 문서를 제거합니다.

     

    또 다른 방법으로는 httpd.conf에서 DocumentRoot값을 새로운 경로로 지정합니다.

     

    2. 불필요한 CGI 스크립트제거하기

    apache를 설치하면 cgi-bin 디렉토리에 기본으로 CGI스크립트가 설치됩니다. CGI 스크립트가 공격에 이용될 수도 있기 때문에 모두 제거하도록 합니다. 특히 초기버전인 경우에 php.cgi등이 제공되었는데 해킹의 빌미를 제공하였다. cgi-bin 디렉토리에 있는 모든 파일을 제거합니다.

     

    cgi-bin 경로

    /usr/local/apache/cgi-bin

     

    명령어

    [root@nextline ~]# cd /usr/local/apache/cgi-bin

    DocumentRoot 디렉토리로 이동합니다.

     

    [root@nextline htdocs]# rm -rf *

    rm 명령어를 이용하여 /usr/local/apache/cgi-bin 하위의 모든 문서를 제거합니다.

     

    3. DocumentRoot, 사용자 홈디렉토리(/home)에 설정하는 디렉토리 옵션 설정하기

    기본적인 설정을 모두 제거하고 보안과 관련있는 항목만 옵션으로 지정합니다.

     

    httpd.conf 지시자 

    /usr/local/apache/htdocs/">

      Options Indexes FollowSymLinks ExecCGI

    AllowOverride All

    Order allow,deny

      Allow from all

     

         Options Includes FollowSymLinks ExecCGI

         AllowOverride All

         Order allow,deny

         Allow from all

    /usr/local/apache/htdocs/">

    tag에 의하여 각 directory마다 적절하게 permission을 걸 수가 있습니다.

     

    Options Indexes FollowSymLinks ExecCGI

     

    None

    어떤 옵션도 이용할 수 없습니다.

     

    All

    지정한 directory에서 모든 명령을 이용할 수 있습니다.

     

    Indexes

    URL에 지정된 디렉토리에 (index.html 같은) 지정된 파일이 없을 경우 디렉토리의 파일 목록을 보여주는 옵션입니다.

     

    Includes

    서버측의 추가적인 정보를 제공할 수 있게 합니다.

     

    IncludesNoExec

    서버측의 추가적인 정보를 제공할 수 있게 하지만, 어떠한 실행 파일을 실행하는 것을 방지합니다.

     

    FollowSymLinks

    디렉토리상의 심볼릭 링크를 사용 가능하게 합니다.

     

    ExecCGI

    CGI 스크립트를 실행할 수 있게 합니다.

     

    MultiViews

    All 옵션이 설정되었을 때만 지정된 목록의 multiviews를 허용합니다.

     

    AllowOverride All

    .htaccess파일은 서버의 각 디렉토리에 만들어서 각 디렉토리에 대한 접근을 제어하기 위한 것으로 디렉토리에 .htaccess파일이 있으면, 서버 전체에 작용하는 access.conf 보다 우선권을 가집니다. .htaccess파일에 대한 Override에 대한 옵션입니다.

     

    None

    .htaccess파일을 읽을 수 없게 합니다.

     

    All

    모든 지정에 대해 가능하게 합니다.

     

    Options

    규정된 디렉토리 형식을 콘트롤하는 지정의 사용을 허락합니다.

     

    FileInfo

    문서형식을 콘트롤하는 지정의 사용을 허용합니다.

     

    AuthConfig

    사용자 인증 지정의 사용을 허용합니다. 사용자 인증 변수를 사용합니다.

     

    Limit

    호스트 접근을 콘트롤하는 지정을 허용합니다.

     

    Order

    Limit에 관련된 부분을 설정을 합니다. 서버가 access control을 수행하는 순서를 나타냅니다. 여기서는 allow기능을 먼저 수행하고, deny기능을 수행하라는 것입니다.

     

    deny, allow

    deny 지시자 부터 검사하고 allow 지시자를 검사 합니다.

     

    allow, deny

    allow 지시자 부터 검사하고 deny 지시자를 검사 합니다.

     

    mutual-failure

    allow목록에 없는 모든 host에게 접속을 거부 합니다.

     

    allow from

    나열되는 주소들에 대한 access control을 가능하게 합니다. 사용 가능한 주소는 도메인 네임, 호스트 이름 주소, 호스트 ip 주소, ip 주소의 앞부분 3바이트, 모든 주소에 해당하는 all 이 있습니다.

     

    deny from

    allow from과 반대되는 개념이며, 사용가능한 주소는 allow from과 같다.

     

    Require

    사용자, 그룹에 대한 접근을 통제할 수 있습니다.

    사용방법 : require entity en1 en2 ... enn

    entity에 들어갈 수 있는 것은 user, group, valid-user의 세가지이다.

     

    User

    지정된 사용자들에게만 접근을 허용하는 것으로, 지정된 사용자에 대한 정보는 AuthUserFile에서 지정한 파일에 있습니다.

     

    Group

    지정된 그룹에게만 접근을 허용하는 것으로, 지정된 그룹에 대한 정보는

    AuthGroupFile에서 지정한 파일에 있습니다.

     

    valid-user

    AuthUserFile에 있는 모든 사용자에 대해 접근을 허용합니다.

     

    4. ~ 태그 이용하기

    태그는 각 디렉토리별로 HTTP Method의 사용여부를 통제하는 태그입니다. 파일의 업로드 및 파일의 수정, 삭제를 위해서 사용되는 HTTP Method PUT POST, DELETE 가 있는데 이 Method를 제한합니다.

     

    httpd.conf 지시자

    Require valid-user

    개인 사용자 홈디렉토리에서 POST, PUT, DELETE Method를 패스워드 파일에 등록된 사용자만이 이용가능하도록 제한한 것입니다.

     

    5. 헤더 정보 숨기기

    클라이언트가 Apache 웹서버에 접속했을 때 웹서버에서는 응답 메시지의 헤더에 웹서버 버전, 설치된 응용프로그램 등과 같은 정보를 전달합니다.

     

    ① 헤더 정보 확인하기

    [root@nextline ~]# telnet xxx.xxx.xxx.xxx 80

         Trying xxx.xxx.xxx.xxx...

         Connected to xxx.xxx.xxx.xxx.

         Escape character is '^]'.

         GET / HTTP/1.1

     

         HTTP/1.1 400 Bad Request

         Date: Sat, 14 Dec 2002 14:24:11 GMT

         Server: Apache/1.3.26 (Unix) PHP/4.2.2

         Connection: close

         Transfer-Encoding: chunked

         Content-Type: text/html; charset=iso-8859-1

     

    이 정보는 공격자에 의해 Apache 웹서버 버전과 구동되고 있는 응용프로그램의 버전을 확인하고 알려진 취약점을 이용하여 공격하는데 유용하게 이용될 수 있습니다.

     

    ② 헤더 정보 숨기기

    Apache 웹서버에서는 "ServerTokens"지시자를 수정함으로써 헤더에 의해 전송되는 정보를 바꿀 수 있습니다.

     

    httpd.conf 지시자

    ServerTokens 키워드

     

    ③ 키워드와 제공되는 정보

     

    Prod[ductOnly]

    웹서버 종류만 표기됩니다. ) Server:Apache

     

    Min[imal]

    Prod 키워드 제공정보 + 웹서버 버전 예) Server:Apache/1.3.26

     

    OS

    Min 키워드 제공 정보 + 운영체제 예) Server:Apache/1.3.26 (Unix)

     

    Full

    OS 키워드 제공정보 + 설치된 모듈(응용프로그램) 정보

    ) Server: Apache/1.3.26 (Unix) PHP/4.2.2

    참고: ServerToken apache 1.3이상에서 가능하고 ProductOnly키워드는 1.3.12버전 이상에서만 사용가능하다. 일반적으로 ServerTokens httpd.conf에 명시되어 있지 않는 경우가 많다. 이런 경우에는 기본값인 "ServerTokens Full"이 적용되어 모든 정보가 응답   헤더에 포함되어 클라이언트에게 전송됩니다. 최소한의 정보를 주기 위해서는   "ServerTokens Prod"가 좋습니다.

     

    6. 기본 사용자 인증 설정

    기본 사용자 인증과 다이제스트 사용자 인증의 설정 방법은 매우 유사하다. 다음과 같이 두가지 절차를 거쳐 설정할 수 있습니다.

    * 패스워드 파일 생성

    * 패스워드 파일을 사용할 수 있도록 Apache 환경 설정

     

    ① 패스워드 파일생성

    [root@nextline ~]# cd /usr/local/apache/bin/

    아파치 bin 디렉토리로 이동합니다.

    [root@nextline ~]# ./htpasswd -c /usr/local/apache/password nextline

    New password: (패스워드입력)

    Re-type new password: (패스워드입력)

    패스워드 파일을 처음 생성할 경우에는 -c 옵션을 사용하여 만듭니다.

    [root@www /usr/local/apache/bin]# ./htpasswd  /usr/local/apache/password nextline2

    New password: (패스워드입력)

    Re-type new password: (패스워드입력)

    사용자를 추가할 경우에는 -c 옵션을 빼고 사용하면 됩니다. 만약 -c 옵션을 사용할 경우에는 기존의 등독된 사용자들은 지워지므로 주의해야 합니다.

     

    [root@www /usr/local/apache/bin]# cat ../password

    nextline:LT30X3txYYEuY

    nextline2:/RfZRDXV1N/Eo

    패스워드 파일을 확인해보면 사용자ID와 패스워드 필드로 구성되어 있는데, 패스워드  필드는 암호화되어 저장됩니다. 또한 두 사용자가 암호를 동일하게 입력해도 암호화된 값 은 다르게 나타납니다.

     

    패스워드 파일을 사용가능하기 위한 환경설정

    httpd.conf파일내에서 디렉토리별로 사용자 인증을 하기 위한 설정을 하면 됩니다.

     

    httpd.conf 지시자

    AllowOverride AuthConfig

     

    사용자 인증이 필요한 디렉토리에 아래의 지시자들이 포함된 .htaccess파일을 생성 합니다.

     

    지시자

    AuthType

    인증형태(Basic 또는 Digest)

    AuthName

    인증영역(웹브라우저의 인증창에 표시됨)

    AuthUserFile

    사용자 패스워드 파일의 위치

    AuthGroupFile

    그룹 파일의 위치(옵션)

    Require

    접근을 허용할 사용자 또는 그룹정의

     

    예문

    앞의 패스워드 파일에 등록된 nextline, nextline2라는 사용자만을 정해진 디렉토리에 접속할 수 있도록 설정해보자.

       [nextline@nextline ~]$ cat .htaccess

       AuthType Basic

       AuthName "Welcome nextline's Home

       AuthUserFile /usr/local/apache/password

       Require user nextline nextline   // 만약 패스워드파일에 등록된 모든 사용자를 접근가능하도록 설정하려면 Require valid-user 라고 하면 됩니다.

     

    관련명령어

    htpasswd

    아파치 사용자 인증을 위한 파일을 생성하거나 업데이트를 하는 명령입니다.

     

    사용법

    htpasswd [options] password_file username

     

    options

    -c

    새로운 패스워드 파일을 생성합니다.

     

    [nextline@nextline ~]$ htpasswd -c /usr/local/apache/password nextline

    password라는 파일을 생성하면서 nextline이라는 사용자를 등록합니다.

    [nextline@nextline ~]$ htpasswd /usr/local/apache/password nextline2

    nextline2 라는 사용자를 등록합니다.

     

    7. 접근통제

    클라이언트가 사용하는 호스트의 IP주소나 도메인에 의해서 웹서버의 데이터에 대한 접근을 통제할 수 있습니다.. 기본적인 서버 설정은 DocumentRoot의 내용에 대해 누구나 접속 을 허락하도록 설정되어 있습니다.

    Apache "Allow" "Deny"지시자는 사용자 시스템의 호스트 이름과 호스트 주소를 근간으로 접속을 허락 또는 차단할 수 있도록 지정할 수 있습니다. 또한, "Allow" "Deny"지시자를 동시에 사용할 경우 그 순서를 정하는 "Order" 지시자를 사용하여 보다 정교한 정책설정을 할 수 있습니다.

     

    Order Deny,Allow

    Deny지시자가 Allow지시자보다 먼저 검사됩니다. 접근을 기본적으로 허용됩니다.

    즉, Deny지시자나 Allow지시자에 일치하지 않는 클라이언트의 접속을 허용합니다.

     

    Order Allow,Deny

    Allow지시자가 Deny지시자보다 먼저 검사됩니다. 접근을 기본적으로 차단됩니다.

    , Deny지시자나 Allow지시자에 일치하지 않는 클라이언트의 접속은 차단합니다.

     

    Order Mutual-failure

    Allow 리스트에 있고, Deny리스트에 없는 호스트만 접근을 허용합니다.순서는 "Allow,Deny"때와 같다.

     

    (참고) 일반적인 Firewall이나 라우터의 접근통제 Rule은 순차적으로 비교하다가 최초로 일치하는 Rule을 적용하고 그 이후는 비교하지 않지만, Apache에서는 Allow Deny를 일단 모두 비교하고 둘 중에 하나라도 일치할 경우 적용합니다는 점에서 차이가 있습니다.. 또한 "Order"지시자 사용시 키워드(Allow 또는 Deny)는 콤마(,)에 의해서만 분리되고 공백이 들어가서는 안됩니다.

     

    Order deny,allow

    deny from all

    allow from 172.16.10

    "deny from" "allow from"지시자는 호스트, 도메인 이름, IP주소, 서브넷마스크를  가진 주소(예를 들면 172.16.10.0/255.255.255.0), CIDR(Classes InterDomain Routing)마스크를 가진 IP주소(172.16.10.0/24)를 사용할 수 있습니다.

     

    8. 권한부여

    권한부여는 특정한 자원에 접근할 사용자 퍼미션이 유효한지를 확인하는 것입니다. 어떤 퍼미션에 의해 허락되고 거부될지는 자원과 그 자원과 관련된 규칙들에 따라서 다양하다. 각 파일과 디렉토리구조는 다른 접근통제나 사용자인증 방법을 가질 수 있습니다. 접근통제와 사용자 인증방법을 사용하여 각 자원에 대한 다양한 권한을 부여할 수 있습니다. 가령 인터넷에서 접속 시에는 사용자이름과 패스워드를 확인하고 인트라넷에서 접속 시에는  요구하지 않도록 설정할 수도 있습니다. 이는 "Satisfy"지시자를 통해서 구현할 수 있습니다.

     

    Satisfy any | all

    all은 인트라넷 사용자에 대해 패스워드를 묻지 않고 접속이 가능하게 하는 것이고, any는인트라넷 사용자라도 패스워드를 묻는다.

     

         Order deny,allow

         deny from all

         allow from xxx.xxx.xxx.xxx

         AuthType Basic

         AuthName "Welcome Posein's Home"

         AuthUserFile /usr/local/apache/password

         Require nextline nextline2

         Satisfy Any

     

    AuthName 항목에서 1.3버전에서는 겹따옴표가 앞쪽에 하나이고, 2.0버전에서는 겹따옴표가 앞뒤로 두개를 써야 합니다.

     



     
    SSL/TLS 인증
    앞에 열거된 사용자 인증기법들은 모든 웹 컨텐츠를 암호화하지 않습니다는 단점이 있습니다..최근 인터넷 뱅킹등과 같이 전송로상에 전송되는 웹컨텐츠 역시 보호되어져야 하는 경우가 많다. SSL/TLS는 사용자인증과 웹서버 데이터와 컨텐츠를 암호화하는 수단입니다. SSL을 지원하기 위해서 Apache는 Mod_SSL 모듈을 가지고 있고, 이 모듈은 SSL v2, v3 그리고 새로운 TLS을 사용하는 강력한 암호화를 제공합니다. 현재 이 모듈은 강력한 128bit암호화와 RSA, Diffie-Hellman암호화를 제공합니다.
    동작원리: 최초 핸드쉐이크 후에 SSL은 비밀키를 생성하고 이 대칭키 암호화가 데이터 암호화를 위해 사용됩니다. 공개키(비대칭키)는 단말의 신원 인증과 대칭키 교환에 사용됩니다.     메시지 무결성은 MAC(Massage Authentication Code)에 의해 제공되고 신뢰된 접속을     가능하게 합니다.
    SSL 프로토콜이 제공하는 주요기능
    * 사설접속과 데이터 암호화
    * 서버에 통신하는 단말 인증
    * 신뢰된 접속
     
    SSL 보안서버 설치
    보안서버 SSL Linux Apache 1.X버전
    넥스트라인 기술문서
    http://nextline.net/?inc=support&html=pds_view&no=165&name=리눅스&home=보안
     
    보안서버 SSL ( Linux Apache 2.X 버전)
    넥스트라인 기술문서
    http://nextline.net/?inc=support&html=pds_view&no=155&name=리눅스&home=보안
     
    Apache SSL 설치방법
    넥스트라인 기술문서
    http://nextline.net/?inc=support&html=pds_view&no=164&name=리눅스&home=보안
     
    2) PHP 보안
    php.ini 보안설정
     

    보안설정 이외의 php.ini 상세한 설정내용은 넥스트라인 기술문서를 참조하시기 바랍니다.

    넥스트라인 기술문서 - php.ini 환경설정
    http://nextline.net/?inc=support&html=pds_view&no=207&name=리눅스&home=PHP

    설정파일 경로 : /usr/local/lib/php.ini

     

    php.ini 보안설정

    safe_mode - On

    safe_mode On 일 경우 파일을 이 디렉토리 및 그 하위로부터 include 하는 경우는 UID/GID 의 체크가 스킵됩니다. 이러한 디렉토리는 include_path 에 포함되도록 하거나 또는 include 시에 절대 경로를 사용해야 합니다. exec관련의 함수를 통해 실행할 수 있는 권한을 safe_mode_include_dir에 있는 실행파일만으로 설정합니다.

     

    이 값을 On으로 설정하면 PHP에 의한 파일 액세스 시 권한을 점검합니다. 웹 프로그램이 /etc/passwd 등 주요 시스템 파일을 액세스 하지 못하도록 제한할 수 있으나, 이로 인해 웹 프로그램이 정상 작동하지 않을 수 있으니 주의하여야 합니다.

     

    display_errors = On

    Error Page 또는 Warning Page 노출을 피하기 위한 것입니다. 공격자들은 일부러 에러를 발생하여 서버에 대한 정보를 확인합니다. 이를 막기 위해 아래와 같이 수정합니다.

    On 으로 했을 시 웹사이트의 파일 정보나 데이타베이스 스키마등의 시큐리티 정보를 접속 사용자에게 표출 될 수도 있기 때문입니다. 이 옵션을 On으로 설정하는 경우 PHP 실행 중 발생하는 에러 정보가 사용자 브라우저에 반환됩니다. 이 정보에는 웹 서버 상의 절대 경로, SQL 쿼리 등 공격자에게 유용한 정보가 포함되어 있으므로, 반드시 이 값을 Off로 설정하여야 합니다.

     

    register_globals = On

    혹시라도 낮은 버전을 사용하는 경우는 이 부분이 디폴트로 On 되어있는데, 특별한 이유가 없다면 Off 로 설정하는 것이 좋습니다.

    이 값을 On으로 설정하면 PHP가 입력으로 받아들이는 값(환경 변수, GET, POST, 쿠키, Server 변수)을 무조건 전역(Global)변수로 다루게 됩니다. 전역 변수가 고전적인 C 프로그램에서 얼마나 많은 버그를 발생시켰는지 아신다면, 이 값을 Off로 설정하는 것이 왜 바람직한지 짐작할 수 있을 것입니다. 전역 변수는 프로그램의 동작 중 어디서나 변수값이 바뀔 수 있기 때문에, 웹 프로그램의 인자 조작, 예기치 못한 오동작 등 다양한 보안 문제가 발생할 수 있습니다. PHP 4.2.0 이후로는 보안상의 문제를 고려해 디폴트로 Off로 설정되어 나오지만, 아직 많은 프로그램이 On 상태에서만 작동하도록 개발되어 있어 서버 관리자들이 On으로 변경하는 경우가 많습니다. On 값에 의존하는 프로그램이 있으면 개발자에게 해당 문제를 알리고 수정을 요구하시는 것이 바람직합니다

     

    safe_mode_gid - Off

    위의 설정과 함께 파일 액세스 시 권한을 점검합니다. 이로 인해 웹 프로그램이 정상 작동하지 않을 수 있으니 주의하여야 합니다.

     

    expose_php - Off

    웹 브라우저의 요청에 대해 PHP 정보를 보내지 않습니다. 그러나 PHP 확장자 설정을 변경하는 등 추가적인 조치를 취하지 않습니다면, 여러분이 PHP를 사용 중이라는 사실이 손쉽게 노출될 수 있으므로 보안상 큰 도움이 되지 않습니다.

     

    file_uploads - Off

    해당 사이트의 PHP 프로그램들이 파일 업로드를 필요로 하지 않는다면 이 값을 Off로 설정하여, 파일 업로드 공격의 발생 가능성을 낮출 필요가 있습니다. 파일 업로드를 통한 사이트 장악은 매우 빈번하게 발생합니다.

    allow_url_fopen Off 이 옵션을 On으로 설정하면 파일 액세스 시 외부 사이트의 파일을 불러올 수 있습니다. 이 기능은 분산 컴퓨팅과 개발, 관리 측면에서 매우 편리하지만, 외부 공격자에 의해 서버를 침탈당하게 되는 주요 원인이 되어 왔습니다. 특히 include(), require() 계열의 함수 사용시 심각한 보안 상의 문제를 유발하게 됩니다. 특수한 경우를 제외하고는 이 기능이 필요치 않으므로 이 옵션을 반드시 Off로 설정하시기 바랍니다.

     

    magic_quotes_gpc = Off

    Sql Injection 과 같은 공격을 막는데 도움이 됩니다. GET/POST/Cookie 의 입력 데이터에 관해서 특수 문자를 이스케이프 Get 방식으로 입력되는 ".." 는 일반적으로 필터링 하도록 설계되고 있습니다. 쉘에는 ".\./" ".."과 동일하게 간주됩니다. 특수문자에 대한 전체적인 제한이 필요하다.

     

    이 옵션을 On으로 설정하면 PHP가 입력으로 받아들이는 값(환경 변수, GET, POST, 쿠키, Server 변수)에 단일 인용 부호('), 이중 인용 부호("), 백슬래쉬(), 널문자(NUL)가 포함된 경우 자동으로 해당 문자 앞에 백슬래쉬를 추가하여 특수 문자 처리를 합니다. 이로 인해 웹 프로그램의 인자를 변경하는 SQL 구문 삽입(injection) 공격의 성공률을 낮춰줍니다. 이 값을 Off로 설정하면 /etc/passwd%00 과 같이 널 문자를 사용해 시스템 상의 임의의 파일을 열람할 수 있으니 반드시 On으로 설정하여야 합니다.

     

    magic_quotes_sybase - Off

    Sybase 사용자의 정상적인 DB 접속을 위해 만들어진 기능이지만,

    이 기능은 magic_quotes_gpc 설정을 무력화합니다. 여러분이 Sybase 사용자가 아니라면 반드시 이 값을 Off로 설정하여야 합니다. Sybase 사용자는 PHP가 입력으로 받아들이는 모든 변수에 대해 addslashes() 함수를 사용하여 명시적으로 특수 문자 처리를 하여야 합니다.

     

    open_basedir - 디렉터리

    이 옵션에 적절한 디렉터리를 설정하면, PHP의 파일 액세스 시 지정된 디렉터리(및 하위 디렉터리)를 벗어난 파일은 액세스 할 수 없게 됩니다.

     

    safe_mode_exec_dir - 디렉터리

    이 옵션을 지정하면 system(), exec(), passthru() 등 외부 명령어 실행 시 지정된 디렉터리에 존재하지 않는 프로그램은 실행할 수 없게 됩니다. 공격자가 임의로 업로드 한 공격 도구나 wget, xterm 등 공격에 사용될 만한 명령어를 실행할 수 없도록 막을 수 있습니다.

     

    allow_url_fopen = On

    URL(http:// ftp:// )을 파일로서 취급할지를 결정합니다.

    많이 발생하고 있는 대규모 홈페이지 변조는 php의 외부사이트 소스 실행기능을 이용하여 악의적인 프로그램을 실행시킴으로써 발생시킵니다.

     

    필요 시 특정 홈페이지만 외부 사이트의 소스 실행 허용을 설정할 수 있습니다.

       

       

        ServerAdmin webmaster@nextline.co.kr

        DocumentRoot /home/nextline/public_html

        ServerName nextline.co.kr

        php_admin_flag allow_url_fopen On     <---------- 라인 추가

        ErrorLog logs/nextline.co.kr-error_log

        CustomLog logs/nextline.co.kr-access_log common

       

     


     
    3) SSH 보안
     
    ① 설정파일 보안적용

     
    보안설정 이외의 sshd_conf 상세한 설정내용은 넥스트라인 기술문서를 참조하시기 바랍니다.

    넥스트라인 기술문서 - SSH 환경설정
    http://nextline.net/?inc=support&html=pds_view&no=203&name=리눅스&home=기타


     
    설정파일 경로 : /etc/sshd/sshd_conf
     

    sshd_conf 보안설정

     

    Port 22

    ssh가 사용할 기본 포트를 지정합니다. 포트 변경 시 /etc/services 파일에서 sshd 관련 포트 역시 변경할 포트로 변경해 주어야 합니다.

     

    AllowUsers root nextline   

    로그인 허락할 계정 nextline root 두 계정에게만 로그인 허용 합니다.

     

    PermitRootLogin no

    root 로그인 허용여부를 결정하는 것입니다. yes, no, without-password를 사용할 수 있습니다. 현재 no로 되어 있기 때문에 직접  root로 접속이 불가능합니다. 이옵션을 yes 로 하기보다는 일반계정으로 로그인후 su 명령으로 root로 전환하는 것이 보안상 안전합니다.

     

    ListenAddress 0.0.0.0

    sshd가 귀를 기울일 주소를 정해줍니다. 0.0.0.0은 모든 곳으로 부터 접속 을 받아들이겠다는 의미입니다. 하지만 패키징을 할때 어떻게 한것인지는 모르겠지만 tcp-wrapper의 영향을 받아서 hosts.deny에서 막혀 있으면 접속이 안되니 hosts.allow hosts.deny에서 sshd2 항목으로 제어를 할수가 있습니다.

     

    AllowedAuthentications   publickey,password

    Sshd2가 제공하는 인증은 password publickey 그리고 hostbased 방식이 있는데, 기본 적으로 public,password가 사용됩니다. 이는 순서대로 인증하는 방법을 보여주는데, 먼저 publickey로 인증하고, 두 번째로 password로 인증한다는 의미입니다.

     

    DenyUsers  nextline, 3737

    접근을 거부할 로컬의 유저를 지정합니다. 위 설정은 nextline uid 3737인 계정으로 ssh 접속 시도할 경우 접근이 거부됩니다.

     

    DenyGroups

    명시된 그룹은 ssh서비스에 접근할 수 없도록 하는 기능 입니다.

    (DenyGroups sysadmin accounting) 와일드카드가 지원되며 공백 문자로 그룹을 구분합니다.

     

    DenyHosts

    명시된 호스트는 ssh서비스에 접근할 수 없도록 하는 기능 입니다.

    (Deny Hosts shell.ourcompany.net).호스트 IP를 쓰거나 호스트 명을 쓸 수 있으며 와 일드 카드가 지원되고 공백 문자로 호스트를 구분합니다.

     

    AllowHosts   1.2.3.0/24 192.168.1.3

    로그인을 허가할 IP 또는 IP 대역을 지정합니다. 여러 개일 경우에는 공란이나 "," 로 구분하여 나열하면 되고 도메인 이름일 경우에는 reverse mapping이 제공되어야 합니다.

     

    AllowGroups

    ssh서비스에 접근 가능한 그룹을 명시합니다.

    ( : AllowGroups sysadmin accounting) 와일드카드가 지원되며 공백문자로 그룹을 구분합니다.

     

    MaxConnections   0

    최대 몇개의 접속을 허락할지를 지정합니다. 0은 제한을 하지 않습니다.

     

    PasswordGuesses   3

    암호인증 방식으로 인증할 때 최대 몇 차례 시도를 허용할 것인지 지정합니다.

     

    ssh1Compatibility   no

    클라이언트가 ssh1만 지원할 경우 ssh1 데몬을 실행할 것인지 여부를 지정합니다. ssh1은 보안상 취약하므로 no로 하는 것이 좋습니다.

     


     
    ② Prevent-SSH Bruteforce(무차별 공격) 방어 툴
     
    SSH Bruteforce(무차별 공격) 방어 툴
     
    Prevent 이란?
    /var/log/secure 로그를 살펴보면 일정한 ID를 이용해서 SSH 접속 시도를 하는 것을 볼 수 있으며 이런 공격은 SSH Bruteforce(무차별 공격)로서, 패스워드 사전 파일을 이용해서 미리 지정한 아이디와 대입하여, 접속 계정을 알아 내는 해킹 방법입니다. Prevent은 /var/log/secure 로그의 실시간 분석하여 특정 아이피에서 일정횟수 이상 접속 실패가 이루어지면 공격 아이피에 대한 clipping level을 지정해서 5 level이상 올라가면 아이피을 블록 시키는 툴입니다.
     
    넥스트라인 기술문서
    http://nextline.net/?inc=support&html=pds_view&no=187&name=리눅스&home=보안
     
    ③ SSH root 접근금지
     
    넥스트라인 기술문서
    http://nextline.net/?inc=support&html=pds_view&no=158&name=리눅스&home=기타

    4) VSFTP 보안

    보안설정 이외의 vsftpd.conf 상세한 설정내용은 넥스트라인 기술문서를 참조하시기 바랍니다.

    넥스트라인 기술문서 - vsftp 환경설정
    http://nextline.net/?inc=support&html=pds_view&no=202&name=리눅스&home=기타

     
    설정파일 경로 : /etc/vsftpd/vsftpd.conf

    vsftp.conf 보안설정

    chroot_local_user=YES (기본값 = NO)

    모든 계정 사용자가 자신의 홈상위 디렉토리를 접근할 수 없도록 설정합니다.

    FTP 사용자가 시스템에 접근할 수 있으면 위험하므로 반드시 활성화 하는것이 좋습니다.

     

    passwd_chroot_enable=NO (기본값 = NO)

    SSH로 접속했을 때 자신의 홈 상위 디렉토리를 접근할 수 없도록 설정합니다.

    chroot_local_user 옵션이 활성화되었고, OpenSSH에 패치를 했을경우, SSH 또한 자신의홈상위 디렉토리를 접근할 수 없도록 설정할 수 있으며, /etc/passwd 파일의 홈 디렉토리필드의 /home/사용자/./와 같이 "/./"를 붙여 사용자를 홈디렉토리에 제한하게 합니다.

     

    chroot_list_enable=NO (기본값 = NO)

    명시된 사용자가 자신의 홈상위 디렉토리를 접근할 수 없도록 설정합니다.

    이 옵션은 chroot_local_user 옵션이 비활성화되어 있어야 사용할 수 있습니다. 전체 적용이 아니라 일부 사용자만 제한할 때 편하지만, 개별 적용은 보안상 좋지 않습니다.

     

    chroot_list_file=/etc/vsftpd.chroot_list (기본값 =/etc/vsftpd.chroot_list)

    사용자의 홈상위 디렉토리를 설정한 파일을 지정합니다.

    chroot_list_enable 옵션을 활성화했을 경우에 리스트를 읽어올 파일을 지정합니다.

     

    secure_chroot_dir=/usr/share/empty (기본값 = /usr/share/empty)

    secure chroot()에 사용될 디렉토리를 지정합니다. 이 옵션에서 지정된 디렉토리는 비어 있어야 되며, ftp 사용자에 대해 쓰기 권한이 없어야 됩니다.

     

     
    5) SENDMAIL 보안

    ① 버전 정보 숨기기
    sendmail이 리슨하고 있는 25번으로 접속하면 아래와 같이 sendmail의 버전 정보를 알 수있는데, 굳이 보여줄 필요가 없으므로 이 정보를 삭제하거나 다른 정보로 보여주도록 합니다.
     
     
     
     
    이를 위해서는 아래와 같이 주석을 제거한 후 관련 부분을 삭제하거나 임의의 문자열을 추가한 후 sendmail을 재가동 합니다.
    설정파일 경로 : /etc/mail/sendmail.cf
    변경전)

     
    변경후)

     
    sendmail 재가동
    [root@nextline ~]# /etc/rc.d/init.d/sendmail restart
    25번으로 접속 시 버전정보가 출력되지 않습니다. 그러나 이 상태에서 HELP를 입력하면 아래와 같이 정보가 표시됩니다.

    helpfile 파일을 삭제하거나 다른 이름으로 변경하면 HELP 입력시에도 버전 정보가 표시되지 않습니다.
    /etc/mail/helpfile 파일명 변경

     
    helpfile 파일명 변경후 HELP 입력시에도 버전 정보가 표시되지 않습니다.

     
    ② procmail을 이용한 스팸 필터링
     
    Sendmail + Procmail + Hcode 연동설치
    다운로드 : rpmfind.net
     
    리눅스 설치시 기본적으로 sendmail, procmail 패키지는 설치되어 있으므로 한글디코딩에 필요한 hcode 패키지를 추가 설치하며 sendmail, procmail 이 설치되어 있지 않을경우 3가지 패키지를 모두 설치합니다.
     
    hcode 다운로드

     
    hcode 설치

     
    sendmail + procmail + hcode 연동 확인
     

     
     
     
    define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')dnl
    FEATURE(local_procmail,`',`procmail -t -Y -a $h -d $u')dnl
    MAILER(procmail)dnl
     
    위 내용이 출력되지 않거나 다르게 출력된다면 적절히 수정하고 다음을 실행합니다.
     
    [root@nextline mail]# su -
    Password:
    [root@nextline mail]# cd /etc/mail
    [root@nextline mail]# vi /etc/mail/sendmail.mc
    [root@nextline mail]# make
    [root@nextline mail]# /etc/rc.d/init.d/sendmail restart
     
    /etc/procmailrc 파일생성 및 설정내용
    [root@nextline mail]# vi /etc/procmailrc
     
    procmailrc 설정
     
    FILTERREASON = "100"
     
    # 환경변수설정
     
    # LOGFILE=/dev/null
    # VERBOSE=on
    VERBOSE=off
    # DROPPRIVS=yes
    PATH=/usr/bin:/usr/local/bin:/bin
    SHELL=/bin/sh
    FORMAIL=/usr/bin/formail
     
    NL = "
    "
    TAB = "   "
    NOW = `date +"%Y-%m-%d %H:%M"`
     
    # 메일서버 해킹방지 (제목이 1024자 이상인것 삭제)
     
    :0
    * -1024^0
    * ^Subject:\/.*
    * 1^1 $MATCH ?? .
    /dev/null
     
    :0
    * -19^0
    * 1^1 $DEFAULT ?? .
    {
        TAB = "    "
    }
     
     
    # 한글디코딩
     
    :0 fhw
    * ^(Subject|From|Cc|To):.*=\?EUC-KR\?(B|Q)\?
    | $FORMAIL -c | hcode -dk -m
     
    :0 fh w
    * ^(Subject|From|Cc|To):.*=\?EUC_KR\?(B|Q)\?
    | $FORMAIL -c | hcode -dk -m
     
    :0 fh w
    * ^(Subject|From|Cc|To):.*=\?ks_c_5601-1987\?(B|Q)\?
    | $FORMAIL -c | hcode -dk -m
     
    # 제목 구하기
     
    EMAILSUBJECT = ""
    REPLYSUBJECT = ""
     
    :0
    * ^Subject:\/.*
    {
        ORGSUBJECT = "$MATCH"
        REPLYSUBJECT = "Re: $MATCH"
        EMAILSUBJECT = "$NL$MATCH$NL"
    }
     
    # 반송메일 필터링(삭제)
     
    :0
    * EMAILSUBJECT ?? Returned mail: see transcript for details
    * $ ^To:.*@$HOST
    /dev/null
     
    # 서버에서 발송된 메일은 그대로 전송
     
    :0
    * ^FROM_DAEMON
    $DEFAULT
     
    # 메시지 아이디 존재여부 확인
    # 파란메일과 모네타등 몇몇 사이트의 잘못된 개발로 추가된 항목입니다.
     
    HASMESSAGEID = "no"
     
    :0
    * ^Message-ID:
    * $ ! ^Message-ID:( )*[<][0-9]+[.][0-9a-zA-Z]+@$HOST[>]
    {
      HASMESSAGEID = "yes"
    }
     
    :0
    * ^X-Mailer: .*(ParanMail Web|Netpion Enterprise|Office Outlook)
    *
    {
       HASMESSAGEID = "yes"
    }
     
    # 수신자의 성명 존재여부 확인(광고메일은 수신자의 이름을 모른다.)
     
    HASRECEIVERNAME = "no"
     
    :0
    * ^To:.*[<].*[>]
    * ! ^To:( )*[<].*[>]
    {
       HASRECEIVERNAME = "yes"
    }
     
    # 발신자의 성명 존재여부 확인
     
    HASSENDERNAME = "no"
     
    :0
    * ^From:.*[<].*[>]
    * ! ^From:( )*[<].*[>]
    {
       HASSENDERNAME = "yes"
    }
     
    # 제목이 특수한 형태인가(예를들면 "[에피소드]..." 등등)
     
    ISFORMATTEDSUBJECT = "no"
     
    :0
    * EMAILSUBJECT ?? ^( )*[[(<]+.*[])>]+
    {
       ISFORMATTEDSUBJECT = "yes"
    }
     
    :0
    * EMAILSUBJECT ?? ^( )*(읽음|Re|Fw):
    {
       ISFORMATTEDSUBJECT = "yes"
    }
     
    # 메일전송경로가 세개 이상인것(광고/바이러스메일은 바로 전송되어 경로가 적습니다.)
    # sendmail 은 메일포멧팅을 하기때문에 기본적으로 한 개이상입니다.
    # 따라서 qmail 일 경우 "* -2^0" 를 "* -1^0" 로 변경하는것이 좋습니다.
     
    HASMULTIPATH = "no"
     
    :0
    * -2^0
    * 1^1 ^Received:.*$
    {
       HASMULTIPATH = "yes"
    }
     
    # 로그화일 변경
     
    LOGFILE=/var/log/procmail
     
    # 광고표시메일 성인관련메일 필터링
     
    ISSPAM = "no"
     
    :0
    * ! ISSPAM ?? yes
    * ! EMAILSUBJECT ?? [[(<(]+(광.*고|廣.*告|홍.*보|동.*의|금.*융)[])>]+
    * ! EMAILSUBJECT ?? @( )*$
    * ! EMAILSUBJECT ?? (성인광고|성인정보|몰카|포르노|스와핑|빠구리|무삭제|노모자이크|자위한다|자위하는|뽀르노|페니스|쌩쇼|섹스)
    * ! EMAILSUBJECT ?? (카[.-]+드|신[.-]+용|대[.-]+출|최[.-]+저[.-]+금[.-]+리)
    * ! EMAILSUBJECT ?? ((광고)
    { }
     
    :0 E
    {
        ISSPAM = "yes"
        FILTERREASON = "201"
    }
     
    :0
    * ISSPAM ?? yes
    {
        LOG = "[$NOW] [Del$FILTERREASON] $DEFAULT$TAB$ORGSUBJECT$NL"
        LOGFILE
     
        :0
        /dev/null
    }
     
    # 100k 이상의 메일
    # 첨부화일이 있으며, 정상적 이메일형태가 아닌것 필터링
    # 기타메일 통과
     
    ISVIRUS = "no"
     
    :0
    * ISVIRUS ?? no
    * > 100000
    * HASMESSAGEID ?? no
    * HASRECEIVERNAME ?? no
    * HASSENDERNAME ?? no
    * HASMULTIPATH ?? no
    * ^Content-Type: multipart[/]mixed
    {
        ISVIRUS = "yes"
        FILTERREASON = "301"
    }
     
    :0
    * ISVIRUS ?? yes
    {
        LOG = "[$NOW] [Blk$FILTERREASON] $DEFAULT$TAB$ORGSUBJECT$NL"
        LOGFILE
     
        :0
        * ! ^Precedence:.*junk
        * ! ^X-Loop:.*
        /var/spool/mail/spam
     
        :0
        /dev/null
    }
     
    :0
    * > 100000
    {
        LOG = "[$NOW] [Pas$FILTERREASON] $DEFAULT$TAB$ORGSUBJECT$NL"
        LOGFILE
     
        :0
        $DEFAULT
    }
     
    # 15k - 100k 사이의 메일
    # 첨부화일이 있으며, 정상적 이메일형태가 아니며, 첨부화일명이 한글이 아닌것 필터링
    # 기타메일 통과
     
    ISVIRUS = "no"
     
    :0 B
    * ISVIRUS ?? no
    * > 15000
    * ^Content-Type: audio[/]x-wav;
    * ^.*(file)?name="?[a-z0-9 ._-]+\.(bat|cmd|com|cpl|exe|hta|scr|pif|vbs|zip)"?$
    {
        ISVIRUS = "yes"
        FILTERREASON = "302"
    }
     
    :0 B
    * ISVIRUS ?? no
    * > 15000
    * ^Content-Disposition: (attachment|inline);
    * ^.*(file)?name="?[a-z0-9 ._-]+\.(bat|cmd|com|cpl|hta|scr|pif|vbs)"?$
    {
        ISVIRUS = "yes"
        FILTERREASON = "303"
    }
     
    :0 B
    * ISVIRUS ?? no
    * > 15000
    * < 65000
    * ^Content-Disposition: (attachment|inline);
    * ^.*(file)?name="?[a-z0-9 ._-]+\.(exe|zip)"?$
    {
        ISVIRUS = "yes"
        FILTERREASON = "304"
    }
     
    :0
    * ISVIRUS ?? yes
    * > 15000
    * < 65000
    * ^Content-Disposition: (attachment|inline);
    * ^.*(file)?name="?[a-z0-9 ._-]+\.(exe|vbs|zip)"?$
    {
        :0
        * ! HASMULTIPATH ?? no
        { }
     
        :0 E
        {
        ISVIRUS = "no"
        FILTERREASON = "100"
        }
    }
     
    :0
    * ISVIRUS ?? yes
    {
        LOG = "[$NOW] [Vir$FILTERREASON] $DEFAULT$TAB$ORGSUBJECT$NL"
        LOGFILE
     
        :0
        * !
        * ! ^Precedence:.*junk
        * ! ^X-Loop:.*
        /var/spool/mail/spam
     
        :0
        /dev/null
    }
     
    :0
    * > 15000
    {
        LOG = "[$NOW] [Pas$FILTERREASON] $DEFAULT$TAB$ORGSUBJECT$NL"
        LOGFILE
     
        :0
        $DEFAULT
    }
     
    # 0k - 15k 사이의 메일
    # 첨부화일이 없는 바이러스메일 필터링
     
    ISVIRUS = "no"
     
    :0
    * ISVIRUS ?? no
    * < 5000
    * HASMESSAGEID ?? no
    * HASMULTIPATH ?? no
    * H ?? ^Content-Type:( )*multipart/mixed
    * 2^0
    * -1^1 B ?? ^Content-Type:
    {
        ISVIRUS = "yes"
        FILTERREASON = "305"
    }
     
    :0
    * ISVIRUS ?? yes
    {
        LOG = "[$NOW] [Vir$FILTERREASON] $DEFAULT$TAB$ORGSUBJECT$NL"
        LOGFILE
     
        :0
        * !
        * ! ^Precedence:.*junk
        * ! ^X-Loop:.*
        /var/spool/mail/spam
     
        :0
        /dev/null
    }
     
    # 0-15k 사이의 메일 필터링
     
    ISSPAM = "no"
     
    :0
    * !
    * ISSPAM ?? no
    * HASMESSAGEID ?? no
    * HASRECEIVERNAME ?? no
    * ISFORMATTEDSUBJECT ?? no
    * HASMULTIPATH ?? no
    {
        ISSPAM = "yes"
    }
     
    :0
    * !
    * ISSPAM ?? no
    * ^Received: from [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+ [(][[][0-9]+\.[0-9]+\.[0-9]+\.[0-9]+[]][)]
    {
        ISSPAM = "yes"
    }
     
    :0
    * !
    * ISSPAM ?? no
    * < 8000
    * ^Received: from .*[0-9]+-[0-9]+-[0-9]
    {
        ISSPAM = "yes"
    }
     
    :0
    * ISSPAM ?? no
    * EMAILSUBJECT ?? (카드( )*(대납|고민|빚|연체|대출|소유자|소지자)|(긴급|급한)( )*자금|직장인.*공무원|공무원.*직장인)
    {
        ISSPAM = "yes"
        FILTERREASON = "202"
    }
     
    :0
    * ISSPAM ?? no
    * EMAILSUBJECT ?? (돌려막|연체.*금리|금리.*연체|만원.*은행|은행.*만원|1[%]대금리|직장인.*여성우대|[(][0-9]*만원[)])
    {
        ISSPAM = "yes"
        FILTERREASON = "202"
    }
     
    :0
    * ISSPAM ?? no
    * EMAILSUBJECT ?? [a-z ][a-z ][a-z ][a-z ][a-z ]$
    * ISFORMATTEDSUBJECT ?? no
    * ! EMAILSUBJECT ?? ^( )*(Re|Fw):
    * ! EMAILSUBJECT ?? ^( )*[a-z0-9*?+[($^-]+
    {
        ISSPAM = "yes"
        FILTERREASON = "203"
    }
     
    :0
    * ISSPAM ?? no
    * < 10000
    * H ?? ^Content-Type:( )*multipart/alternative
    * 2^0
    * -1^1 B ?? ^Content-Type:
    {
        ISSPAM = "yes"
        FILTERREASON = "204"
    }
     
    :0
    * ISSPAM ?? no
    * < 8000
    {
        :0
        * ! ^From: .*@(paypal.com|mortghelper.com|blocjunk.com|mail2Maggie.com|blocspam.com|worldbusinesslink.org)
        * ! ^From: .*@(bisops.com|teadrive.com|superpowerball.com|proxad.net|jsivey.com|dbz.com|alapaz.com)
        { }
     
        :0 E
        {
       ISSPAM = "yes"
       FILTERREASON = "205"
        }
    }
     
    :0
    * ISSPAM ?? no
    * < 8000
    {
        :0
        * ! HB ?? (Pain Relief|rx refill|rx meds|obesity|Viagra|Cialis|Xanax|Valium|Amvien|schlong|Prozac|V-I-A-G-R-A)
        * ! HB ?? (sexual health|porn|orgasm)
        * ! HB ?? (mor( )?t( )?g( )?a( )?g( )?e)
        { }
     
        :0 E
        {
       ISSPAM = "yes"
       FILTERREASON = "206"
        }
    }
     
    :0
    * ISSPAM ?? no
    * < 8000
    * -2^0
    * 1^1 HB ?? (meds|Medication|drug)
    {
        ISSPAM = "yes"
        FILTERREASON = "207"
    }
     
    :0
    * ISSPAM ?? no
    * < 8000
    * -5^0
    * 1^1 HB ?? [.](com|net|org)"[>][<][/]a[>]
    {
        ISSPAM = "yes"
        FILTERREASON = "208"
    }
     
    :0
    * ISSPAM ?? yes
    {
        LOG = "[$NOW] [Blk$FILTERREASON] $DEFAULT$TAB$ORGSUBJECT$NL"
        LOGFILE
     
        :0
        * ! ^Precedence:.*junk
        * ! ^X-Loop:.*
        /var/spool/mail/spam
     
        :0
        /dev/null
    }
     
    :0
    {
        LOG = "[$NOW] [Pas$FILTERREASON] $DEFAULT$TAB$ORGSUBJECT$NL"
        LOGFILE
     
        :0
        $DEFAULT
    }
     
    sendmail 재가동
    procmail 연동을 위해 sendmail 를 재가동 합니다.
    [root@nextline ~]# /etc/rc.d/init.d/sendmail restart
     
    필터링 메일계정 spam
    /etc/procmailrc 파일에 의해 필터링된 메일들이 spam 계정으로 쌓이게 됩니다.

     
     
     
    procmail 로그파일
    /etc/procmailrc 에 설정한대로 /var/log/procmail 파일에 로그가 기록됩니다.

     
     
     
    ③ Clam AntiVirus를 이용한 메일서버 바이러스 차단
     
    넥스트라인 기술문서
    http://nextline.net/?inc=support&html=pds_view&no=142&name=리눅스&home=보안
     
    ④ AUTH 설정
    sendmail로 아웃룩을 사용시 보내는 메일(SMTP)의 인증 설정 부분이 있습니다.
    /etc/mail/access 에서 아웃룩이 접속되는 IP대역을 설정하면 되지만, 어느 곳에서도 접속을 가능하게 하려면 SMTP Auth를 통하여 계정 인증을 통한 인증이 유용합니다.
     
    설정파일 경로 : /etc/mail/sendmail.mc
     
    수정전
    dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
    수정후 (주석 dnl 제거)
    TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
     
    수정전
    dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN
    PLAIN')dnl
    수정후 (주석 dnl 제거)
    define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
     
    수정전
    dnl # DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
    수정후 (주석 dnl 제거 Addr=0.0.0.0 변경)
    DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl
     
    sendmail.cf 생성
    [root@nextline ~]# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
     
    sasl2 설정확인
    [root@nextline ~]# cat /usr/lib/sasl2/Sendmail.conf
    pwcheck_method:saslauthd
     
    /etc/sysconfig/saslauthd 편집
    MECH=shadow 이 부분의 값을 pam으로 변경
     
    sendmail 재가동
    [root@nextline ~]# /etc/rc.d/init.d/sendmail resetart
     
    saslauthd 재가동
    [root@nextline ~]# /etc/rc.d/init.d/salauthd restart
     
    6) MYSQL 보안
     
    ① 리모트 엑세스 차단
     
    먼저 MySQL이 디폴트로 리스닝하는 3306/tcp 포트를 차단해 데이터베이스가 로컬로 설치된 PHP 어플리케이션에 의해서만 사용되게 합니다. 3306/tcp 포트를 리스닝하지 못하게 하면 다른 호스트로부터 직접 TCP/IP 접속을 해서 MySQL 데이터베이스를 공격할 가능성이 줄어듭니다. 그러나 mysql.sock socket 을 통한 로컬 커뮤니케이션은 여전히 가능합니다. 3306/tcp 포트를 리스닝하지 못하게 하려면 /etc/my.cnf의 [mysqld] 부분에 다음을 추가하여 mysql을 재가동합니다.
     
    skip-networking
    또는
    [root@nextline ~]# /usr/local/mysql/bin/mysqld_safe –skip-networking &
     
    리모트로 데이터 백업을 한다든지 등의 이유로 데이터베이스를 리모트 엑세스 해야만 하는 경우 아래와 같이 SSH 프로토콜을 사용합니다.
     
    [root@nextline ~]# ssh mysqlserver /usr/local/mysql/bin/mysqldump -A > backup
     
    ② 디폴트 사용자/데이터베이스 삭제
     
    설치시 기본적으로 설치되는 test 디비 및 루트 어카운트를 제외한 모든 어카운트를 삭제합니다. 이렇게 하면 익명 접속으로 데이터베이스를 설정하는 것을 막을 수 있습니다.
     
    [root@nextline ~]# mysql -u root -p
    Enter password:
     
    mysql> use mysql;
    Database changed
    mysql> drop database test;
    Query OK, 0 rows affected (0.08 sec)
     
    mysql> use mysql;
    Database changed
    mysql> delete from db;
    Query OK, 3 rows affected (0.03 sec)
     
    mysql> delete from user where not(host="localhost" and user="root");
    Query OK, 4 rows affected (0.01 sec)
     
    mysql> flush privileges;
    Query OK, 0 rows affected (0.02 sec)
     
    7) BIND 보안
     
    ① Bind 최신 패키지 업데이트
     
    8.x 이전 버전은 잘 알려진 보안버그가 있으므로 최신 BIND 버전으로 업그레이드를 하도록 합니다. 또한, 버전별보안 취약점이 존재할 수 있으므로
    http://www.isc.org/products/BIND/bind-security.html 에 주기적으로 방문하여 살펴보길 바랍니다.
     
    ② Bind-chroot 환경 적용
     
    BIND는 root 계정 대신 named 계정으로 실행합니다. 또한, chroot 환경을 구성하여 네임서버의 보안 취약점으로 공격당하더라도 네임서버가 특정 디렉토리 이상의 상위로 벗어나지 못하게 설정합니다.
     
    다운로드 : rpmfind.net
    bind-chroot 패키지 설치

     
     
     
    zone 파일경로

     
     
     
    ---------------------------------------------------------------------------------------
     
    6. 보안프로그램
     
    1) 웹 어플리케이션 보안 툴
     
    웹 어플리케이션 보안템플릿 (PHP 버전)
     
    KWST (KISA Web Security Template)
    최근 홈페이지에 존재하는 웹 어플리케이션의 취약점을 이용하여 SQL Injection, iframe 삽입 등의 공격이 비번히 이루어지고 있으며, 이러한 웹 해킹으로 인하여 홈페이지 변조, 데이터유실, 심지어 시스템까지 해킹에 노출되어 막대한 피해를 입는 사례가 보고되고 있습니다.
    웹 어플리케이션의 취약점을 보완하기 위해서는 취약점의 원인이 되는 홈페이지 소스를 직접 수정해야 하나 대부분의 중소 홈페이지의 경우, 개발인력의 미비로 인해 침해사고가 지속적으로 재발하는 문제가 발생하고 있습니다. KWST는 웹인터페이스를 이용한 간단한 설정으로 홈페이지 소스에 SQL Injection, iframe, XSS, 소스변조, 아이피 차단 등의 보안설정을 할 수 있는 보안 툴입니다.
     
    넥스트라인 기술문서
    http://nextline.net/?inc=support&html=pds_view&no=194&name=리눅스&home=보안
     
    2) 아파치 보안 모듈
     
    ModSecurity를 이용한 아파치 웹서보 보안 구축
    Mod Security는 Apache 웹 서버를 위한 오픈 소스 웹 방화벽입니다.
Designed by Tistory.