Как предоставить ограниченный доступ SSH к аккаунту

Как предоставить ограниченный доступ SSH к аккаунту

В данной статье рассмотрено создание SSH-доступа по ключу и примеры использования SSH, как управляющего элемента.

SSH хорош тем, что вы можете предоставить доступ к аккаунту любому количеству людей (например, нескольким разработчикам), не сообщая им свой пароль. Всё что вам нужно сделать для этого, это попросить их сгенерировать пару ключей: открытый и закрытый, а затем отправить открытый ключ вам. Затем вы добавляете информацию об открытом ключе в файл .ssh/authorized_keys на сервере, и теперь только тот, у кого есть соответствующий закрытый ключ, может без пароля попасть к вам в аккаунт. Довольно подробное руководство есть в статье SSH-доступ к хостинг-аккаунту

Теперь, если разработчик сделал свою работу, вы просто удаляете его ключ из списка .ssh/authorized_keys, и он на сервер больше проникнуть не сможет.

Это способ аутентификации безопасен настолько, насколько хороша вся современная криптография, и справедливо считается, что он гораздо безопаснее стандартной парольной аутентификации. Помимо прочего, он еще и удобнее (не нужно каждый раз вводить пароль), и вы можете пользоваться им и самостоятельно.

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

Файл authorized_keys содержит строки, каждая из которых соответствует своему ключу. Обычная строка authorized_keys состоит из трех полей, разделенных пробелом, и выглядит так:

ssh-rsa AAA....ad0Nw==  username

В первом поле указан тип ключа (в данном случае RSA), во втором - непосредственно сам ключ, а в третьем - комментарий к ключу, который, как правило, содержит имя пользователя.

В действительности перед типом ключа можно добавить еще одно поле, которое называется “дополнительные опции” и может содержать такую полезную опцию как command. Проще объяснить на примере:

command="date" ssh-rsa AAA....ad0Nw==  username

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

Сам по себе такой пример может полезен для скриптов, которые собирают какую-нибудь информацию с удаленного ресурса, и интенсивно с ним не взаимодействуют. Однако для чего-то более сложного требуется канал управления (по простому, надо как-то передать команде параметры запуска). Таким каналом управления не могут быть параметры командной строки, как это принято в UNIX, зато управлять поведением команды можно через stdin.

Вот следующий пример, пока еще не очень полезный:

command="nl" ssh-rsa AAA....ad0Nw==  username

Команда nl принимает на stdin строки, а на stdout возвращает их же, но пронумерованные. Вот так может выглядеть сеанс общения с сервером:

$ ssh uXXXX@servername
hello
     1  hello
world
     2  world
^D
Connection to servername closed.

Здесь были набраны строки hello и world, а “1 hello” и “2 world” - это вывод с серверной стороны. Этот пример демонстрирует одну простую вещь - вывод команды может зависеть от тех данных, которые ей переданы.

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

Вот простой скрипт, написанный на bash. Он выполняет команду, имя которой передано на stdin. Из очевидных соображений безопасности список команд, которые можно выполнить, ограничен только функциями (проверка через type -t). Последние две строчки - это как раз чтение stdin и выполнение функции, если это действительно функция, а не внешняя команда:

#!/bin/bash
print_foo() {
    echo "foo"
}   
get_current_date() {
    date --rfc-2822
}   
func=`cat`
test x`type -t "$func"` == xfunction && "$func"

Скрипт складывается в домашний каталог пользователя или любое другое место, на него устанавливаются права на исполнение, затем путь к этому скрипту добавляется в .ssh/authorized_keys - и интерфейс готов:

Это пример исправленной записи о ключе

command="/home/uXXXX/my_script.sh" ssh-rsa AAA....ad0Nw==  username

Сеанс работы с таким скриптом может выглядеть следующим образом:

$ echo 'print_foo' | ssh uXXXX@servername
foo
$ echo 'ifconfig' | ssh uXXXX@servername # здесь ничего не выполнилось
$ echo 'get_current_date' | ssh root@localhost
Mon, 29 Aug 2019 14:01:20 +0500

Очевидно, таким же образом можно написать скрипт на PHP, Perl или Python, который будет выполнять требуемые действия.

С 2003 года
Надежность.
Нам доверяют десятки тысяч компаний и разработчиков
20 лет
Предоставляем услуги профессионального хостинга
35 000
Клиентов доверяют нам размещение своих сайтов
99.99%
Подтвержденный uptime
наших серверов хостинга
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
ВК49865