OpenSSH 服务管理摘要本文详细介绍了 OpenSSH 服务的配置与管理实践。首先通过虚拟机环境准备搭建 server 和 client 测试环境。然后深入讲解 SSH 协议原理包括连接建立过程、加密类型及双向加密机制。接着演示了 ssh 工具的基本使用方法和配置文件管理。重点讲解了 SSH 密钥认证的配置流程和故障排查方法。最后详细说明了 SSH 服务的安全加固措施包括禁止 root 密码登录、禁止 root 登录、禁止密码登录以及只允许特定用户登录等安全配置。文章通过大量实际命令示例帮助读者全面掌握 OpenSSH 服务的部署、配置和安全优化。一、环境准备采用链接克隆方式克隆出两台虚拟机• server 虚拟机并设置ip地址为10.1.8.10/24。• client 虚拟机并设置ip地址为 10.1.8.11/24。server设置主机名称和名称解析# 永久设置主机名[rootlocalhost ~17:39:31]# hostnamectl set-hostname server.lz.cloud# 验证[rootlocalhost ~17:40:35]# hostnamehostnameserver.lz.cloud# 准备名称解析[rootlocalhost ~17:40:41]# echo 10.1.8.10 server.lz.cloud server 10.1.8.11 client.lz.cloud client /etc/hosts[rootlocalhost ~17:41:35]# bash[rootserver ~17:43:20]# hostnameserver.lz.cloudIP 地址通过命令 nmtui 配置过程省略。client设置主机名称和名称解析# 永久设置主机名[rootlocalhost ~17:39:37]# hostnamectl set-hostname client.lz.cloud# 验证[rootlocalhost ~17:42:20]# hostnameclient.lz.cloud# 准备名称解析[rootlocalhost ~17:42:25]# echo 10.1.8.10 server.lz.cloud server 10.1.8.11 client.lz.cloud client /etc/hosts[rootlocalhost ~17:43:09]# bash[rootclient ~17:46:11]#IP 地址通过命令 nmtui 配置过程省略。激活配置回车两次。IT 软件通信架构CS 架构clientServer例如xshellsshdBS 架构BrowserServer谷歌浏览器Apache二、OpenSSH 服务介绍1.SSH 介绍SSH 全称是 Secure ShellSSH协议是基于应用层的协议为远程登录会话和其他网络服务提供安全性的协议。实现此功能的传统方式如 telnet (终端仿真协议)、 rcp、ftp、 rlogin、rsh都是极为不安全的并且会使用明文传送密码。OpenSSH 提供了服务端后台程序和客户端工具用来加密远程控件和文件传输过程中的数据并由此来代替原来的类似服务。2.SSH 建立连接的过程主要分为下面几个阶段SSH协议版本协商阶段SSH目前包括SSH1和SSH2两个大版本。密钥和算法协商阶段SSH支持多种加密算法双方根据自己和对端支持的算法进行协商最终决定要使用的算法。认证阶段服务器和客户端互相进行身份验证。会话请求阶段客户端会向服务器端发送会话请求。会话请求分为这样几类申请对数据传送进行压缩、申请伪终端、启动 X11、TCP/IP 端口转发、启动认证代理等。交互会话阶段会话请求通过后服务器端和客户端进行信息的交互。例如运行 shell、执行命令、传递文件。加密类型3.加密类型对称加密加密和解密都使用一个钥匙。确保数据的完整性、速度快。非对称加密一对钥匙。公钥用来加密数据。私钥用来解密数据。确保数据的安全性。4.双向加密过程SSH协议是基于非对称加密方法的服务器和客户端都会生成自己的公钥和私钥。公钥用来加密数据。私钥用来解密数据。双向加密过程服务器创建密钥对。远程服务器会在/etc/ssh目录下生成一个名为多个密钥对例如ecdsa类型的密钥对ssh_host_ecdsa_key.pub 公钥和 ssh_host_ecdsa_key 私钥。之后每回启动sshd服务的时候系统会自动在此路径下查找公钥。客户端请求连接。服务器接到请求后把公钥传给客户端使用。客户端记录服务器公钥并计算自己的公私钥。客户端将服务器传来的公钥记录在**~/.ssh/known_hosts** 中若是已经记录有该服务器公钥则比对是否一致一致后就计算客户端自己的公私钥。客户端使用服务器的公钥加密自己的公钥并发送给服务器。服务器端拥有客户端公钥自己私钥客户端拥有服务器公钥自己私钥组成了非对称加密系统。双向加解密。服务器发送数据用客户端公钥加密客户端收到数据后用自己私钥解密。客户端发送数据用服务器公钥加密服务器收到数据后用自己私钥解密。三、使用 ssh 访问远端CLI1.ssh 工具演示方式一只指定IP或主机名# 通过IP地址[lzclient ~16:50:42]$ssh10.1.8.10 The authenticity ofhost10.1.8.10 (10.1.8.10)cant be established. ECDSA key fingerprint is SHA256:pplZ4EZPQ8M/f7qvKaAffxbfvKYJg9HCojrmqctkck. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 10.1.8.10 (ECDSA) to the list of known hosts. lz10.1.8.10s password: Activate the web console with: systemctlenable--nowcockpit.socket Last login: Wed May1314:14:052026from10.1.8.1[lzserver ~16:51:04]$exit登出 Connection to10.1.8.10 closed.# 通过主机名称[lzclient ~16:51:20]$sshserver The authenticity ofhostserver (10.1.8.10)cant be established. ECDSA key fingerprint is SHA256:pplZ4EZPQ8M/f7qvKaAffxbfvKYJg9HCojrmqctkck. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added server,10.1.8.10 (ECDSA) to the list of known hosts. lzservers password:redhatActivate the web console with: systemctlenable--nowcockpit.socket Last login: Sat May1616:51:042026from10.1.8.1[lzserver ~16:51:29]$exit登出 Connection to server closed.方式二额外指定用户名# 指定root用户登录[lzclient ~16:52:19]$sshrootserver rootservers password: Last login: Sat May 16 16:49:33 2026 from 10.1.8.11 [rootserver ~ 16:52:31]# exit 登出 Connection to server closed. # 或者 [lzclient ~ 16:52:49]$ ssh -l root server rootservers password: Last login: Sat May1616:52:312026from10.1.8.11[rootserver ~16:53:02]#方式三额外指定命令# 同时指定用户和命令[lzclient ~17:04:58]$sshlzserverhostnamelzservers password: server.lz.cloud # shell提示符仍然是本机。 [lzclient ~ 17:05:42]$ [lzclient ~ 17:05:42]$ ssh rootserver hostname;id rootservers password: server.lz.clouduid0(root)gid0(root)组0(root)2.ssh 工具配置文件参考 SSH_CONFIG(5) 。[lzclient ~17:07:13]$manssh_config~/.ssh/config用户自己的配置优先级高于全局配置。文件权限不得高于644。/etc/ssh/ssh_config全局配置应用于所有用户。示例[lzclient ~17:21:06]$mkdir.ssh[lzclient ~17:21:15]$chmod700.ssh[lzclient ~17:21:26]$vim~/.ssh/config[lzclient ~17:21:59]$cat~/.ssh/config Host * StrictHostKeyChecking no User root[lzclient ~17:22:06]$chmod600.ssh/config[lzclient ~17:22:20]$# 清空其他主机秘钥[lzclient ~17:22:20]$.ssh/known_hosts# 再次登录不会提示主机key是否校验验证用户也是root[lzclient ~15:46:39]$sshserver Warning: Permanently addedserver,10.1.8.10(ECDSA)to the list of known hosts. rootservers password:参数说明• Host *匹配所有目标服务器。• StrictHostKeyChecking no连接目标服务器不校验主机key直接接受。• User root连接目标服务器默认使用当前账户。• PreferredAuthentications password连接目标服务器使用密码认证。• IdentityFile指定私钥位置。四、配置 ssh 密钥认证使用密钥登录避免输入密码更安全。1.配置过程# 客户端生成密钥对[lzclient ~15:50:41]$ ssh-keygen Generating public/private rsa key pair.# 私钥保存位置Enterfileinwhichto save the key(/home/lz/.ssh/id_rsa):回车# 私钥加密密码回车表示不加密Enter passphrase(emptyforno passphrase):回车# 再次回车Enter same passphrase again:回车Your identification has been savedin/home/lz/.ssh/id_rsa. Your public key has been savedin/home/lz/.ssh/id_rsa.pub. The key fingerprint is: SHA256:MdWIfcsDujDmWw5KLcBPFbj2dLtkhXRPOHtKTj4CI/Q lzclient.lz.cloud The keys randomart image is: ---[RSA2048]----|... o.||o.o.B ||.. .o O.||oE o*||B *SO o.||B||.o B o.||..o|||----[SHA256]-----# 查看生成的文件[lzclient ~15:51:14]$ls.ssh/ config id_rsa id_rsa.pub known_hosts# 将公钥推动给目标服务器上的目标用户[lzclient ~15:53:10]$ ssh-copy-id lzserver# 验证[lzclient ~15:53:55]$sshlzserverhostnameserver.lz.cloud# 推送公钥相当于# 将公钥内容保存到目标服务器上目标用户家目录下.ssh/authorized_keys中[lzclient ~15:54:13]$cat.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDjfnLWzrisW2vIVRl5kTQfm8g8qCww22poeW9Fee42AAVHi5yED4OQC3JYdaspR7NCoVHK1OQpny9fymZbf4rBPU8aem5KUbALftZ0bcQAH3206VS3g4MFaesnObrN35cDkwzjI6qIzY8ieevx6d5VZ9H3J1QtyJWIMTWlpdTxl6G6iMgexfV78kaO5clcGkXYwngNQwTfmDFRwS9gWe13wnwCMqoxwmnTnwYx9MbtCvTJkwz2VFgmolJISYw07tCq4PQrJXzrzjPBwEaxZKro3XLNLgAbb9rhHHHIDbfof6BZ6Qcb7NHKOxPol4kNgUcyH4QQsGiwR5JCXQX1h lzclient.lz.cloud# 在server端查看[lzserver ~15:56:15]$cat.ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDjfnLWzrisW2vIVRl5kTQfm8g8qCww22poeW9Fee42AAVHi5yED4OQC3JYdaspR7NCoVHK1OQpny9fymZbf4rBPU8aem5KUbALftZ0bcQAH3206VS3g4MFaesnObrN35cDkwzjI6qIzY8ieevx6d5VZ9H3J1QtyJWIMTWlpdTxl6G6iMgexfV78kaO5clcGkXYwngNQwTfmDFRwS9gWe13wnwCMqoxwmnTnwYx9MbtCvTJkwz2VFgmolJISYw07tCq4PQrJXzrzjPBwEaxZKro3XLNLgAbb9rhHHHIDbfof6BZ6Qcb7NHKOxPol4kNgUcyH4QQsGiwR5JCXQX1h lzclient.lz.cloud# 推给目标主机root用户[rootserver ~13:57:50]# mkdir -m 700 .ssh[rootserver ~15:58:24]# cp ~lz/.ssh/authorized_keys .ssh# 客户端验证[lzclient ~15:55:17]$sshrootserverhostnameserver.lz.cloud以非交互方式生成密钥对[lzclient ~15:59:15]$ ssh-keygen-trsa-N-fid_rsa_new[lzclient ~16:00:22]$ls*new* id_rsa_new id_rsa_new.pub其他选项[lzclient ~16:00:29]$mv.ssh/id_rsa /tmp[lzclient ~16:01:17]$ssh-i/tmp/id_rsa rootserverhostnameserver.lz.cloud# 如果找不到密钥则使用密码登录连接1022端口需要做如下配置# -p选项指定目标服务器 sshd 服务端口号默认22[lzclient ~16:25:22]$ssh-lroot-p1022192.168.1.8hostnameWarning: Permanently added[192.168.1.8]:1022(ECDSA)to the list of known hosts. root192.168.1.8s password: server.lz.cloud网络路径 client-192.168.1.8:1022-10.1.8.10:222.排故故障配置密钥登录后远程登录仍要需要输入密码验证。[lzclient ~16:51:40]$sshroot10.1.8.10hostnameroot10.1.8.10s password:模拟将目标主机上目标用户的家目录的权限改为777。[rootserver ~16:48:34]# chmod 777 /root处理过程1.查看日志# 客户端登录的时候监控服务端日志[rootserver ~16:59:20]# tail -f /var/log/secure......May2317:00:24 server sshd[11494]: Authentication refused: bad ownership or modesfordirectory /root......发现提示文件权限有问题。2.查找文件权限。[rootserver ~16:59:15]# ls -ld /rootdrwxrwxrwx.3root root1475月2315:58 /root# 更改权限[rootserver ~17:01:50]# chmod 700 /root五、加固 SSH 服务配置文件sshd 服务配置文件/etc/ssh/sshd_config。帮助 sshd_config(5)常见配置• PermitRootLogin prohibit-password禁止root用户通过密码登录。• PermitRootLogin no禁止 root 用户登录。• root用户权限不受限制。• root用户存在每个linux系统只需要猜密码就可以。• 从审计角度来看很难跟踪哪个授权用户以root身份登录并进行了更改。 如果用户必须以普通用户身份登录并切换到root帐户则会生成一个日志事件可用于帮助提供问责制。• PasswordAuthentication no禁止用户使用密码登录。• AllowUsers exampleuser允许特定用户登录该用户可以提权为root。• UseDNS no客户端连接服务器的时候服务器不需要反向解析服务端IP地址提高连接速度。1.禁止 root 密码登录环境准备提前配置好 root 秘钥登录。[rootserver ~17:04:39]# vim /etc/ssh/sshd_config#PermitRootLogin yes# 添加一行PermitRootLogin prohibit-password# 重启服务[rootserver ~17:07:25]# systemctl reload sshd连接测试# 即使使用正确的密码也无法远程登录[lzclient ~17:04:52]$sshrootserver rootservers password: Permission denied, please try again. rootservers password:# 如果配置了秘钥登录则需要使用选项强制密码认证# ssh -o PreferredAuthenticationspassword rootserver2.禁止 root 登录环境准备[rootserver ~17:07:36]# vim /etc/ssh/sshd_config#PermitRootLogin yes# 添加一行PermitRootLogin no# 重启服务[rootserver ~17:12:41]# systemctl reload sshd#连接测试不管是密码还是秘钥都无法登录# 即使配置了免密登录也无法远程登录[lzclient ~17:09:45]$sshrootserver rootservers password: Permission denied, please try again. rootservers password: Permission denied, please try again. rootservers password: Permission denied(publickey,gssapi-keyex,gssapi-with-mic,password).# 但是可以使用普通用户登录然后提权为root用户[lzclient ~17:16:11]$sshlzserver[lzserver ~17:27:37]$su-[rootserver ~17:27:45]#3.禁止密码登录环境准备[rootserver ~17:12:53]# vim /etc/ssh/sshd_config# 注释原有行#PasswordAuthentication yes# 添加新行设置为no# 重启服务[rootserver ~17:33:19]# systemctl reload sshd连接测试秘钥可以登录# laoma账户未配置密钥登录直接拒绝[lzclient ~17:34:40]$ssh-oPreferredAuthenticationspassword lzserver Permission denied(publickey,gssapi-keyex,gssapi-with-mic).# 秘钥登录仍然支持[lzclient ~17:45:04]$sshlzserver Last login: Sat May2317:29:562026from10.1.8.114.只允许特定用户登录环境准备lz1用户也可以秘钥登录。[rootserver ~17:46:15]# useradd lz1[rootserver ~17:46:31]# echo 123 | passwd --stdin lz1更改用户 lz1 的密码 。 passwd所有的身份验证令牌已经成功更新。[rootserver ~17:46:43]# mkdir -m 700 /home/lz1/.ssh/[rootserver ~17:46:56]# cp .ssh/authorized_keys /home/lz1/.ssh/[rootserver ~17:47:13]# chown -R lz1:lz1 /home/lz1/.ssh/配置sshd服务[rootserver ~17:48:10]# vim /etc/ssh/sshd_config# 最后添加一行AllowUsers lz# 重启服务[rootserver ~17:50:15]# systemctl reload sshd测试连接lz 可以通过秘钥认证登录lz1不管通过什么方式认证都不可以登录。[lzserver ~17:51:09]$sshlzserverhostnameserver.lz.cloud[lzserver ~17:51:16]$sshlz1serverhostnamePermission denied(publickey,gssapi-keyex,gssapi-with-mic).