LINUX.ORG.RU

«Секьюрный» IPC, или как неинтерактивно передать в ssh-keygen парольную фразу?

 ,


0

3

Приветствую.

Исходная задача: нужно в неинтерактивном режиме запустить ssh-keygen -y -f $privkey и скормить ему парольную фразу, причём сделать это максимально секьюрно. С stdin он её читать не хочет.

Переформулировка задачи: я решил запускать ssh-keygen, передавая ему в качестве SSH_ASKPASS путь к вспомогательной программе, которая, запустившись, как-то получит у меня парольную фразу и отдаст её ssh-keygen'у в stdout. Вопрос: как?

  • Тупо скормить в stdin и надеяться, что запущенный псевдо-askpass унаследует файловый дескриптор от ssh-keygen'а — ненадёжно, в будущей версии openssh могут решить закрывать все fd на всякий случай.
  • Создавать named pipe, System V SHM, ... — несекьюрно, можно успеть подключиться раньше и вычитать оттуда всё что нужно.
  • Что ещё?

Clarification. В итоге я всё-таки заставил ssh-keygen читать парольную фразу из stdin без применения костылей с подложным SSH_ASKPASS. Для этого нужно убрать переменную DISPLAY= и завернуть процесс в setsid, чтобы отобрать доступ к /dev/tty:

( unset DISPLAY; exec setsid -w ssh-keygen -y -f "$privkey_file" < "$passphrase_file" )

★★★★★

Последнее исправление: intelfx (всего исправлений: 4)

а зачем тебе это нужно? Вводить потом эту парольную фразу тоже неинтерактивно будешь?

Harald ★★★★★
()
Ответ на: комментарий от Harald

Вводить потом эту парольную фразу тоже неинтерактивно будешь?

Я это и пытаюсь сделать. Надо просто проверить, подходит ли пароль. (Я пишу PAM-модуль, который аутентифицирует юзера на основании того, можно ли введённым паролем расшифровать его SSH-ключи.)

intelfx ★★★★★
() автор топика
Последнее исправление: intelfx (всего исправлений: 4)

Передавайте через https на 127.0.0.1

anonymous
()

можно успеть подключиться раньше и вычитать оттуда всё что нужно.

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

stalkerhouse
()
Ответ на: комментарий от intelfx

Я пишу PAM-модуль, который аутентифицирует юзера на основании того, можно ли введённым паролем расшифровать его SSH-ключи.

В libssh для этого средств нет?

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

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

intelfx ★★★★★
() автор топика
Последнее исправление: intelfx (всего исправлений: 1)

Задача «решена», я заставил ssh-keygen считывать парольную фразу из stdin.

(Судя по тому, насколько неочевидно это делается, разработчиков openssh в детстве пугали стандартным вводом, не иначе.)

intelfx ★★★★★
() автор топика
Последнее исправление: intelfx (всего исправлений: 1)

Была похожая задача пару мес назад. В итоге пришел к выводу, что передача через stdin нарушает безопасность не больше чем IPC.

anonymous
()
Ответ на: комментарий от xpahos

Я в курсе. Просто ты написал «except». Опять же, expect не в тему, т. к. оно просто не хотело читать из stdin (когда !isatty).

intelfx ★★★★★
() автор топика
Ответ на: комментарий от intelfx

Педон прокрялтый, приходится на нем писать :)

Вообще если тебе нужно это для ssh, то я бы пошел несколько иным путем. Допустим у тебя есть только один дата-центр, тогда можно на том же Zookeeper поднять какой-то сервис с API, который будет проверять токен и отдавать машинам ключи, которые они должны хранить у себя.

xpahos ★★★★★
()
Ответ на: комментарий от intelfx

Задача «решена», я заставил ssh-keygen считывать парольную фразу из stdin.

Ничего личного, но ты из тех му**ков, которые заводят тред, а потом закрывают его чем-то типа «все, нашел решение»? Потому что ты запарился и другие тоже должны запариваться, да? Какая польза другим от этого треда?

MuZHiK-2 ★★★★
()
Ответ на: комментарий от MuZHiK-2

Ух ты! Мужик-2 ... *потыкал палочкой*

anonymous
()
Ответ на: комментарий от intelfx

Исходная задача: нужно в неинтерактивном режиме запустить ssh-keygen -y -f $privkey и скормить ему парольную фразу, причём сделать это максимально секьюрно. С stdin он её читать не хочет.

С stdin он её читать не хочет.

Задача «решена», я заставил ssh-keygen считывать парольную фразу из stdin.

я заставил ssh-keygen считывать парольную фразу из stdin

Только слепой не увидит, что ты сейчас включил шланга. Особенно после этого:

Судя по тому, насколько неочевидно это делается, разработчиков openssh в детстве пугали стандартным вводом, не иначе.

Скажи честно, к чему вот эта фраза последняя была? Ведь она в данном контексте не несет никакой смысловой нагрузки. Когда нет смысловой нагрузки, то это означает, по сути, два варианта: либо у человека проблемы с головой/логикой и он непроизвольно несет бред, либо на самом деле смысл есть, но скрытый (о чем я написал ранее).

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

MuZHiK-2 ★★★★
()
Ответ на: комментарий от MuZHiK-2

Советую тебе проспаться и/или протрезветь. Вопрос треда был про секьюрный IPC ≠ stdin, потому что с stdin оно не работало и я хотел сделать через SSH_ASKPASS. Потом я заставил его работать с stdin и ответ на вопрос треда потерял для меня ценность.

intelfx ★★★★★
() автор топика
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

я так понимаю мужик добивается от тебя подробностей того как ты заставил... и он прав что ты напутил интриги, прям как не мужик... wait, oh sh~

anonymous
()
Ответ на: комментарий от anonymous

Шиза на ЛОРе. Окей, добавил в тред.

intelfx ★★★★★
() автор топика
Ответ на: комментарий от intelfx

ответ на вопрос треда потерял для меня ценность

Но ведь тред читают и другие люди. Для них как раз то, из-за чего для тебя вопрос треда потерял значение, может представлять определенную ценность.

Спасибо, что добавил решение проблемы. Теперь это может быть кому-то спасет час-другой времени.

/offtop За пивом пойду только к футболу :) Я этот разговор завел не просто потроллить, а из-за того, что, думаю много кто бывал в такой ситуации, когда нагугливаешь идентичную твоей проблему, а там в конце треда «спасибо, проблему решил, можно закрывать». В такие моменты хочется сделать такому человеку больно* (* не является пропагандой насилия). Не потому что я такой злой, а потому что все-таки мы должны тут уважать друг друга, иначе это (ЛОР) будет какой-то помойкой, а не сообществом.

В общем, я рад что мы сделали этот тред кому-то полезным.

MuZHiK-2 ★★★★
()
Ответ на: комментарий от MuZHiK-2

Но ведь тред читают и другие люди. Для них как раз то, из-за чего для тебя вопрос треда потерял значение, может представлять определенную ценность.

Да, согласен.

intelfx ★★★★★
() автор топика
Ответ на: комментарий от Deleted

костыли на баше

Я привёл код на баше в качестве примера. В итоге это войдёт в программу на C++.

через системный вызов

Что ты хочешь этим сказать? Любое действие в линуксе делается через тот или иной системный вызов.

в самый раз

Я считаю, что всё лучше, чем дублировать код или функциональность.

intelfx ★★★★★
() автор топика
Последнее исправление: intelfx (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.