当前位置: 首页 > news >正文

[笔记] BAD PASSWORD ,linux 修改密码历程

随着人们对安全意识的逐渐提升,Linux 中的密码策略也变得越来越复杂,导致使用 passwd 改密时需要花费大量时间来应付密码策略。这里回顾一下这艰难的改密之路。

背景

先描述一下我当前的环境,由于是在测试环境中,有大量用于测试的 Linux 主机,而且是所有人共用一个环境。由于 Linux 中的安全策略,导致每隔一段时间都要修改一次密码,否则就无法登录。那么问题来了,如果我改了密码,也就意味着当别人再尝试登录这个节点的时候就必须要知道我设置的新密码是什么。大家一起共同维护一个密码本文档是一个不错的主意。但是由于是测试环境,在没有安全策略的要求下,如果不修改密码或者密码修改为原来的密码对大家是最方便的。

先介绍一种终极改密方法,这个方法要求你当前拥有 root 权限,最好是能在 root 账号下执行命令。

密码文件 /etc/shadow

Linux 中的账号密码都是存在 /etc/shadow这个文件中,格式如下:

root:$6$O.Tl3mmBnJyGT9OX$B2c0FGTOLQwNMrLjK1T8fnrRRcklh7VUhXyy3YlvHqkjeIIwoRpNeMqL8niu6zxKsmI8euCbhjvCqq.BROeZr/:19682:0:99999:7:::
# root 用户名
# $6$0******$***** 密码加盐散列结果
# 19682 最后一次修改密码的日期
# 0 至少多少天修改一次密码
# 99999 最多多少天修改一次密码

其中 root 后面以 $ 开头的一段文本就是对应的账号密码,当然不是明文,而是通过 sha-1、sha-2 之类的散列算法处理之后的结果,当然无法被还原为原来的结果。但我们可以通过手动生成这段密码文本,然后替换到对应的位置,就能够不使用 passwd 就完成改密。

我们可以使用 openssl 命令生成这段散列密码:

# 生成一段密码散列,散列明文为 123456
> openssl passwd -6 123456
$6$ZsbAR/U7DbhfuPiI$O9z7VzKD6oFQKXm3S8X22tkF200MO9BlqfHF8e.IPaXgAndWPBpeVU.9mvcj2O94.KMVs7yeK5YYnEzB3rzQR1
# -salt 指定盐值,可以不指定
# -6 指定散列类型为 sha256/sha512

上面命令执行后生成的文本就是我们的密码散列了,我们可以将这段文本替换到 /etc/shadow 文件我们想要改密的账户下,就能够完成改密了。这样就能绕过 passwd 的安全策略了。

# 首先用 lsattr 查看 /etc/shadow 文件的权限
> lsattr /etc/shadow
----i---------e------- /etc/shadow
# 如果有 i 选项的话,可以使用 chattr 命令移除改该选型
> chattr -i /etc/shadow
# 在修改密码完成后,可以将属性添加回来
> chattr +i /etc/shadow

passwd 命令遇到的问题

Password has been used already. Choose another.

遇到的最痛苦的一个安全策略了,即密码已被使用,需要设置一个新的密码。如果想绕开这个策略,Linux 旧的密码文件保存在 /etc/security/opasswd 目录下,可以通过删除改文件移除历史用过的密码(root下)

/usr/bin/rm -f /etc/security/opasswd*

BAD PASSWORD: it is based on a dictionary word

这表示你的密码是基于 Linux 的安全策略字典,这个安全策略保存在了 /etc/pam.d/system-auth 文件中,可以通过调整文件中配置策略绕过该问题。

Authentication token manipulation error

root用户或者普通用户修改密码失败 ;报的错误 密码:身份验证令牌操作错误;一般是密码文件的权限的问题,或者是该用户锁定不能修改密码,或者是根目录空间满了。

首先查看磁盘空间是否满了df -hl,如果满了,查找出占用较大的无用文件清空或删除;常用到命令:

du -lh --max-depth=1 :查看当前目录下各文件大小
du -sh:查看当前目录总的大小
du -sh * | sort -n:统计当前目录下文件大小,并按文件大小排序
du -sk file_name:查看指定的file文件大小

其次可以用lsattr命令查看存放用户和密码的文件属性lsattr /etc/passwdlsattr /etc/shadow,(i:不得任意更动文件或目录),如果有i选项,则会导致所有的用户都不能修改密码,因为没有权限允许;
可以用chattr命令将i权限撤销 chattr -i /etc/passwdchattr -i /etc/shadow,然后再修改用户密码。

chattr +i /etc/passwd
# 添加 i 选项不得任意修改文件或目录
lsattr /etc/passwd
----i---------e------- /etc/passwd
# 通过 chattr -i 移除 i 属性
chattr -i /etc/passwd

faillock 账户锁定问题解决

examplesystem login: baeldung
The account is locked due to 3 failed logins.
(10 minutes left to unlock)
Password:

在 Linux 下当账户密码输入错误次数过多时,会被认为遇到了暴力破解攻击,在公网环境下当然需要认真对待,通过安装安全组件并部署安全策略来提高安全性。但是在测试环境下安全策略只会影响开发者们的拔刀速度,因此如果有足够的权限的话测试环境下还是禁掉这个安全策略吧。

# 直接使用 faillock 命令可以查看当前被禁用的账号以及登录的 ip
> faillock
ghimi:
When                Type  Source                                           Valid
2022-06-21 18:32:16 RHOST 192.168.0.22                                         V
2022-06-21 18:32:29 RHOST 192.168.0.22                                         V
2022-06-21 18:32:41 RHOST 192.168.0.22                                         V
user:
When                Type  Source                                           Valid
2022-06-21 19:12:23 TTY   pts/0                                    V> faillock --user baeldung  --reset   
# 使用 faillock --reset 命令接触禁用                                           

其他相关的文件

文件路径说明
/etc/passwd保存了一些账户的权限信息,包括权限策略
/etc/login.defs定义了一些密码过期策略

chage -l 查看账户密码过期策略:

root:~# chage -l root
Last password change (最后一次密码修改时间)               : Mar 03, 2024
Password expires   (密码过期时间)                        : never
Password inactive   (密码失效时间)                       : never
Account expires      (账户过期时间)                      : never
Minimum number of days between password change (最少修改密码天数) : 0
Maximum number of days between password change  (最多修改密码天数): 99999
Number of days of warning before password expires  (密码过期多少天前发出告警): 7

passwd -d cina 清除账户密码

passwd -d cina
# 通过 -d 选项可以清除一个账户的密码,后续登录账户时就不需要密码了

参考资料

  • Manually generate password for /etc/shadow
  • chage Command Examples in Linux
  • Linux 修改用户密码
  • 如何设置Linux密码复杂度策略?
  • How to clear password history in Linux
  • How to set password complexity on Linux
  • man-faillock

相关文章:

  • WPF 命名空间解释
  • istio 设置 istio-proxy sidecar 的 resource 的 limit 和 request
  • 百度蜘蛛池平台在线发外链-原理以及搭建教程
  • uni-app中web-view的使用
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • 数据结构:Trie(前缀树/字典树)
  • 2核4g服务器能支持多少人访问?阿里云2核4g服务器在线人数
  • 【论文精读】CAM:基于上下文增强和特征细化网络的微小目标检测
  • 基于RLS的永磁同步电机谐波抑制--FFT分析
  • C++蓝桥考级一级到十八级的考点内容整理
  • LeetCode题练习与总结:字母异位词分组
  • Java类与对象:从概念到实践的全景解析!
  • 在 Linux 中通过 SSH 执行远程命令时,无法自动加载环境变量(已解决)
  • 【Leetcode】top 100 栈
  • SpringBoot -- 整合SpringMVC
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • avalon2.2的VM生成过程
  • Brief introduction of how to 'Call, Apply and Bind'
  • JavaScript新鲜事·第5期
  • ReactNative开发常用的三方模块
  • Sublime text 3 3103 注册码
  • 电商搜索引擎的架构设计和性能优化
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 算法系列——算法入门之递归分而治之思想的实现
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 正则表达式
  • 自定义函数
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​TypeScript都不会用,也敢说会前端?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ###项目技术发展史
  • #Linux(Source Insight安装及工程建立)
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (04)odoo视图操作
  • (13)Hive调优——动态分区导致的小文件问题
  • (bean配置类的注解开发)学习Spring的第十三天
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (LeetCode 49)Anagrams
  • (pytorch进阶之路)扩散概率模型
  • (二)c52学习之旅-简单了解单片机
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (转载)hibernate缓存
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .cn根服务器被攻击之后
  • .form文件_一篇文章学会文件上传
  • .net core 连接数据库,通过数据库生成Modell
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .net连接MySQL的方法
  • .Net面试题4