银河麒麟高级服务器操作系统V10 系统管理员手册
文章目录
-
- SSH 协议
- 配置 OpenSSH
- 不只是一个安全的 Shell
SSH(Secure Shell)是一个使用客户端-服务端架构,使得两个系统之间的安全通信变得容易的协议,它能够让用户远程登录到服务端主机系统中。和其它诸如 FTP 或者 Telnet 的远程通信协议不同,SSH 加密了登录会话,致使入侵者难以通过连接获取未加密的密码。
ssh 程序被设计用于替换诸如 telnet 或者 rsh,这些比较旧的、安全性不高的、用来登录远程主机系统的终端应用程序。与其相关的一个叫做scp 的程序,用于替换诸如 rcp 这样用来在主机之间复制文件的老程序。因为这些老旧的应用程序不会加密在客户端和服务端之间传递的密码,所以应该尽可能地避免使用它们。使用安全方法登录远程系统,能够同时降低客户端系统和远程主机系统的风险。
银河麒麟高级服务器操作系统包含了通用的 OpenSSH 安装包——openssh,以及 OpenSSH 服务端安装包——openssh-server 和OpenSSH 客户端安装包——openssh-clients。注意,OpenSSH 安装包依赖于 OpenSSL 的安装包openssl-libs,这个包安装了几个重要的加密库,使得 OpenSSH 能够提供加密通信。
SSH 协议
为什么使用 SSH?
潜在的入侵者有许多可以使用的工具,能够让他们中断、拦截和重新路由网络流量,从而试图获取对一个系统的访问权限。一般来说,这些威胁可以分为以下几类:
主要特性
SSH 协议提供了以下保护措施:
此外,SSH 协议还提供了以下选项:
协议版本
SSH 目前存在两个版本:版本 1 和较新的版本 2。银河麒麟高级服务器操作系统中的 OpenSSH 套件使用 SSH 版本 2,该版本具有增强的密钥交换算法,不易受到版本 1 中已知漏洞的攻击。然而,为了兼容性的原因,OpenSSH套件同样也支持版本 1 的连接。 重要说明: 为了确保您的连接的最佳安全性,建议您只要可能就使用只兼容SSH版本2的服务端和客户端。
SSH 连接的事件序列
以下一系列事件可以保护两个主机之间的 SSH 通信的完整性。
传输层
传输层的主要角色是确保两个主机之间的通信是安全可靠的,包括在认证的时候以及在随后的通信期间。传输层通过对数据进行加密和解密处理,以及通过提供对数据包发送和接收时的完整性保护,来实现这一目标。传输层也提供压缩、加速信息传输的功能。 SSH 客户端联系服务端时,将进行密钥交换,使得两个系统之间能够正确地构建传输层。密
钥交换时的步骤如下:
在密钥交换期间,服务端用一个唯一的主机密钥向客户端表明自己的身份。如果客户端以前从未和这个特定的服务端通信过,服务端的主机密钥对于客户端来说是未知的,客户端将不会连接。OpenSSH 通过接受服务端的主机密钥来规避这个问题。用户知晓,并且新的主机密钥已经被接受和验证之后,继续后续过程。在之后的连接中,客户端会用已保存的版本来检查服务端的主机密钥,以确保客户端确实是在和预期的服务端通信。如果在将来主机密钥发生了变化,用户必须在连接之前删除客户端已经保存的版本。 重要说明: 攻击者可能会在最初的联系阶段伪装成 SSH 服务端,因为本地系统并不知道预期的服务端和攻击者设置的假服务端之间有什么区别。为了防止这样的事情发生,请在第一次连接或者主机密钥不匹配时,联系服务端管理员以验证SSH服务端的真实完整性。
SSH 被设计成几乎可以和任何类型的公钥算法或者编码格式兼容。在最初的密钥交换创建了一个用于交换的哈希值和一个共享的密值后,两个系统立即开始计算新的密钥和算法,以保护将在连接上发送的认证和数据。
在使用指定的密钥和算法传输一定量(准确的量取决于SSH 实现)的数据之后,将会发生又一次密钥交换,生成另一套哈希值和一个新的共享密值。即使攻击者能够确定哈希值和共享密值,这一信息也仅在非常有限的一段时间内有用。
认证
一旦传输层构建好一个安全隧道在两个系统之间传递信息,服务端告知客户端其所支持的不同的认证方法,例如使用一个私钥编码的签名,或者输入一个密码。然后客户端尝试使用所支持的其中一种方法向服务端进行认证。 SSH 服务端和客户端可以配置使用不同类型的认证方式,让各方都具有最佳的控制度。服务端可以决定基于其安全模型,它可以支持哪些加密方法;客户端可以从可用的选项中选择尝试认证方法的顺序。
通道
在 SSH 传输层完成一次成功的认证之后,将会通过被称为“多路技术”(多路复用连接由多个信号组成,这些信号通过一个共享的、通用的介质进行发送。对 SSH 来说,不同的通道都在一个共同的安全连接中发送)的一种技术打开多重通道。每一条通道负责处理不同的终端会话和转发 X11 会话。
不论是客户端还是服务端都可以创建新的通道。每一个通道将在连接的两端被赋予一个编号。当客户端尝试打开一个新的通道时,客户端把请求和通道编号一起发送出去。这些信息被服务端保存起来,用于将通信导向对应的通道。如此一来,不同类型的会话不会相互影响,并且当一个指定的会话结束之后,关闭它的通道不会中断主要的 SSH 连接。
通道也可以支持流控制,可以让通道以一种有秩序的方式发送和接收数据。以这种方式,只有当客户端接收到通道已经打开的消息,数据才会通过通道发送。
客户端和服务端自动协商每条通道的特征,取决于客户端请求的服务类型以及用户连接到网络的方式。这样可以在不必改变协议的基础设施的情况下,为处理不同类型的远程连接带来很大的灵活性。
配置 OpenSSH
配置文件
配置文件有两个不同的系列,一系列用于客户端程序(例如ssh、scp 和sftp),另外一系列用于服务端(sshd 守护进程)。
系统范围的 SSH 配置信息保存在/etc/ssh/目录下,详见表5-11 系统范围的配置文件。特定用户的 SSH 配置信息保存在~/.ssh/目录下(该目录在特定用户的家目录里),详见表 5-12 特定用户的配置文件。
表 5-11 系统范围的配置文件
/etc/ssh/moduli | 包含了 Diffie-Hellman 密钥交换需要使用的 Diffie-Hellman 组,Diffie-Hellman密钥交换对于构建安全的传输层是关键的。当密钥在一个SSH 会话的最初阶段被交换的时候,一个共享的密值被创建,该密值无法由任何单独的一方所确定。这个密值随后被用来提供主机认证。 |
/etc/ssh/ssh_config | 默认的 SSH 客户端配置文件。注意,如果~/.ssh/config 存在的话,该文件的配置将被~/.ssh/config 覆盖。 |
/etc/ssh/sshd_config sshd | 守护进程的配置文件。 |
/etc/ssh/ssh_host_ecdsa_key sshd | 守护进程所使用的ECDSA私钥。 |
/etc/ssh/ssh_host_ecdsa_key.pub sshd | 守护进程所使用的ECDSA公钥。 |
/etc/ssh/ssh_host_ed25518_key | SSH 协议版本1 的sshd 守护进程所使用的 RSA 私钥。 |
/etc/ssh/ssh_host_ed25518_key.pub | SSH 协议版本1 的sshd 守护进程所使用的 RSA 公钥。 |
/etc/ssh/ssh_host_rsa_key | SSH 协议版本2 的sshd 守护进程所使用的 RSA 私钥。 |
/etc/ssh/ssh_host_rsa_key.pub | SSH 协议版本2 的sshd 守护进程所使用的 RSA 公钥。 |
/etc/pam.d/sshd sshd | 守护进程的PAM配置文件。 |
/etc/sysconfig/sshd sshd | 服务的配置文件。 |
表 5-12 特定用户的配置文件
~/.ssh/authorized_keys | 为服务端保留一个授权的公钥列表。当客户端连接到服务端时,服务端通过检查保存在该文件中的它的签名公钥来认证客户端。 |
~/.ssh/id_ecdsa | 包含用户的 ECDSA 私钥。 |
~/.ssh/id_ecdsa.pub | 用户的 ECDSA 公钥。 |
~/.ssh/id_rsa SSH | 协议版本 2 的 ssh 所使用的RSA 私钥。 |
~/.ssh/id_rsa.pub SSH | 协议版本 2 的 ssh 所使用的RSA 公钥。 |
~/.ssh/identity SSH | 协议版本 1 的 ssh 所使用的RSA 私钥。 |
~/.ssh/identity.pub SSH | 协议版本 1 的 ssh 所使用的RSA 公钥。 |
~/.ssh/known_hosts | 包含用户访问的 SSH 服务端的主机密钥。该文件对于确保 SSH 客户端正在连接正确的SSH服务端是很重要的。 |
获取有关 SSH 配置文件中所使用的各种指令的信息,请参考ssh_config(5) 和 sshd_config(5)手册页面。 启动 OpenSSH 服务端
您必须安装 openssh-server 包之后才能运行 OpenSSH 服务端。
要在当前会话中启动 sshd 守护进程,请以 root 用户在shell 命令行提示符下输入以下命令:
#systemctl start sshd.service
要在当前会话中停止运行 sshd 守护进程,请以 root 用户在shell 命令行提示符下输入以下命令:
#systemctl stop sshd.service
如果您想在系统启动时自动启动守护进程,请以root 用户在shell 命令行提示符下输入以下命令:
#systemctl enable sshd.service
Created symlink
/etc/systemd/system/multi-user.target.wants/sshd.service →/usr/lib/systemd/system/sshd.service.
使用 SSH 进行远程连接
为了让 SSH 真正发挥作用,应该禁止使用不安全的连接协议。否则,用户的密码可能在一个会话中使用 SSH 时被保护得很好,但是却在之后使用Telnet 登录时被捕获了。需要禁用的服务包括 telnet、rsh、rlogin 和vsftpd。
使用基于密钥的认证
为了更进一步的提高系统安全,可以生成 SSH 密钥对,然后强制使用基于密钥的认证,并禁用密码认证。要这样做,请在 vi 或者nano 等文本编辑器中打开/etc/ssh/sshd_config 配置文件,并将 PasswordAuthentication 选项修改为如下内容:
PasswordAuthentication no
如果您不是在一个新的默认安装的系统中进行操作,请检查配置文件确保没有设置 PubkeyAuthentication no 选项。如果是远程连接上的,而不是使用的控制台或者带外访问,建议在禁用密码认证之前先测试基于密钥的登录过程是否可用后再配PubkeyAuthentication 为 no。
为了能够使用 ssh、scp 或者 sftp 从一个客户端机器连接到服务端,请按照
生成秘钥对章节生成一个授权密钥对。注意,这些密钥必须针对每个用户分别生成。
银河麒麟高级服务器操作系统V10默认使用版本2的SSH协议和RSA密钥。重要说明: 如果您以 root 的身份完成了步骤,那么只有 root 用户能够使用这些密钥。备注: 如果您要重装您的系统,又想保留之前生成的密钥对,请备份~/.ssh/目录。在重装后,将其复制回您的家目录。这一过程需要让系统上的所有用户执行,包括 root 用户。
生成密钥对
要生成 SSH 协议版本 2 的 RSA 密钥对,请按以下步骤操作:
$ssh-keygen -t rsa
Generating public/private rsa key pair. Enter file in which to save the key (/home/USER/.ssh/id_rsa):
$ls -ld ~/.ssh
drwx——. 2 USER USER 54 Nov 25 16:56 /home/USER/.ssh/
ssh-copy-id user@hostname
如果公钥尚未安装的话,该命令会复制最近一次修改的~/.ssh/id*.pub 公钥。可选的,您也可以指定公钥的文件名:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@hostname
该 命 令 会 将 ~/.ssh/id_rsa.pub 的 内 容 复 制 到您想连接的机器的~/.ssh/authorized_keys 文件中。如果 authorized_keys 文件已经存在了,密钥将会追加到该文件的末尾。
要生成 SSH 协议版本 2 的 ECDSA 密钥对,请按以下步骤操作:1) 在 shell 命令行提示符
下输入以下命令生成 ECDSA 密钥对:
$ssh-keygen -t ecdsa
Generating public/private ecdsa key pair. Enter file in which to save the key (/home/USER/.ssh/id_ecdsa):
$ls -ld ~/.ssh
drwx——. 2 USER USER 54 Nov 25 16:56 /home/USER/.ssh/
ssh-copy-id user@hostname
如果公钥尚未安装的话,该命令会复制最近一次修改的~/.ssh/id*.pub 公钥。可选的,您也可以指定公钥的文件名:
ssh-copy-id -i ~/.ssh/id_ecdsa.pub user@hostname
该 命 令 会 将 ~/.ssh/id_ecdsa.pub 的 内 容 复 制 到您想连接的机器的~/.ssh/authorized_keys 文件中。如果 authorized_keys 文件已经存在了,密钥将会追加到该文件的末尾。 重要说明: 私钥仅供您个人使用,绝不要把它给任何人,这一点是非常重要的.
. OpenSSH 客户端
您必须安装 openssh-clients 包后,才能从客户端机器连接到一个OpenSSH服务端(请参见 安装软件包。了解如何在银河麒麟高级服务器操作系统中安装新的包)。
使用 ssh 工具
ssh 工具可以让您登录到一台远程机器上,并在上面执行命令。它是对rlogin、rsh 和 telnet 程序的一个安全替换。 和 telnet 命令相似,使用以下命令登录到一台远程机器上:
ssh hostname
例如,要登录到一台名为 penguin.example.com 的远程主机,可以在shell 命令行提示符下输入以下命令
#ssh penguin.example.com
该命令将会以您正在使用的本地机器的用户名登录。如果您想指定一个不同的用户名,请使用以下命令:
ssh username@hostname
例如,以 USER 登录到 penguin.example.com,请输入以下命令:
$ssh USER@penguin.example.com
您第一次连接时,将会看到和如下内容相似的信息:
The authenticity of host 'penguin.example.com' can't be established. ECDSA key fingerprint is
SHA256:Ixy64icRYc/h7XSOvUVywS7t7ThtmOsPT1s07wDD5P8. Are you sure you want to continue connecting (yes/no/[fingerprint])?
在回答对话框中的问题之前,用户应该始终检查指印是否正确。用户可以询问服务端的管理员以确认密钥是正确的。这应该以一种安全的、事先约定好的方式进行。如果用户可以使用服务端的主机密钥,可以使用以下ssh-keygen 命令来检查指印:
#ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub
256 SHA256:b0gGbI+Xk/l+Ve76j3mqpYSty0n3gR9QiIsd+8oV3GI no
comment (ECDSA)
输入 yes 接受密钥并确认连接。您将会看到一个有关服务端已经被添加到已知的主机列表中的通告,以及一个输入密码的提示:
Warning: Permanently added 'penguin.example.com' (ECDSA) to the list
of known hosts. USER@ penguin.example.com's password:
重要说明: 如果 SSH 服务端的主机密钥改变了,客户端将会通知用户连接不能继续,除非将服务端的主机密钥从~/.ssh/known_hosts 文件中删除。然而,在进行此操作之前,请联系 SSH 服务端的系统管理员,验证服务端没有受到攻击。
要从~/.ssh/known_hosts 文件中删除一个密钥,可以使用如下命令:
#ssh-keygen -R penguin.example.com
在输入密码之后,您将会进入远程主机的 shell 命令行提示符下。可选地,ssh 程序可以用来在远程主机上执行一条命令,而不用登录到shell 命令行提示符下:
ssh [username@]hostname command
例如,/etc/kylin-release 文件提供有关操作系统版本的信息。要查看penguin.example.com 上该文件的内容,输入:
$ssh USER@penguin.example.com cat /etc/kylin-release
USER@penguin.example.com's password:
Kylin Linux Advanced Server release V10 (Lance)
在您输入正确的密码之后,将会显示远程主机的操作系统版本信息,然后您将返回到本地的 shell 命令行提示符下。
使用 scp 工具
scp 可以用来在主机之间通过一个安全加密的连接传输文件。在设计上,它和 rcp 非常相似。 要传输一个本地文件到远程系统中,可以使用如下形式的命令:
scp localfile username@hostname:remotefile
例如,如果您想将 taglist.vim 传输到名为 penguin.example.com的远程主机用户家目录上,可以在 shell 命令行提示符下输入以下命令:
#scp taglist.vim USER@penguin.example.com:~
一次可以指定多个文件。要传输.vim/plugin/目录下的文件和目录到远程主机penguin.example.com 的相同目录下,可以输入以下命令:
$scp -r .vim/plugin/* USER@penguin.example.com:.vim/plugin/
要将一个远程的文件传输到本地系统上,可以使用以下语法:
scp username@hostname:remotefile localfile
例如,要从远程主机上下载.vimrc 配置文件,可以输入:
$scp USER@penguin.example.com:.vimrc .vimrc
使用 sftp 工具
sftp 工具可以用来打开一个安全的、交互式的 FTP 会话。在设计上,它类似于 ftp,不同之处在于 sftp 使用了一个安全的加密连接。
要连接到远程系统中,可以使用如下形式的命令:
sftp username@hostname
例如,要使用 USER 用户登录到名为 penguin.example.com 的远程主机上,可以输入:
$sftp USER@penguin.example.com
USER@penguin.example.com's password:
Connected to penguin.example.com.
sftp>
当您输入正确的密码之后,您将会看到一个 sftp 的命令行提示符。sftp 工具可以使用一系列和 ftp 类似的命令(参见表 5- 13)。
表 5-13 常用的 sftp 命令
ls [directory] | 列出一个远程目录的内容。如果没有提供任何目录名称,默认使用当前的工作目录。 |
cd directory | 切换远程工作目录到指定的目录下。 |
mkdir directory | 创建一个远程目录。 |
rmdir path | 删除一个远程目录。 |
put localfile [remotefile] | 将本地文件传输到远程主机上。 |
get remotefile [localfile] | 将远程主机上的文件下载到本地主机上。 |
要获取可用命令的完整列表,请参考 sftp(1)用户手册页面。
不只是一个安全的 Shell
一个安全的命令行界面只不过是 SSH 众多使用方式的开端。给予合适的带宽,可以通过 SSH 通道进行 X11 会话的转发。或者,通过TCP/IP 转发,系统间以前的不安全端口连接可以映射到指定的 SSH 通道上。
X11 转发
要通过 SSH 连接打开 X11 会话,可以使用以下形式的命令:
ssh -Y username@hostname
例如,要使用 USER 用户登录到名为 penguin.example.com 的远程主机上,可以输入:
$ssh -Y USER@penguin.example.com
USER@penguin.example.com's password:
当从安全 shell 命令行提示符下运行一个 X 程序时,SSH 客户端和服务端会创建一个新的安全通道,X 程序数据通过这个通道透明地发送到客户端机器上。 注意,在发生 X11 转发之前,必须在远程系统中安装好X 窗口系统。以root 用户输入以下命令可以安装 X11 软件包分组:
#dnf group install "X Window System"
要了解关于软件包分组的更多信息,请参见 管理软件包。
X11 转发非常有用。例如,X11 转发可以用来为【打印设置】工具创建一个安全的交互式会话。要这样做,先使用 ssh 连接到服务端,然后输入:
$system-config-printer &
【打印设置】工具将会显示出来,让远程用户可以在远程主机上安全地配置打印。
端口转发
SSH 可以通过端口转发安全加固其他不安全的 TCP/IP 协议。在使用这一技术时,SSH 服务端成为了 SSH 客户端的一个加密导管。
端口转发的工作原理是将客户端的一个本地端口映射到服务端的一个远程端口上。SSH 可以从服务端将任意端口映射到客户端的任意端口上。这一技术并不需要端口号互相匹配。
重要说明:
要设置端口转发监听 1024 以下的端口,需要 root 级别的访问权限。
要创建一个监听 localhost 上的连接的 TCP/IP 端口转发通道,可以使用以下形式的命令:
ssh -L local-port:remote-hostname:remote-port username@hostname
例如,要使用 POP3 通过一个加密连接检查名为 mail.example.com的服务器上的邮件,可以使用以下命令:
$ssh -L 1100:mail.example.com:110 mail.example.com
一旦客户端机器和邮件服务器之间的端口转发通道准备就绪后,就可以使用一个 POP3 邮件客户端在 localhost 上使用 1100 端口来检查新邮件了。任何在客户端系统上发往 1100 端口的请求,都将被安全地导向mail.example.com服务器。
如果 mail.example.com 没有运行 SSH 服务端,但是同一网络中的另一台机器运行了 SSH 服务端,那么 SSH 仍然可以用来对连接进行安全加固。当然,使用的命令会略有不同:
$ssh -L 1100:mail.example.com:110 other.example.com
在这一示例中,从客户端机器的 1100 端口发出的POP3 请求,将通过22端口上的SSH连接被转发到SSH服务端other.example.com。然后,other.example.com连接到 mail.example.com 上的 110 端口来检查新邮件。注意,在使用这一技术时,只有客户端和 other.example.com 服务端之间的连接是安全的。
端口转发也可以用来通过网络防火墙安全地获取信息。如果防火墙配置为允许放行使用标准端口(即 22 端口)的 SSH 数据流,但是阻塞了对其它端口的访问,那么在要在两台主机之间使用被阻塞端口建立连接仍然是可能的,只要将它们之间的通信通过一条建立好的 SSH 连接进行重定向即可。
重要说明:
以这种方式来使用端口转发技术对连接进行转发,将允许客户端系统上的任何用户都能连接到相应的服务上。如果客户端系统被入侵,攻击者也同样能够访问转发的服务。
担心端口转发的系统管理员,可以在服务端将/etc/ssh/sshd_config 文件中的AllowTCPForwarding 选项设置为 No,并重启 sshd 服务,来禁用端口转发功能。
评论前必须登录!
注册