SSH登录提示Permission Denied的排查

简介: 简介: ssh登录密码错误情况下排查办法,以及如何模拟生成/etc/shadow文件中加密过的密码hash串

背景

用户反馈使用密码无法正常登录,提示“Permission Denied”,需要重置密码后才能正常,而相同的密码在一个月前能正常登录,一共有两台实例有这样的现象。

分析

一般来说,类似问题可以从几个方面来考虑可能性:

  • SSH server配置问题
  • 服务器密码被改动过或者密码相关配置文件被改动过
  • 通过远程或者VNC的方式键入密码传递到系统内时候发生了变动
  • 记错密码

以上几点我们一一进行排查,由于要保留现场,无法重置密码后再登录查看,我们可以通过将系统盘快照做成云盘来绕过登录的环节,从而进入系统。
挂载快照盘,我们通过chroot进入系统,要定位是否密码有改动或者配置文件有变动,我们首先通过stat查看/etc/ssh/目录下各文件,从mtime/ctime时间戳来看,最近的改动在一年多前,说明sshd如果是读取的正常路径配置文件,那么用户名和密码以及sshd相关配置都没有被改动过。

111.png

单方面看MAC时间可能说服力不够,我们通过查看配置文件和对比测试进一步说明sshd正常工作且服务器端没有改动:

  1. 实际查看/etc/ssh/sshd_conf配置文件,发现是保持的默认配置,没有异常改动。
  2. 有快照的前提下,尝试修改密码/重置密码,之后再登录发现可以正常登录。

以上排查验证了服务器端没有改动且sshd工作正常,为了验证是否输入密码到sshd读取过程是否存在异常,我们挂载快照盘并chroot进入系统,通过strace来跟踪sshd进程以及其fork出的进程,之后通过ssh自己系统来规避网络上的影响。我们可以看到输入的密码在被读取时候并没有发生改变。也能从strace输出中了解到去读取的配置文件是正常路径的配置文件。说明输入的密码在验证之前也没有被修改过。
基于以上信息,我们基本可以肯定是用户密码记录存在问题。但用户也表示从数据库读取的,期间没动过数据库,应该不会出现问题,那么为了更进一步说服用户,我们可以考虑实际验证一下用一样的办法加密密码明文后获取的信息是否和/etc/shadow里记录的一致。
我们知道密码加密后的口令存储在/etc/shadow文件里,那么我们来看一下/etc/shadow文件里的口令存储形式,以CentOS 7.2为例:

root:$6$KqCVFlfd$vAARGaFcI5mNWGoOSJeE87ZrI5anStEWZYRz6EkrvXRSuD7X1teJwrWvC2a3YQRSeKuDaqmuN5ScinV/fvOyy0:17497:0:99999:7:::

这里引用wiki的注解:

User login name
salt and hashed password OR a status exception value e.g.:
"$id$salt$hashed", the printable form of a password hash as produced by crypt (C), where "$id" is the algorithm used. (On GNU/Linux, "$1$" stands for MD5, "$2a$" is Blowfish, "$2y$" is Blowfish (correct handling of 8-bit chars), "$5$" is SHA-256 and "$6$" is SHA-512, other Unix may have different values, like NetBSD. Key stretching is used to increase password cracking difficulty, using by default 1000 rounds of modified MD5, 64 rounds of Blowfish, 5000 rounds of SHA-256 or SHA-512. The number of rounds may be varied for Blowfish, or for SHA-256 and SHA-512 by using e.g. "$6$rounds=50000$".
Empty string – No password, the account has no password (reported by passwd on Solaris with "NP").
"!" – the account is password locked, user will be unable to log in via password authentication but other methods (e.g. ssh key) may be still allowed.
"LK" or "*" – the account is locked, user will be unable to log in via password authentication but other methods (e.g. ssh key) may be still allowed.
"!!" – the password has never been set (RedHat)
Days since epoch of last password change
Days until change allowed
Days before change required
Days warning for expiration
Days before account inactive
Days since epoch when account expires

这里我们主要需要关注的部分是$id$salt$hashed,其中$id是加密算法,$salt是混入加密算法的盐,$hashed是经过加密算法hash对应密码和盐的结果。

ID | Method
───────────────────────────
1 | MD5
2a | Blowfish (not in mainline glibc; added in some Linux distributions)
5 | SHA-256 (since glibc 2.7)
6 | SHA-512 (since glibc 2.7)

这种场景加密过程就是将密码通过加密算法计算得到一个hash串,从hash串是无法反推出密码的。而加入盐的目的是增强加密复杂性,规避一些强行破解的办法。
具体加密算法介绍可以参考:https://en.wikipedia.org/wiki/SHA-2

在实际设置密码过程中,salt是随机生成的,shadow文件记录加密算法、salt以及加密后hash串,而当有用户登录时候,会将输入的密码与shadow文件中salt基于加密算法重新计算一次然后跟hash串比对,如果相同,则说明密码正确。
我们有了算法和salt后,那么就可以实际验证用户提供的密码加密后的hash串是否跟shadow文件中对应用户的hash串相符。

RHEL 6 and newer - python
• Execute the following one-liner:
$ python -c 'import crypt,getpass; print crypt.crypt(getpass.getpass())'
Password:
$6$Q3dbIWgPMCVBpRZK$QSw1cG41FImM0E8B.Hpx1G8eZGqHALzGg75LLAt.MkFZtVma3MHRGBpFSrXEEdVHwySr8B0JfXAgLHgmpSViI0
In short, the above will prompt for input and then interface with python's implementation of the standard crypt() function, generating a shadow-compatible hash by choosing a random salt and the strongest hash method available (SHA-512)
• For documentation, do as the following demonstrates
$ python
Python 2.6.6 (r266:84292, May 1 2012, 13:52:17)
[GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
import crypt
help(crypt)
RHEL 5 and newer - perl
• Execute the following one-liner:
$ perl -le 'print "Password:"; stty -echo; chomp($passphrase=); stty echo; @chars = ("a".."z", "A".."Z", 0..9, ".", "/"); $salt .= $chars[rand @chars] for 1..16; print crypt($passphrase, "$6$$salt");'
Password:
$6$RDGTu1VHQPH2NLpw$no4LMowmxaJogzYoIUdsfi7pfTz2EtzN//oRmEe12AEWc2h6NPoQwrWA4KYe4W0OSAUaBLOG8K59kzENV2bvY0
• Notes on the above perl code:
○ This code was tested by the author on RHEL 5 - RHEL 7; however, it is offered without any guarantees or warranty (to use it, ensure the quotation marks and backslashes are kept intact)
○ This code generates a SHA512-hashed password string; to use SHA256 instead, change the maroon-colored $6 to a $5

*以上为RedHat给出的模拟方式

为了让数据更有说服力,我们先要验证加密办法是对的,通过类似方法加密的信息能正确跟shadow文件里存储的信息对的上。

222.png

验证符合后,我们进一步验证用户提供的密码信息。发现从用户提供的密码来正向获取hash串后跟shadow里root的不匹配,由此进一步说明了是用户提供的密码存在问题。

cat /mnt/etc/shadow
root:$6$D9.mVsWm$W9XlxzRHWU6B6KFNaPZQPCkXF0GrL.Cq.zzx2H24qaDC4bphDFZqZtD5G.t1Rz1cegl2tyQAdx9W6iBoJTANc.:17013:0:99999:7:::
python -c 'import crypt; printcrypt.crypt("Spidermanwsx123","$6$D9.mVsWm")'
$6$D9.mVsWm$Y8rVe1915SlIkdwOloHhFedpW2MZ7xYOYHy69jXOoZqyodDm5WJOBP4P/EeLP1BjJlibHwovaHqawTWD05c6o1
目录
相关文章
|
4月前
|
应用服务中间件 网络安全 数据安全/隐私保护
网关服务器配置指南:实现自动DHCP地址分配、HTTP服务和SSH无密码登录。
哇哈哈,道具都准备好了,咱们的魔术秀就要开始了。现在,你的网关服务器已经魔法满满,自动分配IP,提供网页服务,SSH登录如入无人之境。而整个世界,只会知道效果,不会知道是你在幕后操控一切。这就是真正的数字世界魔法师,随手拈来,手到擒来。
240 14
|
7月前
|
安全 Linux 网络安全
CentOS 8下SSH连接超时与“无法加载主机密钥”错误的排查与修复
在CentOS 8系统中,宝塔面板提示“出错了,面板运行时发生错误”,导致插件无法正常显示。同时,SSH连接超时,修复面板功能失效。通过VNC连接排查,发现SSH服务安装和配置问题频发,最终通过重装SSH、调整权限并重新生成主机密钥文件解决问题,成功恢复SSH连接。
461 16
|
7月前
|
安全 网络安全 数据安全/隐私保护
Debian 12系统中允许Root远程SSH登录解决方法!
在 Debian 12 系统中开启 SSH 远程 Root 登录需修改 SSH 配置文件 (`sshd_config`),将 `PermitRootLogin` 设置为 `yes` 并确保密码认证启用。完成后重启 SSH 服务并验证连接。若防火墙启用,需放行端口 22。注意,直接开放 Root 登录可能带来安全风险,建议使用普通用户登录后切换至 Root。
693 1
|
JavaScript 应用服务中间件 Linux
【应用服务 App Service】解决无法从Azure门户SSH登录问题
【应用服务 App Service】解决无法从Azure门户SSH登录问题
193 0
|
10月前
|
监控 Ubuntu 安全
debian或Ubuntu中开启ssh允许root远程ssh登录的方法
在Debian或Ubuntu系统中启用root用户的SSH远程登录需要编辑SSH配置文件、设置root密码并重启SSH服务。虽然这可以在某些情况下提供便利,但必须注意安全性,通过使用强密码、限制IP访问、使用SSH密钥认证等方法来保护服务器的安全。
4305 5
|
机器学习/深度学习 存储 Linux
【机器学习 Azure Machine Learning】使用VS Code登录到Linux VM上 (Remote-SSH), 及可直接通过VS Code编辑VM中的文件
【机器学习 Azure Machine Learning】使用VS Code登录到Linux VM上 (Remote-SSH), 及可直接通过VS Code编辑VM中的文件
188 4
|
安全 Shell Linux
如何禁止某个用户使用ssh登录
本文介绍了五种禁止用户通过SSH登录的方法:1) 修改`/etc/ssh/sshd_config`文件中的`DenyUsers`和`DenyGroups`来阻止特定用户或用户组登录;2) 将用户的默认shell设置为`/usr/sbin/nologin`或`/bin/false`以禁用其SSH访问;3) 利用PAM(可插入认证模块)通过编辑`/etc/security/sshd.conf`来限制登录权限;4) 通过编辑`/etc/hosts.deny`文件拒绝特定用户的SSH访问;5) 锁定或禁用用户账号以阻止所有类型的登录。每种方法都提供了详细的步骤指导。
1778 1
|
安全 Linux Shell
Linux系统之间实现免密码登录(SSH无密码登录
【8月更文挑战第21天】要在Linux系统间实现SSH免密码登录,需先在源机器生成SSH密钥对,然后将公钥复制到目标机器的`.ssh/authorized_keys`文件中。可通过`ssh-keygen`命令生成密钥,并使用`ssh-copy-id`命令传输公钥。最后测试SSH连接,确保能无密码登录。若目标机器缺少相关目录或文件,需手动创建并设置适当权限。完成这些步骤后,即可实现安全便捷的免密码登录。
646 0
|
20天前
|
Linux 网络安全 Docker
盘古栈云,创建带ssh服务的linux容器
创建带ssh服务的linux容器
84 10
|
3月前
|
监控 Linux 网络安全
FinalShell SSH工具下载,服务器管理,远程桌面加速软件,支持Windows,macOS,Linux
FinalShell是一款国人开发的多平台SSH客户端工具,支持Windows、Mac OS X和Linux系统。它提供一体化服务器管理功能,支持shell和sftp同屏显示,命令自动提示,操作便捷。软件还具备加速功能,提升访问服务器速度,适合普通用户和专业人士使用。
395 0