SSH防止暴力破解--fail2ban

时间:2023-12-19 09:38:44

一、ssh密钥对无交互登录

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

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

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

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

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

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

1)修改登录shell

将 /bin/bash 改为 /sbin/nologin

 [root@linl_S ~]# vim /etc/passwd
#root:x:::root:/root:/bin/bash
root:x:::root:/root:/sbin/nologin
2)修改sshd配置文件
     将PermitRootLogin 设置为no
 [root@linl_S ~]# vim /etc/ssh/sshd_config
#PermitRootLogin yes
PermitRootLogin no
3)将普通用户提升为系统管理员
     将UID和GID改为0
     一般情况这个就可以解决了暴力破解的问题了。
 [root@linl_S ~]# vi /etc/passwd
#linypwb:x::::/home/linypwb:/bin/bash
linypwb:x::::/home/linypwb:/bin/bash [root@linl_C ~]# ssh linypwb@lin_S
linypwb@lin_s's password:
Last login: Fri May :: from lin_c
[root@linl_S ~]# id linypwb
uid=(root) gid=(root) groups=(root)
[root@linl_S ~]# pwd
/home/linypwb
[root@linl_S ~]# whoami
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    下载
 [root@linl_S ~]# rpm -ivh /mnt/Packages/lrzsz-0.12.-27.1.el6.x86_64.rpm
warning: /mnt/Packages/lrzsz-0.12.-27.1.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing... ########################################### [%]
:lrzsz ########################################### [%]
[root@linl_S ~]# rz #选择上传安装包
[root@linl_S ~]# ls fail2ban*
fail2ban-0.8..tar.gz
3)解压fail2ban压缩包
 [root@linl_S ~]# tar -zxf fail2ban-0.8..tar.gz
[root@linl_S ~]# ls
fail2ban-0.8. fail2ban-0.8..tar.gz
4)查看README.md文档帮助,获取安装方法
 [root@linl_S ~]# vim fail2ban-0.8./README.md
 SSH防止暴力破解--fail2ban
 需要安装python 开发环境,并且版本要大于2.4
查看当前系统中python 的版本:
 [root@linl_S ~]# python -V
Python 2.6.

5)安装fail2ban

      根据README.md文档安装步骤安装
 [root@linl_S ~]# cd fail2ban-0.8.
[root@linl_S fail2ban-0.8.]# python setup.py install
running install
running build
...
Please do not forget to update your configuration files.
They are in /etc/fail2ban/.
6)生成服务启动脚本
      将file/redhat-initd 拷贝到/etc/init.d/ ,命名为fail2ban
      加入到启动列表
 [root@linl_S fail2ban-0.8.]# cp files/redhat-initd /etc/init.d/fail2ban
[root@linl_S fail2ban-0.8.]# chkconfig --add fail2ban
[root@linl_S fail2ban-0.8.]# chkconfig --list fail2ban
fail2ban :off :off :off :on :on :on :off
互动: 你怎么知道要复制这个文件? 一个新的软件包,后期怎么可以知道哪个文件是启动脚本文件?
            这就要找服务器启动脚本文件中有什么特点,然后过滤出来对应的文件名。
 [root@linl_S fail2ban-0.8.]# grep chkconfig ./* -R
./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                #启动脚本文件
 [root@linl_S ~]# ls /etc/fail2ban/
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 及说明如下:
 [DEFAULT]                    #全局设置
ignoreip = 127.0.0.1/ #忽略的IP列表,不受设置限制
bantime = #屏蔽时间,单位:秒
findtime = #这个时间段内超过规定次数会被ban掉
maxretry = #最大尝试次数
backend = auto #日志修改检测机制(gamin、polling和auto这三种)
[sshd] #单个服务检查设置,如设置bantime、findtime、maxretry和全局冲突,服务优先级大于全局设置。
enabled = false #是否激活此项(true/false)
filter = sshd #过滤规则filter的名字,对应filter.d目录下的sshd.conf
action = iptables[name=SSH, port=ssh, protocol=tcp] #动作的相关参数,对应action.d/iptables.conf文件
sendmail-whois[name=SSH, dest=you@example.com, sender=fail2ban@example.com, sendername="Fail2Ban"] #触发报警的收件人
logpath = /var/log/sshd.log #检测的系统的登陆日志文件。
1)jail.conf 配置如下:
 [ssh-iptables]
enabled = true #是否激活此项(true/false)修改成 true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
sendmail-whois[name=SSH, dest=you@example.com, sender=fail2ban@example.com, sendername="Fail2Ban"]
logpath = /var/log/secure #这里要写sshd服务日志文件
findtime = #在5分钟内内出现规定次数就开始工作
maxretry = #3次密码验证失败
bantime = #禁止用户IP访问主机1小时
2)启动fail2ban服务
 [root@linl_S ~]# service fail2ban start
Starting fail2ban: [ OK ]
3)清空日志,准备测试
 [root@linl_S ~]# > /var/log/secure     #清空日志,从现在开始
[root@linl_S ~]# /etc/init.d/fail2ban restart #重启fail2ban 服务
Stopping fail2ban: [ OK ]
Starting fail2ban: [ OK ]
[root@linl_S ~]# iptables -nL #查看防火墙状态
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-SSH tcp -- 0.0.0.0/ 0.0.0.0/ tcp dpt: Chain FORWARD (policy ACCEPT)
target prot opt source destination Chain OUTPUT (policy ACCEPT)
target prot opt source destination Chain fail2ban-SSH ( references) #多出一条fail2ban-SSH的规则链
target prot opt source destination
RETURN all -- 0.0.0.0/ 0.0.0.0/
4)lin_C失败远程登录到lin_S
 [root@linl_C ~]# ssh lin_S    #正确密码可以登录
root@lin_s's password:
Last login: Fri May :: from 10.0.0.1
[root@linl_S ~]# ssh lin_S
ssh: Could not resolve hostname lin_S: Name or service not known
[root@linl_S ~]# logout
Connection to lin_S closed.
[root@linl_C ~]# ssh lin_S #3次错误密码后,被拒绝
root@lin_s's password:
Permission denied, please try again.
root@lin_s's password:
Permission denied, please try again.
root@lin_s's password:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
[root@linl_C ~]# ssh lin_S #重新尝试,被锁定
ssh: connect to host lin_S port : Connection refused
5)查看防火墙、fail2ban 等状态
 [root@linl_S ~]# iptables -nL |tail -        #查看防火墙,多了一条REJECT条目,禁止10.0.0.16主机访问
Chain fail2ban-SSH ( references)
target prot opt source destination
REJECT all -- 10.0.0.16 0.0.0.0/ reject-with icmp-port-unreachable
RETURN all -- 0.0.0.0/ 0.0.0.0/
[root@linl_S ~]# fail2ban-client status #查看fail2ban 工作状态
Status
|- Number of jail:
`- Jail list: ssh-iptables
[root@linl_S ~]# fail2ban-client status ssh-iptables #查看具体某一项工作状态
Status for the jail: ssh-iptables
|- filter
| |- File list: /var/log/secure #读取的日志:/var/log/secure
| |- Currently failed:
| `- Total failed: #一共失败了3次
`- action
|- Currently banned: #当前ban掉了1个IP
| `- IP list: 10.0.0.16 #IP
`- Total banned:
6)解除ban限定
方法1:删除/var/log/fail2ban.log 日志中ban掉的IP信息,需重启fail2ban 服务
 [root@linl_S ~]# vim /var/log/fail2ban.log
...
#-- ::, fail2ban.actions[]: WARNING [ssh-iptables] Ban 10.0.0.16 #删除ban掉IP 的日志信息
[root@linl_S ~]# service fail2ban restart
Stopping fail2ban: [ OK ]
Starting fail2ban: [ OK ]
[root@linl_C ~]# ssh lin_S #此时,lin_C再尝试可以进行登录
root@lin_s's password:
Last login: Fri May :: from lin_c
[root@linl_S ~]#
方法2:清空防火墙
 [root@linl_S ~]# iptables -F        #清空防火墙
[root@linl_S ~]# iptables -nL |tail - #REJECT条目已清空
Chain fail2ban-SSH ( references)
target prot opt source destination [root@linl_C ~]# ssh lin_S #此时,lin_C再尝试可以进行登录
root@lin_s's password:
Last login: Fri May :: from lin_c
[root@linl_S ~]#

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

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