码迷,mamicode.com
首页 > 其他好文 > 详细

SSH防止暴力破解--fail2ban

时间:2016-06-07 20:41:18      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:

一、ssh密钥对无交互登录

实战1:通过密钥进行sshd服务认证

服务端:linl_S    IP:10.0.0.15
客户端:lin_C    IP:10.0.0.16
 
1)在客户端生成密钥对
命令:ssh-keygen
 1 [root@linl_C ~]# ssh-keygen 
 2 Generating public/private rsa key pair.
 3 Enter file in which to save the key (/root/.ssh/id_rsa): 
 4 Enter passphrase (empty for no passphrase): 
 5 Enter same passphrase again: 
 6 Your identification has been saved in /root/.ssh/id_rsa.        #$HOME/.ssh/id_rsa私钥
 7 Your public key has been saved in /root/.ssh/id_rsa.pub.        #$HOME/.ssh/id_rsa.pub公钥
 8 The key fingerprint is:
 9 ca:d7:72:c0:ee:5d:61:cc:ea:e4:06:c4:b4:a5:7f:cf root@linl_C
10 The keys randomart image is:
11 +--[ RSA 2048]----+
12 |                 |
13 |        . .      |
14 |       o +       |
15 |       .=  o     |
16 |       .S.  =    |
17 |     . o.o.o..   |
18 |      o +.=..o   |
19 |       o B..  E  |
20 |        ..+      |
21 +-----------------+
22 [root@linl_C ~]# ls .ssh/
23 id_rsa  id_rsa.pub
2)发布公钥到服务端
使用ssh-copy-id 命令将客户端生成的公钥发布到远程服务器,并使用 -i 参数指定本地公钥的存放位置。
命令格式:ssh-copy-id -i [公钥] [远程主机用户名]@[远程服务器主机名或IP地址] 
1 [root@linl_C ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub lin_S        #如果用root账号,则主机可以省略用户名
2 root@lin_ss password: 
3 Now try logging into the machine, with "ssh ‘lin_S‘", and check in:
4   .ssh/authorized_keys
5 to make sure we havent added extra keys that you werent expecting.
3)测试
1 [root@linl_C ~]# ssh lin_S                  #无交互登录
2 Last login: Fri May 20 11:00:50 2016 from 10.0.0.16
3 [root@linl_S ~]# ls $HOME/.ssh/             #在lin_S上$HOME/.ssh/下查看拷贝过来的文件,会将id_rsa.pub重命名为authorized_keys
4 authorized_keys  known_hosts
4)使用其他帐号登录,需要重新上传密钥
 1 [root@linl_C ~]# ssh-copy-id -i .ssh/id_rsa.pub linypwb@lin_S
 2 linypwb@lin_ss password: 
 3 Now try logging into the machine, with "ssh ‘linypwb@lin_S‘", and check in:
 4   .ssh/authorized_keys
 5 to make sure we havent added extra keys that you werent expecting.
 6 [root@linl_C ~]# ssh linypwb@lin_S
 7 Last login: Fri May 20 11:30:07 2016 from lin_c
 8 [linypwb@linl_S ~]$ 
 9 [linypwb@linl_S ~]$ ls .ssh/
10 authorized_keys
5)只使用密钥对验证
1 [root@linl_S ~]# vi /etc/ssh/sshd_config 
2 #PasswordAuthentication yes              #将认证设置为no
3 PasswordAuthentication no
4 [root@linl_S ~]# service sshd restart    #重启sshd服务
5 Stopping sshd:                                             [  OK  ]
6 Starting sshd:                                             [  OK  ]
 

二、sshd服务防止暴力破解—fail2ban

实战2:sshd服务防止暴力破解

方法1:提高密码安全等级
             长度:8位以上,最好14位以上
             复杂性:大小写字母,数字,特殊符号
方法2:修改默认的端口号
方法3:不使用root账号登录

互动:是否可以禁止root身份登录? 不行,因为有些程序需要使用root身份登录并运行。另外判断一个用户是不是超级管理员,看的是用户的ID是否为0。

1)修改登录shell    

     将 /bin/bash 改为 /sbin/nologin

1 [root@linl_S ~]# vim /etc/passwd
2 #root:x:0:0:root:/root:/bin/bash
3 root:x:0:0:root:/root:/sbin/nologin
 
2)修改sshd配置文件
     将PermitRootLogin 设置为no
1 [root@linl_S ~]# vim /etc/ssh/sshd_config
2 #PermitRootLogin yes
3 PermitRootLogin no
3)将普通用户提升为系统管理员
     将UID和GID改为0
     一般情况这个就可以解决了暴力破解的问题了。
 1 [root@linl_S ~]# vi /etc/passwd
 2 #linypwb:x:500:500::/home/linypwb:/bin/bash
 3 linypwb:x:0:0::/home/linypwb:/bin/bash
 4 
 5 [root@linl_C ~]# ssh linypwb@lin_S
 6 linypwb@lin_ss password: 
 7 Last login: Fri May 20 14:22:53 2016 from lin_c
 8 [root@linl_S ~]# id linypwb
 9 uid=0(root) gid=0(root) groups=0(root)
10 [root@linl_S ~]# pwd
11 /home/linypwb
12 [root@linl_S ~]# whoami
13 root
 
情况2:暴力破解问题比较严重。 需要把暴力破解的用的IP地址直接禁掉
 

实战3:fail2ban

实战背景:
最近公网网站一直被别人暴力破解sshd服务密码。虽然没有成功,但会导致系统负载很高,原因是在暴力破解的时候,系统会不断地认证用户,从而增加了系统资源额外开销,导致访问公司网站速度很慢。
fail2ban可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是防火墙),而且可以发送e-mail通知系统管理员,很好、很实用、很强大!
简单来说其功能就是防止暴力破解。工作的原理是通过分析一定时间内的相关服务日志,将满足动作的相关IP利用iptables加入到drop列表一定时间。 
注:重启iptables服务的话,所有DROP将重置。
 
1)获取软件包
     官网:http://www.fail2ban.org
     附件:fail2ban-0.8.14.tar.gz
2)上传软件包到服务器
      安装lrzsz包
      rz    上传
      sz    下载
1 [root@linl_S ~]# rpm -ivh /mnt/Packages/lrzsz-0.12.20-27.1.el6.x86_64.rpm 
2 warning: /mnt/Packages/lrzsz-0.12.20-27.1.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
3 Preparing...                ########################################### [100%]
4    1:lrzsz                  ########################################### [100%]
5 [root@linl_S ~]# rz        #选择上传安装包
6 [root@linl_S ~]# ls fail2ban*
7 fail2ban-0.8.14.tar.gz       
3)解压fail2ban压缩包
1 [root@linl_S ~]# tar -zxf fail2ban-0.8.14.tar.gz 
2 [root@linl_S ~]# ls
3 fail2ban-0.8.14  fail2ban-0.8.14.tar.gz
4)查看README.md文档帮助,获取安装方法
1 [root@linl_S ~]# vim fail2ban-0.8.14/README.md
 技术分享
 需要安装python 开发环境,并且版本要大于2.4
查看当前系统中python 的版本:
1 [root@linl_S ~]# python -V
2 Python 2.6.6
5)安装fail2ban
      根据README.md文档安装步骤安装
1 [root@linl_S ~]# cd fail2ban-0.8.14
2 [root@linl_S fail2ban-0.8.14]# python setup.py install
3 running install
4 running build
5 ...
6 Please do not forget to update your configuration files.
7 They are in /etc/fail2ban/.
6)生成服务启动脚本
      将file/redhat-initd 拷贝到/etc/init.d/ ,命名为fail2ban
      加入到启动列表
1 [root@linl_S fail2ban-0.8.14]# cp files/redhat-initd /etc/init.d/fail2ban
2 [root@linl_S fail2ban-0.8.14]# chkconfig --add fail2ban
3 [root@linl_S fail2ban-0.8.14]# chkconfig --list fail2ban
4 fail2ban           0:off    1:off    2:off    3:on    4:on    5:on    6:off
互动: 你怎么知道要复制这个文件? 一个新的软件包,后期怎么可以知道哪个文件是启动脚本文件?
            这就要找服务器启动脚本文件中有什么特点,然后过滤出来对应的文件名。
1 [root@linl_S fail2ban-0.8.14]# grep chkconfig ./* -R
2 ./files/redhat-initd:# chkconfig: - 92 08
7)相关主要文件
/etc/fail2ban/action.d               #动作文件夹,内含默认文件。iptables以及mail等动作配置
/etc/fail2ban/fail2ban.conf        #定义了fai2ban日志级别、日志位置及sock文件位置
/etc/fail2ban/filter.d                    #条件文件夹,内含默认文件。过滤日志关键内容设置
/etc/fail2ban/jail.conf                 #主要配置文件,模块化。主要设置启用ban动作的服务及动作阀值   
# jail   [d?e?l]  监狱
/etc/rc.d/init.d/fail2ban                #启动脚本文件
1 [root@linl_S ~]# ls /etc/fail2ban/
2 action.d  fail2ban.conf  fail2ban.d  filter.d  jail.conf  jail.d
 
应用实例:
设置条件:ssh远程登录5分钟内3次密码验证失败,禁止用户IP访问主机1小时,1小时该限制自动解除,用户可重新登录。
因为动作文件(action.d/iptables.conf)以及日志匹配条件文件(filter.d/sshd.conf )安装后是默认存在的。基本不用做任何修改。所以主要需要设置的就只有jail.conf文件。启用sshd服务的日志分析,指定动作阀值即可。
实例文件/etc/fail2ban/jail.conf 及说明如下:
 1 [DEFAULT]                    #全局设置
 2 ignoreip = 127.0.0.1/8       #忽略的IP列表,不受设置限制
 3 bantime  = 600               #屏蔽时间,单位:秒
 4 findtime  = 600              #这个时间段内超过规定次数会被ban掉
 5 maxretry = 3                 #最大尝试次数
 6 backend = auto               #日志修改检测机制(gamin、polling和auto这三种)
 7 [sshd]                       #单个服务检查设置,如设置bantime、findtime、maxretry和全局冲突,服务优先级大于全局设置。
 8 enabled  = false             #是否激活此项(true/false 9 filter   = sshd              #过滤规则filter的名字,对应filter.d目录下的sshd.conf
10 action   = iptables[name=SSH, port=ssh, protocol=tcp]             #动作的相关参数,对应action.d/iptables.conf文件
11            sendmail-whois[name=SSH, dest=you@example.com, sender=fail2ban@example.com, sendername="Fail2Ban"]    #触发报警的收件人
12 logpath  = /var/log/sshd.log   #检测的系统的登陆日志文件。
1)jail.conf 配置如下:
1 [ssh-iptables]
2 enabled  = true        #是否激活此项(true/false)修改成 true
3 filter   = sshd
4 action   = iptables[name=SSH, port=ssh, protocol=tcp]
5            sendmail-whois[name=SSH, dest=you@example.com, sender=fail2ban@example.com, sendername="Fail2Ban"]
6 logpath  = /var/log/secure        #这里要写sshd服务日志文件
7 findtime = 300        #在5分钟内内出现规定次数就开始工作
8 maxretry = 3        #3次密码验证失败
9 bantime = 3600        #禁止用户IP访问主机1小时
2)启动fail2ban服务
1 [root@linl_S ~]# service fail2ban start
2 Starting fail2ban:                                         [  OK  ]
3)清空日志,准备测试
 1 [root@linl_S ~]# > /var/log/secure     #清空日志,从现在开始
 2 [root@linl_S ~]# /etc/init.d/fail2ban restart        #重启fail2ban 服务
 3 Stopping fail2ban:                                         [  OK  ]
 4 Starting fail2ban:                                         [  OK  ]
 5 [root@linl_S ~]# iptables -nL        #查看防火墙状态
 6 Chain INPUT (policy ACCEPT)
 7 target     prot opt source               destination         
 8 fail2ban-SSH  tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22
 9  
10 Chain FORWARD (policy ACCEPT)
11 target     prot opt source               destination         
12 
13 Chain OUTPUT (policy ACCEPT)
14 target     prot opt source               destination    
15      
16 Chain fail2ban-SSH (1 references)    #多出一条fail2ban-SSH的规则链
17 target     prot opt source               destination         
18 RETURN     all  --  0.0.0.0/0            0.0.0.0/0  
4)lin_C失败远程登录到lin_S
 1 [root@linl_C ~]# ssh lin_S    #正确密码可以登录
 2 root@lin_ss password: 
 3 Last login: Fri May 20 19:26:32 2016 from 10.0.0.1
 4 [root@linl_S ~]# ssh lin_S
 5 ssh: Could not resolve hostname lin_S: Name or service not known
 6 [root@linl_S ~]# logout
 7 Connection to lin_S closed.
 8 [root@linl_C ~]# ssh lin_S    #3次错误密码后,被拒绝
 9 root@lin_ss password: 
10 Permission denied, please try again.
11 root@lin_ss password: 
12 Permission denied, please try again.
13 root@lin_ss password: 
14 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
15 [root@linl_C ~]# ssh lin_S    #重新尝试,被锁定
16 ssh: connect to host lin_S port 22: Connection refused
5)查看防火墙、fail2ban 等状态
 1 [root@linl_S ~]# iptables -nL |tail -4        #查看防火墙,多了一条REJECT条目,禁止10.0.0.16主机访问
 2 Chain fail2ban-SSH (1 references)
 3 target     prot opt source               destination         
 4 REJECT     all  --  10.0.0.16            0.0.0.0/0           reject-with icmp-port-unreachable 
 5 RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
 6 [root@linl_S ~]# fail2ban-client status        #查看fail2ban 工作状态
 7 Status
 8 |- Number of jail:    1
 9 `- Jail list:        ssh-iptables
10 [root@linl_S ~]# fail2ban-client status ssh-iptables    #查看具体某一项工作状态
11 Status for the jail: ssh-iptables
12 |- filter
13 |  |- File list:    /var/log/secure     #读取的日志:/var/log/secure
14 |  |- Currently failed:    0
15 |  `- Total failed:    3                   #一共失败了3次
16 `- action
17    |- Currently banned:    1               #当前ban掉了1个IP
18    |  `- IP list:    10.0.0.16           #IP
19    `- Total banned:    1
6)解除ban限定
方法1:删除/var/log/fail2ban.log 日志中ban掉的IP信息,需重启fail2ban 服务
 1 [root@linl_S ~]# vim /var/log/fail2ban.log
 2 ...
 3 #2016-05-20 20:03:17,553 fail2ban.actions[3465]: WARNING [ssh-iptables] Ban 10.0.0.16    #删除ban掉IP 的日志信息
 4 [root@linl_S ~]# service fail2ban restart
 5 Stopping fail2ban:                                         [  OK  ]
 6 Starting fail2ban:                                         [  OK  ]
 7 [root@linl_C ~]# ssh lin_S    #此时,lin_C再尝试可以进行登录
 8 root@lin_ss password: 
 9 Last login: Fri May 20 19:34:43 2016 from lin_c
10 [root@linl_S ~]# 
方法2:清空防火墙
1 [root@linl_S ~]# iptables -F        #清空防火墙
2 [root@linl_S ~]# iptables -nL |tail -2    #REJECT条目已清空
3 Chain fail2ban-SSH (0 references)
4 target     prot opt source               destination  
5  
6 [root@linl_C ~]# ssh lin_S          #此时,lin_C再尝试可以进行登录
7 root@lin_ss password: 
8 Last login: Fri May 20 20:08:17 2016 from lin_c
9 [root@linl_S ~]# 

 

三、两台Linux服务器之间复制数据

不同的Linux之间copy文件常用有多种方法,这里利用scp 命令来进行文件复制。
scp基于ssh登录并复制数据。远程复制过程中很安全。操作起来比较方便。
 
例1:把当前一个文件copy到远程另一台主机上。
命令:scp local_file remote_username@remote_ip:remote_folder
1 [root@linl_C ~]# scp /etc/passwd root@10.0.0.15:/tmp
2 root@10.0.0.15s password: 
3 passwd                                                                                 100% 1578     1.5KB/s   00:00    
然后会提示你输入另外那台10.0.0.15 主机的root 用户的登录密码,接着就开始copy了。
 
例2:把文件从远程copy到当前系统。
命令:scp remote_username@remote_ip:remote_folder local_file 
1 [root@linl_S ~]# scp root@10.0.0.16:/etc/passwd /tmp
2 root@10.0.0.16s password: 
3 passwd                                                                                 100% 1578     1.5KB/s   00:00 

 

 

SSH防止暴力破解--fail2ban

标签:

原文地址:http://www.cnblogs.com/linypwb/p/5568069.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!