2012년 6월 17일 일요일

리눅스보안을 위한 기본설정 방법

2000년 12월 2일 (주)베스트한컴 www.besthan.net에서 발표하는 
자료를 보고 작성하였습니다.

1.chmod 700변경하기 

본 권한변경 목적은 계정을 통하지 않은 불법적인 접근을 막기 
위한 방법으로 가능한 필요하지 않은 파일들의 권한을 변경해 
주시기 바랍니다. 특히 suid가 걸린 파일의 경우 절대적으로 
권한변경을 해주시기 바랍니다. 

/usr/bin/finger(chmod 700 적용) <-- 서버 이용자 파악을 하지 못하게 함 
/usr/bin/nslookup(chmod 700 적용) 
/usr/bin/gcc(chmod 700 적용) <-- 당연히 막아줘야져. 
/usr/bin/suidperl(chmod 700 적용) <--suid 걸린 파일 
/usr/bin/whereis(chmod 700 적용) 
/usr/bin/cc(chmod 700 적용) <--- 소스 컴파일은 루트이외에 못하도록 조치 
/usr/bin/sperl5.00503(chmod 700 적용) <--- perl중에 suid걸린 파일임 
/usr/bin/c++(chmod 700 적용) 
/usr/bin/make(chmod 700 적용) 
/usr/bin/pstree(chmod 700 적용) 
/usr/bin/rlog(chmod 700 적용) 
/usr/bin/rlogin(chmod 700 적용) <-- 필요없는 경우에는 삭제 하시길 

/usr/bin/which(chmod 700 적용) 
/usr/bin/who(chmod 700 적용) 
/usr/bin/w(chmod 700 적용) 
/bin/mail(chmod 700 적용) <-- 아웃룩익스프레스가 아닌 계정상에서 
텔넷으로 메일을 확인하지 못하게 하십시요. 
/bin/ps(chmod 700 적용) 
/etc/hosts(chmod 700 적용) 
/etc/hosts.deny(chmod 700 적용) 
/etc/hosts.allow(chmod 700 적용) 

/usr/bin/top (chmod 700 적용) 
/usr/bin/find (chmod 700 적용) 

/usr/bin/lynx (chmod 700 적용) 
/usr/bin/wget(chmod 700 적용) 
--> 이두 명령어는 일반적으로 해커들이 해킹툴을 가져올때 자주쓰는 
명령어 

shell-prompt>lynx --dump 가져올화일이 있는 url 경로 
shell-prompt>wget 가져올화일이 있는 url 경로 


/usr/bin/gcc(chmod 700 적용) <-- 당연히 막아줘야져. 
/usr/bin/c++(chmod 700 적용) 
/usr/bin/make(chmod 700 적용) 

이 명령어를 막게 되면 일반사용자들이 C언어로 작성된 프로그램을 
컴파일하지 못하여 불평을 호소하는 경우가 있다. 

이런 경우는 이 명령어를 사용할수 있는 그룹을 설정해 주면 준다. 
(일반적으로 wheel이라는 그룹을 많이 사용함, 다른 그룹을 등록해서 
사용해도 무관) 

* example) find 명령어의 사용자를 제한 할 경우 
shell-prompt>grep wheel /etc/group 
wheel:x:10:root 

/etc/group 화일에 wheel:x:10:root 이분에 wheel이라는 그룹에 user를 
추가 한다.(khsheen이라는 user가 있을경우임) 
wheel:x:10:root,khsheen 
이러면 wheel이라는 그룹에 khsheen 이라는 user가 등록된다. 
shell-prompt>ls -la /usr/bin/find 
-rwxr-xr-x 1 root root 54544 Feb 3 2000 /usr/bin/find* 
shell-prompt>chgrp wheel find 
shell-prompt>chmod 755 find 
shell-prompt>ls -la /usr/bin/find 
-rwxr-x--- 1 root wheel 54544 Feb 3 2000 find* 

이런식으로 설정하면 find 명령어는 root와 khsheen만 사용할수 있다. 
이 명령어를 su 명령어에도 적용하는 것을 권장함, root로 전환할 
유저 (su 명령어 사용자)를 제한 할수 있다. 


2.anonymous ftp 막기 
#vi proftpd.conf (/etc 에 위치) 
중략 
에서 
UserAlias anonymous ftp //이부분을 주석처리 해준다. 
wq (저장후 종료) 

특정 user가 ftp 접속후 본인의 Directory 외에 다른 유저의 
Directory를 접근 못하게 할 경우 
(접근을 해서 read 권한만있어도 그 유저의 설정을 모두볼수있다.) 

*proftp를 사용하는 경우 

shell-prompt> vi /etc/proftpd.conf 
이 화일에 이 한줄을 추가한다. 
DefaultRoot ~ member 
shell-prompt>/etc/rc.d/init.d/proftpd restart 

이러면 본인의 Directory외에 다른 유저의 계정은 접근 불가.

3.telnet 사용막기 <--가장 추천하는 방법입니다. 
현재 텔넷이 막힌 경우에는 해킹의 위험이 극히 줄어듭니다. 
텔넷을 사용하시고자 하시는 분은 데이터 센터의 보안 서비스나 
다른 방법을 사용하시기 바랍니다. 


ip 거부 
#vi hosts.deny (/etc 에 위치) 
in.telnet:ALL 
wq (저장후 종료) 

#hosts.allow (/etc에 위치) 
ALL:(IP 추가) <--- 텔넷으로 들어올 아이피만 적는다. 
wq (저장후 종료) 

저장후 다음과 같이 
#/etc/rc.d/init.d/inet restart 

telnet 서비스 제공업체측 ip를 추가해야 telnet 사용가능 

4.ping 막는법 <---당연히 핑도 막아야 겟죠. 
#echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all //ping 막기 
#echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all //ping 열기 

5.chkconfig 사용법(부팅시 수행되는 서비스) <--중요합니다. 

#chkconfig --list (/sbin 밑에 위치) 
#chkconfig --help (참고) 

#chkconfig --level 3 sendmail off (사용방법예) 
보통 부팅의 경우 레벨3으로 부팅이 됩니다. 
그러므로 레벨3에서 필요하지 않은 데몬은 위와 같은 방법으로 
모두 꺼두시기 바랍니다. 

#chkconfig --list (하면 나오는것들) 
xfs 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
anacron 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
apmd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
arpwatch 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
atd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
keytable 0:끔 1:끔 2:켬 3:켬 4:켬 5:켬 6:끔 
gpm 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
inet 0:끔 1:끔 2:끔 3:켬 4:켬 5:켬 6:끔 
netfs 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
network 0:끔 1:끔 2:켬 3:켬 4:켬 5:켬 6:끔 
random 0:끔 1:켬 2:켬 3:켬 4:켬 5:켬 6:끔 
ipchains 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
pcmcia 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
kdcrotate 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
kudzu 0:끔 1:끔 2:끔 3:켬 4:켬 5:켬 6:끔 
linuxconf 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
lpd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
nfs 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
nfslock 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
identd 0:끔 1:끔 2:끔 3:켬 4:켬 5:켬 6:끔 
portmap 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
rstatd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
rusersd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
rwalld 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
rwhod 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
sendmail 0:끔 1:끔 2:켬 3:켬 4:켬 5:켬 6:끔 
syslog 0:끔 1:끔 2:켬 3:켬 4:켬 5:켬 6:끔 
snmpd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
crond 0:끔 1:끔 2:켬 3:켬 4:켬 5:켬 6:끔 
ypbind 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
yppasswdd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
ypserv 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 
proftpd 0:끔 1:끔 2:끔 3:켬 4:켬 5:켬 6:끔 
named 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔 

이중 켜야할것은 보통 9개정도밖에 안됩니다. 3번레벨을 
기준으로, keytable,inet, network,random,kudzu,sendmail,syslog, 
crond,proftpd 나머지는 off 시켜주는것이 바람직합니다. (자기의 
환경에 맞춰서) 

참조문서는 http://www.osfs.net/redhat/security-guide-01.doc 

6.find 관련 명령 
#find /dev -type f // /dev/MAKEDEV만떠야함 (백도어 찾기) 
#find / -ctime -1 //하루동안 만들어진 화일 (해킹당한듯 싶으면 확인 ) 
#find / -perm -4000 // setuid 걸린 파일을 찾는 명령어 

#find / -nouser (화일에 소유자가 없는 경우의 화일) 
일반사용자의 사용 디렉토리에서 ... 
화일에 소유자가 없다는것은 의심을 해볼필요가 있다. 

#find /home/khsheen -user root 
(일반사용자인데 root로 되어 있는 화일도 의심해볼 필요가 있다) 


7./etc/inetd.conf 화일 수정 

네트워크의 서비스를 정의하고 있는 화일로서 , 정의되어 있는 
서비스가 많이 있다. 보안사고를 피하기 위해서는 최대한 
필요하지 않은 서비스는 차단하는게 바람직하다. 기본적으로 , 
telnet,ftp,pop3외의것은 주석처리 하는것이 좋다. 닫아놨는데, 
이외의 것이 열려있다면 해킹의 가능성이 있다. 이때는 다시 
주석처리를 하고 

#ps -ef | grep inetd //프로세스 확인 
#kill -HUP PID //리셋 
#vi inetd.conf (/etc 에 위치) 
telnet 
ftp 
pop3 
나머지는 주석처리 
wq (저장후 종료) 
tip> #kill -9 PID //프로세스 죽이기 

8.해킹이 확실한경우 대처법 

해킹이 확실한상태에서 그냥 컴퓨터를 종료시키면, 재부팅이 
안될수가 있다. 이것을 막기 위해, 

#/etc/rc.d/rc.SYSinit 권한을 755를 준다. 최소한 부팅은 된다. 

a.우선 가장 좋은 방법은 port(랜선)를 제거하는 것이 가장 좋다. 
b.그 다음에 설치 되어 있는 해킹툴을 제거한다. 
-프로세스 확인 
[ 이상한(필요없는) 프로세스 확인해서 설치된 위치 확인후 지우기] 

shell-prompt> kill -9 이상한 프로세스 id 

그러나 100%제거 한다는 것은 힘들것 같다. 
서버를 제 세팅하는 것을 권장한다. 

c.중요 data 백업 

9.기타 보안에 관련된 내용 

a.php , mysql db 지원하는 경우 
-일반적으로 php로 mysql에 db에 접속하는 경우 php에서 
connect하는 스크립트를 사용하는 화일을 일반적으로 Web상에 
공개된 소스에는 화일명이 대부분 connect.inc 를 사용하는데 
이것을 웹브라우저에 불러오게 되면 바로 읽혀 져서 mysql db접속 
아이디와 패스워드를 알수가 있게된다. 

이럴경우는 웹서버의 설정화일(httpd.conf)에 

AddType application/x-httpd-php .php .html .php3 .php3 .inc 
~~~~~!! 
AddType application/x-httpd-php-source .phps 

추가하고 웹서버를 제구동한다. 
그러면 .inc로 끝나는 화일도 php로 인식하므로 스크립트 
노출을 막을수 있다. 

또한가지 telnet ftp에 사용시 group을 같게 해주고 각 계정의 
root Directory를 퍼미션을 705로 처리해 주면 다른 유저가 
다른 사용자의 계정에 들어 갈수가 없다. 
만약 755로 한다면 다른 유저에게도 읽을 권한이 생겨서 connect 
스크립트를 읽을 수 있어 db접속 아이디/passwd를 얻을수 있다. 

b.사용자들의 passwd 
- 등록된 user의 passwd를 자주 갱신하게 만든다. 
shell-prompt>vi /etc/login.defs 
이중 아래의 스크립트를 일정기간 설정해서 사용자들의 
passwd를 바꾸게 만든다. 
PASS_MAX_DAYS 99999 
~~~~~ 일정기간으로 잡아준다. 

c.shell 없애기 
- 메일계정으로만 사용하는 경우(shell이 필요없는 경우)의 
유저가 많다. 특히 웹호스팅 사용자 
이런 경우 shell을 주지 않으면 된다. 
shell-prompt>vipw 
khsheen:x:500:502::/home/gdm:/bin/false 
~~~~~~~~~~ 
khsheen이라는 유저에게 shell을 부여하지 않는다. 


- 서버에 등록된 사용자가 많은 경우 사용자가 관리에 
신경을 많이 써야 한다. last 명령을 사용하여 자주 telnet으로 
접속하는 사용자는 history를 자주 살펴보는 것도 좋다. 
shell-prompt> last | grep pts 



d.보안패치하기 

-서버 보안에서 가장 중요한 것이 패치이다. 
서버에 버그가 발표되면 해커도 그것을 접한다고 생각하면 된다. 
그래서 서버에 최신 패키지를 설치해야 하며 보안 뉴스를 빨리 
접해야 한다. 그중 커널 업테이드등은 중요한다. 

* 커널 최신 정보 확인하기 
shell-prompt>finger @www.kernel.org 
[zeus.kernel.org] 

The latest stable version of the Linux kernel is: 2.2.17 
~~~~~~ 
The latest beta version of the Linux kernel is: 2.4.0-test11 
The latest prepatch (alpha) version *appears* to be: 2.4.0-test12-pre4 


2. 2. 17 
| | | 
| | -> 몇번의 패치가 있었는지 나타낸다. 
| -> 안정화 버전인지 개발화 버전이지를 나타낸다. 
| (홀수:개발, 짝수:안정) 
-> 획기적인 변화가 있을때 바뀐다 


그리고 기타 패키지에 대한 버그는 빨리 접하고 패치를 해야 한다. 

http://www.redhat.com/support/errata/index.html(redhat인 경우) 


서버 & 보안 관련 문의 
http://www.besthan.net 또는 http://www.koreaphp.co.kr 

해킹시 연락처 
http://www.certcc.or.kr/ 해킹시 신고처 
cyber 테러대응센터 02-3939-112 
cyber 수사대 02-365-7128 

댓글 없음:

댓글 쓰기