DenyHost 预防SSH暴力破解

DenyHosts安装及配置

一、DenyHost简介
DenyHosts是Python语言写的一个程序软件,运行于Linux上预防SSH暴力破解的,它会分析sshd的日志文件(/var/log/secure),当发现重复的攻击时就会记录IP到/etc/hosts.deny文件,从而达到自动屏IP的功能。
官网地址:http://denyhosts.sourceforge.net/
DenyHosts安装包下载地址:https://sourceforge.net/projects/denyhosts/files/
二、安装过程

tar zxvf DenyHosts-2.6.tar.gz                             #解压源码包
cd DenyHosts-2.6                                          #进入安装解压目录
python setup.py install                                   #安装DenyHosts
cd /usr/share/denyhosts/                                  #默认安装路径
cp denyhosts.cfg-dist denyhosts.cfg                       #denyhosts.cfg为配置文件
cp daemon-control-dist daemon-control                     #daemon-control为启动程序
chown root daemon-control                                 #添加root权限
chmod 700 daemon-control                                  #修改为可执行文件
ln -s /usr/share/denyhosts/daemon-control /etc/init.d     #对daemon-control进行软连接,方便管理

安装到这一步就完成了。
/etc/init.d/daemon-control start                          #启动denyhosts
chkconfig daemon-control on                               #将denghosts设成开机启动

三、配置文件简要说明

vim /usr/share/denyhosts/denyhosts.cfg        #编辑配置文件,另外关于配置文件一些参数,通过grep -v "^#" denyhosts.cfg查看
SECURE_LOG = /var/log/secure                  #ssh 日志文件 #redhat系列根据/var/log/secure文件来判断;
                                                           #Mandrake、FreeBSD根据 /var/log/auth.log来判断;
                                                           #SUSE则是用/var/log/messages来判断,这些在配置文件里面都有很详细的解释。
HOSTS_DENY = /etc/hosts.deny                  #控制用户登陆的文件
PURGE_DENY = 30m                              #过多久后清除已经禁止的,设置为30分钟;
# ‘m’ = minutes
# ‘h’ = hours
# ‘d’ = days
# ‘w’ = weeks
# ‘y’ = years
BLOCK_SERVICE = sshd                         #禁止的服务名,当然DenyHost不仅仅用于SSH服务
DENY_THRESHOLD_INVALID = 1                   #允许无效用户失败的次数
DENY_THRESHOLD_VALID = 3                     #允许普通用户登陆失败的次数
DENY_THRESHOLD_ROOT = 3                      #允许root登陆失败的次数
DAEMON_LOG = /var/log/denyhosts              #DenyHosts日志文件存放的路径,默认

更改DenyHosts的默认配置之后,重启DenyHosts服务即可生效:
/etc/init.d/daemon-control restart         #重启denyhosts

监控非SSH服务
需要添加正则匹配,官方文档有说明。

相似工具
Fail2Ban,使用iptables
BlockHosts
Blacklist

SSH安全配置
PermitRootLogin no
PasswordAuthentication no
Port 59922

参考文章:https://www.cnblogs.com/lcword/p/5912625.html

防止ssh暴力破解,自动提交黑名单

近日系统发现多例ssh登录失败记录,明显是有人ssh暴力破解,百度了下[1]参考,做了以下处理
一、系统:Centos

二、方法:读取/var/log/secure,查找关键字 Failed,例如(注:文中的IP地址特意做了删减):

Sep 17 09:08:09 localhost sshd[29087]: Failed password for root from 13.7.3.6 port 44367 ssh2
Sep 17 09:08:20 localhost sshd[29087]: Failed password for root from 13.7.3.6 port 44367 ssh2
Sep 17 09:10:02 localhost sshd[29223]: Failed password for root from 13.7.3.6 port 56482 ssh2
Sep 17 09:10:14 localhost sshd[29223]: Failed password for root from 13.7.3.6 port 56482 ssh2

从这些行中提取IP地址,如果次数达到10次(脚本中判断次数字符长度是否大于1)则将该IP写到 /etc/hosts.deny中。

三、步骤:

1、先把始终允许的IP填入 /etc/hosts.allow ,这很重要!比如:
sshd:19.16.18.1:allow
sshd:19.16.18.2:allow

2、脚本 /usr/local/bin/secure_ssh.sh

#! /bin/bash
cat /var/log/secure|awk '/Failed/{print (NF-3)}'|sort|uniq -c|awk '{print2"="1;}'>/usr/local/bin/black.list
for i in `cat  /usr/local/bin/black.list`
do
  IP=`echoi |awk -F= '{print 1}'`
  NUM=`echoi|awk -F= '{print 2}'`
  if [{#NUM} -gt 1 ]; then
    grep IP /etc/hosts.deny>/dev/null
    if [? -gt 0 ];then
      echo "sshd:$IP:deny" >> /etc/hosts.deny
    fi
  fi
done

3、将secure_ssh.sh脚本放入cron计划任务,每1分钟执行一次。

crontab -e

*/1 * * * * sh /usr/local/bin/secure_ssh.sh


这样脚本检查到暴力破解ip就会自动提交到黑名单禁止访问
最后做出总结:
– 修改默认22端口
– 禁止root用户登录,使用其他用户操作root命令[2]
– 使用秘钥登录ssh,不使用密码登录
– 添加上诉脚本自动提交黑名单,封禁IP

PHP session 存储方式

PHP session 存储方式有3种

1)文件存储,file

2)memcahe存储

3)redis存储


1)file(默认方式)

session.save_handler = file  
ssession.save_path = "/tmp"  

第一点设置为使用文件存储session,第二点为默认的存储位置

 


2)memcache

session.save_handler = memcache  
session.save_path = "tcp://127.0.0.1:11211,tcp://Mem服务器2:端口号..."  

使用多个 memcached server 时用逗号","隔开,可以带额外的参数"persistent"、"weight"、"timeout"、"retry_interval" 等,  
类似:"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2"  
参考:http://php.net/manual/zh/memcache.addserver.php  

如果安装的PECL是memcached(使用libmemcache库的那个),则配置应为  
ini_set("session.save_handler", "memcached"); // 是memcached不是memcache  
ini_set("session.save_path", "127.0.0.1:11211"); // 不要tcp://  
参数参考:http://php.net/manual/zh/memcached.addserver.php  

 


3)redis

session.save_handler = redis  
session.save_path = "tcp://host1:6379?weight=1, tcp://host2:6379?weight=2&timeout=2.5, tcp://host3:6379?weight=2"  

参数:  
weight 比重  
timeout 超时  
persistent 持久连接 取值 0 1  
prefix session id 前缀  
auth 验证  
database 选择的数据库  

session 以秒表示 生命周期由session.gc_maxlifetime来控制  
ini_set('session.gc_maxlifetime','3600')可改变生存时间,需要SETEX 命令,redis版本至少2.0  

phpredis 也可以链接一个unix domain socket :unix:///var/run/redis/redis.sock?persistent=1&weight=1&database=0  

 


redis实例

ini_set('session.save_handler', 'redis');  
ini_set('session.save_path', 'tcp://127.0.0.1:6379');  
session_start();  
_SESSION['sessionKey'] = 'redis session!';  
var_dump(_SESSION['sessionKey']);  
echo '<br/>';  

redis = new redis();redis->connect('127.0.0.1', 6379);  
//redis用session_id作为key并且是以string的形式存储  
var_dump($redis->get('PHPREDIS_SESSION:' . session_id()));  

参考至https://blog.csdn.net/qq_39780174/article/details/78482943

利用阿里云周边实现SLB+ECS+NAS+RDS负载均衡高并发架构

基本思路:

1.创建自定义专有网络VPC,后续负载均衡SLB、服务器ECS、云数据库RDS都使用同一VPC

2.购买SLB

3.购买ECS一台,记得使用自建专有网络VPC,且不搭建公有网络

4.使用SLB对ECS进行4层协议,监听端口转发到ECS实例1,可访问公网

5.搭建ECS实例1环境,并购买文件存储包,进行快照,创建自定义镜像

6.购买相同配置ECS一台,使用刚才的自定义镜像创建环境

7.使用SLB对两台ECS进行7层协议,监听80端口,实行负载均衡

8.分别对两台ECS实例挂载共享数据盘NAS,并设置自动挂载

9.购买RDS-mysql版本,申请公网地址用于开发,并创建只读实例,使用读写分离地址用于程序

10.在实例1上安装应用程序,程序放置于NAS挂载点上,并把nginx配置复制到实例2上面

11.使用了负载均衡后,会遇到会话保持问题,此时需要做session共享,session共享有3种方式,这里使用第一种

1)利用NAS系统,修改session文件存储位置,存放到共享NAS系统中

2)使用memcache来做共享

3)使用redis来做共享

 

感谢标杆徐教学视频指导 http://medu.51cto.com/course/index/view?id=16806