记一次root用户在本地登录及SSH连接均遭遇permission denied的问题排查经过
某日一位老师反映,机房的6号节点无法登录了。一开始以为是为节点防火墙配置IP白名单时忘记了加进去,但随后发现此节点并未进行白名单配置,密码也一直未有变更,于是在自己的电脑上连接,发现终端里很快显示出了Last login信息,说明这时应该已经成功与节点进行了连接,但随后就报出Connection closed,连接被关闭了。
都在一栋楼里,不大可能是网络问题,于是去机房里排查问题。将KVM控制平台连接到节点上后,发现屏幕上输出了一些类似设备调试中的报错信息,且已经完全卡死,不接受键盘的中断信号,于是只好长按强制关机,但再次开机后怪事发生了。
输入用户名root和密码后,Shell给出了这样的提示

(failed login是之前记错密码导致的)
显然不是密码问题,因为Last login信息已经显示就表明密码无误,但root用户在本地登录都会被拒绝,这个就有点吓人了,第一时间想到是不是遭遇黑客,赶紧到网上搜索相关问题,但回答大多都是针对SSH登录的情况,未见到本地登录也会被拒绝。有些文章提到可用普通用户登录,但此节点并未设置其他用户,无法尝试。
想要进行修复工作,首先必须想办法进入系统,于是尝试了一下单用户模式(关于单用户模式可参见 https://blog.51cto.com/hqq0000/2177280),发现可以进入!这下先松了一口气,至少实在没辙了可以把数据导出然后重装系统,要不然就得把整个集群断电拆硬盘了。
在单用户模式下,先修改了下密码,发现没用;然后又怀疑是不是bash出了问题,因为permission denied常见于执行某些没有执行权限的文件时,如果/bin/bash被恶意更改了权限,貌似是可能报这样错误的,但用ls -l看了下,也不是bash的事。
想到登录失败,日志中会有记录,于是查看/var/log/secure,发现末尾有如下一段记录

似乎登录失败的原因就出在这个pam上。PAM是Linux的一个动态验证模块,可能是它阻止了我们的登录行为。注意到最后几行,有提到nofile,这不是Linux最大打开文件数那个限制参数吗?于是进行调整(参见https://www.iteye.com/blog/jameswxx-2096461 总结的很不错),但仍未能解决问题。
继续分析日志,发现这样一行

确实,6号节点的所有用户,uid都小于1000,于是根据网上的解决方案(https://help.aliyun.com/knowledge_detail/41491.html?spm=a2c6h.13066369.0.0.2edd1479unyVgh),对/etc/pam.d下的文件进行修改,把system-auth中的相关语句注释掉了

但重启后发现还是没用!原来system-auth 会在重启后自动恢复配置,手工更改是无效的。
那么换个思路,既然禁止uid<1000的用户登录,我使用>1000的不就可以了?继续在单用户模式下,adduser创建了一个普通用户,passwd设置密码,并加入到root组里使其可以用sudo,重启,登录......
......还是不行......
难道就没有办法绕过pam了吗?突然想到ssh_config里好像有一个参数与PAM有关,叫use_PAM,马上打开一看,果然,被设置为了yes,赶紧改回no,然后回楼上ssh连接。
普通用户,root均成功!这回可算是解决了。
总结
经过一番排查,最终定位是PAM惹的祸,如果自己对PAM熟悉,应该会更快地定位问题。目前只是恢复了root用户的远程登录,对于root为什么在本地也会被拒绝,还未能找到答案。
但另一方面来讲,Linux设置PAM也必然有自己的考量,运行root远程登录,本身就存在一定安全风险,管理员还是应该只允许普通用户远程登录,而后使用su切换或sudo执行命令。
记一次root用户在本地登录及SSH连接均遭遇permission denied的问题排查经过的更多相关文章
- 【Hadoop系列】linux下 root用户免密码登录远程主机 ssh
SSH原理:[Hadoop系列]linux SSH原理解析 操作环境: CentOS 6.5 操作对象: 用户A主机和远程主机B 正文部分:斜体加粗代表linux指令. linux下 非root用户免 ...
- 记一次由selinux引起的使用cat查看文件报错Permission denied的问题排查
事件起因:如下 1.在服务器上root用户,定期会生成一个文件,到/tmp目录,如:qq_5201351.txt,给other加上了r读取 2.zabbix端会周期性取这台服务器/tmp/qq_520 ...
- MySQL普通用户无法本地登录的解决方法及MySQL的用户认证算法
在安装完成MySQL后,我们通常添加拥有相应权限的普通用户用来访问数据库.在使用普通用户本地登录数据库的时候,经常会出现怎么登录也无法登录的情况. 例如,我的MySQL中的用户为: mysql> ...
- Linux设置以root用户开机自动登录桌面
目录 Ubuntu 18.04系统下设置 Redhat7.6系统下设置 Ubuntu 18.04系统下设置 1. 允许使用root用户登录桌面 Ubuntu默认不允许使用root用户登录桌面的, ...
- ESXI启用本地登录和SSH服务连接功能,使用Xshell连接
1.选中Troubleshoot Options进行SSH服务配置 2.开启本地登录功能 3.开启远程连接功能 4.本地登录修改SSH服务允许基于密码登录 默认无法用密码登录ssh服务,只支持基于ke ...
- 已知root用户密码并登录,修改mysql用户名密码方法
首先进入命令行下:以root用户登录,命令:mysql -uroot -p 回车 输入密码:mysql>use mysql:mysql>UPDATE user SET password=P ...
- MySQL 5.7免安装版设置编码格式、设置root用户密码 远程登录.
一.设置默认编码格式为utf-8 ... 由于免安装版并没有my.ini的配置文件.需要自行粘贴配置并创建一个my.ini 配置如下: [mysql] # 设置mysql客户端默认字符集 defaul ...
- 服务器ssh登录提示“Permission denied, please try
原因:不用怀疑,一般情况下,就是你密码输入错误了. 解决:找到正确的密码输入. 当然,也有可能是下面的情况: 在Windows中使用ssh客户端连接,提示"ssh服务器拒绝了密码,请再试一次 ...
- MySQL密码正确却无法本地登录,ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
MySQL密码正确却无法本地登录 报错如下: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password ...
随机推荐
- jack反序列化自定义字段绑定,报错:can only instantiate non-static inner class by using default, no-argument constructor
package com.xxx; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import lo ...
- Java内部类(2):普通的成员内部类
在成员内部类中要注意两点 第一:成员内部类中不能存在任何static的变量和方法: 第二:成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类. 接下来是两个例子(关键字:.this . ...
- Flask之上下文管理机制
前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...
- bash-2 httpd服务的源码编译安装脚本
httpd服务的源码编译安装脚本 #!/bin/bash # #******************************************************************** ...
- 【Web】如何注释?
HTML 形式:<!-- 注释内容 --> 实例: <!-- <p>这是第一段</p> --> CSS 形式:/* 注释内容 */ 实例: /* 选中i ...
- 【POJ - 1970】The Game(dfs)
-->The Game 直接中文 Descriptions: 判断五子棋棋局是否有胜者,有的话输出胜者的棋子类型,并且输出五个棋子中最左上的棋子坐标:没有胜者输出0.棋盘是这样的,如图 Samp ...
- B-tree 和 B+tree过程
https://blog.csdn.net/baiyan3212/article/details/91043695 https://www.jianshu.com/p/0371c9569736
- [git] git error: unable to unlink old
今天git pull ,结果报错 : git error: unable to unlink old 原因是 文件夹内 一个exe 处于打开状态. 哈哈哈哈,又是个低级错误~~~ 下次注意呀~
- docker学习笔记之把容器commit成镜像
docker提供了两种镜像制作的方式,提高了使用的灵活性: 1.可以将更改后的容器提交,制作成镜像(这是接下来要说明的) 2.通过Dockerfile来制作镜像 下面通过一个例子来展示方法1. 本地有 ...
- __declspec(dllexport)的作用
加了之后发现,用ollydbg导入dll,可以自动判断某个函数是导出函数