关于云主机root无法从VNC登录处理

一、问题描述

某次基线加固过程中,一线反馈离开工位后,返回时原root登录会话断开,使用普通用户无法切到root,尝试使用移动云控制台进行VNC登录,但也提示登录失败:报:incorrect auth
在这里插入图片描述

二、处理过程

1)单用户模式登录:(救援模式因文件不全,无法处理该场景)

现场使用bclinux8.6(Anolis 8.6)系统,单用户模式只需要启动时,修改grub引导菜单第一项里的linux内核加载菜单,在initrd前面那一行最后面,直接加single后ctrl+x登录即可,输入root密码这时可跳过登录验证

2)检查root用户登录失败原因

查看/var/log/secure和authpriv日志,可看到如下报错:

在这里插入图片描述

3)询问操作前做了什么变更,发现主要操作/etc/pam.d/下文件,最后锁定主要修改其下的login文件,增加了如下内容:

在这里插入图片描述
其中,pam_securetty.so这个PAM模块用于限制只有从指定的终端才能用于root登录。结合/etc/securetty文件完成登录终端的限制,现场正式基于此修改,导致VNC无法登录

4)综上,如果使用它限制了root登录,而vnc又无法登录root账户,可以通过以下步骤进行排查:

  1. 检查/etc/securetty文件,看看限制的终端列表是否包含vnc会使用的虚拟终端,如vcsa等。如果不包含需要添加。
  2. 检查PAM配置文件(通常在/etc/pam.d/目录下),确保与登录相关的服务如login、sshd等都包含了pam_securetty.so模块。
  3. 在PAM配置文件中,尝试将pam_securetty.so模块的control标志设置为sufficient而不是required。
  4. 检查Selinux策略是否存在限制,可以尝试暂时将Selinux模式切换到permissive。
  5. 检查系统日志如/var/log/secure,看看具体是在什么地方禁止了root登录。
  6. 尝试更新vnc相关软件包,或切换到其他vnc实现(如x11vnc)来检查问题是否出在具体实现上。
  7. 如果问题仍未解决,可以尝试完全移除pam_securetty.so模块进行测试。

现场检查/etc/securetty文件为空,故禁止root从任何终端登录,但是要综合考虑基线合规标准:查看/etc/pam.d/login文件的模块类型配置查看login文件中的控制标志配置。查看是否存在auth required pam_securetty.so,存在视为合规。但是又不限制移动云终端VNC登录,综上,在/etc/securetty文件新增tty2豁免,验证VNC登录成功,至此该问题解决。

在这里插入图片描述

三、附录

3.1、救援模式回顾

Grub启动菜单找到linux16行修改ro为rw,删除多余内容,并在行尾添加内核参数rd.break(或init=/bin/bash);完成后按ctrl+x进入救援模式,如下所示:
在这里插入图片描述
进入后执行:

mount -o remount,rw /sysroot
chroot /sysroot
#修改密码
passwd root
touch /.autorelable
exit  #退出/
reboot 或init 6  #重启

3.2、其他登录报错

在这里插入图片描述
当/etc/pam.d/login文件中限制登录的行:auth required pam securettu.so书写错误时,会导致任何用户都无法登陆,报上图错误,修复同上文,删除:login文件中auth required pam securettu.so行多余内容,删除/etc/securetty文件;否则默认所有终端root无法登陆;

3.3、VNC登录

VNC (Virtual Network Computing) 是OpenStack项目中的一项虚拟网络服务,它又称为一个图形化桌面共享系统,它基于图形接口,提供了一个图形化的终端允许用户连接到远程服务器来完成管理操作,实际就是将远端主机的终端界面通过网络传送给当前的用户,就行当前界面就是远程主机一样,因此,它又被当做为一种协议,被称为是一种用于远程访问虚拟机的图形化界面的协议;VNC service是 OpenStack 中的实例控制台服务,能让用户通过浏览器/VNC客户端就能访问到远程的虚拟机;

VNC连接的主要原理是将远程计算机的屏幕图像压缩成图像数据流,并通过网络传输到本地计算机。本地计算机接收到图像数据流后,将其解压缩并显示在本地屏幕上。同时,本地计算机的输入设备(如鼠标和键盘)的操作也会被捕捉,并通过网络传输到远程计算机。远程计算机接收到本地计算机的输入后,将其应用于自己的系统。如下是一端Python代码配置OpenStack 虚拟机VNC的:

import openstack

# Create a connection to the OpenStack API
conn = openstack.connect(cloud='openstack')

# Get the virtual machine by its ID
vm = conn.compute.find_server('vm_id')

# Define the VNC settings
vnc_settings = {
    
    
    'vnc_ip': '192.168.1.100',
    'vnc_port': 5900,
    'vnc_password': 'password123'
}

# Update the virtual machine's metadata with the VNC settings
conn.compute.set_server_metadata(vm, **vnc_settings)

在 Linux 中,VNC 包括以下四个命令:vncserver,vncviewer,vncpasswd,和 vncconnect。VNC基本上是由两部分组成:一部分是客户端的应用程序(vncviewer) ;另外一部分是服务器端的应用程序( vncserver)。VNC的基本运行原理和一些Windows下的 远程控制软件类似。

1、vncserver:此服务程序必须在在主(或遥控)计算机上运行。你只能作为使用者(不需要root用户身份)使用此项服务。

2、vncviewer:本地应用程序,用于远程接入运行 vncserver的计算机并显示其环境。你需要知道远程计算机的IP地址和vncserver设定的密码。

3、vncpasswd:vncserver的密码设置工具。vncserver服务程序没有设置密码将不能运行(好习惯)。如果你没有设置,运行vncserver时它会提示你输入一个密码。所以,一般我不会单独运行这个命令来设置密码。

4、vncconnect:告诉 vncserver连接到远程一个运行vncviewer的计算机的IP和端口号。这样我就可以避免给其他人一个接入的密码。

5、Xvnc:一个vnc“主控”程序,一般来说不需要直接运行。(vncserver和vncviewer实际上是Xvnc的脚本)

VNC连接的通信过程主要分为以下几个步骤:

1.建立连接:当用户在VNC客户端中输入远程计算机的IP地址和端口号后,VNC客户端会请求与远程计算机建立连接。远程计算机上运行的VNC服务器会监听指定的端口,等待客户端的连接请求。
2.认证过程:在建立连接之后,远程计算机会要求客户端进行身份认证。这是为了确保只有经过授权的用户才能远程访问远程计算机。客户端需要提供正确的认证凭证(如密码)才能通过认证过程。
3.图像传输|:认证通过后,VNC服务器会开始捕捉远程计算机的屏幕图像,并将其压缩成图像数据流。然后,VNC服务器将图像数据流通过网络传输到VNC客户端。VNC客户端接收到图像数据流后,将其解压缩并显示在本地计算机的屏幕上。
4.输入传输:同时,VNC客户端还会捕捉本地计算机的输入设备操作,如鼠标移动和键盘输入。VNC客户端将捕捉到的输入操作通过网络传输到VNC服务器。VNC服务器接收到本地计算机的输入后,将其应用于远程计算机的系统。

在OpenStack项目中,我们通常是通过访问 Horizon(OpenStack Web 界面),选择对应的项目和实例。在实例详情页面中,点击 “Console” 标签页。选择 “VNC Console”,然后点击 “Launch Console”,就可以登录 OpenStack 的被控制节点/虚拟机实例。如想关闭VNC功能时,可编辑Nova配置文件:/etc/nova/nova.conf,完成后重启Nova服务即可;配置如下:

[DEFAULT]
vnc_enabled = False   #修改为false

#重启
service nova-compute restart
service nova-consoleauth restart
service nova-novncproxy restart

猜你喜欢

转载自blog.csdn.net/ximenjianxue/article/details/134082064
今日推荐