9.2. 远程登录

对于管理员来说有必要远程连接电脑。位于单独房间的服务器,很少配置固定的键盘和显示器-但是他们都会接到网络。

回到基础 客户,服务器

拥有多个相互通信进程的系统常常被比作“客户/服务器”。服务器是获取客户请求并执行的程序。由客户来控制操作,服务器自身不会发起任何行动。

9.2.1. 安全远程登录:SSH

SSH (Secure SHell) 通信协议系以安全与可靠考量。以 SSH 连接是安全的:伙伴需认证且数据交换经过加密。

文化 Telnet 与 RSH 已过时

SSH 问世前,TelnetRSH 是远程登录的主要工具。目前已过时,即使 Debian 仍提供此等命令,但已没有人使用它们。

词汇 授权,加密

当你需要赋给客户在服务器执行或发起行动的能力时,安全是很重要的。必须确定客户的身份;这就是授权。授权通常包含隐秘的口令,否则其他客户很容易获得口令。这是加密的主要目的,这种编码形式可以让两个系统通过公共渠道传递机密信息而不被其他人读到。

授权和加密经常被同时提及,而且也频频同时使用,因为他们通常使用相似的数学算法概念实现。

SSH 还涉及两个文件传输服务。 scp 是一个可以像cp命令一样使用的命令行工具,除了指向其他机器的路径需要加机器名冒号前缀。

  1. $

sftp 是一个交互命令,类似于 ftp。在一个单独会话中, sftp 可以传输多个文件,并且可以远程操作文件(删除,重命名,更改许可,等等)。

Debian 使用 OpenSSH,一个由 OpenBSD 项目(注重安全,基于 BSD 内核的自由操作系统)维护的自由版本,它效仿了芬兰 SSH Communications Security Corp 公司开发的原始 SSH 软件。该公司最初将 SSH 作为自由软件开发,但是最终决定在专有许可下继续开发。然后,OpenBSD 项目创建了 OpenSSH 维护 SSH 的自由版本。

回到基础 岔(Fork)

一个“岔”,在软件领域,意味着克隆已有项目的新项目,并将与之竞争。从此,两个软件通常会迅速发散开发。岔通常由开发团队内部的分歧产生。

项目分岔也是自由软件本身特性产生的结果;如果能使自由软件继续发展,那么分岔也是一种好事(例如万一软件许可证变化)。源自技术或者个人意见不统一的分岔常常是浪费资源;推荐其他的解决方案。之前分岔的项目再次合并也不是未曾听说。

OpenSSH 分裂为两个软件包:客户端是 openssh-client 软件包,服务器端是 openssh-server 软件包。ssh 超软件包依赖这两个部分且需安装它们 (apt install ssh)。

9.2.1.1. 基于密钥的认证

每次有人通过 SSH 登入,远程服务器询问密码来授权用户。如果想要自动连接或者使用需要频繁通过 SSH 连接的工具,这就会产生问题。这就是为什么 SSH 提供一种基于密钥的认证系统。

户在客户机上用 ssh-keygen -t rsa 产生密钥对;公共密钥存储在~/.ssh/id_rsa.pub中,而对应的私有密钥存储在~/.ssh/id_rsa中。然后,用户使用ssh-copy-id *server* 将他们的公共密钥添加到服务器上的 ~/.ssh/authorized_keys 文件中。如果私有密钥在创建的时候没有“口令密语”保护,随后所有在服务器上的登录将不需要口令。然而,私有密钥在每次输入口令时都必须被解密。幸运的是, ssh-agent 允许我们把私有密钥放在内存中而不必频繁重新输入口令。为此,可以简单的使用 ssh-add (每个工作会话一次)来指明该会话已经和 ssh-agent功能实例相关联。Debian 在图形界面会话中默认激活这一特性,也可以通过改变 /etc/X11/Xsession.options来停用。对于控制台会话,可以使用 eval $(ssh-agent)手动启动。

安全 保护私有密钥

任何拥有私有密钥的人都可以登录已经配置的账户。这是私有密钥要使用“口令密码”保护的原因。某些获得了私有密钥文件(例如 ~/.ssh/id_rsa)副本的人,要使用这个文件仍然需要密码。然而,这种额外的保护措施并不是万全的,如果觉得文件被破解,最好在所安装的计算机上禁用该密钥(通过从文件 authorized_keys 移除)并使用新生成的密钥取代它。

文化 OpenSSL 在 Debian Etch上的缺陷

OpenSSL 程序库,首先由 Debian Etch 提供,在其随机数值产生器 (random number generator, RNG) 里有重大缺陷。所以,Debian 维护者修改它,使用 valgrind 之类的内存测试工具时,不再产生警示消息。不幸的是,此种改变让 RNG 套用一个熵值对应 32,000 个可能的处理编号 (PID),不足以称为乱数。

http://www.debian.org/security/2008/dsa-1571

特别是当OpenSSL 用于产生密钥,它总是生成一个在已知几百万值集合范围内的密钥(32000乘上密钥长度中的小数字)。这会影响SSH 密钥,SSL 密钥,和X.509认证,他们被大量程序使用,例如OpenVPN。骇客只能尝试所有的密钥来取得未授权的读取。为了减小问题的影响,SSH 守护进程会拒绝使用 openssh-blacklist 和 openssh-blacklist-extra 软件包中列出的有问题密钥。另外, ssh-vulnkey 命令允许在系统中使用某些折中密钥。

进一步分析这个事件,发现影响多个 (小) 问题,包括 OpenSSL 计划内与 Debian 软件包维护者。像 OpenSSL 这种被广泛使用程序库,被 valgrind 测试时,应该 — 未经修改 — 不能产生警示。尤有甚者,其代码 (尤其是像 RNG 这么敏感的部分) 应该有更好的说明以避免这种错误。从 Debian 的角度来看,维护者要向 OpenSSL 开发者认证其修改的部分,但单纯的解说修改而未提供对应的补丁供查看,以致 Debian 发生前述的错误。最后,维护者的选择是次要的选项:源代码的修改没有清楚的文档;所有的修改都保存在典藏所的次版本内,但是把所有的修改总结在一个补丁内纳入原始软件包中。

在这种情况下,很难找出正确的方法以避免再发生此类事件。从此得到的教训,让每个发散的 Debian 必须尽可能的大量公开,经过调整过、文档充足后,才能上传软件。经过此事后,发展出新的原始软件包格式 (“3.0 (quilt)”) 与 Debian 原始网页服务。

http://sources.debian.net

9.2.1.2. 使用远程 X11 应用程序

SSH 协议允许转发图形数据(“X11”会话,源于最广泛传播Unix图形系统的名字);然后,服务器为这些数据保留固定通道。特别地,远程执行的图形程序可以在本地系统X.org服务器屏幕上显示,并且整个会话(输入和显示)都是安全的。由于该特性允许远程应用与本地系统交互,因此默认是关闭的。您可以指明X11Forwarding yes参数,将其写入服务器配置文件(/etc/ssh/sshd_config)以启用该功能。最后,用户必须通过添加 -X 选项到 ssh 命令行中以提出功能请求。

9.2.1.3. 通过端口转发建立加密通道

它的 -R-L 选项允许 ssh 在两个机器间添加 “加密信道”,把本地 TCP 端口 (见专栏 基本 TCP/UDP) 映射至远程机器或反之。

词汇 隧道

大多数局域网通过数据包模式而不是连接模式接入互联网,意味着:由一个计算机发送到另一个计算机的数据包要找到目的地会在几个间歇路由之间停顿。仍然可以通过数据流IP 数据包封装模拟连接操作。这些数据包流过路由,但是数据流在目的地不加改变重新构造。我们称之为“隧道”,类比为机动车从入口(输入)直接开向出口(输出)的公路通道,期间不会碰到任何交汇,与在表面可能交叉和变向的路径相对。

可以利用这个机会给隧道加密:流过的数据在外面不能被辨认,但是在隧道的出口解密恢复。

运行ssh -L 8000:server:25 intermediary 命令,将会建立同服务器主机intermediary 的SSH 会话,并侦听本地端口8000 ¼ˆ参考see 图 9.3 “使用SSH转发本地端口”)。对于任何建立在该端口的连接, ssh 将会发起从电脑intermediaryserver 端口25 的连接,并将两个连接绑定。

命令ssh -R 8000:server:25 intermediary也会建立电脑 intermediary 的SSH 会话,但是在本机 ssh 侦听端口8000 (参考 图 9.4 “使用SSH转发远程端口”)。在该端口建立的连接将ssh 打开本机到 server25 端口的连接,并将两个连接绑定。

两种情况下,连接建立在server 主机的25 端口,它会透过SSH 隧道建立本地机器和中介机器的连接。在头一种情况下,到该隧道的入口是本地端口8000,数据在定向到公共网络的server 之前,流向 intermediary 。在第二种情况下,隧道输入输出被保留;入口是 intermediary 的8000 端口,输出在本地主机,然后数据被定向到 server。实际上,服务器不是本地机器就是中介机器。这样SSH 保护了一端到另一端的连接。

使用SSH转发本地端口

图 9.3. 使用SSH转发本地端口

使用SSH转发远程端口

图 9.4. 使用SSH转发远程端口

9.2.2. 使用远程图形桌面

VNC (Virtual Network Computing)允许远程接入图形桌面。

该工具主要用于技术支持;管理员可以看到用户面临的错误,并演示正确的操作而不必待在他们旁边。

首先,用户必须授权共享其进程。在 Jessie 配置面版 (不同于稍早的 Debian 版本,用户必须安装并运行 vino) 的GNOME 图形桌面环境已有此选项。KDE 桌面环境仍需使用 krfb 才能经由 VNC 共享既有的进程。其他皂图形桌面环境,x11vnc 命令 (在同名的 Debian 软件包内) 也能达到同样的结果;以明确的图标标明。

从 VNC 取得图形进程时,管理者必须链接至 VNC 客户端。GNOME 有 vinagreremmina 命令链接,而 KDE 使用 krdc (在 KInternetRemote Desktop Client 菜单内)。还有使用命令行的其他 VNC 客户端,诸如 xvnc4viewer 在 Debian 的同名软件包内。链接后,管理者可以看到远程的桌面、操控远程桌面、并让远程用户知道运作的方式。

安全 VNC 使用 SSH

想要经由 VNC 链接,但不想在网络传输纯文本数据,可以把数据打包在 SSH 信道内 (见 第 9.2.1.3 节 “通过端口转发建立加密通道”)。只需知道 VNC 缺省在第一个屏幕使用端口号 5900 (称为 “localhost:0”),端口号 5901 用在第二个端口号 (称为 “localhost:1”),等等。

ssh -L localhost:5901:localhost:5900 -N -T *machine*命令创建本地端口5901 和 machine 5900 端口的隧道。第一个“localhost”要求SSH 仅侦听本地机器接口。第二个“localhost”指示远程机器上的接口接收进入“localhost:5901”的网络数据。因此, vncviewer localhost:1 会把VNC 客户连到远程屏幕。

当VNC 会话关闭时,记得退出相应的SSH 会话来关闭隧道。

回到基础 显示管理器

gdm3kdmlightdm、和 xdm 都是显示管理者。他们在启动后不久就控制图形接口担供登录画面。用户登录后,再运行启动图形工作进程所需的程序。

VNC 也可供移动用户、或公司运行者使用,这些人偶而需要从家中的电脑远程登录办公室的桌面电脑。这种配置稍为复杂些:首先安装 vnc4server 软件包,改变显示管理者的配置,以便接受 XDMCP Query 请求 (给 gdm3,添加 Enable=true/etc/gdm3/daemon.conf 的 “xdmcp” 区块),然后以 inetd 启动 VNC 服务器,接着在用户试图登录时,自动开启进程。例如,可以在 /etc/inetd.conf 内加入这一列:

  1. 5950 stream tcp nowait nobody.tty /usr/bin/Xvnc Xvnc -inetd -query localhost -once -geometry 1024x768 -depth 16 securitytypes=none

重新定向输入链接至显示管理者,解决认证的问题,因为只有本地帐号的用户才能通过 gdm3 登录画面 (或同级的 kdmxdm等)。当此作业允许同时登录多个用户 (服务器够力是前提),就能够提供完整的桌面给远程用户 (或稍为不够力的桌面系统,则需要配置为精简客户)。使用只需以 vncviewer *server*:50 登录服务器画面,因为用到的端口号是 5950。