URL: https://www.progressiverobot.com/how-to-use-nsh-to-run-secure-remote-commands-on-ubuntu-18-04-ru/

Введение

Часто бывает трудно управлять несколькими машинами на ежедневной основе. Хотя Security Shell (SSH) — это хороший инструмент для удаленного доступа, сам протокол имеет определенные недостатки в отношении удобства и безопасности.

Например, удаленные компьютеры должны иметь публичный IP-адрес и порт для перенаправления, через которые можно получить к ним доступ, в результате чего они будут доступны из сети Интернет или, по крайней мере, из крупной сети. Это особенно касается случаев, когда вы используете пароль для аутентификации вместо пары ключей (публичного и частного). Кроме того, если вы заранее не будете знать публичный ключ удаленной машины, вы можете стать объектом атаки через посредника. Многие удаленные компьютеры, к которым требуется доступ, либо не имеют публичного IP-адреса, либо имеют динамический IP-адрес, который вы, возможно, не знаете.

Кроме того, SSH требует отдельного подключения для каждого сеанса удаленного подключения. Если пользователю потребуется запустить одну команду на сотнях или тысячах машин, потребуется сначала создать соединение для каждой машины с помощью TCP рукопожатия, что не очень эффективно.

NKN Shell, или nsh, — это альтернатива SSH, которая обеспечивает удобный и безопасный способ запуска удаленных команд. nsh использует глобальную публичную сеть NKN, которая обеспечивает защищенную и децентрализованную передачу данных. Архитектура использует уникальные адреса, которые содержат публичный ключ, используемый как для маршрутизации, так и для сквозного шифрования без какой-либо инфраструктуры открытых ключей (PKI). Сеть также не требует, чтобы удаленный сервер имел публичный IP-адрес. Удаленный сервер должен только иметь доступ к Интернету и иметь возможность устанавливать исходящие подключения через HTTP и websocket. В результате ваши удаленные машины оказываются закрыты от внешнего Интернета.

В этом руководстве мы будем использовать приложения демон оболочки NKN ​​и клиент Xterm оболочки NKN для выполнения команд на удаленной машине. Для это необходимо установить и настроить демон NKN Shell на удаленной машине с доступом в Интернет, создать пару ключей и установить подключение с помощью клиента.

Предварительные требования

nsh illustration for: Предварительные требования

Для выполнения этого руководства вам потребуется следующее:

  • Браузер, установленный на локальном компьютере.

Шаг 1 — Настройка демона NKN Shell на удаленном сервере

Во-первых, установите демон NKN shell (nsd) на вашем сервере. Это приложение будет вызывать nkn-multiclient для подключения к публичной сети NKN и получения адреса для маршрутизации. Затем демон будет прослушивать входящие команды оболочки от аутентифицированных и добавленных в белый список клиентов, выполнять эти команды и затем отправлять результаты назад.

				
					
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, чтобы активировать перезапуск при перезагрузке сервера.

Создайте файл с названием nshd.service в /etc/systemd/system:

				
					
sudo nano /etc/systemd/system/nshd.service

				
			

Добавьте следующее определение службы в файл для настройки службы:

				
					
[label /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 в статье Знакомство с юнитами и юнит-файлами Systemd.

Сохраните файл и выйдите из редактора. Затем активируйте и запустите службу nshd с помощью следующих команд:

				
					
sudo systemctl enable nshd.service

sudo systemctl start nshd.service

				
			

Запустите следующую команду, чтобы обеспечить активность и запуск службы:

				
					
sudo systemctl status nshd.service

				
			

Вы увидите, что статус активный:

				
					
[secondary_label 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

				
			

В результате вы получите нужный вам адрес:

				
					
[secondary_label Output]

<^>e70ca28ede84fc0659f2869255e8a393aef35b4fa5a7e036f29127c7dba75383<^>

				
			

Запишите этот адрес, так как он потребуется вам для подключения к вашему серверу.

Теперь, когда демон запущен и работает, вы можете настроить веб-клиент для коммуникации с сервером.

Шаг 2 — Настройка разрешений для клиента оболочки NKN

Вам потребуется совместимый клиент, который может подключаться к удаленной машине. В этом обучающем модуле мы будем использовать клиент Xterm оболочки NKN, веб-клиент оболочки NKN. Вы можете воспользоваться несколькими способами:

  • Используйте версию размещенную на странице <https://nsh.nkn.org/>. Обратите внимание, что хотя эта веб-страница размещается на сервере, на самом деле, это чистое локальное веб-приложение, которое запускается в вашем браузере.

В этом руководстве вы будете использовать в размещенную на сервере версию. Откройте браузер на локальном компьютере и перейдите на страницу <https://nsh.nkn.org>. Вы увидите экран приветствия:

Нажмите Сгенерировать новую пару ключей. Ваши ключи будут сгенерированы и отображены, как показано на изображении ниже:

Примечание: при создании новой пары ключей вы увидите secret seed. Сохраните этот secret seed в защищенном и безопасном месте, как и в случае в приватным ключом SSH. Любой, кто владеет этим secret seed, может использовать его для восстановления публичного ключа и запуска команд на удаленных машинах. Ваш браузер будет запоминать этот seed, но вам следует скопировать его в безопасное место, чтобы вы снова могли использовать его на новой машине.

Сохраните secret seed в безопасном месте. Вы можете использовать его позже для восстановления публичного ключа, чтобы вы могли подключиться с другой клиентской машины.

Поскольку это новая пара ключей, вы должны добавить публичный ключ в файл /etc/nshd/authorized_pubkeys​​​ на вашем сервере.

/etc/nshd/authorized_pubkeys играет ту же роль, что и файл ~/authorized_keys, который определяет, какие публичные ключи SSH можно использовать для входа. Файл authorized_pubkeys может указать, какой пользователь связан с ключом. В целях безопасности вы можете выполнить вход с помощью пользователя без прав root, используемого в данном руководстве, так что вы будете привязывать сгенерированный публичный ключ к пользователю sammy, созданному согласно указаниям руководства по начальной настройке сервера.

Для привязки пользователя к публичному ключу вам потребуется идентификатор пользователя (UID) и идентификатор группы (GID) этого пользователя. Выполните следующую команду на вашем сервере во время входа с помощью пользователя sammy:

				
					
id

				
			

Вы увидите UID и GID пользователя:

				
					
[secondary_label Output]

uid=&lt;^&gt;1000&lt;^&gt;(&lt;^&gt;sammy&lt;^&gt;) gid=&lt;^&gt;1000&lt;^&gt;(&lt;^&gt;sammy&lt;^&gt;) groups=1000(sammy),27(sudo)

				
			

Откройте файл authorized_pubkeys​​​ в своем редакторе:

				
					
sudo nano /etc/nshd/authorized_pubkeys

				
			

Добавьте одну строку, содержащую публичный ключ, uid и gid, разделенные пробелами:

				
					
[label authorized_pubkeys]

5d5367a5730427c205904a4457392051d2045dbce0186518fb6eb24dd9e41ba6 1000 1000

				
			

Сохраните файл.

Убедитесь в корректности содержимого файла:

				
					
cat /etc/nshd/authorized_pubkeys

				
			

Вы увидите ваш ключ, выведенный на экране:

				
					
[secondary_label Output]

&lt;^&gt;5d5367a5730427c205904a4457392051d2045dbce0186518fb6eb24dd9e41ba6 1000 1000&lt;^&gt;

				
			

Затем перезапустить демон nshd для применения изменений:

				
					
sudo systemctl restart nshd.service

				
			

Теперь давайте проведем тест с помощью подключения к серверу и запуска команды.

Шаг 3 — Отправка команды удаленной машины и получение ответа

В клиенте оболочки NKN введите ваш удаленный nshd адрес, полученный в шаге 1, а также опциональный идентификатор клиента:

Нажмите Подключиться для установки соединения.

Вы подключитесь к удаленному компьютеру и увидите в браузере командную строку терминала. Здесь вы можете использовать его также, как и в случае с SSH. Например, выполните следующую команду для перехода в каталог /etc/nshd:

				
					
cd /etc/nshd

				
			

Затем получите список его содержимого:

				
					
ls

				
			

Вы увидите содержимое каталога:

				
					
[secondary_label Output]

authorized_pubkeys wallet.json wallet.pswd

				
			

Вы можете отключиться с помощью команды exit. Когда вам потребуется перезапустить подключение, повторно откройте веб-интерфейс и введите данные для подключения. Если вы создадите новую пару ключей, вам потребуется добавить новый публичный ключ в ваш сервер.

Заключение

В этом обучающем модуле мы установили и настроили nsh для безопасной и удобной отправки команд на удаленный компьютер. nsh — это отличный способ доступа к удаленным компьютерам, когда требуется быстро запускать команду для получения последнего статуса службы или просмотра ряда настроек конфигурации. Это приложение работает на базе глобальной публичной сети NKN и может свободно использоваться, поэтому вы можете включить его в ваше приложение или рабочий процесс.

Также вы можете ознакомиться с nkn-tunnel, приложением, которое поддерживает SSH или любые другие приложения, основанные на TCP.