머신이미지 생성및사용시주의사항 ( 가이드라인 ) 목 차 1. 머싞이미지 생성시주의사항 2. 머싞이미지 사용시주의사항 3. VM 접속보앆강화방법 1 / 18
I. 머신이미지 생성시주의사항 머싞이미지 생성시설치된모듞 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 된이력까지삭제 ) 2 / 18
rm f /root/.bash_history cp /dev/null /var/log/wtmp cp /dev/null /var/log/messages history -c Windows templates : - guest account 제거 - Windows event log 제거 - 인증받지않은사용자가접근할수있는어떠한파일공유설정도허용금지. 모듞파일공유기능 disable. 만약, 공개된 머신이미지 가위의가이드라인을준수하지않아문제가발생예측되는경우, 이는해당 머신이미지 로 VM을생성한고객들에게심각한위험요인으로작용할수있기때문에 kt는해당 머신이미지 를제거할수있고, 머신이미지 생성자에게통보할수있습니다. 3 / 18
II. 머신이미지 사용시주의사항 머싞이미지 로최초 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
III. VM 접속보안강화방법 I. 비밀번호설정변경 서비스개요 >>> 서비스 VM 의비밀번호설정변경으로해킹으로인한피해를줄일수있습니다. 비밀번호길이는 8 자이상으로길게설정하고, 비밀번호는 3 개월마다변경할것을추천합니다. 순서 >>> 1. 리눅스서버에서비밀번호를 8글자이상으로설정 2. 리눅스서버에서비밀번호를 3개월마다변경하도록설정 3. 윈도우서버에서비밀번호를 8글자이상으로설정 4. 윈도우서버에서비밀번호를 3개월마다변경하도록설정 과정 >>> 1. 비밀번호를 8 글자이상으로설정 ( 리눅스서버 ) /etc/login.defs 파일을수정할수있도록열어줍니다. 비밀번호의최소길이값인 PASS_MIN_LEG 값을 8 로변경하고저장합니다. (i 를눌러변경하고 esc 키, :wq 로저장합니다.) 일반계정으로비밀번호변경을시도합니다. ( 변경사항은일반계정에적용됩니다. ) 5 / 18
8 자리미만의비밀번호로변경을시도하면변경되지않습니다. 2. 비밀번호를 3 개월마다변경하도록설정 ( 리눅스서버 ) /etc/login.defs 파일을수정할수있도록열어줍니다. 비밀번호최대유지기한값인 PASS_MAX_DAYS 값을 90 으로변경하고저장합니다. (i 를눌러변경하고 esc 키, :wq 로저장합니다.) 3. 비밀번호를 8 글자이상으로설정 ( 윈도우서버 ) 제어판 > 관리도구 > 로컬보앆정책을확인합니다. ( 실행에서 secpol.msc 를입력해도됨 ) 6 / 18
보앆설정에서계정정책 > 암호정책을확인합니다. 최소암호길이를클릭하여최소문자값을 8 로변경합니다. 8 자리미만의비밀번호로변경을시도해도변경할수없습니다. 7 / 18
4. 비밀번호를 3 개월마다변경하도록설정 ( 윈도우서버 ) 제어판 > 관리도구 > 로컬보앆정책을확인합니다. ( 실행에서 secpol.msc 를입력해도됨 ) 보앆설정에서계정정책 > 암호정책을확인합니다. 8 / 18
최대암호사용기갂을클릭하여해당값을 90 으로변경합니다. II. Fail 2 ban 설치및설정 서비스개요 >>> fail2ban은 python(2.4 Ver 이상 ) 으로만들어짂특정서비스로로그인을몇회이상실패할경우, logfiles을읽어서일정기갂동앆접속을차단하는툴로 ssh, ftp 등에무작위로로그인하는 brute force attack에대응하기위한모듈입니다. iptables, tcpwrapper 등에해당 host를등록하여특정 host의접속을차단하는기능을가지고있으며, ssh, apache, ftp 등을이용한접속방어에사용됩니다. 과정 >>> 1. rpm 으로 fail2ban 이설치되어있는지확인합니다. 설치가되어있다면위와같은메시지가보입니다. 만일설치되어있지않다면 yum install fail2ban 명령을통해설치할수있습니다. 9 / 18
yum 명령을이용한설치방법이외에도 rpm 명령을이용한설치방법을 2~3 번에설명하 였습니다. 2. http://www.fail2ban.org 에서 centos 5.5, x86_64에맞는 package를 download 받습니다. 아래는해당 package download link입니다. http://download.fedora.redhat.com/pub/epel/5/x86_64/fail2ban-0.8.4-23.el5.noarch.rpm wget 명령을통해쉽게다운로드받을수있습니다. 3. 다운받은 package 설치 (rpm 명령으로설치 ) rpm -Uvh fail2ban-0.8.4-23.el5.noarch.rpm 4. usr/bin 에 fail2ban 명령어가존재하는지확인 10 / 18
/etc/fail2ban 에 fail2ban 설정파일이위치하게됩니다.. 5. 설정파일인 jail.conf 를열어 [default] section 에서 bantime( 차단시갂 ) 과 maxretry( 차단할 실패횟수 ) 를적젃하게변경해주세요. 각항목설명 - Ignoreip : 여기에지정된주소는 fail2ban에의해차단되지않습니다. 원격에서 VM 에접속하는고객님의경우, 해당 PC나노트북의 ip를여기에등록한다면혹시라도패스워드입력실패로인해고객님의 ip가차단되는경우를예방할수있습니다. - Bantime : 특정호스트가일정횟수를넘어서패스워드입력실패가될때, 해당호스트가차단될시갂입니다. - Maxretry : 특정호스트가차단될실패횟수입니다. 6. 적용하려는 service section을찾아서 enabled = true로고쳐주면해당서비스만적용됩니다. 기본으로 ssh 서비스만적용이되어있습니다. [ssh-iptables] 의미는 ssh 접속의경우, iptables을이용해특정호스트를차단한다는뜻이며, ssh section 이외에도여러다른서비스의경우다양한필터링툴 (tcpwrapper, badbots, shorewall 등 ) 을사용하고있습니다. 11 / 18
Section 내의설정내용 - Enabled : 해당서비스사용여부 - Filter : 로그를읽을때사용할필터 /etc/fail2ban/filter - Action : iptable로차단하고, 메일을발송 (/var/spool/mail/root 에서확인 ) Dest mail 은일반메일주소도등록가능합니다. 단이때에는본인의 mail service가동작하고있어야합니다. ps ef grep sendmail 명령으로 mail process가동작하는지확인할수있습니다. 만약 mail process 가동작하지않으면 service sendmail start 명령으로해당 process 를실 행시킬수있습니다. 제개인메일을입력했을때, 아래와같이메일을받을수있습니다. - Logpath : 읽어서처리할로그파일위치 - Maxretry : 차단할실패횟수 - Bantime : 차단시갂 - 7. 서비스시작. 8. 부팅시자동시작하도록 ntsysv 명령으로등록하거나, chkconfig levels 235 fail2ban on 명령실행 12 / 18
적용사례 >>> fail2ban 이작동하여특정 host 에서일정횟수이상 VM 에접속시도시 iptables 에서해당 host 를 일정기갂차단하는기능시연 1. 특정 host 에서 fail2ban 이설치된 VM 에접속시도 (password 인증실패 ) jail.conf 내의 maxretry( 차단할실패횟수 ) 는 password 입력실패횟수와는다릅니다. Fail2ban은 /var/log/secure 의 log에서표시되는패스워드입력실패 log의횟수를확인합니다. 위의화면에서는 permission denied라고표시되는횟수 ( 빨갂색으로표시 ) 가 maxretry에설정한횟수와동일하면 fail2ban은해당 host의 ip를 iptables에등록하여차단합니다. 2. 일정횟수이상접속시도실패시 VM 에설치한 fail2ban 이작동하여해당 host 의 ip 를 iptables 에등록하여차단합니다. 접속실패 (password 인증실패 ) host 의 ip : 10.0.0.2 /var/log/message 에서해당 host 가차단되는모습을볼수있습니다. 13 / 18
접속실패 (password 인증실패 ) host 의 ip : 10.0.0.2 3. Jail.conf 에서설정한 bantime( 차단시갂 ) 을넘으면해당 host 의 ip 는 iptables 에서자동으로 삭제됩니다. Fail2ban chain 에서해당 host 의 ip 가삭제되었음을확인할수있습니다. /var/log/message 에서해당 host 가 unban 되었음을확인할수있습니다. 접속실패 (password 인증실패 ) host 의 ip : 10.0.0.2 참조 : http://www.fail2ban.org/wiki/index.php/manual III. sshd config 에서 root 로그인제한 서비스개요 >>> Linux가설치된후에는 default로시스템관리자인 root 사용자계정만존재하고있습니다. 또한기본적인 ssh설정으로 root로바로접속이가능하도록설정되어있습니다. 이러한상황에서 root 사용자로만로그인하여시스템을사용하게되면많은위험에노출되기쉽습니다. 무한스캐닝방법을사용하여 root 계정을통해악의적인접속을시도하는것이그예입니다. 그리하여 root 계정의 ssh 원격접속을허용하지않도록설정하고, 일반사용자계정으로로그인하여 root 권한의작업이필요할때마다 root 권한을얻어작업하는것이바람직합니다. 14 / 18
과정 >>> 1. 우선일반사용자계정을추가해야하므로 root 계정으로로그인한후다음과같이새로 운계정 (ucloud) 을추가 (adduser) 하고암호 (passwd) 를설정해줍니다. 2. vi /etc/ssh/sshd_config 명령어를통해 #PermitRootLogin yes 항목을찾습니다. 3. PermitRootLogin no 로수정하고저장합니다. 수정이완료되면 esc 를누르고 :wq 로저장하여 vi 를빠져나옵니다. 4. Service sshd restart 로수정한 sshd demon 을다시시작합니다. 5. root 계정으로로그인을시도하면 Access denied 란메시지가뜨면서접속이제한됩니다. 6. root 계정접속이제한되었으므로, 새로생성했던 ucloud 계정으로로그인하여사용합니다. 7. root 계정의권한이필요할경우 su 명령으로 root 계정에로그인하여권한을획득합니 다. 8. 다시 root 계정의접속을허용하고싶을경우, vi /etc/ssh/sshd_config 명령어를사용하 여 PermitRootLogin no 항목을 PermitRootLogin yes 로수정하고, Service sshd restart 15 / 18
로수정한 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" 명령어사용가능 IV. iptables 를이용한 SSH brute force 공격방어 (source ip 접근제한 ) 서비스개요 >>> 1. iptables 란? 커널상에서특정조건을가지고있는패킷에대해허용 (Accept) 과차단 (Drop) 등의정책을등록할수있는패킷필터 2. 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 : 규칙을적용할인터페이스 16 / 18
-j : 규칙에맞는패킷처리방식 과정 >>> 1. 허용 ip 주소등록 iptables -A INPUT -s [ 허용주소 ] -p tcp --dport [SSH port] - j ACCEPT 허용주소형태의예 - 127.0.0.1-192.168.1.0/24 또는 192.168.1.0/255.255.255.0-0/0 ( 모듞 IP) 2. 허용 ip 주소외 SSH port 에대한접근차단 iptables -A INPUT -p tcp --dport [SSH port] -j DROP iptables 방화벽은테이블형식으로정책을관리하며, 등록순서에있어먼저등록한 정책에대해서효력이우선시되기때문에등록순서가매우중요. 허용정책 (ACCEPT) 을 먼저등록한후거부정책 (DROP) 을등록하여야함 3. 적용된정책보기 : iptables --list 4. 저장하기 : /etc/rc.d/init.d/iptables 있는시작스크립트를이용하여저장 ( 재부팅시적용 ) /etc/rc.d/init.d/iptables save 5. 허용되지않는 IP 접근대한로그출력 : iptables -A INPUT -s! [ 허용주소 ] -p tcp --dport [SSH port] - j LOG 기록된로그보기 : cat /var/log/messages 로그정책이반영된 iptables list : 로그정책은 Drop 정책보다먼저등록하여야함 17 / 18
참조 : 1. http://www.netfilter.org/projects/iptables/index.html 2. http://www.netfilter.org/documentation/howto//packet-filtering-howto.html 18 / 18