How to communicate with OpenSSH on the same machine? Does it have API?

I'm on the same machine as OpenSSH server, that is, I don't need to authenticate. I, however, want to be able to get communicate with OpenSSH server from my client application in Python or other language. Namely, when a new client is connecting, in my python script I want to get notified about that and retrieve their public keys, IP address, etc... And reject that a client from login. Or maybe allow -- depending on some conditions.

Does OpenSSH server provide such API or callbacks?

1
задан 9 August 2017 в 19:03
3 ответа

Он не предлагает API.

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

2
ответ дан 3 December 2019 в 17:35

Если ваши клиенты никогда не используют пароль, но всегда ключ, вы можете использовать параметр AuthorizedKeysCommand в sshd_config для выполнения вашего скрипта Python для проверки ключа SSH. Вы, вероятно, сможете проделать некоторые уловки, чтобы также найти IP-адрес и т. Д., Обнаружив свой процесс-отец Python и проверив его файловые дескрипторы.

Надеюсь, это поможет.

2
ответ дан 3 December 2019 в 17:35

Я вижу два способа интерпретировать ваш вопрос.

Мониторинг журналов

Возможно, вы действительно ищете сценарий мониторинга журналов, например Fail2ban (который является проектом бесплатного программного обеспечения Python, поэтому вы можете посмотрите, как работает их код).

Журналы сервера SSH различаются в зависимости от того, как они установлены. Чаще всего они находятся в /var/log/auth.log , / var / log / secure , /var/log/sshd.log или аналогичное имя в альтернативной области журнала, например / usr / local / var / log / (см. также Как проверить журнал sshd? ). Вот пример журнала:

Aug 14 12:34:56 jodari-desktop sshd[12345]: Accepted pubkey for jodari from 127.0.0.1 port 54321 ssh2: RSA SHA256:3xyQ+PG0Z3CIiShclJ2iNya5TOdKDgE/HrOXr11IdOo

Если вы «хотите получить уведомление об этом и получить их открытые ключи, IP-адреса и т. Д.» тогда вам нужно только контролировать эту линию. (Возможно, вам потребуется увеличить LogLevel в / etc / ssh / sshd_config или там, где находится этот файл.)

Если вы хотите получить фактические открытые ключи пользователя (а не только их отпечатки пальцев), вашему сценарию просто нужно будет пройти их файл $ HOME / .ssh / authorized_keys (это расположение по умолчанию; его можно изменить с помощью директивы AuthorizedKeysFile в вашем sshd_config ). Вам нужно будет сопоставить отпечаток пальца с открытым ключом. Это бесплатно, если в файле есть только одна допустимая строка, но в противном случае вам нужно было бы сгенерировать отпечаток каждого открытого ключа и сопоставить его с отпечатком, который вы извлекли из журналов. Просто найдите отпечаток пальца в выводе следующей команды:

ssh-keygen -lf "$HOME/.ssh/authorized_keys"

Выполнение команд через SSH

Если вы действительно хотите запускать вещи так, как они были бы в сеансе SSH, вы можете использовать без пароля ssh-ключи для запуска команд.

Сгенерируйте ssh-ключи только для внутреннего использования, и вы получите автоматический беспарольный доступ через ssh на localhost. При этом все будет контролироваться OpenSSH, поэтому для мониторинга соединений просто ищите localhost, аутентифицированный специальными внутренними ключами в стандартных журналах SSH.

Я не могу говорить о способе python для этого, но вы можете сделать это все это в Python как системные вызовы.

Чтобы создать ключ:

mkdir -p "$HOME/.ssh"
chmod 700 "$HOME/.ssh"
ssh keygen -t rsa -b 4096 -P "" -C "python script PASSWORDLESS access" \
  -f "$HOME/.ssh/python-localhost.id_rsa"

Чтобы установить его локально:

cat "$HOME/.ssh/python-localhost.id_rsa.pub" >> "$HOME/.ssh/authorized_keys"

Чтобы затем использовать:

ssh -i "$HOME/.ssh/python-localhost.id_rsa" localhost your_command_goes_here
0
ответ дан 3 December 2019 в 17:35

Теги

Похожие вопросы