首页 > 代码库 > 2-3 sshd服务---暴力破解应对策略

2-3 sshd服务---暴力破解应对策略

 

sshd服务暴力破解步骤

sshd暴力破解方法

防止暴力破解调优

1. 变更默认端口

2. 变更root用户

3. 日志监控-->防止暴力破解(fail2ban应用)

fail2ban详解

在初始化的服务器中,20种ssh服务调优方法!

技术来源于生活!!!

===============================================

sshd服务暴力破解步骤

第一步:确认目标IP地址

第二步:确认目标端口--->根据目标开放端口,确定其操作系统

第三步:运行暴力破解程序,破解密码

为了防止我们的密码被暴力破解,服务器的密码一定不要使用弱口令!!!而且在企业中,一般会要求半个月或多长时间变更一次密码(公司中运维工程师会要求的)

弱口令:简单的密码,如下:

123456

awp@host

12HLad^

强口令:  ---> 密码长度大于8位(最好不少于14位),且有字母 数字 和特殊符号混合构成的高复杂度的字符串

防止暴力破解调优

安装sshd-server

查询服务是否安装:

rpm -qa | grep openssh-server

技术分享

若没有安装,可使用如下命令进行安装:

yum -y install openssh* #安装所有openssh软件包

通过如下命令,查看openssh生成的文件列表:

rpm -ql openssh

1. 变更默认端口

sshd服务配置文件位于/etc/ssh目录下!

ls /etc/ssh

技术分享

ssh_config ---> 客户端配置文件

sshd_config  ---> 服务器端配置文件

我们修改服务器端文件(别人访问我们时,我们是sshd服务器!!!)

vim /etc/ssh/sshd_config

修改默认端口配置:

#Port 22

改为:

Port 123

技术分享

保存退出,并重启sshd服务:

service sshd restart

/etc/init.d/sshd restart

技术分享

查看监听端口是否生效:

netstat -anlpt | grep ssh

技术分享

通过本机远程连接测试!(本机远程连接本机!)本机即使客户端,也是服务端

ssh 192.168.31.222 -p 123 #指定端口远程连接

技术分享

------------------------------

使用nmap命令扫描服务器开放端口

1.查看并安装nmap软件包

which nmap

yum -y install nmap

技术分享

2. 扫描某IP地址开放端口

nmap 192.168.171.120

技术分享

这里我发现,当设置ssh开放端口在1000以内是扫描不出来的!!!而且若是指定到其他服务的端口上时,扫描到的服务名称就是该服务的名称!!!

技术分享

这就是为什么我们要修改端口的意思!!!让别人不知道我们的哪个端口是sshd服务的端口!

------------------------------

2. 变更root用户

但是别人可以一个一个的端口来测试啊!?我们该怎么办呢?

别人测试后的时候,他最可能测试的用户是root用户(因为其他的用户名他不知道啊)

我们可以通过禁止root用户登录来实现,但是系统中很多服务都需要root用户来进行安装和维护!!

我们可以创建一个普通用户,将其UID和GID设置为rootID即可(因为linux系统是根据用户id来判断用户权限的!!!)

useradd xg && echo 123456 | passwd xg --stdin #创建普通用户

编辑/etc/passwd文件,修改如下:

修改:root:x:0:0:root:/root:/bin/bash

为:root:x:0:0:root:/root:/bin/nologin #禁止root用户登录

修改:xg:x:500:500::/home/xg:/bin/bash

为:xg:x:0:0::/home/xg:/bin/bash #普通用户提权

远程连接测试:

root用户连接测试

技术分享

xg用户连接测试:

技术分享

另外,改下面内容后,xg用户也是登录不上的。只判断UID是否为0,不查看用户名的:

vim /etc/ssh/sshd_config

改:

#PermitRootLogin yes

为:

PermitRootLogin no

service sshd restart

测试:

ssh xg@192.168.31.222

xg@192.168.31.222‘s password:

Permission denied, please try again.

一般情况这个就可以解决了暴力破解的问题了。

到目前为止小的暴力破解已经解决了!!!

3. 日志监控-->防止暴力破解(fail2ban应用)

但是,虽然我们有效的降低了别人破解我们系统的可能性,但是,别人在攻击时,会造成sshd服务器系统资源占用(可能导致瘫痪!)

为有效防止系统资源无辜被占用导致系统缓慢或瘫痪,我们可以使用防火墙!!!---->一般公司不使用防火墙.

我们还可以使用fail2ban软件,实现一些规则的制定!!避免别人恶意攻击服务器造成不必要的损失!

fail2ban  ---> 系统日志监控

通过匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是防火墙),而且可以发送e-mail通知系统管理员,很好 很实用 很强大!

#ban (b?n)禁令

简单来说其功能就是防止暴力破解。工作的原理是通过分析一定时间内的相关服务日志,将满足动作的相关IP利用iptables加入到dorp列表一定时间。

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name ROUTER-SSH  --update --seconds 1800 --hitcount 5 -j DROP

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name ROUTER-SSH --set -j ACCEPT

两种安装方式

Way 1. yum安装

rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

yum -y install fail2ban

Way 2. 源码安装

下载地址:

http://www.fail2ban.org

尽量使用稳定版本(推荐0.8.14或0.9.4)

下载下来后,怎么安装呢?!

第一步:上传压缩包到虚拟机,并解压

tar -zxf fail2ban-0.8.14.tar.gz -C /usr/src

第二步:查看解压目录下的配置文档

vim /usr/src/fail2ban-0.8.14/README.md

17 Installation:

18 -------------

19

20 **It is possible that Fail2ban is already packaged for your distribution.      In

21 this case, you should use it instead.**

22

23 Required:

24 - [Python >= 2.4](http://www.python.org)

25

26 Optional:

27 - [pyinotify >= 0.8.3](https://github.com/seb-m/pyinotify)

28   - Linux >= 2.6.13

29 - [gamin >= 0.0.21](http://www.gnome.org/~veillard/gamin)

30

31 To install, just do:

32

33     tar xvfj fail2ban-0.8.12.tar.bz2

34     cd fail2ban-0.8.12

35     python setup.py install

由配置文档得知,安装本源码程序需要

1. Python版本为2.4或以上

2. pyinotify版本为0.8.3或以上

3. gamin版本为0.0.21或以上

4. Linux内核版本在2.6.13或以上

技术分享

查看依赖关系已满足条件!

切换到源码文档目录,进行安装,执行如下命令:

python setup.py install

技术分享

安装完成后,为了便于后期的管理操作,以及添加开机启动等,我们需要将fail2ban启动脚本复制到/etc/init.d目录下. 根据/etc/init.d目录下的文件特点,他们都存在chkconfig配置项,在源码目录中通过grep查找

grep chkconfig ./* -R --color #在当前目录下,查找所有文件中,存在chkconfig字段的文件

cp files/redhat-initd /etc/init.d/fail2ban #拷贝启动脚本到目标位置

chkconfig --add fail2ban #添加开机启动项fail2ban

chkconfig --list fail2ban #查看

技术分享

------------------------------

拓展:

1)grep的用法

grep  ssh   /etc/passwd

2)

echo -e  “this is a world \n nest line” |grep word

3)打印除包含 math_pattern 行之外的所有的行

grep -v match_pattern file

4)统计文件或文本中包含匹配字符串的行数:

grep -c “test” filename

5)忽略大小写

echo ”hello world” |grep -I ”HELLO”

------------------------------

fail2ban配置文件:

相关主要文件说明:

/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   #启动脚本文件

fail2ban主要配置文件详解:

============= /etc/fail2ban/fail2ban.conf =============

loglevel = 4 #日志级别

logtarget = /var/log/fail2ban.log #日志文件路径

socket = /var/run/fail2ban/fail2ban.sock #socket文件位置

pidfile = /var/run/fail2ban/fail2ban.pid #fail2ban服务进程ID

=======================================================

============= /etc/fail2ban/jail.conf =============

[DEFAULT]               #全局设置

ignoreip = ipaddress/prefix #忽略监控ip

ignoreip = 127.0.0.1/8 10.10.10.0/24   #忽略的IP列表,不受设置限制  如果有二组以上用空白做为间隔

ignorecommand = #忽略命令

bantime = 600 #屏蔽时间,单位:秒(设置IP被封锁的时间)

findtime = 600 #这个时间段内超过规定次数会被ban掉(设定多长时间内达到最大次数就解锁。)

maxretry = 3 #在被ban之前,发生错误的最大次数

backend = auto #日志修改检测机制(pyinotify、gamin、polling和auto这三种)

usedns = warn #yes/warn/no 处理方式

===================================================

[] #剩下的配置信息是模块设置,发送信息等

格式如下:

[ssh-iptables] #ssh配置设置 #单个服务检查设置,如设置bantime、findtime、maxretry和全局冲突,服务优先级大于全局设置。

enabled = false #是否启用该模块

filter = sshd #监控字符串 过滤规则filter的名字,对应filter.d目录下的sshd.conf

action = iptables[name=SSH, port=ssh, protocol=tcp] #事件

#动作的相关参数,对应action.d/iptables.conf文件  SSH服务名称 ssh端口好 protocol协议

logpath = /var/log/sshd.log  #日志文件路径,检测的系统的登陆日志文件。

# 这里要写sshd服务日志文件。

# 默认为logpath  = /var/log/sshd.log ,可在/etc/rsyslog.conf文件中查看

# ----- /etc/ssh/sshd_config -----

# 36 #SyslogFacility AUTH

# 37 SyslogFacility AUTHPRIV

# ----- /etc/rsyslog.conf -----

# 44 # The authpriv file has restricted access.

# 45 authpriv.*                                              /var/log/secure

maxretry = 5  #最大错误次数

实战:通过修改配置文件实现以下要求

设置条件:ssh远程登录5分钟内3次密码验证失败,禁止用户IP访问主机1小时,1小时该限制自动解除,用户可重新登录。

修改配置文件如下:

[sshd]

enabled  = true             #是否激活此项(true/false)修改成 true

#5分钟内3次密码验证失败,禁止用户IP访问主机1小时。 配置如下

bantime  = 3600   #禁止用户IP访问主机1小时

findtime  = 300    #在5分钟内内出现规定次数就开始工作

maxretry = 3    #3次密码验证失败

技术分享

保存退出后,重启fail2ban服务

/etc/init.d/fail2ban restart #重启服务

ssh远程连接,测试是否生效

ssh 192.168.31.222 -p 123 #故意三次输错密码后,重新连接!

[root@xiaogan120 ~]# ssh 192.168.31.222 -p 123

ssh: connect to host 192.168.31.222 port 123: Connection refused

技术分享

1. 查看防火墙规则:

iptables -L |tail -4

2. 查看fail2ban状态:

fail2ban-client status

3. 查看fail2ban详情:

fail2ban-client status sshd

4. 查看fail2ban日志文件:

tail /var/log/fail2ban.log

 

[root@xiaogan120 ~]# iptables -L |tail -4

Chain fail2ban-SSHD (1 references)

target     prot opt source               destination        

REJECT     all  --  192.168.31.222       anywhere            reject-with icmp-port-unreachable

RETURN     all  --  anywhere             anywhere           

[root@xiaogan120 ~]# fail2ban-client status

Status

|- Number of jail: 1

`- Jail list: sshd

[root@xiaogan120 ~]# fail2ban-client status sshd

Status for the jail: sshd

|- filter

|  |- File list: /var/log/secure

|  |- Currently failed: 0

|  `- Total failed: 3

`- action

   |- Currently banned: 1

   |  `- IP list: 192.168.31.222

   `- Total banned: 1

[root@xiaogan120 ~]# tail /var/log/fail2ban.log

2016-09-19 18:12:51,624 fail2ban.server [1629]: INFO    Changed logging target to /var/log/fail2ban.log for Fail2ban v0.8.14

2016-09-19 18:12:51,624 fail2ban.jail   [1629]: INFO    Creating new jail ‘sshd‘

2016-09-19 18:12:51,624 fail2ban.jail   [1629]: INFO    Jail ‘sshd‘ uses poller

2016-09-19 18:12:51,636 fail2ban.jail   [1629]: INFO    Initiated ‘polling‘ backend

2016-09-19 18:12:51,637 fail2ban.filter [1629]: INFO    Added logfile = /var/log/secure

2016-09-19 18:12:51,637 fail2ban.filter [1629]: INFO    Set maxRetry = 3

2016-09-19 18:12:51,638 fail2ban.filter [1629]: INFO    Set findtime = 300

2016-09-19 18:12:51,639 fail2ban.actions[1629]: INFO    Set banTime = 600

2016-09-19 18:12:51,724 fail2ban.jail   [1629]: INFO    Jail ‘sshd‘ started

2016-09-19 18:12:52,756 fail2ban.actions[1629]: WARNING [sshd] Ban 192.168.31.222

[root@xiaogan120 ~]#

解除IP限制:

1. 重启fail2ban服务

技术分享

2. 等待超过时间限制

拓展配置文件:

0.9.4配置文件

ls /etc/fail2ban/

[root@xiaogan121 fail2ban-0.9.4]# ls /etc/fail2ban/

action.d       filter.d   paths-common.conf  paths-freebsd.conf

fail2ban.conf  jail.conf  paths-debian.conf  paths-opensuse.conf

fail2ban.d     jail.d     paths-fedora.conf  paths-osx.conf

[DEFAULT]

bantime  = 3600       禁止此用户IP访问主机1小时

findtime  = 300 在5分钟内内出现规定次数就实施动作,默认时间单位:秒

maxretry = 3 密码验证失败次数最大值为3

filter = sshd

protocol = tcp 协议为TCP

action = iptables[name=SSH, port=ssh, protocol=tcp]  所采用的工作,按照名字可在action.d目录下找到

[sshd]

port    = ssh

logpath = /var/log/secure  检测的系统的登陆日志文件,这里要写sshd服务日志文件的路径

最后保存设置

ssh使用密钥登录

密钥登录,其实就是生成一个密钥对

一个公有密钥,一个私有密钥

将公有密钥保存到服务器,私有密钥保存在本地客户端.

这样就可以实现我们的密钥登录了!!!

原理:公钥加密,私钥解密(其实就是相当于给服务器上了一个锁,公有密钥就是这个锁,而钥匙就保存在我们客户端中,当需要连接时,客户端中的钥匙就可以开启服务器端的锁!)

第一步:生成密钥对 公钥-私钥

ssh-keygen #默认回车即可

技术分享

第二步:上传公有密钥到服务器

ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.171.121

技术分享

第三步:尝试远程连接服务器

ssh 192.168.171.121

技术分享

看到了么?没有输入密码,就直接登录了!!!

################## scp 命令 ##################

简介:

scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读 read only system时,用scp可以帮你把文件移出来。另外,scp还非常不占资源,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。虽然 rsync比scp会快一点,但当小文件众多的情况下,rsync会导致

1.命令格式:

scp [参数] [原路径] [目标路径]

2.命令功能:

scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。linux的scp命令可以在linux服务器之间复制文件和目录。

3.命令参数:

-1  强制scp命令使用协议ssh1 

-2  强制scp命令使用协议ssh2 

-4  强制scp命令只使用IPv4寻址 

-6  强制scp命令只使用IPv6寻址 

-B  使用批处理模式(传输过程中不询问传输口令或短语) 

-C  允许压缩。(将-C标志传递给ssh,从而打开压缩功能) 

-p 保留原文件的修改时间,访问时间和访问权限。 

-q  不显示传输进度条。 

-r  递归复制整个目录。 

-v 详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。  

-c cipher  以cipher将数据传输进行加密,这个选项将直接传递给ssh。  

-F ssh_config  指定一个替代的ssh配置文件,此参数直接传递给ssh。 

-i identity_file  从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。   

-l limit  限定用户所能使用的带宽,以Kbit/s为单位。    

-o ssh_option  如果习惯于使用ssh_config(5)中的参数传递方式,  

-P port  注意是大写的P, port是指定数据传输用到的端口号  

-S program  指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。

4.使用实例:

scp命令的实际应用概述: 

从本地服务器复制到远程服务器:

(1) 复制文件:

命令格式:

1). scp local_file remote_username@remote_ip:remote_folder 

或者

2). scp local_file remote_username@remote_ip:remote_file 

或者

3). scp local_file remote_ip:remote_folder 

或者

4). scp local_file remote_ip:remote_file 

第1,2个指定了用户名,命令执行后需要输入用户密码,第1个仅指定了远程的目录,文件名字不变,第2个指定了文件名 

第3,4个没有指定用户名,命令执行后需要输入用户名和密码,第3个仅指定了远程的目录,文件名字不变,第4个指定了文件名  

(2) 复制目录:

命令格式:

1). scp -r local_folder remote_username@remote_ip:remote_folder

或者

2). scp -r local_folder remote_ip:remote_folder

第1个指定了用户名,命令执行后需要输入用户密码; 

第2个没有指定用户名,命令执行后需要输入用户名和密码;硬盘I/O非常高,而scp基本不影响系统正常使用。

从远程服务器复制到本地服务器:

从远程复制到本地的scp命令与上面的命令雷同,只要将从本地复制到远程的命令后面2个参数互换顺序就行了。

实例:

scp root@192.168.171.121:/root/fail2ban-0.9.4.tar.gz  /root

#已root用户身份,从192.168.171.121拷贝/root/fail2ban-0.9.4.tar.gz文件到/root目录下!

技术分享

scp /root/sshd_config 192.168.171.121:/root

#拷贝/root/sshd_config文件到192.168.171.121地址/root目录下

#############################################

20种调优方式--->刚建好的服务器?!

2-3 sshd服务---暴力破解应对策略