如何在Ubuntu上使用nShell安全的运行远程命令

作者:NKN Labs 张逸伦

介绍

通常情况下,在日常生活/工作中很难管理多台计算机。尽管Secure Shell(SSH)是远程访问的不错选择,但该协议本身在便利性和安全性方面还都存在一些缺点。

例如,远程机器需要具有公共IP地址和开放端口才能被访问,这使它们暴露于整个因特网或至少是更大的网域中。如果您使用密码而不是公钥和私钥进行身份验证,则尤其要注意这一点。此外,如果您事先不知道远程计算机的公钥,则可能容易受到“中间人”攻击。而且您要访问的许多远程计算机都没有公共IP地址,或者它们具有您可能不知道的一直在变的动态IP地址。

此外,SSH还要求每个远程会话建立一个连接。如果用户需要在数百甚至数千台计算机上运行单个命令,则他们必须首先使用TCP协议建立与每台计算机的连接,这会大大降低运行效率。

NKN Shell(简称nsh)是SSH的替代方法,它提供了一种方便且安全的方式来运行远程命令。 nsh利用NKN的全球公共网络提供安全和去中心化的数据传输。该架构使用每个客户端独一无二的NKN地址,其中包含用于路由和端到端加密的公钥。而且不需要任何公共密钥基础设施(PKI)。网络也不需要远程服务器具有公共IP地址。远程服务器只需要可以访问因特网并能够建立出站HTTP和Websocket连接。因此,您的远程计算机不会轻易暴露在开放的因特网中。

在本教程中,您将使用NKN Shell daemon程序NKN Shell Client Xterm应用程序在远程计算机上执行命令。为此,您将在具有因特网访问权限的远程计算机上安装和配置NKN Shell daemon程序,生成密钥对,并与客户端建立连接。

前提条件

要执行本教程,您需要先完成以下设置:

步骤1 —在远程服务器上安装NKN Shell daemon程序

首先,在远程服务器上安装NKN Shell daemon程序(nsd)。该应用程序将调用nkn-multiclient,该客户端将连接到NKN的公共网络并获取用于路由的地址。然后,daemon程序将侦听来自经过身份验证和列入白名单的客户端的传入Shell命令,执行这些命令,然后发送回结果。

首先从GitHub下载最新的编译好的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作为daemon程序运行,以便在重置服务器后自动启动。

在/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
( 点击了解更多关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

您会看到您的地址显示如下:
Output
e70ca28ede84fc0659f2869255e8a393aef35b4fa5a7e036f29127c7dba75383

记下该地址,因为您将需要该地址才能连接到服务器。

现在,daemon程序正在运行并且正在侦听,您可以配置基于Web的客户端以与服务器对话。

第2步-为NKN Shell客户端配置权限

您需要一个兼容的客户端,该客户端可以连接到远程计算机。 在本教程中,您将使用基于网络的NKN Shell客户端NKN Shell Client Xterm。 有以下几种不同的运行方式:

  • 使用在线托管版本,网址为https://nsh.nkn.org/。 请注意,尽管此网页托管在服务器上,但实际上是在您的浏览器中运行的纯本地网络应用。
  • 获取源代码并自己运行。
  • 使用nShell Chrome扩展插件。

在本教程中,我们将使用在线托管版本。 在本地计算机上,打开Web浏览器并导航到https://nsh.nkn.org。 您会看到一个欢迎屏幕:

单击生成新密钥对( Generate New Key Pair)。 您的密钥将生成并显示,如下图所示:

注意: 生成新的密钥对时,您将看到一个 密钥种子。和像使用SSH私钥一样,请安全的保存此密钥种子。拥有此密钥种子的任何人都可以使用它来重新生成您的公钥,然后在远程计算机上盗用。虽然您的浏览器会记住该种子,但是您应该将其复制到安全的地方,以便可以在新计算机上再次使用它。

密钥种子保存在安全的地方。以后可以使用它来重新生成公共密钥,以便可以从其他客户端计算机进行连接。

由于这是一个新的密钥对,因此必须将公共密钥添加到服务器上的白名单文件/ etc / nshd / authorized_pubkeys中。

/ etc / nshd / authorized_pubkeys与〜/ authorized_keys文件具有相似的作用,该文件控制哪些SSH公共密钥可以登录。authorized_pubkeys文件可以指定与该密钥关联的用户。为了安全起见,您将在本教程中使用非root用户登录,因此,将生成的公钥与在本文前提条件的“初始服务器设置”指南中创建的超级用户相关联。

要将用户与公钥相关联,您需要获取该用户的用户ID(UID)和组ID(GID)。以超级用户或sudo用户在服务器上执行以下命令:
$ id

您将看到用户的UID和GID:
Output
uid=1000(sammy) gid=1000(sammy) groups=1000(sammy),27(sudo)

然后在编辑器中打开authorized_pubkeys文件:
$ sudo nano /etc/nshd/authorized_pubkeys

添加一行包含公钥,uid和gid的行,并用空格分隔:
authorized_pubkeys
5d5367a5730427c205904a4457392051d2045dbce0186518fb6eb24dd9e41ba6 1000 1000

保存该文件。

验证文件是否包含正确的内容:
$ cat /etc/nshd/authorized_pubkeys

您会在屏幕上看到密钥:
Output
5d5367a5730427c205904a4457392051d2045dbce0186518fb6eb24dd9e41ba6 1000 1000

然后重新启动nshd程序以应用更改:
$ sudo systemctl restart nshd.service

现在,通过连接到服务器并运行命令来对其进行测试。

第3步-向远程计算机发送命令并接收响应

在NKN Shell客户端中,输入步骤1中的远程nshd地址,以及可选的客户端标识符:

单击连接(Connect )以启动连接。

您将连接到远程计算机,并在浏览器中显示一个终端提示。从这里可以像SSH终端一样使用它。例如,执行如下命令以切换到/ etc / nshd目录:
[email protected]_server_ip~$ cd /etc/nshd

然后列出其内容:
[email protected]_server_ip/etc/nsnd$ ls

您将看到目录的内容:
Output
authorized_pubkeys wallet.json wallet.pswd

您可以通过键入退出键(exit)来断开连接。当您需要重新连接时,请重新访问Web界面并输入连接详细信息。如果生成新的密钥对,则需要将新的公共密钥添加到服务器。

结论

在本教程中,您安装并配置了nsh,并安全方便地将命令发送到远程计算机。当您需要快速运行命令以获取服务的最新状态或查看某些配置设置时,nsh是访问远程计算机的一种好方法。该应用程序基于NKN的全球公共网络,开源并且可免费使用,因此您可以将其整合到自己的应用程序或工作流程中。

您也可以浏览nkn-tunnel,它支持SSH或任何其他基于TCP协议的应用程序。

关于NKN

NKN是一个完全去中心化,基于网络传输量工作证明,可支持千万级规模节点共识的区块链系统。由NKN所构建的这样一个有经济模型所驱动,社区共建共享的新型点对点网络,为开发者提供了一个开放、便捷、高效和安全的网络连接传输平台。基于NKN开发的各种应用将给终端用户带来各种全新的网络体验。

主页: https://www.nkn.org/zh
邮箱: [email protected]
论坛: https://forum.nkn.org
Telegram: https://t.me/nknorg
Twitter: https://twitter.com/NKN_ORG
Medium: https://medium.com/nknetwork
Discord: https://discord.gg/yVCWmkC