标签 SSH 下的文章

如果你是 OpenSSL、LibreSSL、OpenSSH 的用户,你可以坐下来看看了,因为这不会影响你。

最近一项学术研究展示了如下情况:对于某些特定设备,他人可以监听其 SSH 连接,然后借助一些运气在无声无息中破译出主机的私有 RSA 密钥,从而冒充该设备。

冒充这些设备后,通过使用推断出的主机密钥私钥实施的中间人攻击,间谍可以安静地记录用户的登录信息,同时,通过将这些连接转发给真正的设备,他们还可以监控用户在远程 SSH 服务器上的活动。尽管 SSH 还有其他功能,但其主要应用场景仍然是用户登录到设备并通过命令行接口进行控制。

据悉,可以通过被动监视从客户端到易受攻击设备的 SSH 服务器的连接,获得主机的 RSA 密钥私钥:无论是在签名生成过程中的偶发运算错误,还是因宇宙射线等微小故障产生的自然错误,都可以被观察和利用来推算 SSH 服务器的主机密钥私钥,这本应是保密的。

虽然可能认为自然错误发生的概率很小,偶发错误可能已为众所周知,但实际上只要你连续观察足够多的到有漏洞的 SSH 服务器的 SSH 连接,你就有可能发现一个你可以利用的。

重要的一点是,软件库 OpenSSL 和 LibreSSL,以及 OpenSSH,都未发现存在上述密钥推导问题的漏洞。由此,我们认为,网上的大部分设备、服务器和其他设备都不会受到影响,只有特定的物联网设备和类似的嵌入式设备可能会对此种攻击敏感。此外,这种问题也仅影响 RSA 密钥。

细节

由加利福尼亚大学圣地亚哥分校的 Keegan Ryan、Kaiwen He(他同时也在麻省理工学院任职)、George Arnold Sullivan 以及 Nadia Heninger 基于早期的一些研究,完成并撰写了这项研究。他们采用的技术,旨在揭示 RSA 密钥私钥,该技术源于 Florian Weimer 在 2015 年对 TLS 的突破性研究,以及 2022 年圣地亚哥论文的几位作者以及其他研究者的一些工作,这些工作可追溯到 1990 年代。

信息安全专家 Thomas Ptacek 曾高度赞扬了 2023 年研究的合著者 Nadia Heninger,并在此分享了 RSA 密钥分析论文的摘要,以便于理解这个问题。我们同时也要感谢曾在 Register vulture 工作的 Dan Goodin,他在周一通过 Ars Technica 向我们报告了 UC 圣地亚哥论文的消息。

基本上,当客户端尝试连接到一个容易受到攻击的 SSH 服务器时,它们在协商建立全面安全加密通信的过程中,服务器将会生成一个数字签名以供客户端检查,以确保其正在与预期的服务器通信。

如我们之前所述,这个签名的计算过程可能会随机或意外地产生错误,聪明的算法可以从错误的签名中推导出服务器的私有 RSA 密钥,此密钥用于签名生成。对此的一种防范措施是在将签名发送给客户端前确保其计算正确;OpenSSL 和 LibreSSL 已经在实施这种防范。

正如论文作者在他们的摘要中提到的:

“我们证明了一种可能性:若 SSH 服务器在进行签名计算过程中出现自然故障,一名被动的网络攻击者便有机会获得其私有 RSA 主机密钥。

在之前的研究中,我们通常认为这对于 SSH 协议是不可行的,因为签名中包含了一些信息,比如 Diffie-Hellman 共享密钥,这些信息对于被动的网络观察者来说无法获得。

然而,我们证明了,在 SSH 中经常使用的签名参数下,如果出现了签名错误,我们便能有效地使用 格攻击 lattice attack 来恢复私钥。

我们对 SSH、IKEv1、IKEv2 协议进行了安全分析,在此场景下,我们利用我们的攻击方法在现实环境中挖掘出几个存在漏洞的独立实现中的数百个被攻破的密钥。

“一个被动的对手可以安静地监控合法的连接,不用冒被检测的风险,直到他们观察到一个包含私钥的错误签名。”研究团队做出了这样的结论:“然后,攻击者可以主动且不会被检测地冒充被攻破的主机,从而截取敏感数据。”

研究人员表示,他们已经扫描了整个互联网,并翻查了以前收集的 SSH 扫描数据,以测量易受攻击的签名的流行程度。他们声称,他们的数据集涵盖了 52 亿条 SSH 记录和超过七年的观察,其中包含了超过 59 万个无效的 RSA 签名。

通过他们的格密钥恢复技术,学者们表示,其中超过 4900 个错误的签名揭示了对应 RSA 公钥的因子分解。他们利用这些信息,推导出了 189 个公钥的私有 RSA 密钥。

在他们的研究中,作者们发现,思科、Zyxel、山石网科和 Mocana 这四个制造商的产品都可能受到这种密钥侦测攻击。研究者已经向思科和 Zyxel 报告了这个问题,观察到两家供应商都迅速进行了调查行动。

思科判定其 ASA 和 FTD 软件在 2022 年已经解决了此问题,且在这篇论文发布之前,公司正在对其 IOS 和 IOS XE 软件进行调查,看看如何应对此问题。

同一时间,Zyxel 发现这个缺陷只影响到了它那些已停止服务的固件,并且它已经开始使用不受此问题影响的 OpenSSL。研究人员表示,他们没有成功地与山石网科和 Mocana 取得联系,所以决定把这个问题提交给了 CERT 协调中心。

据称,自诩为 “SSH-2.0-SSHD” 的 SSH 服务器实现也可能受到攻击,这可能会影响到一些企业级的 Java 应用。有鉴于这个密钥推导技术的关键在于 PKCSv1.5,使用 PKCSv1.5-RSA 签名的 DNSSEC 可能也在风险之中。

他们还指出,他们在 IPsec 连接中收集到的签名数据集不大,所以无法确定此协议是否也可能受到类似的密钥泄漏攻击。他们表示:“鉴于易受攻击的签名故障很罕见,根据我们的数据,我们无法对 IPsec 实现得出多少结论,我们认为这个问题值得进一步研究。”

更新:已经与山石网科取得联系,官方确认该问题已在 2015 年发布的相关版本中修复,之后的版本也不存在相关问题。

具体详情可以咨询山石网科客服或查看如下链接:

https://www.hillstonenet.com.cn/security-notification/2015/07/28/dsfyj/

(题图:MJ/f94093f0-9ffe-4cf1-82fb-cdac1427e923)


via: https://www.theregister.com/2023/11/14/passive_ssh_key_compromise/

作者:Jessica Lyons Hardcastle 译者:ChatGPT 校对:wxy

通过安全的网络连接在远程计算机上调用命令或程序。

有一天,我正在测试如何在 将文件或目录复制到多个位置和系统时保持完整的文件权限。当我想检查远程系统上的文件权限时,我必须通过 SSH 登录它并检查属性。从远程系统多次登录和注销的过程让我有点烦,我想,如果我可以在远程 Linux 系统上通过 SSH 执行命令就好了。

幸运的是,在浏览了 ssh 命令的手册页后,我找到了一个解决办法。

如果你想知道如何本地运行远程系统上运行命令或脚本,而不登录到远程系统,下面的内容会告诉你如何做。

1、通过 SSH 在远程 Linux 系统上执行命令

从本地系统通过 SSH 在远程系统上运行命令或脚本的典型方法是:

$ ssh <username@IP_Address-or-Doman_name> <Command-or-Script>

允许我给你们举几个例子:

1.1、通过 SSH 在远程系统上运行单个命令

假设你想要 查找远程 Linux 系统的内核详细信息。为此,只需运行:

$ ssh [email protected] uname -a

这里,

  • sk 是远程系统的用户名,
  • 192.168.225.22 是远程系统的 IP 地址,
  • uname -a 是我想在远程系统上运行的命令。

示例输出:

通过 SSH 在远程 Linux 系统上执行命令

看到没?我并没有实际登录到远程系统,但通过 SSH 在远程系统上执行了 uname 命令,并在本地系统的终端上显示了输出。

你还可以像下面这样用引号指定命令。

$ ssh [email protected] "uname -a"

或者,

$ ssh [email protected] 'uname -a'

如果你已经 更改了 SSH 协议的默认端口,只需使用 -p 参数指定它。

$ ssh -p 2200 [email protected] uname -a

1.2、通过 SSH 在远程主机上执行多个命令

你还可以在远程主机上运行多个命令,方法是将它们放在引号中。

$ ssh [email protected] "uname -r && lsb_release -a"

或者:

$ ssh [email protected] "uname -r ; lsb_release -a"

上面的命令将显示我的 Ubuntu 服务器的内核版本和发行版详细信息。

示例输出:

在 Linux 上通过 SSH 在远程主机上运行多个命令

正如一位读者在下面的评论部分提到的那样,你应该用引号指定多个命令。如果不使用引号,第一个命令将在远程系统上执行,第二个命令将仅在本地计算机上执行。整个带引号的命令将按预期在远程计算机上运行。

提示: 了解 &&; 在命令中的区别:

&& 操作符只有在第一个命令成功时才执行第二个命令。

示例:

sudo apt-get update && sudo apt-get upgrade

在上述示例中,如果第一个命令成功,才会执行 sudo apt-get upgrade。否则,它将不会运行。

; 操作符会执行第二个命令,无论第一个命令是成功还是失败。

示例:

sudo apt-get update ; sudo apt-get upgrade

在上述示例中,即使第一个命令失败,sudo apt-get upgrade 也会执行。

1.3、通过 SSH 在远程机器上调用有 sudo 权限的命令

有些命令需要 sudo 权限才能运行。例如,以下命令将在我的远程系统上安装 apache2

$ ssh -t [email protected] sudo apt install apache2

示例输出:

通过 SSH 在远程机器上运行有 Sudo 权限的命令

注意到了吗?我在上面的命令中使用了 -t 标志,我们需要使用它来强制进行伪终端分配。它用于在远程机器上执行任意基于屏幕的程序,这非常有用。例如,在实现菜单服务时。

另外,我输入了两次密码。第一次是远程用户的密码,以便从本地系统通过 SSH 访问远程系统,第二次是为了向远程用户赋予 sudo 权限,以便安装应用程序(在本例中为 apache2)。

让我们用以下命令检查 Apache 服务是否正在运行:

$ ssh -t [email protected] sudo systemctl status apache2
[email protected]'s password: 
[sudo] password for sk: 
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Drop-In: /lib/systemd/system/apache2.service.d
└─apache2-systemd.conf
Active: active (running) since Thu 2019-12-19 11:08:03 UTC; 52s ago
Main PID: 5251 (apache2)
Tasks: 55 (limit: 2318)
CGroup: /system.slice/apache2.service
├─5251 /usr/sbin/apache2 -k start
├─5253 /usr/sbin/apache2 -k start
└─5254 /usr/sbin/apache2 -k start

Dec 19 11:08:03 ubuntuserver systemd[1]: Starting The Apache HTTP Server...
Dec 19 11:08:03 ubuntuserver apachectl[5227]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 2409:4072:51f:a1b6:a00:27ff:f
Dec 19 11:08:03 ubuntuserver systemd[1]: Started The Apache HTTP Server.

同样的,我们可以通过 SSH 在本地系统上运行远程系统上的任何命令或脚本。

1.4、通过 SSH 在远程系统上运行本地脚本

让我们在本地系统上创建一个简单的脚本来显示关于远程系统的发行版名称、包管理和基本细节等。

$ vi system_information.sh

添加以下行:

#!/bin/bash
#Name: Display System Details
#Owner: OSTechNIx
#----------------------------
echo /etc/*_ver* /etc/*-rel*; cat /etc/*_ver* /etc/*-rel*

按下 ESC 键,输入 :wq 保存退出。

现在,通过 SSH 命令在远程系统上运行这个脚本:

$ ssh [email protected] 'bash -s' < system_information.sh

示例输出:

[email protected]'s password: 
/etc/debian_version /etc/lsb-release /etc/os-release
buster/sid
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.2 LTS"
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

如果你没有在上面的命令中指定 bash -s,你将获得远程系统的详细信息,但伪终端不会被分配。

1.5、将远程主机的命令输出保存到本地主机

如果你希望与支持团队或同事共享远程系统上运行的命令输出,那么这非常有用。

以下命令将通过 SSH 在远程系统运行 du -ah,并将输出保存在本地系统的 diskusage.txt 文件中。

$ ssh [email protected] du -ah > diskusage.txt

然后,你可以通过使用 cat 命令或文本编辑器查看 diskusage.txt 文件来分析磁盘使用细节。

$ cat diskusage.txt 
4.0K ./.profile
4.0K ./.gnupg/private-keys-v1.d
8.0K ./.gnupg
76K ./data/image.jpg
128K ./data/file.pdf
20K ./data/text.docx
5.9M ./data/audio.mp3
6.1M ./data
0 ./.sudo_as_admin_successful
4.0K ./pacman?inline=false
4.0K ./.bash_logout
4.0K ./.wget-hsts
4.0K ./.bash_history
0 ./.cache/motd.legal-displayed
4.0K ./.cache
4.0K ./deb-pacman_1.0-0.deb
4.0K ./.bashrc
6.2M .

1.6、配置 SSH 密钥认证,避免输入密码

如果你经常在远程系统上运行命令,你可能需要配置基于 SSH 密钥的身份验证,以便每次跳过密码输入。更多细节可以在以下链接中找到。

Linux 系统下如何配置 SSH 密钥认证

配置了基于 SSH 密钥的认证后,我们可以通过 SSH 在远程机器上执行命令,从而不需要输入密码:

$ ssh [email protected] sudo apt update

2、通过 sshpass 在远程机器上运行命令

如果你不想配置基于 SSH 密钥的身份验证,你可以使用 sshpass 实用程序。

2.1、什么是 sshpass?

sshpass 是为使用键盘交互密码身份验证模式运行 ssh 而设计的,但它以非交互的方式。简单来说,sshpass 提供了非交互式的方式来验证 SSH 会话。

SSH 使用直接 TTY 访问来确保密码确实是由交互式键盘用户发出的。sshpass 在一个专用 tty 中运行 SSH,让它误以为从交互用户那里获得了密码。

2.2、在 Linux 中安装 sshpass

在许多 Linux 发行版的默认仓库中都有 sshpass 实用程序。例如,在 Debian、Ubuntu 及其衍生版本中,你可以使用下面的命令来安装 sshpass

$ sudo apt install sshpass

2.3、通过 SSH 和 sshpass 在远程机器上执行命令

sshpass 可以通过参数接受密码,或者通过环境变量读取密码,也可以从文本文件中读取密码。

警告: 所有这些方法都是 高度不安全的。所有系统用户都可以通过 ps 命令看到命令中的密码。不建议在生产中使用这些方法。最好使用基于密钥的身份验证。

让我们看看每种方法的示例。

将密码作为参数提供

将密码作为参数提供,使用 -p 选项,如下所示:

$ sshpass -p <remote-password> ssh remoteuser@ip-address <command-to-execute>

示例输出:

$ sshpass -p ubuntu ssh [email protected] uname -a

其中,

  • -p ubuntu - 提供远程系统的密码。
  • [email protected] - 远程系统用户名和地址。
  • uname -a - 要在远程计算机上执行的命令。

示例输出:

Linux Ubuntu22CT 5.15.60-1-pve #1 SMP PVE 5.15.60-1 (Mon, 19 Sep 2022 17:53:17 +0200) x86_64 x86_64 x86_64 GNU/Linux
密码作为环境变量提供

在这个方法中,我们声明一个名为 SSHPASS 的环境变量,用远程环境的密码作为其值。然后我们使用 -e 标志,如下所示:

$ SSHPASS=ubuntu sshpass -e ssh [email protected] uname -a
从文本文件中读取密码

使用 echo 命令在文本文件中追加密码:

$ echo "ubuntu" > mypassword.txt

现在,将密码文件传递给带有 -f 标志的 sshpass,如下所示:

$ sshpass -f mypassword.txt ssh [email protected] uname -a

通过 SSH 和 sshpass 在远程机器上执行命令

总结

在本教程中,我们学习了一些通过安全的网络连接在远程计算机上调用命令或程序的方法。在所有的方法中,sshpass 方法是最不安全的,建议用户避免在生产系统中使用它。


via: https://ostechnix.com/execute-commands-on-remote-linux-systems-via-ssh/

作者:sk 选题:lkxed 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如今 SSH 已成为了登录远程服务器的默认方式。

SSH 的全称是 “ 安全的 Shell Secure Shell ”,它功能强大、效率高,这个主流的网络协议用于在两个远程终端之间建立连接。让我们不要忘记它名称的“安全”部分,SSH 会加密所有的通信流量,以防止如劫持、窃听等攻击,同时提供不同的身份认证方式和无数个配置选项。

在这份新手指南中,你会学到:

  • SSH 的基本概念
  • 设置 SSH 服务器(在你想要远程登录的系统上)
  • 从客户端(你的电脑)通过 SSH 连接远程服务器

SSH 的基本概念

在学习配置过程前,让我们先了解一下 SSH 的全部基础概念。

SSH 协议基于 客户端-服务器 server-client (CS)架构。“ 服务器 Server ”允许“ 客户端 Client ”通过通信通道进行连接。该信道是经过加密的,信息交换通过 SSH 公私钥进行管理。

Image credit: SSH

OpenSSH 是在 Linux、BSD 和 Windows 系统上提供 SSH 功能的最流行的开源工具之一。

想要成功配置 SSH,你需要:

  • 在作为服务器的机器上部署 SSH 服务器组件,它由 openssh-server 包提供。
  • 在你远程访问服务器的客户端机器上部署 SSH 客户端组件,它由 openssh-client 包提供,大多数 Linux 和 BSD 发行版都已经预装好了。

区分服务器和客户端是十分重要的事情。或许你不想要你的 PC 作为 SSH 服务器,除非你有充分理由希望其他人通过 SSH 连接你的系统。

通常来说,你有一个专用的服务器系统。例如,一个 运行 Ubuntu 的树莓派。你可以 启用树莓派的 SSH 服务,这样你可以在你 PC 中的终端中,通过 SSH 控制并管理该设备。

有了这些信息,让我们看看如何在 Ubuntu 上设置 SSH 服务器。

在 Ubuntu 服务器中配置 SSH

设置 SSH 并不复杂,只需要以下几步。

前提

  • 一个在服务器端拥有 sudo 权限的用户
  • 可以下载所需包的互联网连接
  • 在你的网络中至少有另一个系统。可以是局域网中的另一台电脑,远程服务器或者计算机中托管的虚拟机。

再次强调,在你想要通过 SSH 远程登录的系统上安装 SSH 服务。

第一步:安装所需包

让我们从打开终端输入一些必要命令开始。

注意,在安装新的包或者软件前,要 更新你的 Ubuntu 系统,以确保运行的是最新版本的程序。

sudo apt update && sudo apt upgrade

你要运行 SSH 服务器的包由 OpensSSH 的 openssh-server 组件提供:

sudo apt install openssh-server

第二步:检查服务器状态

当你下载并安装完包后,SSH 服务器应该已经运行了,但是为了确保万无一失我们需要检查一下:

service ssh status

你还可以使用 systemctl 命令:

sudo systemctl status ssh

你应该会看到这样的结果,其中 active 是高亮的。输入 q 退出该页面。

如果你的结果中 SSH 服务没有运行,使用这个命令运行它:

sudo systemctl enable --now ssh

第三步:允许 SSH 通过防火墙

Ubuntu 带有名为 UFW 简单的防火墙 Uncomplicated Firewall )的防火墙,这是管理网络规则的 iptables 的一个接口。如果启动了防火墙,它可能会阻止你连接服务器。

想要配置 UFW 允许你的接入,你需要运行如下命令:

sudo ufw allow ssh

UFW 的运行状态可以通过运行 sudo ufw status 来检查。

现在,我们的 SSH 服务器已经开始运行了,在等待来自客户端的连接。

连接远程服务器

你本地的 Linux 系统已经安装了 SSH 客户端。如果没有,你可以在 Ubuntu 中使用如下命令安装:

sudo apt install openssh-client

要连接你的 Ubuntu 系统,你需要知道它的 IP 地址,然后使用 ssh 命令,就像这样:

ssh username@address

用户名username)改为你的系统上的实际用户名,并将 地址address)改为你服务器的 IP 地址。

如果你 不知道 IP 地址,可以在服务器的终端输入 ip a 查看结果。应该会看到这样的结果:

Using “ip a” to find the IP address

可以看到我的 IP 地址是 192.168.1.111。让我们使用 username@address 格式进行连接。

ssh [email protected]

这是你第一次连接到该 SSH 服务器,它会请求添加主机。输入 yes 并回车即可。

First time connecting to the server

SSH 会立即告诉你该主机已经被永久添加了,并要求你输入指定用户的密码,输入密码并再次按回车即可。

Host added, now type in the password

瞧,你远程登录了你的 Ubuntu 系统!

Connected!

现在,你可以在远程服务器的终端里和寻常一样工作了。

关闭 SSH 连接

你只需要输入 exit 即可关闭连接,它会立马关闭不需要确认。

Closing the connection with “exit”

在 Ubuntu 中关闭并禁止 SSH

如果你想要停止 SSH 服务,需要运行该命令:

sudo systemctl stop ssh

该命令会关闭 SSH 服务,直到重启它或者系统重启。想要重启它,输入:

sudo systemctl start ssh

现在,如果你想要禁止 SSH 跟随系统启动,使用该命令:

sudo systemctl disable ssh

该命令不会停止当前的 SSH 会话,只会在启动的时候生效。如果你想要它跟随系统启动,输入:

sudo systemctl enable ssh

其他 SSH 客户端

从 Linux 到 macOS,大多数 *nix 系统中都有 ssh 工具,但这并不是唯一的选项,这里有几个可以在其他操作系统中使用的客户端:

  • PuTTY 是一个自由开源的 Windows 系统上的 SSH 客户端。它功能强大并且简单易用。如果你从 Windows 系统上连接你的 Ubuntu 服务器,PuTTY 是最好的选择。(LCTT 译注:切记从官方网站下载。)
  • 对安卓用户来说,JuiceSSH 是十分优秀的工具。如果你在旅途中需要一个移动客户端来连接你的 Ubuntu 系统,我强烈建议你试试 JuiceSSH。它已经出现了将近 10 年,并且可以免费使用。
  • 最后是 Termius,它可用于 Linux、Windows、macOS、iOS 和安卓。它有一个免费版本和几个付费选项。如果你运行大量服务器并进行共享连接的团队合作,那么 Termius 对你来说是一个不错的选择。

总结

在这份指导中,你可以在 Ubuntu 系统中设置 SSH 作为服务器,允许来自你电脑的远程安全的连接,便于你通过命令行开展工作。

此,我推荐以下文章:

远程工作快乐!


via: https://itsfoss.com/set-up-ssh-ubuntu/

作者:Chris Patrick Carias Stas 选题:lujun9972 译者:Donkey-Hao 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

使用开源的 PuTTY 工具,从 Windows 建立到 Linux 的 SSH 连接。

 title=

在 Linux 世界中, 安全外壳 secure shell (SSH)协议是最为常用的、通过命令行控制远程计算机的方式。SSH 是真正的 Linux 原创,但是它在 Windows 世界中也越来越流行。甚至有了一份官方的 Windows 的 SSH 文档,那篇文档阐述了使用 OpenSSH 控制 Windows 的方法。

这篇文章展示了如何使用了流行的开源工具 PuTTY,建立一个从 Windows 到 Fedora 33 Linux 系统的 SSH 连接。

使用 SSH 的方法

SSH 使用客户端-服务器模式,即 SSH 客户端会创建到 SSH 服务端的连接。SSH 服务器通常会作为 守护进程 Daemon 运行,所以它常被称为 SSHD。你很难找到一个不自带 SSH 守护进程的 Linux 发行版。在 Fedora 33 中,已安装了 SSH 守护进程,但是并未激活。

你可以使用 SSH 控制几乎所有的 Linux 机器,无论它是作为虚拟机还是作为网络上的物理设备运行。一个常见的用例是 无头 headless 配置的嵌入式设备,如树莓派。SSH 也可以用做一个其它网络服务的隧道。因为 SSH 连接是加密的,所以你可以使用 SSH 作为一个任何默认不提供加密的协议的传输层。

在这篇文章中,我将解释使用 SSH 的四个方式:1、如何在 Linux 端配置 SSH 守护进程;2、如何设置远程控制台连接;3、如何通过网络复制文件,4. 如何将 SSH 作为某些协议的隧道。

1、配置 SSHD

将 Linux 系统(文中是 Fedora 33)作为 SSH 服务器,允许 PuTTY SSH 客户端进行连接。首先,检查守护进程的 SSH 配置。配置文件放在 /etc/ssh/sshd_config,它包含了许多选项,通过取消掉相关行的注释就可以激活:

#       $OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

Include /etc/ssh/sshd_config.d/*.conf

#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

没有取消任何注释的默认配置在这个示例中应该是可以工作的。要检查 SSH 守护进程是否已经运行,输入 systemctl status sshd

$ systemctl status sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2018-06-22 11:12:05 UTC; 2 years 11 months ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 577 (sshd)
    Tasks: 1 (limit: 26213)
   CGroup: /system.slice/sshd.service
           └─577 /usr/sbin/sshd -D -oCiphers=[[email protected]][5],chacha20-[...]

如果它处于 未激活 inactive 状态,使用 systemctl start sshd 命令启动它。

2、设置远程控制台

在 Windows 下 下载 PuTTY 安装程序,然后安装并打开它。你应看到一个像这样的窗口:

 title=

在“ 主机名(或 IP 地址) Host Name (or IP address) ”输入框,键入你的 Linux 系统的连接信息。本文设置了一个 Fedora 33 虚拟机,它使用桥接网络适配器,使我可以由 IP 地址 192.168.1.60 连接这个系统。点击“ 打开 Open ”,应会如图示的打开一个窗口:

 title=

这是 SSH 的安全措施之一,是为了防止 中间人攻击 man-in-the-middle attack 。消息中的指纹应该匹配 Linux 系统中放在 /etc/ssh/ssh_host_ed25519_key.pub 的密钥。PuTTY 将这个密钥以 MD5 哈希值 的方式打印出来。要检查它的真实性,切换到 Linux 系统并打开一个控制台,然后输入:

ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ed25519_key.pub

输出应该和 PuTTY 展示的指纹一致:

$ ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ed25519_key.pub
256 MD5:E4:5F:01:05:D0:F7:DC:A6:32 no comment (ED25519)

点击“ Yes ”以确认 PuTTY 的安全提示。主机系统的指纹现在存储在 PuTTY 的信任列表中,其位于 Windows 的注册表中的:

HKEY_CURRENT_USER\SOFTWARE\SimonTatham\PuTTY\SshHostKeys

输入正确的登录凭证,然后你应该进入控制台了,位置在你的用户主目录。

 title=

3、通过网络复制文件

除了远程控制台,你同样可以使用 PuTTY 通过 SSH 来传输文件。PuTTY 的安装目录在 C:\Program Files (x86)\PuTTY,在该目录下寻找 ppscp.exe。你既可以使用它从 Linux 系统复制文件,也可以复制文件到 Linux 系统。

使用 Windows + R 然后输入 cmd 来打开命令提示符,从你的 Linux 用户主目录复制 MYFile.txt 到你的 Windows 主目录,输入:

C:\"Program Files (x86)"\PuTTY\pscp.exe [email protected]:/home/stephan/MyFile.txt .

要从 Windows 主目录复制文件到 Linux 用户主目录,输入:

C:\"Program Files (x86)"\PuTTY\pscp.exe MyFile.txt [email protected]:/home/stephan/

就像你也许已经发现的那样,复制的命令通常构造为:

pscp.exe <source> <target>

4、隧道化一个协议

假设你拥有一个 Linux 机器,为某些特别的应用运行一个基于 HTTP 的服务。你想从你的 Windows 机器通过互联网访问这个 HTTP 服务。而且,你不能将相关的 TCP 端口暴露在公网,因为:

  1. 这个服务通过 HTTP 而非 HTTPS 运行
  2. 根本没有用户管理和登录系统

乍一看,建立这种架构不产生可怕的漏洞似乎是不可能的。但是 SSH 可简单的为这种情况建立一个安全的解决方案。

我将用我的软件项目 Pythonic 来演示这个过程。在容器中运行。Pythonic 作为容器运行,开放两个 TCP 端口:TCP 端口 7000(主要编辑器)和 TCP 端口 8000(code-server 代码编辑器)。

要在一个 Linux 机器上安装 Pythonic ,运行:

podman pull pythonicautomation/pythonic
podman run -d -p 7000:7000 -p 8000:8000 pythonic

转向你的 Windows 机器,打开 PuTTy,转到 “ 连接 Connection -> SSH -> 隧道 Tunnels ”。加入你要转发的两个 TCP 端口:

  • 源:7000 / 目标:localhost:7000
  • 源:8000 / 目标:localhost:8000

 title=

然后返回 “ 会话 Session ” 部分,并像之前那样建立一个 SSH 链接。打开网页浏览器,然后转到 http://localhost:7000;你应该看见像这样的窗口:

 title=

你成功的设置了端口转发!

警告: 如果你选择在公网上暴露 TCP 端口 22 ,不要使用易于猜测的登录凭证。你将接受来自全世界的登录请求,它们使用常见的、标准的登录凭证以尝试登录你的 Linux 机器。相反,只允许已知的用户登录。这种登录限制可以通过 公钥加密 来实现,它使用一个密钥对,其中公钥存储在 SSH 主机上,而私钥保留在客户端。

调试

如果你难以连接你的 Linux 机器,你可以跟踪你的 SSH 守护进程的处理过程:

journalctl -f -u sshd

这是一个普通的登录进程,但是其日志级别为 DEBUG,它看起来是这样的 :

 title=

了解更多

这篇文章几乎没有涉及到使用 SSH 的方法。如果你正在寻找一个特定用例的信息,你也许可以在互联网中找到无数的教程。我在工作中使用 PuTTY ,因为它易于设置,在两个操作系统间又具有良好的可操作性,使得它成为连接解决方案里的瑞士军刀。

(文内图片来自:Stephan Avenwedde,CC BY-SA 4.0


via: https://opensource.com/article/21/6/ssh-windows

作者:Stephan Avenwedde 选题:lujun9972 译者:yjacks 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

以下是我如何优化我的 SSH 体验并保护我的服务器不被非法访问。

 title=

SSH(安全 Shell)是一个协议,它使你能够创建一个经过验证的私人连接,并使用加密密钥保护通道,在另一台机器上启动一个远程 Shell。使用这种连接,你可以执行远程命令,启动安全文件传输,转发套接字、显示和服务,等等。

在 SSH 出现之前,大多数远程管理是通过 telnet 完成的,公平地说,一旦你能建立一个远程会话,你几乎可以做任何你需要的事情。这个协议的问题是,通讯是以纯明文的方式进行的,没有经过加密。使用 流量嗅探器 不需要太多努力就可以看到一个会话中的所有数据包,包括那些包含用户名和密码的数据包。

有了 SSH,由于使用了非对称密钥,参与通信的设备之间的会话是加密的。如今,这比以往任何时候都更有意义,因为所有的云服务器都是由分布在世界各地的人管理的。

3 个配置 SSH 的技巧

SSH 协议最常见的实现是 OpenSSH,它由 OpenBSD 项目开发,可用于大多数 Linux 和类 Unix 操作系统。一旦你安装了这个软件包,你就会有一个名为 sshd_config 的文件来控制该服务的大部分行为。其默认设置通常是非常保守的,但我倾向于做一些调整,以优化我的 SSH 体验,并保护我的服务器不被非法访问。

1、改变默认端口

这是一个并非所有管理员都记得的问题。任何有端口扫描器的人都可以发现一个 SSH 端口,即使你之后把它移到别的端口,所以你很难把自己从危险中移除,但这样却会有效的避免了数百个针对你的服务器扫描的不成熟脚本。这是一个可以让你省心,从你的日志中减去大量的噪音的操作。

在写这篇文章时,我在一个云服务提供商上设置了一个 SSH 服务器,默认端口 TCP 22,每分钟平均被攻击次数为 24 次。在将端口改为一个更高的数字,即 TCP 45678 后,平均每天有两个连接并用各种用户名或密码进行猜测。

要改变 SSH 的默认端口,在你喜欢的文本编辑器中打开 /etc/ssh/sshd_config,将 Port 的值从 22 改为大于 1024 的某个数字。这一行可能被注释了,因为 22 是默认的(所以不需要在配置中明确声明),所以在保存之前取消注释。

Port 22122
#AddressFamily any 
#ListenAddress 0.0.0.0 
#ListenAddress ::

一旦你改变了端口并保存了文件,重新启动 SSH 服务器:

$ sudo systemctl restart sshd

2、不要使用密码

现在有一个普遍的潮流是停止使用密码作为认证手段,双因素认证等方法越来越受欢迎。OpenSSH 可以使用非对称密钥进行认证,因此不需要记住复杂的密码,更不需要每隔几个月轮换一次密码,也不需要担心有人在你建立远程会话时进行“肩后偷窥”。使用 SSH 密钥可以让你快速、安全地登录到你的远程设备上。这往往意味着花费在错误的用户名和密码上的时间更少。登录令人愉快的简单。当没有密钥时,就没有入口,甚至没有提示符。

要使用这个功能,你必须同时配置客户机(在你面前的计算机)和服务器(远程机器)。

在客户端机器上,你必须生成一个 SSH 密钥对。这包括一个公钥和一个私钥。正如它们的名字所暗示的,一个公开的密钥是供你分发给你想登录的服务器的,另一个是私人的密钥,必须不与任何人分享。使用 ssh-keygen 命令可以创建一个新的密钥对,并使用 -t 选项来指定一个好的、最新的密码学库,如 ed25519

$ ssh-keygen -t ed25519    
 Generating public/private ed25519 key pair. 
 Enter file in which to save the key (~/.ssh/id_ed25519):

在密钥创建过程中,你会被提示为文件命名。你可以按回车键来接受默认值。如果你将来创建了更多的密钥,你可以给每个密钥起一个自定义的名字,但有多个密钥意味着你要为每次交互指定使用哪个密钥,所以现在只要接受默认即可。

你还可以给你的密钥一个口令。这可以确保即使别人设法获得你的私钥(这本身就不应该发生),没有你的口令,他们也无法将其投入使用。这对某些密钥来说是一种有用的保护措施,而对其他密钥来说则不合适(特别是那些用于脚本的密钥)。按回车键让你的密钥没有口令,或者你选择创建一个口令。

要把你的密钥复制到服务器上,使用 ssh-copy-id 命令。例如,如果我拥有一台名为 example.com 的服务器,那么我可以用这个命令把我的公钥复制到它上面:

$ ssh-copy-id [email protected]

这将在服务器的 .ssh 目录下创建或修改 authorized_keys 文件,其中包含你的公钥。

一旦确认 ssh-copy-id 命令完成了它所做的事情,尝试从你的电脑上登录,以验证你可以在没有密码的情况下登录(或者如果你选择使用你的密钥的口令,就输入密钥口令)。

在没有使用你的服务器帐户的密码登录到你的服务器上后,编辑服务器的 sshd_config 并将 PasswordAuthentication 设置为 no

PasswordAuthentication no

重新启动 SSH 服务以加载新的配置:

$ sudo systemctl restart sshd

3、决定谁可以登录

大多数发行版不允许 root 用户通过 SSH 登录,这确保只有非特权账户是活跃的,根据需要使用 sudo 命令来提升权限。这就防止了一个明显的、令人痛苦的目标(root)受到简单而常见的脚本攻击。

同样,OpenSSH 的一个简单而强大的功能是能够决定哪些用户可以登录到一台机器。要设置哪些用户被授予 SSH 访问权,在你最喜欢的文本编辑器中打开 sshd_config 文件,并添加这样一行:

AllowUsers jgarrido jane tux

重新启动 SSH 服务以加载新的配置选项。

这只允许三个用户(jgarridojanetux)登录或在远程机器上执行任何操作。

总结

你可以使用 OpenSSH 来实现一个强大而稳健的 SSH 服务器。这些只是加固你的系统的三个有用的选项。尽管如此,在 sshd_config 文件中仍有大量的功能和选项可以打开或关闭,而且有许多很棒的应用程序,如 Fail2ban,你可以用来进一步保护你的 SSH 服务。


via: https://opensource.com/article/22/2/configure-ssh-privacy

作者:Jonathan Garrido 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

学会使用安全外壳协议连接远程计算机。

 title=

使用 Linux,你只需要在键盘上输入命令,就可以巧妙地使用计算机(甚至这台计算机可以在世界上任何地方),这正是 Linux 最吸引人的特性之一。有了 OpenSSH,POSIX 用户就可以在有权限连接的计算机上打开安全外壳协议,然后远程使用。这对于许多 Linux 用户来说可能不过是日常任务,但从没操作过的人可能就会感到很困惑。本文介绍了如何配置两台计算机的 安全外壳协议 secure shell (简称 SSH)连接,以及如何在没有密码的情况下安全地从一台计算机连接到另一台计算机。

相关术语

在讨论多台计算机时,如何将不同计算机彼此区分开可能会让人头疼。IT 社区拥有完善的术语来描述计算机联网的过程。

  • 服务 service : 服务是指在后台运行的软件,因此它不会局限于仅供安装它的计算机使用。例如,Web 服务器通常托管着 Web 共享 服务。该术语暗含(但非绝对)它是没有图形界面的软件。
  • 主机 host : 主机可以是任何计算机。在 IT 中,任何计算机都可以称为 主机,因为从技术上讲,任何计算机都可以 托管 host 对其他计算机有用的应用程序。你可能不会把自己的笔记本电脑视为 主机,但其实上面可能正运行着一些对你、你的手机或其他计算机有用的服务。
  • 本地 local : 本地计算机是指用户或某些特定软件正在使用的计算机。例如,每台计算机都会把自己称为 localhost
  • 远程 remote : 远程计算机是指你既没在其面前,也没有在实际使用的计算机,是真正意义上在 远程 位置的计算机。

现在术语已经明确好,我们可以开始了。

在每台主机上激活 SSH

要通过 SSH 连接两台计算机,每个主机都必须安装 SSH。SSH 有两个组成部分:本地计算机上使用的用于启动连接的命令,以及用于接收连接请求的 服务器。有些计算机可能已经安装好了 SSH 的一个或两个部分。验证 SSH 是否完全安装的命令因系统而异,因此最简单的验证方法是查阅相关配置文件:

$ file /etc/ssh/ssh_config
/etc/ssh/ssh_config: ASCII text

如果返回 No such file or directory 错误,说明没有安装 SSH 命令。

SSH 服务的检测与此类似(注意文件名中的 d):

$ file /etc/ssh/sshd_config
/etc/ssh/sshd_config: ASCII text

根据缺失情况选择安装两个组件:

$ sudo dnf install openssh-clients openssh-server

在远程计算机上,使用 systemd 命令启用 SSH 服务:

$ sudo systemctl enable --now sshd

你也可以在 GNOME 上的 系统设置 或 macOS 上的 系统首选项 中启用 SSH 服务。在 GNOME 桌面上,该设置位于 共享 面板中:

 title=

开启安全外壳协议

现在你已经在远程计算机上安装并启用了 SSH,可以尝试使用密码登录作为测试。要访问远程计算机,你需要有用户帐户和密码。

远程用户不必与本地用户相同。只要拥有相应用户的密码,你就可以在远程机器上以任何用户的身份登录。例如,我在我的工作计算机上的用户是 sethkenlon ,但在我的个人计算机上是 seth。如果我正在使用我的个人计算机(即作为当前的本地计算机),并且想通过 SSH 连接到我的工作计算机,我可以通过将自己标识为 sethkenlon 并使用我的工作密码来实现连接。

要通过 SSH 连接到远程计算机,你必须知道其 IP 地址或可解析的主机名。在远程计算机上使用 ip 命令可以查看该机器的 IP 地址:

$ ip addr show | grep "inet "
inet 127.0.0.1/8 scope host lo
inet 10.1.1.5/27 brd 10.1.1.31 [...]

如果远程计算机没有 ip 命令,可以尝试使用 ifconfig 命令(甚至可以试试 Windows 上通用的 ipconfig 命令)。

127.0.0.1 是一个特殊的地址,它实际上是 localhost 的地址。这是一个 环回 loopback 地址,系统使用它来找到自己。这在登录远程计算机时并没有什么用,因此在此示例中,远程计算机的正确 IP 地址为 10.1.1.5。在现实生活中,我的本地网络正在使用 10.1.1.0 子网,进而可得知前述正确的 IP 地址。如果远程计算机在不同的网络上,那么 IP 地址几乎可能是任何地址(但绝不会是 127.0.0.1),并且可能需要一些特殊的路由才能通过各种防火墙到达远程。如果你的远程计算机在同一个网络上,但想要访问比自己的网络更远的计算机,请阅读我之前写的关于 在防火墙中打开端口 的文章。

如果你能通过 IP 地址 主机名 ping 到远程机器,并且拥有登录帐户,那么就可以通过 SSH 接入远程机器:

$ ping -c1 10.1.1.5
PING 10.1.1.5 (10.1.1.5) 56(84) bytes of data.
64 bytes from 10.1.1.5: icmp_seq=1 ttl=64 time=4.66 ms
$ ping -c1 akiton.local
PING 10.1.1.5 (10.1.1.5) 56(84) bytes of data.

至此就成功了一小步。再试试使用 SSH 登录:

$ whoami
seth
$ ssh [email protected]
bash$ whoami
sethkenlon

测试登录有效,下一节会介绍如何激活无密码登录。

创建 SSH 密钥

要在没有密码的情况下安全地登录到另一台计算机,登录者必须拥有 SSH 密钥。可能你的机器上已经有一个 SSH 密钥,但再多创建一个新密钥也没有什么坏处。SSH 密钥的生命周期是在本地计算机上开始的,它由两部分组成:一个是永远不会与任何人或任何东西共享的私钥,一个是可以复制到任何你想要无密码访问的远程机器上的公钥。

有的人可能会创建一个 SSH 密钥,并将其用于从远程登录到 GitLab 身份验证的所有操作,但我会选择对不同的任务组使用不同的密钥。例如,我在家里使用一个密钥对本地机器进行身份验证,使用另一个密钥对我维护的 Web 服务器进行身份验证,再一个单独的密钥用于 Git 主机,以及又一个用于我托管的 Git 存储库,等等。在此示例中,我将只创建一个唯一密钥,以在局域网内的计算机上使用。

使用 ssh-keygen 命令创建新的 SSH 密钥:

$ ssh-keygen -t ed25519 -f ~/.ssh/lan

-t 选项代表 类型 ,上述代码设置了一个高于默认值的密钥加密级别。-f 选项代表 文件,指定了密钥的文件名和位置。运行此命令后会生成一个名为 lan 的 SSH 私钥和一个名为 lan.pub 的 SSH 公钥。

使用 ssh-copy-id 命令把公钥发送到远程机器上,在此之前要先确保具有远程计算机的 SSH 访问权限。如果你无法使用密码登录远程主机,也就无法设置无密码登录:

$ ssh-copy-id -i ~/.ssh/lan.pub [email protected]

过程中系统会提示你输入远程主机上的登录密码。

操作成功后,使用 -i 选项将 SSH 命令指向对应的密钥(在本例中为 lan)再次尝试登录:

$ ssh -i ~/.ssh/lan [email protected]
bash$ whoami
sethkenlon

对局域网上的所有计算机重复此过程,你就将能够无密码访问这个局域网上的每台主机。实际上,一旦你设置了无密码认证,你就可以编辑 /etc/ssh/sshd_config 文件来禁止密码认证。这有助于防止其他人使用 SSH 对计算机进行身份验证,除非他们拥有你的私钥。要想达到这个效果,可以在有 sudo 权限的文本编辑器中打开 /etc/ssh/sshd_config 并搜索字符串 PasswordAuthentication,将默认行更改为:

PasswordAuthentication no

保存并重启 SSH 服务器:

$ sudo systemctl restart sshd &amp;&amp; echo "OK"
OK
$

日常使用 SSH

OpenSSH 改变了人们对操作计算机的看法,使用户不再被束缚在面前的计算机上。使用 SSH,你可以访问家中的任何计算机,或者拥有帐户的服务器,甚至是移动和物联网设备。充分利用 SSH 也意味着解锁 Linux 终端的更多用途。如果你还没有使用过 SSH,请试一下它吧。试着适应 SSH,创建一些适当的密钥,以此更安全地使用计算机,打破必须与计算机面对面的局限性。


via: https://opensource.com/article/20/9/ssh

作者:Seth Kenlon 选题:lujun9972 译者:unigeorge 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出