메뉴 건너뛰기

2014.02.27 11:35

리눅스 보안 Tip

조회 수 8627 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
이 문서는 Kapil Sharma가 쓴 기본적이면서, 꼭 확인해 두어야 할 리눅스 보안 팁 입니다. 원문은 http://www.linuxgazette.com/issue58/sharma.html에 있습니다.


BIOS
콘솔로의 접근을 막기 위해서는 BIOS 에 암호를 설정해두고, 플로피로의 부팅은 하지 못하도록 설정합니다.


LILO
다음과 같은 설정으로 리로에 암호를 걸수 있습니다.


lilo 설정 파일 (/etc/lilo.conf)

lilo.conf

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
time-out=00 # time-out을 0로 설정
prompt
Default=linux
restricted # 이 라인을 추가
password=<password> # 이 라인을 추가하고 암호를 설정
image=/boot/vmlinuz-2.2.14-12
label=linux
initrd=/boot/initrd-2.2.14-12.img
root=/dev/hda6
read-only

리로 설정파일의 암호가 암호화되지 않은 일반 텍스트이므로, 루트만이 억세스 할수 있도록 다음과 같이 합니다.
chmod 600 /etc/lilo.conf


리로 설정 파일을 수정 한다음 리로를 실행합니다.
/sbin/lilo -v


마지막으로 리로 설정 파일의 변경을 막기위해 lilo.conf 파일을 chattr 명령으로 Immunize(변경불가)로 만듭니다. (역주, ext2 파일 시스템에서만 됩니다.)
chattr +i /etc/lilo.conf


불필요한 계정 삭제하기
시스템에서 사용하고 있지 않는 불필요한 계정은 삭제합니다. 예를 들어 lp, sync, shutdown, halt, news, uucp, operator, games, gopher 등..., 계정의 삭제는 다음과 같이 할수 있습니다.

userdel gopher

그룹의 삭제는

groupdel gopher


확실한 암호체계를 사용한다.

암호의 길이
대부분의 배포본에서 기본적으로 암호의 길이는 5자 이상으로 설정되어 있습니다. 이것은 8자 이상으로 바꾸어야 합니다. 이것을 위해서는 login.defs 파일을 수정합니다. (보통 /etc/login.defs)

PASS_MIN_LEN 5

PASS_MIN_LEN 8
로 바꾸어 줍니다.

쉐도우 패스워드 사용
이것은 일반적으로 리눅스 설치시 옵션입니다. 이후에는 authconfig 유틸리티를 사용할 수 있습니다. 기존 암호들과 그룹등의 쉐도우 패스워드로의 전환은 pwconv, grpconv 같은 명령을 사용할수 있습니다.


root 계정
루트 계정은 유닉스 시스템에서 가장 강력한 권한을 가지고 있는 계정입니다. 만약 관리자가 콘솔로의 접속후, 로그아웃하는 것을 잊고 루트 프롬프트를 그대로 놔두었다면, 위험한 상황이 벌어지겠지요? 이런 상황을 피하기 위해 TMOUT 변수를 사용할수 있습니다. /etc/profile 파일 또는 루트의 해당 쉘의 설정파일, 예를 들어 bash 라면 ~/.bash_profile 에 다음과 같이 설정해 둡니다.

HISTSIZE=0
HISTFILESIZE=0
TMOUT=3600

숫자는 초단위 입니다. 3600초 즉, 1시간동안 아무런 입력이 없다면 자동으로 로그아웃됩니다. HISTSIZE 와 HISTFILESIZE 를 0으로 해두는 것도 만약을 위한 조치입니다.

console-equivalent 접근
일반 유저의 콘솔 관련 프로그램 사용을 방지합니다. 예를 들어 shutdown, reboot, halt와 같은 명령어들 입니다. 다음과 같이 합니다.

rm -f /etc/security/console.apps/명령어


사용하지 않는 서비스 지우기
사용하지 않고, 불필요한 서비스 패키지는 삭제합니다. 일단 /etc/inetd.conf 파일을 수정해서 사용하지 않는 서비스는 모두 주석처리(#)한후, inetd를 재시동합니다.


/etc/inetd.conf 파일을 600 모드로 바꾸어서 루트만이 억세스하도록 합니다.
chmod 600 /etc/inetd.conf


반듯이 /etc/inetd.conf 파일의 오너는 root 이여야 합니다.
chown root.root /etc/inetd.conf


inetd.conf 를 수정합니다. 예를 들어 ftp, telnet, shell, login, exec, talk, ntalk, imap, pop-2, pop-3, finger, auth등 사용하지 않는 서비스들은 모두 주석처리 합니다.

inetd 를 재시동합니다. killall -HUP inetd

/etc/inetd.conf 파일을 immunize 합니다.
chattr +i /etc/inetd.conf

다시 변경이 가능하게 하려면 chattr -i /etc/inetd.conf 하면 됩니다.


TCP_WRAPPER 사용하기
tcp wrapper로 서버로의 접근을 제한할수 있습니다. 가장 좋은 정책은 일단 /etc/hosts.deny 에 ALL: ALL@ALL, PARANOID 로 모든 접근을 막은후, /etc/hosts.allow 에 허가 해주는 것입니다.


hosts.deny 파일을 다음과 같이 수정합니다.
ALL: ALL@ALL, PARANOID


hosts.allow 를 다음 예와 같이 수정합니다.
ftp: 202.54.15.99 foo.com

위 설정은 ftp 억세스를 ip 주소인 202.54.15.99와 foo.com 도메인을 가지는 클라이언트 들에게 허용합니다.


마지막으로 tcpdchk 명령으로 설정파일들의 오류를 확인해 볼수 있습니다.

시스템 정보를 보여주지 말자
외부에 서버의 정보를 최대한 보여주지 않는 것도 공격을 예방하는 방법입니다. 예를 들어 "/etc/inetd.conf" 의 telnet 옵션을 다음과 같이 수정합니다.

telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
을...
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h
와 같이...

-h 옵션은 시스템 정보를 보여주지 않고, 사용자에게 id 와 암호만 물어옵니다. 그러나 언제나 telnet 보다는 sshd 의 사용을 권장합니다.

"/etc/host.conf" 파일 수정

# Lookup names via DNS first then fall back to /etc/hosts.
order bind,hosts
# We have machines with multiple IP addresses.
multi on
# Check for IP address spoofing.
nospoof on

첫번째 줄은 DNS 관련 설정입니다. 먼저 DNS 에서 host name을 resolve 하고, 다음 hosts 파일을 참조하라는 것입니다. multi 옵션은 /etc/hosts 파일에 다중 IP 주소를 가질수 있다는 것이며, 마지막 nospoof 옵션은 서버로의 스푸핑을 방지합니다.

"/etc/services" 파일은 immunize 합니다. chattr +i /etc/services

루트 로그인의 제한
/etc/securetty 파일은 어떤 TTY 디바이스로 루트 로그인이 가능한지 설정합니다. 불필요한 디바이스는 주석처리 합니다.


일반 유저의 su root 방지
특정 유저만 su root 할수 있도록 설정하려면 다음과 같이합니다.

/etc/pam.d/su 파일의 처음에 다음을 추가합니다.

auth sufficient /lib/security/pam_rootok.so debug
auth required /lib/security/Pam_wheel.so group=wheel

/etc/group 의 wheel 그룹에 su root를 허용하고자 하는 사용자 그룹 등록합니다.

wheel:x:10:root,someone

쉘 로그 파일
bash 쉘은 500여개의 지난 명령어를 ~/.bash_history 에 남깁니다. 다음과 같이 크기를 줄이거나, 0로 설정해 아예 로그를 남기지 않도록 합니다.

~/.bash_profile 에
HISTFILESIZE=30
HISTSIZE=30

Control-Alt-Delete 키를 사용하지 못하도록 합니다.
/etc/inittab 파일에서 다음과 같은 라인을 찾아 주석처리 합니다.

#ca::ctrlaltdel:/sbin/shutdown -t3 -r now


"/etc/rc.d/init.d" 디렉토리와 파일들의 퍼미션 수정
chmod -R 700 /etc/rc.d/init.d/*

위와 같이 설정해서 루트만이 억세스 할수 있도록 합니다.


시스템 정보 숨기기
기본적으로 리눅스 서버로 로그인 할때 배포본, 버젼, 커널 버젼, 서버이름 등이 나타나도록 되어 있습니다. 이것은 서버를 노리는 크랙커들에게 더 많은 정보를 줄뿐입니다.

"/etc/rc.d/rc.local" 의 수정
rc.local 매 부팅시마다 /etc/issue 파일을 생성하는 루틴이 있습니다. 이 부분을 모두 주석처리 합니다.

# This will overwrite /etc/issue at every boot. So, make any changes you
# want to make to /etc/issue here or you will lose them when you reboot.
#echo "" > /etc/issue
#echo "$R" >> /etc/issue
#echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue
#
#cp -f /etc/issue /etc/issue.net
#echo >> /etc/issue


이슈 파일 삭제

rm -f /etc/issue
rm -f /etc/issue.net


SUID/SGID 프로그램 찾기
일반 유저가 루트 권한으로 실행 시킬수 있는 불필요한 SUID/SGID 프로그램들은 최소화 합니다. 먼저, 다음과 같이 SUID/SGID 퍼미션의 파일들을 찾아내서

find / -type f ( -perm -04000 -o -perm -02000 ) -exec ls ­lg {} ;

모드를 바꾸어 줍니다. chmod a-s [program]

수정/보안할것은 연락주시기 바랍니다.


--------------------------------------------------------------------------------
* 이하 역자 추가 *

포트 스캐너
일반적으로 크래커들이 제일 먼저 해보는 것은 공격할 서버에 어떤 서비스 포트들이 열려 있는지 포트 스캐닝을 해본후, 열려있는 서비스들 중에 알려진 버그를 이용하는 경우가 많습니다. 이런 포트 스캐닝을 감지 할수 있는 툴이 몇가지 있는데 그중에서 가장 간단한 scanlogd 라는 툴을 소개합니다. scanlogd 는 http://www.openwall.com/scanlogd/에서 최신 버젼을 받을수 있습니다.


먼저 타볼 소스를 풀어 make linux 로 간단하게 컴파일을 하면 scanlogd 라는 바이너리가 생깁니다. 적당한 곳에 옭겨둡니다. (예 /usr/local/sbin/)

scanlogd 라는 유저를 만듭니다. 로그인 할 필요가 없는 계정이므로, /etc/passwd 파일을 수정하든지 해서, scanlogd:x:521:521::/home/scanlogd:/bin/false 와 같이 /bin/false 로 해놓습니다.

로그를 남기기 위해 /etc/syslog.conf 에 다음을 추가합니다.
daemon.alert /var/log/alert

이제 scanlogd 를 실행시켜 놓으면 어느 ip 에서 포트 스캐닝을 하는지 /var/log/alert 에 다음과 같이 남게 됩니다. 재 부팅시에 실행되도록 /etc/rc.d/rc.local 같은곳에 넣어둡니다.
Jan 23 22:34:05 test scanlogd: xxx.xxx.xxx.xxx to yyy.yyy.yyy.yyy ports 1, 7, 9, 11, 13, 15, ..., fSrpauxy, TOS 00, TTL 120 @22:34:05

xxx.xxx.xxx.xxx 라는 ip 가 yyy.yyy.yyy.yyy 의 포트를 스캔하였습니다.


보통 포트 스캐닝만 했다고 어떤 조치를 취해야 하는 것은 아닙니다. 하지만 그후에 어떤 이상이 있다고 생각되면 그 ip 의 서버로의 억세스를 막을수 있겠지요. 커널에서 ipchains 을 지원한다면 간단하게 ipchains -A input -l -j REJECT -s xxx.xxx.xxx.xxx -d 0/0 -p all 와 같이 해버릴수 있겠지요.

로그 확인 유틸리티
서버 관리자의 가장 기본적인 임무중 하나는 자신의 서버에 항상 기록되는 로그들을 살펴보는 것입니다. 습관적으로 로그를 살펴보는 관리자의 서버는 그 만큼 크래킹에서 벗어날수 있습니다. logcheck 라는 로그 관련 유틸리티가 있습니다. 여기서 받을수 있으며, http://www.psionic.com/download 이곳에는 또한 PortSentry 라는 포트 스캐닝 감지 유틸리티가 있는데, 이것은 scanlogd 보다 더 적극적인 방어책으로, 설정에 따라 스캐닝을 감지했을때 자동으로 그 ip의 접근을 막는등의 일을 할수 있습니다. 사용하고 안하고는 취향 차이겠지요.

List of Articles
번호 제목 날짜 조회 수
10 SQL 인젝션 복구 쿼리 2014.02.27 8097
» 리눅스 보안 Tip 2014.02.27 8627
8 도메인 포워딩 설정 2014.02.27 7793
7 apache + mysql 자동 실행 방법 (소스설치) 2014.02.27 7794
6 history 파일 삭제 제한하기 2014.02.27 7609
5 파일 속성 명령어 : chattr, lsattr 2014.02.27 9333
4 vsftp 이란? 2014.02.27 9057
3 APM 소스 설치 2014.02.27 7531
2 APM 소스 설치 2014.02.27 7942
1 ftp passive mode 설정 2014.02.27 7876
Board Pagination Prev 1 ... 3 4 5 6 7 8 9 10 11 12 Next
/ 12

하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved