강좌
클라우드/리눅스에 관한 강좌입니다.
리눅스 분류

리눅스 설치후 초기 보안셋팅

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

 

리눅스 설치후 초기 보안셋팅

 

*교육 참가를 하시기 전에 반드시 자료를 인쇄(프린트)하여 가지고 오시기 바랍니다. *

 

자료는 수퍼유저코리아의 “리눅스서버 교육”위하여 제작된 것입니다.

제작자 : "대한민국 서버관리자그룹" ----"수퍼유저코리아"    박성수

자료의 복사 배포를 금지합니다.

PS : 추가 설명을 듣지않으시고 본 자료만으로 설정하시면 원하지 않은 결과를 초래할 수도 있습니다.

 

1. 서버구축시에는 반드시 별도의 파티션과, 별도의 백업디스크를 둔다.

   이 백업디스크에 일백업및 실시간 백업이 이루어 지도록 구성한다.

 

   backup.sh 파일작성및 crontab에 설정적용함.

 

### crontab 파일내용(기본)

00 00 * * * su - root /usr/bin/rdate -s time.bora.net && /sbin/clock -w

00 01 * * * su - root -c '/home/papa/backup.sh' >& /dev/null

00 08 * * * su - root -c '/home/papa/system_check' > /home/papa/www/system_check/system_check_logs

 

   ### backup.sh 내용(기본)

#!/bin/bash

cd /backup

rm -f *.tar.gz

tar cvfpz /backup/usr.local.tar.gz /usr/local/

tar cvfpz /backup/home.tar.gz /home

tar cvfpz /backup/etc.tar.gz /etc

tar cvfpz /backup/var.tar.gz /var

 

2. 시스템디스크와 데이터디스크를 구분하여 구축한다.

 

   예 sda : / 시스템(운영체제가 설치되는)디스크   

      sdb : /home        : 데이터디스크

      sdc : /usr         : Mysql, Apache등의 Applications 저장 디스크

      sdd : /backup      : 백업 디스크

 

3. /etc/xinetd.d/ 불필요한 파일들 제거

 

4. /etc/rc.d/init.d/ 불필요한 초기화 스크립트 제거

 

5. /etc/services 파일의 사용하지 않는 포트정보 주석처리

 

6. tcp_wrapper효율적인 활용을 위한 /etc/hosts.allow,  /etc/hosts.deny 파일 설정

 

   /etc/hosts.allow의 권장내용

 

    popper : ALL

    sendmail : ALL

 

7. proftpd 설치시에 Anonymous로그인 불허설정.(주석처리)

   ** RPM시에는 /etc/proftpd/conf/proftpd.conf 파일에 설정

   ** 컴파일시에는 /usr/local/proftpd/etc/proftpd.conf 파일에 설정

 

   관리자 ID외의 상위 디렉토리 이동제한설정

 

   예1)

   DefaultRoot                     ~ !papa

 

   예2)

   DefaultRoot                     ~ !ds5ezp,!papa

 

8. ssh의 root원격로그인 설정제거

   sshd가 설치되어 있지않을 경우나 망가져있을 경우에는 ssh관련 파일들을 rpm으로 설치하거나 compile하여 설치한다.

   rpm으로 설치하였을 경우에는 /etc/rc.d/init.d/sshd start를 해줘야만 local key파일들이 /etc/sshd에 생성된다.

 

   /etc/ssh/sshd_config파일내의 (redhat 7.3에서는 기본설정되어 있음(주석처리되어 있다는 의미)

   PermitRootLogin no

 

9. su 명령어의 사용제한설정

 

   chmod 4750 /bin/su

   /etc/group내의 wheel그룹에 관리자계정 등록(예 : wheel:x:10:root,papa)

   chown root:wheel /bin/su

 

10. logserver 설정 : 필요할 경우에.....

    /etc/hosts 에는 logserver의 호스트정보 등록

    /etc/syslog.conf 에는 로그를 원격로그서버에 저장할 대상 설정

 

    작업서버에서의 syslog 재시작(/etc/rc.d/init.d/syslog restart)

    로그서버(su21)에서의 syslogd재시작(/sbin/syslogd -h -r)

 

11. secu_script파일보안을 위한 파일퍼미션 설정

 

12. /etc/rc.d/rc.local내에 시스템 시작시 실행할 초기화 스크립트 설정

 

/usr/local/apache/bin/apachectl start

/usr/local/mysql/bin/safe_mysqld&

/usr/local/proftpd/sbin/proftpd

 

### Time Server Setting

/usr/bin/rdate -s time.bora.net

/sbin/clock -w

 

13. timeserver 설정

 

방법#1 cron에 설정 (매일 한번씩 맞춤)

00 01 * * * su - root /usr/bin/rdate -s time.bora.net && /sbin/clock -w

 

time server 설정시 크론의 내용을 확인하여 작동이 되지않을 경우에는 /etc/services 내의 time관련 서비스 항목의 주석제거할것....

 

방법#2 부팅시마다 적용하기 위해 /etc/rc.d/rc.local에 설정

 

### Time Server Setting

/usr/bin/rdate -s time.bora.net

/sbin/clock -w

 

14. cron에 local 백업설정 (가능한 새벽 04:00)

 

15. cron시스템 점검 실행 설정 system_check (가능한 아침 08:00)

 

16. 불필요한 process 제거

 

17. ntsysv 에서 초기 실행할 서비스데몬 내리기

 

18. 로그인정보수정 리눅스버전정보 숨기기

 

    /etc/motd

    /etc/issue

    /etc/issue.net

    /etc/redhat-release

 

############################ 경고   ################################

 

지금 접속하신 귀하의 정보들은 이미 다른 서버로 원격저장 되었습니다.

 

불필요한 접속을 하셨다면 지금 로그아웃 하십시요.

 

허용되지않은 불법적인 접속으로 인한 모든 법적인 책임은 접속자에게

 

있습니다.

 

-------------------------  for login user  -------------------------

 

It will be punished for illegal login to this system.

 

It is saved for login information in another system.

 

####################################################################

 

 

19. root소유의 SetUID, SetGID 명령어 퍼미션수정및 불피요한 것일 경우에 삭제

    찾는 방법 : find / -user root -perm -4000 -print

 

20. systemfiles로컬복구를 위한 별도저장

    저장위치 : /backup/systemfiles/

 

21. chkrootkit 설치및 실행결과 확인

 

22. 시스템 performance및 hacking보안을 위한 kernel option설정

    (리스트 작성하여 적어둘것....)

 

23. 마지막에는 tripwire 설치 초기화 설정

 

24. 커널옵션값 설정 (/etc/sysctl.conf 수정)

 

/etc/sysctl.conf 파일에 아래 설정들을 복사하여 넣어두면

 

########## 커널옵션 튜닝값들  ################

net.ipv4.icmp_echo_ignore_broadcasts = 1

net.ipv4.icmp_ignore_bogus_error_responses = 1

net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_keepalive_time = 180

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_max_syn_backlog = 1280

net.ipv4.tcp_sack = 0

net.ipv4.tcp_window_scaling = 0

net.ipv4.conf.all.accept_redirects = 0

net.ipv4.conf.all.send_redirects = 0

net.ipv4.conf.all.rp_filter = 1

net.ipv4.conf.default.rp_filter = 1

net.ipv4.conf.all.log_martians = 1

net.ipv4.conf.all.accept_source_route = 0

net.ipv4.ip_local_port_range = 32768 61000

net.ipv4.ip_forward = 0

vm.bdflush = 100 1200 128 512 15 5000 500 1884 2

vm.buffermem = 80 10 60

kernel.sysrq = 1

 

##선택사항

net.ipv4.icmp_echo_ignore_all = 0

fs.file-max = 32768

###  RAM 256M :8192

########## 커널옵션 튜닝값들  ################

 

  

 

직접명령어를 사용할 경우에 다음과 같은 명령어로 커널값설정한다.

주의) 오른쪽의 값이 두개이상되는 것들은 입력이 안됨.(방법찾아볼것)

 

#!/bin/bash

 

sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1

sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1

sysctl -w net.ipv4.tcp_fin_timeout=30

sysctl -w net.ipv4.tcp_keepalive_time=180

sysctl -w net.ipv4.tcp_timestamps=0

sysctl -w net.ipv4.tcp_syncookies=1

sysctl -w net.ipv4.tcp_max_syn_backlog=1280

sysctl -w net.ipv4.tcp_sack=0

sysctl -w net.ipv4.tcp_window_scaling=0

sysctl -w net.ipv4.conf.all.accept_redirects=0

sysctl -w net.ipv4.conf.all.send_redirects=0

sysctl -w net.ipv4.conf.all.rp_filter=1

sysctl -w net.ipv4.conf.default.rp_filter=1

sysctl -w net.ipv4.conf.all.log_martians=1

sysctl -w net.ipv4.conf.all.accept_source_route=0

sysctl -w net.ipv4.ip_forward=0

sysctl -w kernel.sysrq=1

sysctl -w net.ipv4.icmp_echo_ignore_all=0

sysctl -w fs.file-max=16384

########################################################

 

25. httpd.conf 파일 수정

 

-- Options 항목에 Indexes 모두 제거

 

--- 아래행 추가

## *.inc 파일을 웹에서 불러들이지 못하는 설정

## 수퍼유저코리아 박성수(papa@superuser.co.kr)

## 2003년 5월 30일

 

     Order allow,deny

     Deny from all

 

 

--- 아래행 추가

## *.log 파일을 웹에서 불러들이지 못하는 설정

## 수퍼유저코리아 박성수(papa@superuser.co.kr)

## 2003년 5월 30일

 

     Order allow,deny

     Deny from all

 

 

26. 아파치 cgi 실행옵션제거

 

    Options 부분에서 ExecCGI 제거  고려할 것.

    AddHandler cgi-script .cgi   주석제거

 

27. 서버설치 직후에 모든 파일시스템의 badblock점검한다.

 

- mount 를 해서 파티션의 정보를 확인한다.

- badblocks -v -o 파티션명.txt 파티션명

  (예 badblocks -v -o sda1.txt /dev/sda1

- 시간이 많이 걸리므로 shell 파일을 만들어서 작업한다.

  (예 badblocks.sh)

#!/bin/bash

badblocks -v -o sda1.txt /dev/sda1

badblocks -v -o sda2.txt /dev/sda2

badblocks -v -o sda3.txt /dev/sda3

 

작업이 끝난 후에 배드블럭이 존재하는 디스크는 반드시 교체한다.

 

28. httpd.conf파일을 이용하여 기본적인 아파치웹서버보안을 설정한다.

 

- Options 지시자중 Indexes를 제거한다.

 

- Options 지시자중 FollowSymLinks를 제거한다. : 심블릭링크파일의 설정을 허용하지 않는다.  예)/home/sspark09/www/linkfile 이라는 파일이 ln -s /home/sspark/09/www/linkfile /etc/passwd라는 링크파일일 경우에 웹에서 linkfile을 로딩했을 경우에 /etc/passwd의 파일내용을 볼 수 있다. SymFollowLinks라는 지시자가 없을 경우에는 이런 링크파일의 사용을 웹에서는 허용하지 않는다.

 

- Options 지시자중 IncludesNoExec옵션을 추가한다. 이는 SSI의실행 태그중 exec나 cmd를 실행하지 못하게 한다.

 

- CGI는 특정 디렉토리에서만 실행가능하도록 설정한다. 게시판등에서 cgi실행파일을 웹서버에 올려두고서 이를 실행하게 되면 시스템의 정보가 쉽게 유출이 될 수 있다.  이를 막기 위하여 다음 예와 같은 설정으로 특정 디렉토리에서만 cgi가 실행가능하도록 한다.

 ScriptAlias /cgi-bin/ "//usr/local/apache/cgi-bin/"

 

- ServerTokens는 Apache서버에 접속했을 경우에 응답메시지의 헤더에 웹서버 버전, 설치된 응용프로그램등과 같은 정보를 전달한다. 이 정보들은 공격자들에게는 웹서버의 버전정보등을 유출함으로서 서버해킹을 용이하게 하는 문제를 야기할 수 있다. ServerTokens Full 이라고 되어 있다면 제거하고 ServerTokens Prod로 추가또는 수정한다. 기본적으로 ServerTokens키워드는 Apache 1.3이상에서 사용가능하며 일반적으로는 httpd.conf에 설정이 되어있지않다. 설정되어 있지 않을 경우에는 Full의 적용을 받게 되므로 전달가능한 모든 정보를 전달한다. 이를 ServerTokens Prod를 추가또는 수정함으로서 정보유출을 막을 수 있다. 

 

- 웹서버 구동중에 문제나 에러발생시(401, 403, 404등)에 보여줄 에러페이지를 redirect하여 원하는 페이지를 보여줄 수 있도록 한다. (광고나 홍보들을 위한 수단으로 사용한다.)

   

 

 

자료는 수퍼유저코리아의 “리눅스서버 교육”위하여 제작된 것입니다.

제작자 : "대한민국 서버관리자그룹" ----"수퍼유저코리아"    박성수

자료의 복사 배포를 금지합니다.

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,015 명
  • 현재 강좌수 :  35,688 개
  • 현재 접속자 :  167 명