Centos下防止ssh暴力破解密码的方法

参考网址:

方法一,

收集 /var/log/secure 里面的信息,若是某个IP 链接次数超过一定次数 ,则把此ip记录到/etc/hosts.deny里面。

通过crontab来执行,每分钟执行一次。

*/1 * * * /bin/bash /root/Denyhosts/Denyhosts.sh

 

#!/bin/bash
#Denyhosts SHELL SCRIPT

cat /var/log/secure|awk ‘/Failed/{print $(NF-3)}’|sort|uniq -c|awk ‘{print $2″=” $1;}’ >/root/Denyhosts/Denyhosts.txt
DEFINE=”5″
for i in `cat /root/Denyhosts/Denyhosts.txt`
do
IP=`echo $i|awk -F= ‘{print $1}’`
NUM=`echo $i|awk -F= ‘{print $2}’`
if [ $NUM -gt $DEFINE ]
then
ipExists=`grep $IP /etc/hosts.deny |grep -v grep |wc -l`
if [ $ipExists -lt 1 ]
then
echo “sshd:$IP” >> /etc/hosts.deny
fi
fi
done

方法二,

DenyHosts官方网站为:http://denyhosts.sourceforge.net

1. 安装

# tar -zxvf DenyHosts-2.6.tar.gz
# cd DenyHosts-2.6
# python setup.py install
默认是安装到/usr/share/denyhosts目录的。

2. 配置

# cd /usr/share/denyhosts/
# cp denyhosts.cfg-dist denyhosts.cfg
# vi denyhosts.cfg
PURGE_DENY = 50m #过多久后清除已阻止IP
HOSTS_DENY = /etc/hosts.deny #将阻止IP写入到hosts.deny
BLOCK_SERVICE = sshd #阻止服务名
DENY_THRESHOLD_INVALID = 1 #允许无效用户登录失败的次数
DENY_THRESHOLD_VALID = 10 #允许普通用户登录失败的次数
DENY_THRESHOLD_ROOT = 5 #允许root登录失败的次数
WORK_DIR = /usr/local/share/denyhosts/data #将deny的host或ip纪录到Work_dir中
DENY_THRESHOLD_RESTRICTED = 1 #设定 deny host 写入到该资料夹
LOCK_FILE = /var/lock/subsys/denyhosts #将DenyHOts启动的pid纪录到LOCK_FILE中,已确保服务正确启动,防止同时启动多个服务。
HOSTNAME_LOOKUP=NO #是否做域名反解
ADMIN_EMAIL = #设置管理员邮件地址
DAEMON_LOG = /var/log/denyhosts #自己的日志文件
DAEMON_PURGE = 10m #该项与PURGE_DENY 设置成一样,也是清除hosts.deniedssh 用户的时间。

3. 设置启动脚本

# cp daemon-control-dist daemon-control
# chown root daemon-control
# chmod 700 daemon-control

完了之后执行daemon-contron start就可以了。

# ./daemon-control start

如果要使DenyHosts每次重起后自动启动还需做如下设置:

# ln -s /usr/share/denyhosts/daemon-control /etc/init.d/denyhosts
# chkconfig –add denyhosts
# chkconfig denyhosts on

然后就可以启动了:

# service denyhosts start
可以看看/etc/hosts.deny内是否有禁止的IP,有的话说明已经成功了。

提高ssh安全性的方法

1. 修改sshd服务器的配置文件/etc/ssh/sshd_config,将部分参数参照如下修改,增强安全性。

系统缺省使用22号端口,将监听端口更改为其他数值(最好是1024以上的高端口,以免和其他常规服务端口冲突),这样可以增加入侵者探测系统是否运行了 sshd守护进程的难度。
Port 5555
对于在服务器上安装了多个网卡或配置多个IP地址的情况,设定sshd只在其中一个指定的接口地址监听,这样可以减少sshd的入口,降低入侵的可能性。
ListenAddress 192.168.0.1
如果允许用户使用root用户登录,那么黑客们可以针对root用户尝试暴力破解密码,给系统安全带来风险。
PermitRootLogin no
允许使用空密码系统就像不设防的堡垒,任何安全措施都是一句空话。
PermitEmptyPasswords no
只允许指定的某些用户通过ssh访问服务器,将ssh使用权限限定在最小的范围内。
AllowUsers sshuser1 sshuser2
同上面的AllowUsers类似,限定指定的用户组通过ssh访问服务器,二者对于限定访问服务器有相同的效果。
AllowGroups sshgroup
禁止使用版本1协议,因为其存在设计缺陷,很容易使密码被黑掉。
Protocol 2
关闭X11Forwarding,防止会话被劫持。
X11Forwarding no
sshd服务运行时每一个连接都要使用一大块可观的内存,这也是ssh存在拒绝服务攻击的原因。一台服务器除非存在许多管理员同时管理服务器,否则上面这 个连接数设置是够用了。
MaxStartups 5
注意:以上参数设置仅仅是一个示例,用户具体使用时应根据各自的环境做相应的更改。

2. 修改sshd服务器的配置文件/etc/ssh/sshd_config的读写权限,对所有非root用户设置只读权限,防止非授权用户修改sshd 服务的安全设置。

chmod 644 /etc/ssh/sshd_config

3. 设置TCP Wrappers。服务器默认接受所有的请求连接,这是非常危险的。使用TCP Wrappers可以阻止或允许应用服务仅对某些主机开放,给系统在增加一道安全屏障。这部分设置共涉计到两个文件:hosts.allow和 hosts.deny。
将那些明确允许的请求添加到/etc/hosts.allow中。如系统仅允许IP地址为192.168.0.15和10.0.0.11的主机使用 sshd服务,则添加如下内容:

sshd:192.168.0.15 10.0.0.11

将需要禁止使用的信息添加到/etc/hosts.deny中。如对除了在hosts.allow列表中明确允许使用sshd的用户外,所有其他用户都禁止使用sshd服务,则添加如下内容到hosts.deny文件中:
sshd:All
注意:系统对上述两个文件的判断顺序是先检查hosts.allow文件再查看hosts.deny文件,因此一个用户在hosts.allow允许使用网络资源,而同时在hosts.deny中禁止使用该网络资源,在这种情况下系统优先选择使用hosts.allow配置,允许用户使用该网络资源。

 

注:

更改port值后需要如下命令设置

semanage port -a -t ssh_port_t -p tcp 1998

firewall-cmd –zone=public –add-port=1998/tcp –permanent

firewall-cmd –reload

 

参考文章:https://blog.51cto.com/lorysun/1663567

Linux系统安装好后,默认会开启SSH服务以便远程配置。但使用默认端口22不安全,一般不建议使用默认端口,那就需要修改SSH默认端口。在RHEL7.0上修改和7.0以下类似,但要注意SELinux的修改。

SSH 为 Secure Shell,由IETF的网络工作小组(Network Working Group)所制定;SSH 是建立在应用层和传输层基础上的一种安全协议。SSH传输数据是加密的,可以有效防止传输过程被截取数据保障安全。SSH的数据是经过压缩的,所以可以加快传输的速度。

修改步骤:

1、查看是否已安装SSH软件包,#rpm -qa|grep ssh

2、检查服务是否开启,# systemctl status sshd.service

3、检查进程运行状态,# ps -ef |grep sshd

4、检查程序运行端口,# netstat -anpl |grep sshd

5、修改sshd配置文件,# vi /etc/ssh/sshd_config

取消“#Port 22”前面的#号,另起一行新增Port 6022(自定义端口),wq保存退出。

6、重启SSH服务,# systemctl restart sshd.service

7、开放防火墙端口:

添加端口,# firewall-cmd –zone=public –add-port=6022/tcp –permanent

重新加载,# firewall-cmd –reload

重启服务,# systemctl restart firewalld.service

查看端口,# firewall-cmd –zone=public –list-all

8、修改SELinux端口:

检查SELinux是否启用,# sestatus -v |grep SELinux

SELinux status:  enabled    #表示启用

检查semanage是否安装,# rpm -qa |grep policycoreutils-python

若未安装,请先安装工具包# yum install policycoreutils-python

查看当前selinux允许的端口,# semanage port -l |grep ssh

添加新端口,# semanage port -a -t ssh_port_t -p tcp 6022

检查是否添加成功,# semanage port -l |grep ssh

重启SSH服务,# systemctl restart sshd.service

注意:

SSH端口默认是22,如果要修改端口,可先增加一个端口,方法如上,使用新端口登录后再把22端口注释掉(注意同时修改防火墙# firewall-cmd –zone=public –remove-port=22/tcp –permanent,再重新加载# firewall-cmd –reload)。如果是增加端口号,需要先取消22端口的#号,再另起一行新增一个port端口。

若想删除已停用的端口可使用-d删除命令,# semanage port -d -t ssh_port_t -p tcp 6022

若想添加其他已定义的端口(如443)到SSH,可使用-m修改命令,# semanage port -m -t ssh_port_t -p tcp 443

直接使用-a命令添加443端口会报错:ValueError: Port tcp/443 already defined

一般停用默认端口后我们会想到从selinux中删除22端口,但在执行# semanage port -d -t ssh_port_t -p tcp 22命令后会报以下错误:ValueError: Port tcp/22 is defined in policy, cannot be deleted而无法删除。暂时无法实现。