LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 6477|回复: 21

彻底封杀sshd 的致命诱惑

[复制链接]
发表于 2006-12-20 12:02:46 | 显示全部楼层 |阅读模式
彻底封杀sshd 的致命诱惑

author:bobkey
date:06.12
mail:toqinbo at msn.com


本文用到的一些方法参照互联网上多个资料,感谢这些作者们,实施细节均已测试通过。




接到某客户电话,发现LinuxAS4执行系统指令 ls 失败,并出现奇怪提示。随即我在他授权下登陆机器检查,发现是被入侵。过程如下:
暴力破解成功通过ssh登陆安装 rootkit 安装攻击工具
普通的攻击过程,连日志也不清除,大摇大摆的来去,如入无人之地。存在弱口令的时候,尤其是Linux机器一上线瞬间被入侵!
本文在讨论通过通常的加固(参考公司的 Linux 加固文档)步骤后,是否还能进一步采取更严格措施的方法。
一、准备工作
1.1测试所需要的环境
安装了Redhat9的VMware5.0
Wb.exe         连接耗尽
DoSend.c         synflood攻击
Superscan3.exe  全端口扫描
Nmap4.0.exe         特殊方法扫描(包括syn半连接、空扫描、FIN扫描等)
Windows自带工具 Ping.exe 测试网络连通性
hydra-5.3-src.tar.gz 暴力破解SSH口令

1.2常规方法加固操作系统
可参考公司的《Linux加固方案》,此时操作系统的网络服务只剩下 ssh ,本地加固了口令档案,权限、profile的设置等,这里为了如果为了排除远程溢出的风险,可先升级 sshd 到最新版本,我自己测试就省略了这一步。
1.3 口令策略的加固
编辑口令设置文件,vi /etc/login.defs,找到如下语句:
PASS_MAX_DAYS 99999  把数字改成30,表示一个月强制用户更改一次口令
PASS_MIN_DAYS 0        把数字改成7,表示至少一个星期才能改一次密码
PASS_MIN_LEN    5      更改数字8 ,表示口令长度最短为8
PASS_WARN_AGE 7      把数字改成3,表示密码更改前3天提醒用户
以上配置是对新增用户的定义,如果要修改现存的用户密码配置可以用 chage 命令,它的基本用法是:
chage [-m mindays] [-M maxdays] [-d lastday] [-I inactive]
             [-E expiredate] [-W warndays] user
对已经存在的用户可以用如下语句执行:
chage -m 7 -M 60 -W 3 root
更严厉的设置在 /etc/default/useradd
INACTIVE=-1  把数字更改为15,则表示,当需要更改口令而又没有更改时,15日后该用户被禁用
EXPIRE=     缺省没有,这里对所有用户停用的时间设置
查看配置好的结果
[root@bobkey]# chage -l root
Minimum:        7
Maximum:        60
Warning:        3
Inactive:       -1
Last Change:            Dec 05, 2006
Password Expires:       Feb 03, 2007
Password Inactive:      Never
Account Expires:        Never

设置完毕可以运行 chattr +i  /etc/shadow 把文件锁定,避免删除或修改操作
二、测试 ssh 暴露在公网的风险
2.1扫描获取到的信息
结果:危险!可成功获取。

图一:superscan的端口扫描截图

图二:nmap的全连接扫描截图
2.2 被synflood之后的反应
结果:危险!系统被攻击,系统资源急剧下降。

图三:攻击之后的系统网络连接状态截图

图四:攻击之前的系统资源截图


图五:攻击之后的系统资源截图
2.3 被口令穷举之后的效果
结果:危险!可猜测系统帐号。

图六:利用ssh_scan工具在10分钟扫描一个B class截图

图七:系统弱口令被破解截图

三、采取的应对措施
通过以上的攻击测试发现,尽管做了通常步骤的加固,但风险依然存在,表现在可被扫描、DOS攻击、远程暴力猜解口令。当然也许还有未知的溢出风险。
        怎么防范?在本次例子中,被加固的对象是抓包服务器,没有特殊的应用,所以对于加固后给生产带来的风险相对不大,如果是其他机器切不可盲目照抄,否则后果自负。
3.1改变工作模式
SSHD缺省是stand-alone工作模式,改变为有Xinetd调用可降低被DDOS的风险,。xinetd能同时监听多个指定的端口,在接受用户请求时,根据用户请求的端口不同,启动不同的网络服务进程来处理这些用户请求。


图八:Xinetd工作原理
        当然,这是理想做法,但不能改变根本问题,我并没去操作它。要提醒的是对于频繁访问的服务如:www mail,不要用xinetd去启动,这样反而降低效率。
3.2 改变缺省端口
SSHD的默认端口就是 22 ,地球人都知道,通常黑客在没有准确目标的情况下要寻找 Linux机器的最好方法就是扫描所有开放了 22 端口的机器,然后放在一个列表里,一个个去探求它的漏洞。
        比如 nmap4 的新功能 nmap -v -iR 10000 -P0 -p 22 可随机在10000个IP里去寻找开放了 22 端口的机器。当然也可以有目标的把日本或者其他国家的ip段添上再扫描。
        通常是按照服务对应的常规端口去扫描,除非用全端口1-65535,但除非是针对性的对一台机器扫描,否则这样效率不高。
        把默认端口改变成60022的步骤如下:
vi /etc/ssh/sshd_config
找到#Port 22,标识默认使用22端口,如果需要更改为8888则去掉前面的 #  注释符号,修改为:Port 60022
然后重启服务进程
/etc/init.d/sshd restart
或者
kill -HUP `cat /var/run/sshd.pid`
3.3 sshd_config其他安全选项
把 #PermitRootLogin yes 改为 PermitRootLogin no 可防止 root 远程登陆
把 #Protocol 1,2  改 Protocol 2 ,不用 SSH protocol 1 协议,只用 2
当然还有一些选项,视需要而定,比如:Banner的伪造、登陆失败后的的锁定时间、是否允许空口令帐号登陆、服务器密钥的位数等、允许登陆的用户和IP等。
3.4 TCP Wrappers 列出白名单
TCP  Wrappers的防护思想和防火墙原则一样,除非允许,否则默认是禁止的,在 Redhat 所有发行版上默认是安装了这个程序的,可利用此程序来允许可连接的客户端机器。先在 /etc/hosts.deny中添加禁止来自任何地方对所有服务的访问,然后在 /etc/hosts.allow 中添加允许的机器ip或者域名
Vi /etc/hosts.deny, ALL:ALL
Vi /etc/hosts.allow
sshd:172.168.20.0/255.255.255.0, 192.168.20.163


3.4 内核参数调整
sysctl -w net.ipv4.conf.default.accept_source_route=0
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
#sysctl -w net.ipv4.icmp_echo_ignore_all=1
sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1
sysctl -w net.ipv4.ip_conntrack_max=65535
#
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_syn_retries=1
sysctl -w net.ipv4.tcp_fin_timeout=5
sysctl -w net.ipv4.tcp_synack_retries=1
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.route.gc_timeout=100
sysctl -w net.ipv4.tcp_keepalive_time=500
sysctl -w net.ipv4.tcp_max_syn_backlog=10000
3.5 Iptables 最后的铠甲
如果前面的都已经设置完毕,到这里其实相对较安全了,我都觉得不是很有必要再用iptables来做黑白名单之类的操作了,就好像穿了一件铠甲,里面又弄件刀枪不入的宝衣。显得没这么必要,但谁知道呢?这年头假货多,万一被弄穿一层也还有一层,多弄层防护也不是坏事,但自己要记住设置的地方,免得和其他设置有冲突,适得其反。
#1.初始化防火墙的表和链条,并设置所有链条的默认策略为禁止任何包通过
iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
#2.ICMP是扫描器探测机器存活的手段之一,把它关闭可防止,视需要而定

#iptables -A INPUT -p icmp -i eth0 -m state --state NEW,ESTABLISHED -j ACCEPT

#3.防止端口探测存活技术的规则
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
iptables -A INPUT  -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

#4.对唯一开放的 60022 sshd端口要限制连接数,这里选项是每秒只允许 1个连接,防止被DOS
iptables -A INPUT  -m limit --limit 1/second -p tcp --tcp-flags ALL SYN --dport 60022  -j ACCEPT
iptables -A INPUT -m limit --limit 1/second -p tcp --tcp-flags ALL FIN --dport 60022 -j ACCEPT
iptables -A INPUT -m limit --limit 1/second -p tcp --tcp-flags ALL RST --dport 60022 -j ACCEPT
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -p tcp --dport 60022 -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#5.到这里防火墙设置差不多结束了,下面有更严格的,把允许登陆的IP和其MAC绑定在一起,可替换第4段规则,但灵活性就差些,也可视情况而定
iptables –A INPUT –p tcp --dport 60022 –m limit --limit 1/second --limit-burst 20 –j ACCEPT
iptables –A FORWARD –s 192.168.1.23 –m mac –mac-source 00:e0:4c:3d:5e:4f –j ACCEPT

图九:3个request包对应1个reply   启用ICMP防护规则效果截图

四、自动化阻断密码暴力破解者IP
首先系统已经加固,验证记录在/etc/syslog.conf中设置了/var/log/secure中可查到。系统设置了不允许用root远程登陆,如果黑客还用root来猜解密码,势必留下 Failed password for invalid user root from 的字样, 或者是其他不存在的用户登陆痕迹。

图九:/var/log/secure中错误登陆截图
那么我们用awk和sed等工具组合后筛选出恶意ip,然后把它加入IPTABLES的阻断规则中,其实网上已经有很多人用这样的思路做出了一些程序,比如防止DDOS,防止扫描等,手段都是一样的。
IP怎么加呢?
首先,取得恶意ip
Blickip=`cat /var/log/secure |grep sshd|grep Failed |awk '{ print $11 }'|uniq|sort`
然后,把恶意ip增加的iptables的阻断规则里
for i in $blackip;do
        iptables -A INPUT -s $i -j DROP
done
这样就可以了,但,有个问题是这样会重复增加一样的ip到规则里,造成防火墙臃肿,效率降低,特别黑客如果用多台主机暴力破解,或者用代理主机时。
对此我有两个想法:
1.比较两次的ip,只增加新增的IP到规则 ,这个编写上要麻烦点
2.让防火墙每5分钟重运行一次,刷掉所有现存的规则,重载所有block的ip,这样就不会重复
如果让程序进程实时监控日志变化然后再加规则?
While ture;
Do
                Command
                Sleep 300
done
这样有点浪费资源,而且万一程序宕掉了,那么就失效了,所以还是老老实实用crontab来做,即计划任务,让它每5分钟自动执行一次。
Crontab -l
*/5 * * * * root /etc/iptables.sh >; /dev/null 2>;&1
如果非要挑刺,黑客在5分钟内就破解了口令,然后迅速登陆系统,再把规则修改掉怎么办?系统口令如果在8位以上,并且复杂度高,那是不可能的,除非管理员非要弄个弱密码,123456之类,那就没办法了,我只能扛把火枪去机房站岗,谁来我就顺着网线崩了他。

还有两个问题需要考虑:
1.防火墙频繁重启有什么问题?
我测试过运行完整的程序时间如下,大概2秒多,当然如果日志文件逐步增大,那么运行时间会延长,时间主要话费在统计log的ip和用新增ip比较现存的黑名单地址上,这里其实也可以用其他方法来改进:
#time { ./iptns.sh ; }
real    0m2.963s
user    0m1.740s
sys     0m0.510s
2./var/log/secure 是会轮循到另一个数字递增的文件,比如: secure.1 secure.2,怎么自动跟着取得它的变量?
虽然可以用编程的方法来处理,先得到secure后最大的数字,然后用它来处理,这样又怕管理员擅自改动,用 lsof 方法更简单,哪个文件是被syslogd调用,那么当前记录的也就是它了:
secure_log=`lsof /var/log/secure* |grep syslogd|awk '{ print $9 }'`
3.
五、第三方工具
这里不着重推荐,因为我并没去测试它们,其实原理和以上介绍一样
5.1 BlockSSHD
官方链接: https://sourceforge.net/project/showfiles.php?group_id=163753
下面是官方的简介
BlockSSHD protects computers from SSH brute force attacks by dynamically blocking IP addresses by adding iptables rules.
BlockSSHD 是用 perl 写的程序,目前是1.0版。安装只有两个步骤,把程序放入/usr/sbin/,并初始化在/etc/init.d中可自启动,通过日志增加恶意IP到iptables的规则中
5.2 DenyHOSTS
官方链接: http://denyhosts.sourceforge.net/
下面是官方的简介
What is DenyHosts?
DenyHosts is a script intended to be run by Linux system administrators to help thwart SSH server attacks (also known as dictionary based attacks and brute force attacks).
If you've ever looked at your ssh log (/var/log/secure on Redhat, /var/log/auth.log on Mandrake, etc...) you may be alarmed to see how many hackers attempted to gain access to your server. Hopefully, none of them were successful (but then again, how would you know?). Wouldn't it be better to automatically prevent that attacker from continuing to gain entry into your system?
DenyHosts是用python写的程序,目前是2.5版,通过SSH验证日志筛选出恶意IP放到 /etc/hosts.deny中达到防范的目的

六、制作加固包的想法
这个想法其实上次的经验总结我就提到过,还没去制作。现在想想,我还懒得去改目标文件了,直接替换它不是更爽?当然这样也有弊端,除非你很了解系统的作用,才能量身定做,而且在已有的生产环境中万不可这样操作,否则把别人已有的配置替换了,罪过就大了。
对于这一次的20台同样安装的机器,是可以用程序批量加固,因为加固步骤是一样的,又是没有上线的机器,风险不大,那么可以先用一台做样本,测试无误后,把所有文件打包,上传到被加固的机器里,强行覆盖即可,同时把增加的新文件按照目录所在文字自动解压。写到这里我突然想起,为了保险起见可以把原有配置先备份一次,吔!
比如 hardenLinux.tar 是制作好的包,里面已经包含了目录的路径和文件,用如下命令执行即可:
[root@rh9bk test]# tar tvf hardenLinux.tar
drwxr-xr-x root/root         0 2006-12-04 12:16:54 etc/
-rw-r--r-- root/root        84 2006-12-04 12:18:03 etc/bobkey.sh
[root@rh9bk test]# tar xvf hardenLinux.tar -C /
etc/
etc/bobkey.sh
七、测试效果
7.1.自动安装测试
包括开启自启动、crond自动运行、修改若干配置文件等,测试成功。
7.2.程序运行后效果测试
包括NMAP各参数扫描、superscan全端口扫描、wb连接耗尽攻击、synflood攻击、ping 测试、hydra口令暴力猜解测试、正常连接测试、登陆系统后往外连接测试,测试成功。

nmap.exe -sS -O 192.168.0.100
扫描结果如下,看不到系统类型和端口:
Warning:  OS detection will be MUCH less reliable because we did not find at lea
st 1 open and 1 closed TCP port
All 1672 scanned ports on 192.168.0.100 are: filtered
MAC Address: 00:0C:29:06:CE:31 (VMware)
Too many fingerprints match this host to give specific OS details
用其他参数再扫描,同样看不到有效信息
nmap.exe –sN -O
nmap.exe –sX -O
nmap.exe -sT -O
nmap.exe –sF –O
nmap.exe –sO –O
nmap.exe –sA –O

指定端口用arp扫描参数再次扫描,通过对端口开放后的TCP指纹校验,这次能发现开放端口和系统类型:
nmap.exe -v -P0 -O -p 60022 192.168.0.100
Starting Nmap 4.00 ( http://www.insecure.org/nmap ) at 2006-12-10 16:11 中国标准
时间
Initiating ARP Ping Scan against 192.168.0.100 [1 port] at 16:11
The ARP Ping Scan took 1.59s to scan 1 total hosts.
DNS resolution of 1 IPs took 13.04s. Mode: Async [#: 2, OK: 0, NX: 0, DR: 1, SF:
0, TR: 4, CN: 0]
Initiating SYN Stealth Scan against 192.168.0.100 [1 port] at 16:11
Discovered open port 60022/tcp on 192.168.0.100
The SYN Stealth Scan took 0.92s to scan 1 total ports.
Warning:  OS detection will be MUCH less reliable because we did not find at lea
st 1 open and 1 closed TCP port
For OSScan assuming port 60022 is open, 43061 is closed, and neither are firewal
led
Insufficient responses for TCP sequencing (1), OS detection may be less accurate
Host 192.168.0.100 appears to be up ... good.
Interesting ports on 192.168.0.100:
PORT      STATE SERVICE
60022/tcp open  unknown
MAC Address: 00:0C:29:06:CE:31 (VMware)
Device type: firewall|broadband router|general purpose|media device
Running: Fortinet embedded, Level One embedded, Linux 2.4.X|2.6.X, Pace embedded
, Panasonic embedded
Too many fingerprints match this host to give specific OS details
TCP/IP fingerprint:
SInfo(V=4.00%P=i686-pc-windows-windows%D=12/10%Tm=457BC147%O=60022%C=-1%M=000C29
)
T1(Resp=Y%DF=Y%W=16A0%ACK=S++%Flags=AS%Ops=MNNTNW)
T2(Resp=N)
T3(Resp=N)
T4(Resp=N)
T5(Resp=N)
T6(Resp=N)
T7(Resp=N)
PU(Resp=N)

Nmap finished: 1 IP address (1 host up) scanned in 19.738 seconds
               Raw packets sent: 23 (1878B) | Rcvd: 4 (206B)

全端口扫描用superscan3测试没发现,nmap.exe -p 1-65535 192.168.0.100,扫描时间24分钟,也没发现开放端口,why?因为被INPUT链条过滤了,如果缩小范围比如 60000-60050,那是可以的,但这样花费的代价更大,所以对于端口的隐藏再加上防火墙的对于扫描探测规则,是可以成功实现的。

ICMP测试
Ping 192.168.0.100 –t
可以ping通,但会最断
Wb连接耗尽测试,可以抵御大部分攻击,其实这里也是可以改进的,用netstat查看某IP发起连接数,一旦超过一定数目,比如10个,就判断为攻击,再把其IP防止防火墙黑名单。
25分钟攻击完512条连接数,被攻击的Linux用netstat查看有34个TIME_WAIT 和 FIN_WAIT2
7分钟攻击完512,被攻击的Linux用netstat查看有197个TIME_WAIT 和 FIN_WAIT2

八、程序附件和说明
8.1程序附件

[root@rh9bk nu]# tar tvf hardenAS4.tar
-rwx--x--x root/root      2812 2006-12-10 14:26:47 hardenAS4.sh
drwxr-xr-x root/root         0 2006-12-10 14:18:54 iptns/
-rwx--x--x root/root      4672 2006-12-10 13:14:01 iptns/iptns.sh
-rw-r--r-- root/root        10 2006-12-10 13:03:18 iptns/wip_list
-rw-r--r-- root/root        28 2006-12-10 06:55:05 iptns/bip_list
-rw-r--r-- root/root       308 2006-12-10 13:10:20 iptns/allbip
-rw-r--r-- root/root        44 2006-12-10 13:10:20 iptns/Failed_count_ip
8.2 hardenAS4.sh
#!/bin/sh
#author:bobkey
#mail:qinbo@nsfocus.com
#date:06.12.01
#for gd.chinamobile cmnet harden Linux AS4

#
if [ -e install.log ];
then
        clear
        echo  -e "\n\n\t\t\talready hardened OS & installed program! QUITTING!!!\n\n" &&exit 0
else
        clear
        echo -e "\n\n\t\t\tbegin install...\n\n" && echo "`date` first install" > install.log
fi
#

sshdconf="/etc/ssh/sshd_config"
loginconf="/etc/login.defs"
crond="/var/spool/cron/root"

#del sys default accounts
userdel lp
groupdel lp
userdel sync
userdel shutdown
userdel halt
userdel news
userdel uucp
userdel operator
userdel games
userdel gopher
echo "step 1. delete sys default accounts .......................[  OK  ]"
#
chattr +a /var/log/messages
chattr +i /var/log/messages.*
echo "step 2. change /var/log/messages* attribute value .........[  OK  ]"
#
chmod +t /tmp
chmod 644 /var/log/wtmp
chmod 644 /var/run/utmp
chmod -R 700 /etc/rc.d/init.d/*
echo "step 3. change /tmp wtmp utmp init.d/* attribute value ....[  OK  ]"
#
chmod 000 /etc/rc.d/init.d/netfs
chmod 000 /etc/rc.d/init.d/portmap
chmod 000 /etc/rc.d/init.d/sendmail
chmod 000 /etc/rc.d/init.d/ypbind
echo "step 4. disable netfs portmap sendmail ypbind .............[  OK  ]"
#

cp -p /etc/profile /etc/profile.bk
chmod 000 /etc/profile.bk
grep "^TMOUT" /etc/profile || sed -i 's/HISTSIZE=1000/HISTSIZE=1000\nTMOUT=300/g' /etc/profile
grep "^umask" /etc/profile||echo "umask 077" >>/etc/profile

echo "step 5. set umask & TMOUT in /etc/porfile .................[  OK  ]"

test -e /etc/login.defs.bk||cp -p $loginconf /etc/login.defs.bk && \
echo "step 6. backup /etc/login.defs to /etc/login.defs.bk ......[  OK  ]"

sed -i 's/^PASS/#PASS/g' $loginconf && \
echo -e "#by nsfocus's bobkey change 06.12.10\nPASS_MAX_DAYS\t60\nPASS_MIN_DAYS\t7\nPASS_MIN_LEN\t8\nPASS_WARN_AGE\t3" >>$loginconf && \

echo "step 7. reconfig /etc/login.defs ..........................[  OK  ]"



test -e /etc/ssh/sshd_config.bk||cp -p $sshdconf /etc/ssh/sshd_config.bk && \

echo "step 8. backup sshd_config to /etc/ssh/sshd_config.bk .....[  OK  ]"

sed -i 's/^#Port 22/Port 60022/g' $sshdconf && \
/etc/init.d/sshd restart && \

echo "step 9. reconfig /etc/ssh/sshd_config .....................[  OK  ]"


test -e iptns.tar >/dev/null&& tar xvf iptns.tar -C /etc && \
chown root:root /etc/iptns && \
chmod 600 /etc/iptns && \
chmod 700 /etc/iptns/* && \
echo "step 10. install iptns.sh to /etc/iptns/iptns.sh ..........[  OK  ]"

grep iptns $crond >/dev/null||echo "*/10 * * * * /etc/iptns/iptns.sh" >>$crond && \
chmod 600 $crond && \
/etc/init.d/crond restart
echo "step 11. set crontab auto run .............................[  OK  ] "
grep iptns /etc/rc.d/rc.local >/dev/null||echo "/etc/iptns/iptns.sh" >>/etc/rc.d/rc.local  && \
echo "step 12. set program to system startup auto run ...........[  OK  ]"
echo -e "\n\n\tALL DONE! TOTAL 12 STEPS\n\n"
8.3 iptns.sh
#!/bin/sh
#name:iptns.sh for chinamobile's cmnet LinuxAS4 machines
#author:bobkey
#mail:qinbo@nsfocus.com
#date:06.12.01


if [ "$1" = "-stop" ]
then
        echo -e "\n\n\tStopping the firewall...\n\n"
        /etc/rc.d/init.d/iptables restart
        exit 0
elif [ "$1" = "-allow" ]
then
        echo -e "\n\n\tallow all packets transfers...\n\n"
        iptables -F
        iptables -P INPUT ACCEPT
        iptables -P OUTPUT ACCEPT
        iptables -P FORWARD ACCEPT
        iptables -L -n
        exit 0
else
        echo -e "\tUsage:"
        echo -e "\t1. ./`basename $0` -stop   # stop the firewall,resume default."
        echo -e "\t2. ./`basename $0` -allow  # allow packet transfers on all chain. "
        echo -e "\t3. ./`basename $0`         # go run . "
        echo -e "\n\tFiles description:"
        echo -e "\t1. `basename $0`  is main programe, it's me"
        echo -e "\t2. wip_list  is white list"
        echo -e "\t3. bip_list  is black list"
        echo -e "\t4. Failed_count_ip  is from secure log statistic"
        echo -e "\t5. allbip  is temp file,recode all block ip address"
fi

echo -e "\n\t\t\t the iptables running now...  \033[3;31m by bobkey config \033[0m \n"
echo -e " \t\t\t\t \033[1;32m mail: qinbo@nsfocus.com \033[m \n"

#define programme conf file
runpath=`dirname $0`
wip="$runpath/wip_list"
bip="$runpath/bip_list"
secure_log=`lsof /var/log/secure* |grep syslogd|awk '{ print $9 }'`
allbip="$runpath/allbip"
Failed_count_ip="$runpath/Failed_count_ip"
test -s $wip || touch $wip
test -s $bip || touch $bip



#FUNCTION statistic Failed ip from secrue log
function failedip_statistic ()
{
#for REDHAT AS4 secure file format
#cat $secure_log |grep sshd|grep Failed |cut -d: -f7|awk '{ print $1 }' > $allbip
#cat $secure_log |grep sshd|grep Invalid|cut -d: -f7 >> $allbip
#for REDHAT 9 secure file format
cat $secure_log |grep sshd|grep Failed |awk '{ print $11 }' > $allbip
sort $allbip|uniq -c >$Failed_count_ip
#cat /dev/null > $bip
while read count ipaddr;do
        if [ $count -ge 5 ];then
                echo "add  ipaddress $ipaddr to block rules!"
                #iptables -A INPUT -s $ipaddr -j DROP
                grep $ipaddr $bip >/dev/null||echo $ipaddr >> $bip
                #echo $ipaddr >>$bip
        fi
done < $Failed_count_ip
}

#FUNCTION add block ip to iptables accept rules

function add_bip_to_block ()
{
        test -s $bip && for i in `cat $bip`;
        do
                iptables -A INPUT -s $i -p all -j DROP

        done
}

#FUNCTION add manager ip to iptables grant rules
function add_wip_to_grant ()

{
        test -s $wip && for i in `cat $wip`;
        do
                iptables -A INPUT -s $i -j ACCEPT
        done
}

#FUNCTION set kernel net parameter
function set_kernel ()
{
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
     echo 1 > $f
done

sysctl -w net.ipv4.conf.default.accept_source_route=0
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1   
#sysctl -w net.ipv4.icmp_echo_ignore_all=1   
sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1
sysctl -w net.ipv4.ip_conntrack_max=65535
#
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_syn_retries=1
sysctl -w net.ipv4.tcp_fin_timeout=5
sysctl -w net.ipv4.tcp_synack_retries=1
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.route.gc_timeout=100
sysctl -w net.ipv4.tcp_keepalive_time=500
sysctl -w net.ipv4.tcp_max_syn_backlog=10000
}

#define fw default policy
iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# run funcitons
failedip_statistic
set_kernel
add_wip_to_grant
add_bip_to_block


iptables -A INPUT -i lo  -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT


iptables -A INPUT -p icmp -m limit --limit 6/m   --limit-burst 5 -j ACCEPT
iptables -A INPUT -p icmp -m limit --limit 6/m   --limit-burst 5 -j ACCEPT
#iptables -A INPUT -p icmp -m length --length 48:256 -j ACCEPT


#kill all portscan detection
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP


#limit the connect number
iptables -A INPUT  -m limit --limit 1/second -p tcp --tcp-flags ALL SYN --dport 60022  -j ACCEPT
iptables -A INPUT -m limit --limit 1/second -p tcp --tcp-flags ALL FIN --dport 60022 -j ACCEPT
iptables -A INPUT -m limit --limit 1/second -p tcp --tcp-flags ALL RST --dport 60022 -j ACCEPT
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -p tcp --dport 60022 -j ACCEPT

date >>/tmp/ipt_run_state
8.4安装界面

图十:运行hardenAS4.sh加固和安装截图


图十一:运行Iptns.sh截图
8.5安装说明
hardenAS4.sh:
为初次安装运行,会自动安装加固(参考Linux加固方案步骤)和安装防火墙程序。删除系统默认帐号,禁用某些网络服务、添加安全选项到/etc/profile、修改某些文件和目录权限、添加crond任务(每10分钟运行一次防火墙程序)和开机运行语句,并且自动修改和备份配置文件,包括/etc/login.defs /etc/ssh/sshd_config。
为了避免出错,此程序只能运行一次,当然非要多运行几次也不会出太大问题,已经做了判断机制。

Iptns.tar程序包说明:
Iptns.sh :为程序主体
运行参数 –stop会恢复iptables和内核网络参数的默认状态
运行参数 –allow 会把所有防火墙链路开放
不加参数,则为启动程序运行

Wip_list:为管理主机的白名单IP地址或网段,可自行增加
Bip_list:为黑名单IP地址或网段,可自行增加
Failed_bip_count:为统计恶意ip和数量的文本,由程序运行产生,不用去修改
Allbip:为所有恶意IP的保存文本,由程序运行产生,不要去修改
安装步骤:
1.        运行sshd –p 10000,再通过sshd的10000端口登陆连接,避免更改端口造成连接中断。
2.        上传install.sh 和nsipt.tar到目标主机的某目录;
3.        执行 sh install.sh;
4.        根据需要增加白名单地址到 /etc/iptns/wip_list,格式为主机 1.1.1.1或网段1.1.1.0/24,如果不确定可以不增加;
5.        黑名单地址为猜错密码5次以上的ip,会自动添加到阻断规则里 ;
 楼主| 发表于 2006-12-20 12:32:47 | 显示全部楼层
附件是程序,还有pdf带图版的分卷压缩,可下载。
欢迎高手能测试并指点。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2006-12-20 13:39:24 | 显示全部楼层
这是精品,收藏了。
回复 支持 反对

使用道具 举报

发表于 2006-12-20 14:32:28 | 显示全部楼层
好家伙,绿盟的,

我认为用至少1024位秘要,至少每3个月换一次,不用密码方式登录,即ssh2,可以root登录,
linux漏洞太多,暴露在网上的主机要经常update,ssh版本要最新,ssh加密方式尽量不选md5,
ssh 连接速度要限制,不过这个比较麻烦
linux下,n 次失败的连接后 要拒掉tcp 更麻烦, 但我觉得ms的方案不错,方便的多。就是n 次失败的连接后,此用户禁用多少分钟。

至于防ddos 什么系统都达不到要求,就省了8,我有防火墙,也必须有。有了防火墙,就可以
把主机受攻击消耗的资源转嫁给防火墙。你们绿盟就卖防火墙,你不会不道防火墙的好处8

当然该了端口也会好不少,但是如果不是特别重要的主机,我还是喜欢不改,让人家攻击我试验,看我的系统,和我的方法抵抗力如何 ^_^
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-20 14:43:35 | 显示全部楼层
Post by aleng

我认为用至少1024位秘要,至少每3个月换一次,不用密码方式登录,即ssh2,可以root登录linux下,n 次失败的连接后 要拒掉tcp 更麻烦, 但我觉得ms的方案不错,方便的多。就是n 次失败的连接后,此用户禁用多少分钟。
至于防ddos 什么系统都达不到要求,就省了8,我有防火墙,也必须有。有了防火墙,就可以
把主机受攻击消耗的资源转嫁给防火墙。你们绿盟就卖防火墙,你不会不道防火墙的好处8

当然该了端口也会好不少,但是如果不是特别重要的主机,我还是喜欢不改,让人家攻击我试验,看我的系统,和我的方法抵抗力如何 ^_^


不错的回复,谢谢。我也怕管理员输错口令,所以要统计输错5次以上才禁止他的IP,而且为了保险可以把其IP添加到白名单。

主机的防DOS设置还是有必要的,我已经进行过测试,效果还是不错。当然对付大型的就没辙了。

绿盟没有防火墙,有黑洞 。。。
回复 支持 反对

使用道具 举报

发表于 2006-12-20 16:16:46 | 显示全部楼层
相当好。精了
回复 支持 反对

使用道具 举报

发表于 2006-12-20 17:07:37 | 显示全部楼层
LoginGraceTime 非常重要,设置长点就很安全了。如果再加上自动屏蔽IP,暴力破解基本没威胁了。
PermitRootLogin 一定要NO,必要时用低级用户登陆然后SU ROOT
回复 支持 反对

使用道具 举报

发表于 2006-12-20 17:17:14 | 显示全部楼层
有笔记本的话最方便,在IPTABLES里加个MAC地址的SSH登陆限制,端口不必改,我想这个最安全,来扫描的人无法判断是权限不够还是SSH服务没开
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-20 17:20:57 | 显示全部楼层
谢谢版主加精。

我这里有几个问题要改经,需要请教大家:
1.对于/var/log/secure会轮循递增变化,我目前采用lsof获取文件,这样有什么弊端,能否更好改进?
2.iptables 10分钟自动重启,初始化链条,并附加规则,要浪费2秒多,有什么好方法只附加黑名单,而又不重复,这里绝对要改进
3.如果用while循环+sleep 6000代替crond是否效果好些?
4.后续处理最好再加上mail报警等更多智能化阻击动作。

……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-20 17:21:06 | 显示全部楼层
甚至可以引用蜜罐的技术,比如入侵痕迹的记录,报警
以前我曾经部署过一次蜜罐,了解其中的机制
目前已经有比较成熟的工具 snort swatch bash补丁 sebek 等可实现,这个想法不错,谁有兴趣可以讨论
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表