Назад | Перейти на главную страницу

Аутентификация на основе ключа SSH на сервере Perl

У меня есть сервер, написанный на Perl, к которому клиенты подключаются для выполнения некоторых задач управления. Не вдаваясь в подробности, хотелось бы добиться двух вещей:

  1. зашифровать канал соединения между сервером и клиентом - это можно сделать с помощью IO :: Socket :: SSL.
  2. аутентифицировать клиента с помощью ключей SSH - я пока не знаю, как это сделать.

Лучшим решением было бы объединить эти два требования в одно и получить механизм, который работает точно так же, как соединение / аутентификация SSH. Это возможно?

Спасибо.

Вы хотите использовать SSH-туннель. Это зашифрует ваше общение и аутентифицируется с помощью ключей SSH.

Если вы хотите, чтобы клиент был написан на perl, используйте что-то вроде модуля Net :: SSH :: Perl: http://search.cpan.org/~turnstep/Net-SSH-Perl-1.34/lib/Net/SSH/Perl.pm

Не зная больше о вашей настройке, я действительно не могу помочь вам полностью реализовать туннель SSH.

Некоторое время назад я написал подобное серверное / клиентское приложение. Основной дизайн:

  • сервер не поддерживает работу в сети, это простой скрипт, который взаимодействует с потоками stdin / stdout (например, демоны, выполняемые inetd);
  • все сетевые и аутентификационные данные выполняются ssh / sshd, клиент использует ssh с авторизацией на основе ключа, на сервере есть файл authorized_keys с опцией command = "" - этот ключ всегда выполняет мой сервер и не может использоваться для доступа к оболочке или другим программам;

Образец .ssh/authorized_keys файл:

no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding,from="10.0.0.1",command="/usr/local/bin/fsdumps-receiver" ssh-rsa AAAA.... key_comment

Обратите внимание на параметр from = "<ip>" - доступ в этом примере ограничен только одним IP.

Код сервера имеет доступ к некоторым полезным переменным среды. Такие как:

  • $ ENV {'SSH_ORIGINAL_COMMAND'} - "команда" (не совсем) передается как ssh server_ip that_command
  • $ ENV {'SSH_CLIENT'} - IP клиента

Вы можете использовать SSH_ORIGINAL_COMMAND для выбора задачи управления на вашем сервере. Клиентский код может порождать ssh (или использовать Net :: SSH :: Perl) с этим именем задачи в качестве аргумента, а затем отправлять / получать данные на / с сервера.

Помимо простого туннелирования соединения через SSH, поскольку Крис Тинг указывает:

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

Это потребует значительного количества перезаписи, в зависимости от того, как подключаются клиенты и синтаксис протокола. Очевидное преимущество состоит в том, что тогда он будет легко интегрирован в конфигурацию SSH пользователя.

SSH использует ключи, тогда как SSL обычно использует сертификаты X.509 (кстати, SSH не основан на SSL).

Сертификат (открытый ключ) - это больше, чем просто открытый ключ: это связь между открытым ключом, идентификатором (например, Subject DN) и другими атрибутами, причем все это подписывается (эмитентом сертификатов X.509).

Например, при использовании RSA можно извлечь материал открытого ключа (модуль и открытую экспоненту) и превратить его в сертификат. Чего не хватает в этой модели, так это того, что ключи SSH не «подписаны» и не «выпущены», как сертификаты X.509. Вам будет не хватать аспекта PKI, который часто используется в SSL в вашей модели. Легкий способ обойти это - сделать из него самозаверяющий сертификат. Затем вам придется явно импортировать его в свой клиент, чтобы сделать его доверенным, или импортировать его при первом подключении к нему (что, в конце концов, очень похоже на то, что происходит при первом подключении к серверу SSH).

Форматы ключей RSA для SSH и X.509 различаются, поэтому вам нужно будет написать код для чтения модуля и показателей из ключей SSH и создания сертификата X.509 и закрытого ключа в формате, пригодном для стеков SSL.

это вопрос по StackOverflow должен представлять интерес (хотя это делается наоборот).