머신이미지생성및사용시 주의사항 ( 가이드라인 ) 1 / 18
문서버전및이력 버전 일자 이력사항 1.1 2015.09.04 포탈콘솔개정에따른 UI 수정, 1.0 2013 최초배포 목차 1. 머신이미지 생성시주의사항...3 Linux templates...3 Windows templates...4 2. 머신이미지 사용시주의사항...4 3. VM 접속보안강화방법...5 비밀번호설정변경...5 Fail 2 ban 설치및설정...9 Sshd config 에서 root 로그인제한... 15 IPTABLES 를이용한 SSH BRUTE FORCE 공격방어... 17 2 / 18
1. 머신이미지 생성시주의사항 머신이미지 ' 생성시설치된모든 s/w들은최신의보안패치가적용되어야하며, 최소한아래에나열된 ' 머신이미지 ' 생성가이드라인을적용한후에공개되어야한다. 모든서비스들과사용자인증프로토콜들은 disable 시켜야한다. ( 예 : telnet, FTP 등 ) 불필요한 network service들은 run-level 설정에서제외시켜서자동시작시키지않는다. 오직관리자서비스 (SSH, RDP) 와 ' 머신이미지 ' 에설치된 application들을위한서비스들만필요하다. 모든접속 public key들은시스템에서제거한다. ' 머신이미지 ' 에설치된모든 s/w들은내부 default 계정과암호가없어야한다. Linux templates : - Password 보안정책반영 : 패스워드최소 8자이상사용, 90일마다 - 변경, 만료 7일젂경고 (centos & RHEL : /etc/login.defs 수정 ) PASS_MIN_LEN 8 PASS_MAX_DAYS 90 PASS_WARN_AGE 7 - root를제외한모든 user 계정과암호제거 - 모든 SSH public and private key pairs 제거 - 모든 shell history( 작업이력정보 ) 와 message log파일제거 (wtmp clean up,.bash_history 삭제, history c 로 cache 된이력까지삭제 ) rm f /root/.bash_history cp /dev/null /var/log/wtmp cp /dev/null /var/log/messages history -c 3 / 18
Windows templates : - guest account 제거 - Windows event log 제거 - 인증받지않은사용자가접근할수있는어떠한파일공유설정도허용금지. 모든파일공유기능 disable. 2. 머신이미지 사용시주의사항 ' 머신이미지 ' 로최초 VM 생성시만들어져있는 Public SSH key('/root/.ssh/authorized_keys' 파일안에있는고객이만들지않은 Public key) 들은제거해야합니다. 이때부주의하게자신의인증 key를삭제하지않도록주의합니다. 인증받지않은접속의결과인모든 default usernames and passwords를제거합니다. 아래의명령은 usernames and passwords 를찾게도와준다. - # cat /etc/passwd /etc/shadow grep -E '^[^:]*:[^:]{3,}' cut -d: -f1 어떠한알려지지않은 login을확인했다면아래의명령을통해 password 변경합니다. - # Password USERNAME 사전에설정된원격접속을예방하기위해존재하는 syslog config을제거하고, syslog service 재시작합니다. 3. VM 접속보안강화방법 참조합니다. - 비밀번호설정변경 (linux & windows) - Fail 2 ban 설치및설정 (linux) - Sshd config에서 root log-in 제한 - Iptables를이용한 SSH brute force 공격방어 (source ip 접근제한 ) 4 / 18
3. VM 접속보안강화방법 비밀번호설정변경 - 서비스개요 서비스 VM의비밀번호설정변경으로해킹으로인한피해를줄일수있습니다. 비밀번호길이는8자이상으로길게설정하고, 비밀번호는 3개월마다변경할것을추천합니다. - 순서 1. 리눅스서버에서비밀번호를 8글자이상으로설정 2. 리눅스서버에서비밀번호를 3개월마다변경하도록설정 3. 윈도우서버에서비밀번호를 8글자이상으로설정 4. 윈도우서버에서비밀번호를 3개월마다변경하도록설정 - 비밀번호를 8 글자이상으로설정 리눅스서버 /etc/login.defs 파일을수정할수있도록열어줍니다. 비밀번호의최소길이값인 PASS_MIN_LEG 값을 8 로변경하고저장합니다. (i 를눌러변경하고 esc 키, :wq 로저장합니다.) 일반계정으로비밀번호변경을시도합니다. ( 변경사항은일반계정에적용됩니다.) 일 5 / 18
8 자리미만의비밀번호로변경을시도하면변경되지않습니다. - 비밀번호를 3 개월마다변경하도록설정 - 리눅스서버 /etc/login.defs 파일을수정할수있도록열어줍니다. 비밀번호최대유지기한값인 PASS_MAX_DAYS 값을 90 으로변경하고저장합니다. (i 를눌러변경하고 esc 키, :wq 로저장합니다.) - 비밀번호를 8 글자이상으로설정 윈도우서버 제어판 > 관리도구 > 로컬보안정책을확인합니다. ( 실행에서 secpol.msc 를입력해 도됨 ) 6 / 18
보안설정에서계정정책 > 암호정책을확인합니다. 최소암호길이를클릭하여최소문자값을 8 로변경합니다. 8 자리미만의비밀번호로변경을시도해도변경할수없습니다 7 / 18
- 비밀번호를 3 개월마다변경하도록설정 - 윈도우서버 제어판 > 관리도구 > 로컬보안정책을확인합니다. ( 실행에서 secpol.msc 를입력해 도됨 ) 보안설정에서계정정책 > 암호정책을확인합니다. 최대암호사용기간을클릭하여해당값을 90 으로변경합니다. 8 / 18
Fail 2 ban 설치및설정 - 서비스개요 fail2ban은 python(2.4 Ver 이상 ) 으로만들어진특정서비스로로그인을몇회이상실패할경우, logfiles을읽어서일정기간동안접속을차단하는툴로 ssh, ftp 등에무작위로로그인하는 brute force attack에대응하기위한모듈입니다. iptables, tcpwrapper 등에해당 host를등록하여특정 host의접속을차단하는기능을가지고있으며, ssh, apache, ftp 등을이용한접속방어에사용됩니다. - Yum 을이용한설치과정 rpm 으로 fail2ban 이설치되어있는지확인합니다. 설치가되어있다면위와같은메시지가보입니다. 만일설치되어있지않다면 yum install fail2ban 명령을통해설치할수있습니다. (Package 를찾지못하는경우 yum install epel-release 를먼저설치후 Yum clean all 명령실행, 이후 yum install fail2ban 실행 ) 9 / 18
- Rpm 파일을이용한설치과정 http://www.fail2ban.org 에서 OS 버전에맞는 package를 download 받습니다. 아래는해당 package download link입니다. https://dl.fedoraproject.org/pub/epel/6/x86_64/fail2ban-0.9.2-1.el6.noarch.rpm (CentOS6/RHEL6 64bit 전용 ) ( 해당 URL은 epel repo변경에따라달라질수있습니다 ) wget 명령을통해쉽게다운로드받을수있습니다. 다운받은 package 설치 (rpm 명령으로설치 ) # rpm -Uvh fail2ban-0.9.2-1.el6.noarch.rpm 타 OS 버전및연관 Package 들은모두 https://dl.fedoraproject.org/pub/epel/ 에서 Download 가능 ( 해당 URL은 epel repo변경에따라달라질수있습니다 ) 10 / 18
- Fail 2 ban 설정과정 usr/bin 에 fail2ban 명령어가존재하는지확인 /etc/fail2ban 에 fail2ban 설정파일이위치하게됩니다. 설정파일인 jail.conf 를열어 [default] section 에서 bantime( 차단시간 ) 과 maxretry( 차 단할실패횟수 ) 를적절하게변경해주세요. 각항목설명 Ignoreip : 여기에지정된주소는 fail2ban에의해차단되지않습니다. 원격에서 VM에접속하는고객님의경우, 해당 PC나노트북의 ip를여기에등록한다면혹시라도패스워드입력실패로인해고객님의 ip가차단되는경우를예방할수있습니다. Bantime : 특정호스트가일정횟수를넘어서패스워드입력실패가될때, 해당호스트가차단될시간입니다. 11 / 18
Maxretry : 특정호스트가차단될실패횟수입니다. 적용하려는 service section을찾아서 enabled = true로고쳐주면해당서비스만적용됩니다. 기본으로 ssh 서비스만적용이되어있습니다. [ssh-iptables] 의미는 ssh 접속의경우, iptables을이용해특정호스트를차단한다는뜻이며, ssh section 이외에도여러다른서비스의경우다양한필터링툴 (tcpwrapper, badbots,shorewall 등 ) 을사용하고있습니다. Section 내의설정내용 - Enabled : 해당서비스사용여부 - Filter : 로그를읽을때사용할필터 (/etc/fail2ban/filter) - Action : iptable로차단하고, 메일을발송 (/var/spool/mail/root 에서확인 ) - Logpath : 읽어서처리할로그파일위치 - Maxretry : 차단할실패횟수 - Bantime : 차단시간 Dest mail 은일반메일주소도등록가능합니다. 단이때에는본인의 mail service 가동작하고있어야합니다. ps ef grep sendmail 명령으로 mail process가동작하는지확인할수있습니다. 만약 mail process가동작하지않으면 service sendmail start 명령으로해당 process를실행시킬수있습니다. 제개인메일을입력했을때, 아래와같이메일을받을수있습니다. 12 / 18
서비스시작 # service fail2ban start 부팅시자동시작하도록 ntsysv 명령으로등록혹은아래명령실행 # chkconfig levels 235 fail2ban on - Fail 2 ban 적용사례 fail2ban이작동하여특정 host에서일정횟수이상 VM에접속시도시 iptables에서해당 host를일정기간차단하는기능시연 특정 host에서 fail2ban이설치된 VM에접속시도 (password 인증실패 ) 13 / 18
jail.conf 내의 maxretry( 차단할실패횟수 ) 는 password 입력실패횟수와는다릅니다. Fail2ban은 /var/log/secure 의 log에서표시되는패스워드입력실패 log의횟수를확인합니다. 위의화면에서는 permission denied라고표시되는횟수 ( 빨간색으로표시 ) 가maxretry에설정한횟수와동일하면 fail2ban은해당 host의 ip를 ptables에등록하여차단합니다. 일정횟수이상접속시도실패시 VM 에설치한 fail2ban 이작동하여해당 host 의 ip 를 iptables 에등록하여차단합니다 접속실패 (password 인증실패 ) host 의 ip : 10.0.0.2 /var/log/message 에서해당 host 가차단되는모습을볼수있습니다. 접속실패 (password 인증실패 ) host 의 ip : 10.0.0.2 Jail.conf 에서설정한 bantime( 차단시간 ) 을넘으면해당 host 의 ip 는 iptables 에서자동 으로삭제됩니다 Fail2ban chain 에서해당 host 의 ip 가삭제되었음을확인할수있습니다. /var/log/message 에서해당 host 가 unban 되었음을확인할수있습니다. 참조 : http://www.fail2ban.org/wiki/index.php/manual 14 / 18
Sshd config 에서 root 로그인제한 - 서비스개요 Linux가설치된후에는 default로시스템관리자인 root 사용자계정만존재하고있습니다. 또한기본적인 ssh설정으로 root로바로접속이가능하도록설정되어있습니다. 이러한상황에서 root 사용자로만로그인하여시스템을사용하게되면많은위험에노출되기쉽습니다. 무한스캐닝방법을사용하여 root 계정을통해악의적인접속을시도하는것이그예입니다. 그리하여 root 계정의 ssh 원격접속을허용하지않도록설정하고, 일반사용자계정으로로그인하여 root 권한의작업이필요할때마다 root 권한을얻어작업하는것이바람직합니다. - 과정 우선일반사용자계정을추가해야하므로 root계정으로로그인한후다음과같이새로운계정 (ucloud) 을추가 (adduser) 하고암호 (passwd) 를설정해줍니다. vi /etc/ssh/sshd_config 명령어를통해 #PermitRootLogin yes 항목을찾습니다 PermitRootLogin no 로수정하고저장합니다 수정이완료되면 esc 를누르고 :wq 로저장하여 vi 를빠져나옵니다. Service sshd restart 로수정한 sshd demon 을다시시작합니다 root 계정으로로그인을시도하면 Access denied 란메시지가뜨면서접속이제한됩 니다. 15 / 18
root 계정접속이제한되었으므로, 새로생성했던 ucloud 계정으로로그인하여사용합 니다 root 계정의권한이필요할경우 su 명령으로 root 계정에로그인하여권한을획득 합니다 다시 root 계정의접속을허용하고싶을경우, vi /etc/ssh/sshd_config 명령어를사용 하여 PermitRootLogin no 항목을 PermitRootLogin yes 로수정하고, Service sshd restart 로수정한 sshd demon 을다시시작하여원래상태로복구하시면됩니다. 참고 특정사용자계정에게만 su 명령어를사용하도록설정하는방법입니다. 1. root 계정으로로그인한후 vi /etc/pam.d/su 실행 2. #auth required pam_wheel.so use_uid 항목의주석 (#) 제거 3. vi /etc/group 를실행하여 whee 그룹에 su 명령사용가능한계정추가 wheel:x:10:root,ucloud 4. "wheel" 그룹에추가된계정들만 "su" 명령어사용가능 16 / 18
IPTABLES 를이용한 SSH BRUTE FORCE 공격방어 (SOURCE IP 접근제한 ) - Iptables 란? 커널상에서특정조건을가지고있는패킷에대해허용 (Accept) 과차단 (Drop) 등의정책을등록할수있는패킷필터 iptables -A INPUT -s [ 발신지 ] --sport [ 발신지포트 ] -d [ 목적지 ] --dport [ 목적지포트 ] -j [ 정책 ] Commands -A : 새로운규칙추가 (--append) -D : 규칙삭제 (--delete) -C : 패킷을테스트 (--check) -I : 새로운규칙삽입 (--Insert) -R : 새로운규칙교체 (--replace) -L : 새로운규칙출력 (--list) -F : 체인의모든규칙삭제 (--flush) -Z : 모든체인의패킷과바이트카운터값을 0 으로 (--zero) -N : 새로운체인생성 (--new) -X : 체인삭제 (--delete-chain) -P : 기본정책변경 (--popicy) Match -p : 패킷의포트번호또는이름 -s : 패킷의발신지 -d : 패킷의도착지 -i : 규칙을적용할인터페이스 -j : 규칙에맞는패킷처리방식 - 과정 허용 ip 주소등록 iptables -A INPUT -s [ 허용주소 ] -p tcp --dport [SSH port] - j ACCEPT 17 / 18
허용주소형태의예 -127.0.0.1-192.168.1.0/24 또는 192.168.1.0/255.255.255.0-0/0 ( 모든 IP) 허용 ip 주소외 SSH port에대한접근차단 iptables -A INPUT -p tcp --dport [SSH port] -j DROP iptables 방화벽은테이블형식으로정책을관리하며, 등록순서에있어먼저등 록한정책에대해서효력이우선시되기때문에등록순서가매우중요. 허용정책 (ACCEPT) 을먼저등록한후거부정책 (DROP) 을등록하여야함. 적용된정책보기 : iptables list 저장하기 : /etc/rc.d/init.d/iptables 있는시작스크립트를이용하여저장 ( 재부팅시적 용 ) /etc/rc.d/init.d/iptables save 허용되지않는 IP 접근대한로그출력 iptables -A INPUT -s! [ 허용주소 ] -p tcp --dport [SSH port] - j LOG 기록된로그보기 : cat /var/log/messages 로그정책이반영된 iptables list : 로그정책은 Drop 정책보다먼저 등록하여야함 참조 : http://www.netfilter.org/projects/iptables/index.html 18 / 18