Preventing thwart SSH attacks with DenyHosts
หลังจากที่เครื่อง server เข้าสู่ internet ไม่นานก็จะมีพวกมือดีต่างๆมาลอง login เข้าระบบด้วยโปรโตโคล ssh กันอย่างไม่ขาดสาย ซึ่งถ้าระบบเราไม่ได้มีการป้องกันไม่ให้ ssh ไม่อนุญาติให้ user root ทำการ Login ได้และ password ก็ยังแสนง่ายอีก ก็คงต้องเตรียมใจได้เลยว่าอีกไม่กี่วันต้องโดนใครสักคนเข้าสู่ระบบเราได้แน่ๆ เพราะผมเคยลองมาแล้ว ลองเซ็ตเล่นๆแล้วใช้ password ง่ายๆ ผ่านไปวันกว่าๆ ไปดูที่ log พบว่ามีใครบางคนเข้าสู่ระบบเราได้แล้ว
หลักการของพวกมือดีนี้โดยส่วนมากจะใช้วิธี brust force เป็นหลัก นั้นก็คือการเดาไปเรื่อยๆจนกว่าจะจอนั้นเอง แต่ใช่ว่าจะสักแต่ว่าเดาอย่างเดียว โดยมาก password จะเอามาจากคำศัพท์ต่างๆ และ user ก็พวกชื่อคนหรือพวกชื่อ user ในระบบพวกชื่อเช่น bin, cyrus, nagios, postgres เป็นต้น
เอาละครับมาเข้าเรื่องกันเลยดีกว่า ในบทความนี้ผมจะมาแนะนำการป้องกันการโจมตีการเหล่า hacker ที่ใช้วิธีการ brust force ทั้งหลายด้วยการติดตั้ง DenyHosts ซึ่งโปรแกรมนี้นี้จะทำหน้าที่ในการ block IP ของผู้ไม่ประสงค์ดีเหล่านี้ โดยการเข้าไปอ่าน log ไฟล์ของ sshd แล้วก็ตรวจสอบว่า IP ใดมีความพยายามที่จะ login เข้าสู่ระบบแต่ไม่สำเร็จตามจำนวนครั้งที่เรากำหนด ก็จะ block IP นั้นด้วย TCP Wrapper หรือ เพิ่มข้อมูลเข้าไปที่ /etc/hosts.deny นั้นเอง
วิธีการติดตั้งจะขอพูดถึงแต่ Red Hat และ Centos โดยวิธีการติดตั้งและตั้งค่ามีดังต่อไปนี้
- ติดตั้ง rpmforge repo ก่อนเพื่อที่จะสามารถใช้ yum ในการ Install ได้
Red Hat Enterprise 5 64bit
[root@Ezylinux ~]# rpm -ivh http://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm
Red Hat Enterprise 5 32bit
[root@Ezylinux ~]# rpm -ivh http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
Red Hat Enterprise 6 64bit
[root@Ezylinux ~]# rpm -ivh http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
Red Hat Enterprise 6 32bit
[root@Ezylinux ~]# rpm -ivh http://apt.sw.be/redhat/el6/en/i386/rpmforge/RPMS/rpmforge-release-0.5.2-2.el6.rf.i686.rpm
- หลังจากติดตั้ง rpmforge ไปเรียบร้อยแล้ว ก็มาถึงขั้นตอนการติดตั้ง DenyHosts ใช้คำสั่ง
[root@Ezylinux ~]# yum -y install denyhosts
Loaded plugins: downloadonly, fastestmirror Loading mirror speeds from cached hostfile * addons: mirror.issp.co.th * atrpms: dl.atrpms.net * base: mirror.issp.co.th * extras: mirror.issp.co.th * rpmforge: fr2.rpmfind.net * updates: mirror1.ku.ac.th addons 100% |=========================| 951 B 00:00 atrpms 100% |=========================| 3.0 kB 00:00 atrpms/primary_db 100% |=========================| 1.1 MB 00:03 base 100% |=========================| 2.1 kB 00:00 extras 100% |=========================| 2.1 kB 00:00 rpmforge 100% |=========================| 1.1 kB 00:00 updates 100% |=========================| 951 B 00:00 updates/primary 100% |=========================| 622 kB 00:00 updates 1137/1137 Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package denyhosts.noarch 0:2.6-3.el5.rf set to be updated --> Finished Dependency Resolution Dependencies Resolved =================================================================================== Package Arch Version Repository Size =================================================================================== Installing: denyhosts noarch 2.6-3.el5.rf rpmforge 91 k Transaction Summary =================================================================================== Install 1 Package(s) Upgrade 0 Package(s) Total download size: 91 k Downloading Packages: denyhosts-2.6-3.el5.rf.no 100% |=========================| 91 kB 00:01 Running rpm_check_debug Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction Installing : denyhosts 1/1 Installed: denyhosts.noarch 0:2.6-3.el5.rf Complete!
- เมื่อ Install denyhosts เสร็จเรียบร้อยก็สามารถใช้งานได้เลยโดยไม่ต้องแก้ไขอะไร แต่ถ้าต้องการให้ระบบส่ง report ไปเมื่อมีการ Block ip เพิ่มหรือมีการเข้าสู่ระบบที่น่าสงสัย ก็แก้ไขไฟล์ configure denyhosts.cfg ด้วยคำสั่ง
[root@Ezylinux ~]# vi /etc/denyhosts/denyhosts.cfg
แก้ไขค่า ADMIN_EMAIL ให้เป็น email ที่เราต้องการให้ส่ง report แต่ถ้าไม่ต้องการรายงานก็ให้เว้นว่างเอาไว้ได้เลย
ตัวอย่างการตั้งค่าสำหรับ Red Hat Enterprise และ CentOS
SECURE_LOG = /var/log/secure HOSTS_DENY = /etc/hosts.deny PURGE_DENY = 7d BLOCK_SERVICE = sshd DENY_THRESHOLD_INVALID = 3 DENY_THRESHOLD_VALID = 5 DENY_THRESHOLD_ROOT = 2 DENY_THRESHOLD_RESTRICTED = 1 WORK_DIR = /usr/share/denyhosts/data SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES HOSTNAME_LOOKUP=YES LOCK_FILE = /var/lock/subsys/denyhosts ADMIN_EMAIL = [email protected] SMTP_HOST = localhost SMTP_PORT = 25 #SMTP_USERNAME=foo #SMTP_PASSWORD=bar SMTP_FROM = DenyHosts SMTP_SUBJECT = DenyHosts Report AGE_RESET_VALID=5d AGE_RESET_ROOT=25d AGE_RESET_RESTRICTED=25d AGE_RESET_INVALID=10d DAEMON_LOG = /var/log/denyhosts DAEMON_SLEEP = 30s DAEMON_PURGE = 1h
- หลังจากแก้ไขค่า configure เสร็จแล้วให้ใช้คำสั่ง chkconfig เพื่อให้ service DenyHosts start ในตอนบูตเครื่อง
[root@Ezylinux ~]# chkconfig denyhosts on - Start service DenyHosts ด้วยคำสั่ง
[root@Ezylinux ~]# /etc/init.d/denyhosts start
starting DenyHosts: /usr/bin/env python /usr/bin/denyhosts.py --daemon --config=/etc/denyhosts/denyhosts.cfg
เมื่อ start service DenyHosts เสร็จแล้วให้ลองไปตรวจสอบดูที่ไฟล์ /etc/hosts.deny ดูครับ จะมีการ block sshd ใน IP ต่างๆที่ได้มีการพยายามลอง login เข้าสู่ระบบเราซึ่งการเริ่มใช้งานครั้งแรก DenyHosts จะเข้าไปอ่านไฟล์ /var/log/secure ทั้งหมดและไล่ block ย้อนหลังให้ด้วย
ตัวอย่างการแจ้ง report ทางเมล์