linux 设置在连续输错错误密码n次后,锁定该用户

一、在字符终端下,实现某一用户连续错误登陆N次后,就锁定该用户X分钟(pam_tally2)

执行 vim /etc/pam.d/login#%PAM-1.0 下新起一行,加入

auth required pam_tally2.so deny=3 unlock_time=5 even_deny_root root_unlock_time=10

如果不限制root用户,则可以写成

auth required pam_tally2.so deny=3 unlock_time=5

even_deny_root 也限制root用户;

deny 设置普通用户和root用户连续错误登陆的最大次数,超过最大次数,则锁定该用户; unlock_time 设定普通用户锁定后,多少时间后解锁,单位是秒;

root_unlock_time 设定root用户锁定后,多少时间后解锁,单位是秒;

备注:

1、此处使用的是 pam_tally2 模块,如果不支持 pam_tally2 模块可以使用 pam_tally 模块。另外,不同的pam版本,设置可能有所不同,具体使用方法,可以参照相关模块的使用规则。

2、也可以直接在 system-auth 文件中直接添加这些命令,修改完成后,凡是调用 system-auth 文件的服务,都会生效。因为有自动解锁时间,所以,不用担心全部限制后,会出现永远无法登陆的”尴尬”情况。

3、可以使用 pam_tally2 -r -u username 命令,手动清除某用户记录次数。

二、设置Linux用户连续N次登陆失败时,自动锁定X分钟(pam_tally)

1、如果想在所有登陆方式上,限制所有用户,可以在 /etc/pam.d/system-auth 中增加2行

auth  required  pam_tally.so  onerr=fail  no_magic_root
account  required  pam_tally.so   deny=3  no_magic_root  even_deny_root_account  per_user  reset

deny 设置普通用户和root用户连续错误登陆的最大次数,超过最大次数,则锁定该用户; no_magic_root 连root用户也在限制范围,不给root特殊权限。

详细参数的含义,参见 /usr/share/doc/pam-xxxx/txts/README.pam_tally

如果不想限制root用户,可以将 even_deny_root_account 取消掉。

2、针对不同服务来限制不同登陆方式 只在本地文本终端上做限制,可以编辑如下文件,添加的内容和上方一样。 vim /etc/pam.d/login 只在远程telnet、ssh登陆上做限制,可以编辑如下文件,添加的内容和上方也一样。 vim /etc/pam.d/remote vim /etc/pam.d/sshd

3、手动解除锁定:

查看某一用户错误登陆次数:

pam_tally –user username

例如,查看work用户的错误登陆次数:

pam_tally –user work

清空某一用户错误登陆次数:

pam_tally –user username –reset

例如,清空 work 用户的错误登陆次数,

pam_tally –user work –reset faillog -r 命令亦可。

4、pam_tally没有自动解锁功能 因为pam_tally没有自动解锁的功能,所以,在设置限制时,要多加注意,万一全做了限制,而 root用户又被锁定了,就只能够进单用户模式解锁了。

当然,也可以添加crontab任务,达到定时自动解锁的功能,但需要注意的是,如果在/etc /pam.d/system-auth 文件中添加了pam_tally的话,当root被锁定后,crontab任务会失效,所以,最好不要在system-auth 文件中添加pam_tally。


### MySQL明文密码登录失败的原因分析及解决方案 #### 原因一:认证插件不兼容 自MySQL 8.0起,默认的认证插件由`mysql_native_password`更改为`caching_sha2_password`。这可能导致某些客户端无法加载新的认证插件,从而引发登录失败的问题[^4]。 #### 解决方案一:更改默认认证插件 可以通过修改用户的认证插件来解决此问题。具体操作如下: 1. 使用管理员权限登录MySQL服务器。 2. 执行以下SQL语句以更改指定用户的认证插件为`mysql_native_password`: ```sql ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码'; ``` 3. 刷新权限并退出重试: ```sql FLUSH PRIVILEGES; ``` #### 原因二:密码策略过于严格 MySQL可能启用了严格的密码验证策略,导致不符合安全要求的明文密码被拒绝。 #### 解决方案二:调整全局密码策略 可以降低密码强度校验的要求,允许简单的明文密码通过验证。执行以下命令可禁用密码策略: ```sql SET GLOBAL validate_password.policy=LOW; ``` 或者完全关闭密码策略: ```sql UNINSTALL PLUGIN validate_password; ``` #### 原因三:服务未正常启动或端口冲突 如果MySQL服务未能成功运行,则即使提供了正确的用户名和密码也无法完成身份验证。 #### 解决方案三:检查并重启MySQL服务状态 确认MySQL进程是否存在以及监听端口是否开放。对于Windows系统而言,可通过服务管理器查看;而对于Linux则使用命令行工具检测: ```bash sudo systemctl status mysql.service netstat -an | grep 3306 ``` 假如发现异常情况,尝试停止再重新开启服务试试看效果如何: ```bash sudo service mysql stop && sudo service mysql start ``` #### 原因四:账户锁定或权限不足 当多错误密码后可能会触发自动锁住机制,另外即便解锁也可能因为缺乏相应访问控制列表中的条目而遭到阻止。 #### 解决方案四:解除账号封锁状况并且赋予适当权利 先判断目标用户是否有遭受限制影响: ```sql SELECT * FROM performance_schema.account_usage WHERE user='your_user'; SHOW WARNINGS; ``` 接着按照实际情况采取行动恢复正常使用功能: - 如果是因为连续失误造成暂时性的不可达现象的话可以直接跳过等待时间立即恢复正常; - 若属于长期失效情形则需手动设置有效期范围之外的时间点作为起点计算向前推移一定周期数直至当前时刻为止期间均视为有效期内无任何约束条件下的自由进出模式即可实现彻底解放枷锁的目的同时还要记得补充授予必要的许可事项以免再遭遇类似的困境局面发生哦! --- ### 提供一段示例代码用于演示如何创建带有加密处理的新记录入库流程 以下是基于JSON数据结构向数据库表单写入经过AES算法保护后的敏感字段值的一个例子说明文档片段内容摘抄部分展示给大家参考学习一下吧😊: ```cpp bool UserDAO::insert(const std::string& username,const std::string& passwd){ MYSQL* conn=mysql_init(NULL); if(!conn)return false; const char* server="127.0.0.1"; uint port=3306; const char* user="testUser"; const char* password="testPass"; if(!(conn=mysql_real_connect(conn,server,user,password,"mydb",port,NULL,CLIENT_FOUND_ROWS))){ fprintf(stderr,"%s\n",mysql_error(conn)); return false; } string sqlStr=fmt::format( R"(INSERT INTO users(username,pwd_hash) VALUES('{}',HEX(AES_ENCRYPT('{}','encryption_key'))))", mysql_real_escape_string_quote(conn,username.c_str(),username.length()), mysql_real_escape_string_quote(conn,passwd.c_str(),passwd.length()) ); int res=mysql_query(conn,sqlStr.c_str()); mysql_close(conn); return !res; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值