Odoo14 防暴力破解登录密码
1 # Odoo14 防暴力破解登录密码
2 # 主要工具:redis
3 # 实现思路:限制每个用户24小时内登录失败次数。连续超过5次失败后,需要等待一定时间后才能再次尝试登录
4 # 配置:在你的配置文件中增加redis配置信息(如,我的是myodoo.cfg:./odoo-bin -c myodoo.cfg)
5 [REDIS]
6 ODOO_SESSION_REDIS=1
7 ODOO_SESSION_REDIS_HOST=192.168.31.20
8 ODOO_SESSION_REDIS_PORT=6379
9
10 # 代码
11 # -*- coding: utf-8 -*-
12 from odoo import models
13 import contextlib
14 from odoo.http import request
15 import logging
16 from odoo.exceptions import AccessDenied
17 import datetime
18 from odoo.tools import collections
19 from odoo import _
20 from configparser import ConfigParser
21 from odoo.tools import config as odoocfg
22 from odoo.tools.func import lazy_property
23
24 _logger = logging.getLogger(__name__)
25
26 try:
27 import redis
28 from redis.sentinel import Sentinel
29 except ImportError:
30 redis = None # noqa
31 _logger.debug("Cannot 'import redis'.")
32
33 import threading
34
35 class SingletonRedis(object):
36 _instance_lock = threading.Lock()
37
38 def __init__(self):
39 sentinel_host = self.get_redis_config('ODOO_SESSION_REDIS_SENTINEL_HOST')
40 sentinel_port = int(self.get_redis_config('ODOO_SESSION_REDIS_SENTINEL_PORT', 26379))
41 password = self.get_redis_config('ODOO_SESSION_REDIS_PASSWORD')
42 sentinel_master_name = self.get_redis_config('ODOO_SESSION_REDIS_SENTINEL_MASTER_NAME')
43 url = self.get_redis_config('ODOO_SESSION_REDIS_URL')
44 host = self.get_redis_config('ODOO_SESSION_REDIS_HOST', 'localhost')
45 port = int(self.get_redis_config('ODOO_SESSION_REDIS_PORT', 6379))
46 if sentinel_host:
47 sentinel = Sentinel([(sentinel_host, sentinel_port)],
48 password=password)
49 self.rd = sentinel.master_for(sentinel_master_name)
50 elif url:
51 self.rd = redis.from_url(url)
52 else:
53 self.rd = redis.Redis(host=host, port=port, password=password, db=1)
54
55 def get_redis_config(self, pcname, defv=None):
56 # print("============================:%s:%s" % (pcname, str(odoocfg.rcfile)))
57 config_cfg = odoocfg.rcfile
58 conf = ConfigParser()
59 conf.read(config_cfg)
60 if conf.has_option('REDIS', pcname):
61 return conf.get('REDIS', pcname)
62 else:
63 if defv:
64 return defv
65 else:
66 return None
67
68 @classmethod
69 def instance(cls, *args, **kwargs):
70 if not hasattr(SingletonRedis, "_instance"):
71 SingletonRedis._instance = SingletonRedis(*args, **kwargs)
72 return SingletonRedis._instance
73 # with SingletonRedis._instance_lock: 不用考虑多线程问题,redis会自己解决。所以单例模式到这里就可以了
74 # if not hasattr(SingletonRedis, "_instance"):
75 # SingletonRedis._instance = SingletonRedis(*args, **kwargs)
76 # return SingletonRedis._instance
77
78
79 class LoginLimit(models.Model):
80 _inherit = 'res.users'
81
82 def _bys_login_success(self, uname):
83 rd = SingletonRedis()
84 rd.rd.delete(uname)
85 rd.rd.delete('bys666888_'+uname)
86
87 def _bys_on_login_cooldown(self, uname):
88 # 一天刷新一次,
89 # 一天有10次错误的机会,
90 # 前5次没有限制,
91 # 后5次每次必须隔5分钟后尝试。
92 # 10次机会耗尽,只能等24小时后再次尝试
93 days = 1
94 max_err = 10
95 min_err = 5
96 interval_sec = 5 * 60
97
98 # 查看redis中有没有数据
99 rd = SingletonRedis()
100 rd = rd.rd
101
102 # 有的话就拿出数据,并对请求次数判断是否过期
103 failures = rd.get(uname)
104 print(uname, failures)
105 if failures:
106 failures = int(failures) + 1
107 if failures > max_err:
108 raise AccessDenied(_("please wait %s hours before trying again.") % (str(days*24)))
109 if failures >= min_err:
110 a = rd.ttl('bys666888_'+uname)
111 if a > 0:
112 raise AccessDenied(_("please wait %s seconds before trying again.") % (a))
113 # return True
114 else:
115 rd.set(name='bys666888_'+uname,value=1,ex=interval_sec)
116 rd.set(name=uname,value=failures,ex=86400*days)
117 else:
118 rd.set(name=uname,value=1,ex=86400*days)
119
120
121 @contextlib.contextmanager
122 def _assert_can_auth(self):
123 """ Checks that the current environment even allows the current auth
124 request to happen.
125
126 The baseline implementation is a simple linear login cooldown: after
127 a number of failures trying to log-in, the user (by login) is put on
128 cooldown. During the cooldown period, login *attempts* are ignored
129 and logged.
130
131 .. warning::
132
133 The login counter is not shared between workers and not
134 specifically thread-safe, the feature exists mostly for
135 rate-limiting on large number of login attempts (brute-forcing
136 passwords) so that should not be much of an issue.
137
138 For a more complex strategy (e.g. database or distribute storage)
139 override this method. To simply change the cooldown criteria
140 (configuration, ...) override _on_login_cooldown instead.
141
142 .. note::
143
144 This is a *context manager* so it can be called around the login
145 procedure without having to call it itself.
146 """
147 # needs request for remote address
148 if not request:
149 yield
150 return
151
152 user_name = request.httprequest.form['login']
153 if self._bys_on_login_cooldown(user_name):
154 raise AccessDenied(_("Too many login failures,1 \r\nplease wait a bit before trying again."))
155 try:
156 yield
157 except AccessDenied:
158 # self._bys_login_failures(user_name)
159 raise
160 else:
161 self._bys_login_success(user_name)
Odoo14 防暴力破解登录密码的更多相关文章
- openssh安装、设置指定端口号、免密码登录、变量传递、防暴力破解
首先确保机器挂在好光盘镜像,然后查看软件包信息 [root@xuegod63 ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev ...
- Linux用root强制踢掉已登录用户;用fail2ban阻止ssh暴力破解root密码
Linux用root强制踢掉已登录用户 首先使用w命令查看所有在线用户: [root@VM_152_184_centos /]# w 20:50:14 up 9 days, 5:58, 3 use ...
- WordPress防暴力破解:安全插件和用.htpasswd保护WordPress控制面板
正在用Wordpress的博主们一定知道最近全球兴起的一波黑客锁定Wordpress暴力破解控制面板密码的风波了,据CloudFlare执行长Matthew Prince所说,所谓的暴力密码攻击是输入 ...
- centos7防暴力破解五种方法
什么是暴力破解,简单来说就是对一个服务器进行无数次尝试登陆,并用不同的密码进行登陆直到可以登陆成功.暴力破解的基本步骤可以分为以下几步: 1. 找到对应的linux服务器 Ip地址 2.扫描端口 ...
- fail2ban的使用以及防暴力破解与邮件预警
fail2ban可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是防火墙),而且可以发送e-mail通知系统管理员! fail2ban运行机制:简单来说其功能就 ...
- [典型漏洞分享]YS的防暴力破解设计存在缺陷
YS使用的防暴力破解机制存在缺陷,该缺陷可被用于暴力破解其它用户密码[高] 问题描述: YS在用户登录页面设置了验证码机制,当用户输入密码错误次数达到3次时,再次登录需要验证码以防止攻击者进行暴力破解 ...
- centos 7 DenyHosts 安装 防暴力破解ssh登陆
为了减少软件扫描ssh登陆 还是用这个比较好点 默认端口号22 也要改 登陆密码也不要使用 弱口令 123456 这样的 Description DenyHosts is a python prog ...
- 记录ssh暴力破解的密码字典
之前我已经在wooyun和91ri上发表了这篇文章,今天转到51cto上... 默认的ssh日志是不带密码记录功能的,现在想把登录密码记录下来,这样就可以搜集黑客的ssh爆破字典了,从而可以反扫回去. ...
- fail2ban 防暴力破解总结
公司服务器安全问题一直是个令人头疼的问题,许多运维的小伙伴一直在用脚本来监控服务器登录状态,然而脚本编写比较麻烦,今天就给大家推荐一款小而精致的防暴力破解工具 fail2ban ,他可以监控系统日志, ...
随机推荐
- RapidIO 逻辑层IO操作与Message操作的原理和区别
接上一篇 SRIO RapidIO (SRIO)协议介绍(一) 1 说明 查看协议手册时会发现,逻辑层的操作分成了IO和Message 2类动作,那么为什么要分成2类操作?从原理和应用角度来看 ...
- 利用 Onekey Theater 改善屏幕显示效果
介绍 Onekey Theater(一键影音),它是联想笔记本带的一键影音功能,使用它能够更改笔记本的显示效果和音效,以此模仿电影院的效果,为用户带来更好是视听效果及享受. 作用 之前的联想笔记本自带 ...
- STM32 CubeMx使用教程
一.STM32CubeMX 简介 STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具,目的就是为了方便开发者, 允许用户使用图形化向导生成C 初始化代码,可以 ...
- 异常——JavaSE基础
异常 异常的分类 检查性异常 运行时异常:可能被程序员避免的异常,运行时异常可以在编译时被忽略 错误ERROR:错误不是异常 在Java中把异常当作对象来处理,并且定义了一个基类java.lang.T ...
- DAST 黑盒漏洞扫描器 第二篇:规则篇
0X01 前言 怎么衡量一个扫描器的好坏,扫描覆盖率高.扫描快.扫描过程安全 而最直接的效果就是扫描覆盖率高(扫的全) 怎么扫描全面,1 流量全面 2 规则漏报低 流量方面上篇已经讲过,这篇主要讲扫描 ...
- Fiddler对安卓高版本进行抓包解决方案以及分析 进阶二
今天是2021年的最后一天了,多分享一些干货吧!看过上一章节教程后会有同学疑惑,我也一步一个脚印的,跟着流程走也设置了代理以及安装了证书,有的同学会发现 为什么手机不能够连接网络了呢?细心一点的同学会 ...
- NetCore框架WTM的分表分库实现
介绍 本期主角: ShardingCore 一款ef-core下高性能.轻量级针对分表分库读写分离的解决方案,具有零依赖.零学习成本.零业务代码入侵 WTM WalkingTec.Mvvm框架(简称W ...
- Linux切换中英文输入
使用xshell登录Linux服务器后,输入的命令正确但是提示命令不存在,这是什么鬼. 通过移动光标可以发现两种字体的宽度不一样 解决方法 shift + 空格 进行切换
- Ubuntu 配置 .NET 使用环境
本文迁移自Panda666原博客,原发布时间:2021年3月29日. 说明 测试使用的环境 Linux版本:Ubuntu Server 20.04 LTS x64 .NET SDK版本:5.0 其他版 ...
- WPF开发随笔收录-DataAnnotations实现数据校验(MVVM架构下)
一.前言 在自己的项目中挺多地方需要涉及到数据验证的,初期的实现方式都是通过点击确定后再逐个验证数据是否符合要求,但这种方式会让后台代码变得很多很乱.于是就开始在网上需求好的解决方式,刚好看到了一个大 ...