如何使用nsh在Ubuntu18.04上运行安全远程命令
介绍
每天管理多台机器通常很困难。 虽然 Secure Shell (SSH) 是远程访问的不错选择,但该协议本身在便利性和安全性方面都存在一些缺陷。
例如,远程机器需要有一个公共 IP 地址和一个转发端口才能访问它们,这会将它们暴露给互联网,或者至少是一个更大的网络。 如果您使用密码而不是公钥和私钥对进行身份验证,这尤其令人担忧。 此外,如果您事先不知道远程机器的公钥,您可能容易受到“man-in-the-middle”攻击。 许多你想访问的远程机器要么没有公共 IP 地址,要么有一个你可能不知道的动态 IP 地址。
此外,SSH 要求每个远程会话建立一个连接。 如果用户需要在数百甚至数千台机器上运行单个命令,则必须首先通过 TCP 握手建立与每台机器的连接,这样效率较低。
NKN Shell 或 nsh 是 SSH 的替代方案,它提供了一种方便且安全的方式来运行远程命令。 nsh 利用 NKN 的全球公共网络 提供安全和分散的数据传输。 该架构使用包含用于路由和端到端加密的公钥的唯一地址,无需任何公钥基础设施 (PKI)。 该网络也不需要远程服务器具有公共 IP 地址。 远程服务器只需要能够访问 Internet 并能够建立出站 HTTP 和 websocket 连接。 因此,您的远程计算机不会暴露在开放的 Internet 中。
在本教程中,您将使用 NKN shell 守护程序 和 NKN Shell Client Xterm 应用程序在远程机器上执行命令。 为此,您将在具有 Internet 访问权限的远程计算机上安装和配置 NKN Shell 守护程序,生成密钥对,并从客户端建立连接。
先决条件
要遵循本教程,您将需要以下内容:
- 按照 Ubuntu 18.04 初始服务器设置指南 设置一台 Ubuntu 18.04 服务器,包括启用非 root
sudo
的用户和防火墙。 - 安装在本地计算机上的 Web 浏览器。
第 1 步 — 在远程服务器上安装 NKN Shell 守护程序
首先,在您的服务器上安装 NKN shell 守护程序 (nsd
)。 此应用程序将调用 nkn-multiclient,它将连接到 NKN 的公共网络并获取路由地址。 然后,守护程序将侦听来自经过身份验证和列入白名单的客户端的传入 shell 命令,执行这些命令,然后发回结果。
首先从 GitHub 下载最新的 pre-built nshd 二进制文件:
wget https://github.com/nknorg/nkn-shell-daemon/releases/latest/download/linux-amd64.tar.gz
解压文件:
tar -zxvf linux-amd64.tar.gz
然后将文件移动到 /usr/local/bin
目录,以便它们在系统范围内可用:
sudo mv ./linux-amd64/* /usr/local/bin/
接下来,您将使用 Systemd 将其配置为作为守护进程运行,以便在服务器重置时重新启动。
在 /etc/systemd/system
中创建一个名为 nshd.service
的文件:
sudo nano /etc/systemd/system/nshd.service
将以下服务定义添加到文件中以配置服务:
/etc/systemd/system/nshd.service
[Unit] Description=NKN Shell Daemon After=network.target [Service] Type=simple User=root Group=root Restart=always ExecStart=/usr/local/bin/nshd [Install] WantedBy=multi-user.target
在 Understanding Systemd Units and Unit Files 中了解有关 Systemd 单元文件的更多信息。
保存文件并退出编辑器。 然后使用以下命令启用并启动 nshd
服务:
sudo systemctl enable nshd.service sudo systemctl start nshd.service
运行以下命令以确保服务处于活动状态并已启动:
sudo systemctl status nshd.service
你会看到状态是活跃的:
Output● nshd.service - NKN Shell Daemon Loaded: loaded (/etc/systemd/system/nshd.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2020-02-19 19:16:02 UTC; 7s ago Main PID: 3457 (nshd) Tasks: 10 (limit: 1152) CGroup: /system.slice/nshd.service └─3457 /usr/local/bin/nshd Feb 19 19:16:02 your_hostname systemd[1]: Started NKN Shell Daemon. Feb 19 19:16:03 your_hostname nshd[3457]: Create directory /etc/nshd/ Feb 19 19:16:03 your_hostname nshd[3457]: Create password and save to file /etc/nshd/wallet.pswd Feb 19 19:16:03 your_hostname nshd[3457]: Create wallet and save to file /etc/nshd/wallet.json Feb 19 19:16:03 your_hostname nshd[3457]: Create authorized pubkeys file /etc/nshd/authorized_pubkeys Feb 19 19:16:03 your_hostname nshd[3457]: Listening at d46567b883a3070ee3fe879d9fa2d5dc55a95f79ff2797c42df36c6979e5c4Aba
为了连接到您的服务器,您需要获取其 NKN 地址,您可以在上一个命令的输出中找到该地址。 您也可以运行以下命令来获取地址:
nshd addr
你会看到你的地址出现:
Outpute70ca28ede84fc0659f2869255e8a393aef35b4fa5a7e036f29127c7dba75383
记下这个地址,因为您需要它来连接到您的服务器。
现在守护程序正在运行并正在侦听,您可以配置基于 Web 的客户端与服务器通信。
第 2 步 — 为 NKN Shell 客户端配置权限
您需要一个可以连接到远程计算机的兼容客户端。 在本教程中,您将使用 NKN Shell Client Xterm,这是一个基于 Web 的 NKN Shell 客户端。 有几种不同的方式来运行它:
- 使用 https://nsh.nkn.org/ 上的托管版本。 请注意,虽然此网页托管在服务器上,但它实际上是在您的浏览器中运行的纯本地 Web 应用程序。
- 获取 源代码 并自己托管。
- 使用 nShell Chrome 扩展 。
在本教程中,您将使用托管版本。 在本地计算机上,打开 Web 浏览器并导航到 https://nsh.nkn.org。 您将看到一个欢迎屏幕:
单击生成新密钥对。 您的密钥将生成并显示,如下图所示:
注意:当你生成一个新的密钥对时,你会看到一个Secret Seed。 保持这个秘密种子的安全和安全,就像使用 SSH 私钥一样。 任何拥有这个秘密种子的人都可以使用它来重新生成你的公钥,然后在你的远程机器上运行命令。 你的浏览器会记住这个种子,但你应该把它复制到安全的地方,这样你就可以在新机器上再次使用它。
将 Secret Seed 保存在安全的地方。 您可以稍后使用它来重新生成您的公钥,以便您可以从不同的客户端计算机进行连接。
由于这是一个新的密钥对,您必须将 Public Key 添加到服务器上的文件 /etc/nshd/authorized_pubkeys
中。
/etc/nshd/authorized_pubkeys
与 ~/authorized_keys
文件具有相似的作用,它控制哪些 SSH 公钥可以登录。 authorized_pubkeys
文件可以指定与密钥关联的用户。 出于安全考虑,您将希望在本教程中使用非 root 用户登录,因此您将生成的公钥与您在初始服务器设置指南中创建的 sammy 用户相关联文章的前提。
要将用户与公钥相关联,您需要获取该用户的用户 ID (UID) 和组 ID (GID)。 以 sammy 用户身份登录时,在您的服务器上执行以下命令:
id
您将看到用户的 UID 和 GID:
Outputuid=1000(sammy) gid=1000(sammy) groups=1000(sammy),27(sudo)
现在在编辑器中打开 authorized_pubkeys
文件:
sudo nano /etc/nshd/authorized_pubkeys
添加包含公钥、uid 和 gid 的单行,以空格分隔:
授权的公钥
5d5367a5730427c205904a4457392051d2045dbce0186518fb6eb24dd9e41ba6 1000 1000
保存文件。
验证文件是否包含正确的内容:
cat /etc/nshd/authorized_pubkeys
您会在屏幕上看到您的密钥:
Output5d5367a5730427c205904a4457392051d2045dbce0186518fb6eb24dd9e41ba6 1000 1000
然后重新启动 nshd
守护程序以应用更改:
sudo systemctl restart nshd.service
现在让我们通过连接到服务器并运行命令来测试它。
第 3 步 — 向远程机器发送命令并接收响应
在 NKN Shell 客户端中,输入步骤 1 中的远程 nshd
地址,以及可选的客户端标识符:
单击 Connect 启动连接。
您将连接到远程计算机并在浏览器中显示终端提示。 从这里您可以像使用 SSH 一样使用它。 例如,执行以下命令切换到/etc/nshd
目录:
cd /etc/nshd
然后列出其内容:
ls
您将看到目录的内容:
Outputauthorized_pubkeys wallet.json wallet.pswd
您可以通过键入 exit
断开连接。 当您需要重新连接时,请重新访问 Web 界面并输入您的连接详细信息。 如果您生成新的密钥对,则需要将新的公钥添加到您的服务器。
结论
在本教程中,您安装并配置了 nsh 以安全方便地向远程计算机发送命令。 当您需要快速运行命令以获取服务的最新状态或查看某些配置设置时,nsh 是访问远程计算机的好方法。 该应用程序基于 NKN 的全球公共网络,并且可以免费使用,因此您可以将其整合到您自己的应用程序或工作流程中。
您还可以探索支持 SSH 或任何其他基于 TCP 的应用程序的 nkn-tunnel。