사이트 내 전체검색
[linux] 보안을 생각한 리눅스 서버 설치 단계
로빈아빠
https://cmd.kr/server/369 URL이 복사되었습니다.

본문

보안을 생각한 리눅스 서버 설치 단계

보안에 신경을 쓰시고자 한다면 구성에서 부터 신경을 쓰셔야 합니다.

1. 파티션을 어떻게 나눌 것이며...
예) 보안에 최적이라면 /boot, /var 파티션은 따로 분리를 한다거나...

http://linuxse.net/board/read.php?table=security&no=75
인용:
일단 /var 디렉터리를 분리 하는 이유는 로그가 DOS 공격의 원인이 될 수 있습니다.
만약... 로그 사이즈가 커져서 /var 디렉의 용량이 커지게 되면 파티션이 분리 되지 않은
경우 / 파티션이 꽉 차는 현상이 발생하면서 서비스가 제대로 돌아 가지 못하죠...

그리고 파티션을 세분화 해서 나누는 이유는 관리의 효율성및 보안 강화 때문입니다.
파티션을 나누지 않으면 일단 하드 링크를 걸수 있죠...
디렉터리에 setuid가 필요 하지 않는 경우 파티션이 나눠져 있으면 설정이 가능 합니다.

어떤 이유에서 인지 파티션이 문제가 생겨서 fsck로 고칠수가 없게 되면 파티션이 나눠 있
지 않으면 많은 데이터를 잃게 되죠... 그러면 복구가 힘들어 지겠죠...

몇가지 보안및 관리의 효율성을 따져 봤을때 파티션을 나누는것이 좋다는 이야기 입니다.
그런데 주의 하실점은 시스템의 상태를 정확히 파악 하지 못한다면 특정 파티션의 용량부
족으로 고생하실수 있습니다. 그러니 충분히 생각 하시고 파티션을 나누셔야 될듯...


2. 설치할때는 최소의 패키지를 설치하시는게 가장 좋습니다.
리눅스 배포판 특정상 필요 없는 데몬들이 많이 설치가 됩니다. 설치가 끝나면 따로 지워주셔야 겠죠.

3. 설치가 끝나면 사용하지 않는 데몬은 모두 내려야 합니다.
http://linuxse.net/board/read.php?table=security&no=56
인용:
아래는 현재 lse 서버의 netstat -an 값이다.

Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN tcp 0 0 211.174.50.100:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN udp 0 0 211.174.50.100:53 0.0.0.0:*

개인적으로는 telnet과 ftp는 이용하지 않는다. 패킷이 단순 text 이기 때문에...

그럼 열어놓은 까닭은?
이유는 본인 혼자서 사용하는 서버가 아니기 때문이다. 비록 여러가지 문제로 욕을 먹고는 있지만 서버 관리자라고 하면 사용자에게 최소의 불편함을 주면서 보안에 신경을 써야 하기 때문에 보안에 취약한 telnet이나 ftp를 open 시켜 놓고 있다.

위의 포트들이 최소한의 서버에서 서비스를 하는 포트들일 것이다.
하지만 이것으로 끝은 아니다. 패킷에 대한 방어를 하고는 있지만 세상에는 천재들이 많기 마련... 열려 있는 포트의 데몬들의 최신 업그레이드가 무엇보다 중요하다. 적어도 lse 서버에 설치되어 있는 각 데몬들은 그러한 데몬 취약점이 없을 것이다.

데몬이 시작하고 종료하는 것은 ntsysv 라는 데몬으로 관리가 가능하다.
리눅스에서는 Runlevel 이라는 개념이 있는데 주로 서버라면 runlevel 3 이외에는 사용하지 않을 것이다. 반드시 그래야 하고...

[root@linuxse root]# ntsysv --level 345
// --level 345 라는 뜻은 runlevel 345 번을 동시에 똑같이 적용시키겠다는 것이다. 3 번만 해도 됨.

--------------------------------------  | 어떤 서비스를 자동으로 시작할까요? |  | |  | [ ] comsat |  | [*] crond |  | [ ] daytime |  | [ ] daytime-udp |  | [ ] dbskkd-cdb |  | [ ] dhcpd |  | [ ] echo |  | |  | | 확인 | | 취소 | |  --------------------------------------

스페이스바로 선택을 한다.
구동시킬 서비스는 cron, httpd, mysqld, named, network, proftpd, ssh, syslog 정도이다.
단, 메일서버까지 구동한다면 sendmail, xinetd, ipop3, 정도가 추가되어야 할 것이다.
슈퍼데몬으로 구동하는 서비스들은 /etc/xinet.d/ 에서 각 파일의 disable = no 로 설정하면 된다. 예를 들면 telnet.

아마도 여기까지는 대부분 잘 설명되어 있는 사이트들이 있을 것이다. 하지만 여기서 끝나진
않는다. 가장 기본이라는 데몬정책이라는것이 이토록 복잡한가? ㅡㅡa

여기까지 왔다면 지금부터가 실력차이가 확연히 들어나는 부분일 것이다.
바로 설정이다. 어떤 서비스를 하느냐에 따라 해당 서비스 데몬들의 설정이 달라질 수 있다.
이 기술들은 거의 어느곳에서도 찾기 힘들고 오직 경력자의 머리속에 들어 있는것이 대부분이다. 운이 좋아 괜찮은 사수를 만나야 그나마 노하우를 배울 수 있지 않을까 싶다.


4. 패키지 업데이트는 up2date 를 추천합니다.

http://technet.inempire.com/g_linux/up2date/index.html

해킹, 크래킹 발생률로 봤을 때 80% 이상이 local 사용자에 의해 발생합니다.
이때에는 대부분 서비스 되고 있지 않는 패키지들의 취약점을 공격하는 경우가 많은데 서비스 데몬들만 업데이트를 한다고 해서 문제가 해결 되는 것이 아니기 때문입니다.

5. 간과하기 쉬운 문제인데 내공(?)이 중요합니다. 서비스들의 설정상에 문제가 있으면 그것 또한 취약점이 될 수 있으니까요. 이때 보안 툴을 운영하는 것도 도움이 많이 됩니다.

예) iptables 같은 보안툴로 패킷필터링을 하면 풋 프린팅을 막을 수 있습니다. 풋프린팅을 막게되면 반 이하로 위험부담이 줄 것입니다.

http://woogi.org/bbs/read.php?table=firewall&no=44
인용:
현재 woogi.org 서버의 iptables script 입니다. 방화벽용 스크립트와는 구별됩니다. 이것은 서버용입니다. 사용자에 맞게 설정을 하셔야 할 겁니다. 특히 ssh 같은 shell 쪽은 접속자체에 문제가 될 수 있으므로...
======================================
#!/bin/sh # http://woogi.org ^-^v # 모듈 같은건 올리지 않습니다. 기본적으로 올라와 있으므로... # iptables Path iptables=/sbin/iptables # SERVER IP 받아오기. HOST_IP="`/sbin/ifconfig eth0 | grep 'inet addr' | awk '{print $2}' | sed -e 's/.*://'`" NETMASK="`/sbin/ifconfig eth0 | grep 'inet addr' | awk '{print $4}' | cut -d : -f 2`" # rule delete # 모두 지우고 다시 재설정합니다. $iptables -F # INPUT Rules 설정 $iptables -Z INPUT $iptables -P INPUT ACCEPT # local 과 자기자신의 IP 는 허용. $iptables -A INPUT -i lo -j ACCEPT $iptables -A INPUT -s $HOST_IP -j ACCEPT # 알 수 없는 패킷 즉, NETWORK 상태가 INVALID 인 패킷들을 막아 버린다. # 정상적인 접근에서는 나올 수 없는 상태. $iptables -A INPUT -m state --state INVALID -j DROP # 외부 서비스를 위한 설정. / udp service # dns 상호 쿼리를 위해서... $iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT # TCP service # ftp-data, 서버자체가 클라이언트가 될 경우... $iptables -A INPUT -p tcp --dport 20 -m state --state NEW,ESTABLISHED -j ACCEPT $iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT $iptables -A INPUT -i eth0 -p tcp --sport 1024:65535 --dport 1024:65535 -m state -- state ESTABLISHED,RELATED -j ACCEPT # ftp service # ftp 를 이용할 수 있는 대역을 지정하였습니다. 좀더 세밀해 질 수 있겠죠. $iptables -A INPUT -s 61.0.0.0/8 -p tcp --dport 21 -j ACCEPT $iptables -A INPUT -s 210.0.0.0/8 -p tcp --dport 21 -j ACCEPT $iptables -A INPUT -s 211.0.0.0/8 -p tcp --dport 21 -j ACCEPT # ssh service # ssh 접속 지역 지정. $iptables -A INPUT -s 61.0.0.0/8 -p tcp --dport 22 -j ACCEPT $iptables -A INPUT -s 210.0.0.0/8 -p tcp --dport 22 -j ACCEPT $iptables -A INPUT -s 211.0.0.0/8 -p tcp --dport 22 -j ACCEPT # telnet # telnet은 현재 서비스 하지 않습니다. #$iptables -A INPUT -s 210.0.0.0/8 -p tcp --dport 23 -j ACCEPT #$iptables -A INPUT -s 211.0.0.0/8 -p tcp --dport 23 -j ACCEPT # etc service # 25(메일), 80(웹)은 모든 곳에서 ACCEPT 입니다. 반드시... $iptables -A INPUT -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT $iptables -A INPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT # AUTH 는 서비스를 하지 않더라도 열어야 합니다. 클라이언트에서 요청합니다. $iptables -A INPUT -p tcp --dport 113 -m state --state NEW,ESTABLISHED -j ACCEPT # pop3s 를 이용하는 관계로 995번을 열고 있습니다. $iptables -A INPUT -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT # mysql # 기본적으로 mysql 은 local에서만 접속하면 됩니다. DB 공유를 할 경우 대역 지정. $iptables -A INPUT -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT # ip 대역 예제. # ip 대역뿐만 아니라 아래와 같이 상태접속을 지정할 수도 있습니다. #$iptables -A INPUT -s 211.0.0.0/8 -p tcp --dport 22 -m state --state NEW,ESTABLISHED - j ACCEPT # UDP service # udp 서비스는 하나뿐이죠? $iptables -A INPUT -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT # ICMP service # ping은 별 의미가 없지만... $iptables -A INPUT -s 211.0.0.0/8 -p icmp --icmp-type echo-request -j ACCEPT $iptables -A INPUT -s 211.0.0.0/8 -p icmp --icmp-type echo-request -j ACCEPT # 서버로 들어오는 SYN packet 을 모두 거절한다. $iptables -A INPUT -p tcp --syn -j REJECT # Drop All packet # 원활한 서비스를 위해 1023 포트까지만 DROP 을 합니다. 물론 다 막아도 상관 없습니다. $iptables -A INPUT -p tcp --dport 0:1023 -j DROP $iptables -A INPUT -p udp --dport 0:1023 -j DROP $iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT echo -e "\nDone.\n" exit;


6. 마지막이 될수는 없겠지만 관리자의 부지런함이 최고의 보안 입니다.

=> 6번은 취소해야겠습니다. 이젠 게으름의 극치이니... 배째라 정신도 필요한듯... 넉넉함을 배워야겠습니다.

댓글목록

등록된 댓글이 없습니다.

1,139 (11/23P)

Search

Copyright © Cmd 명령어 3.138.69.39