Аутентификация с использованием Twisted SSH-сервера

Вот простое скрученное приложение:

from twisted.cred import checkers, portal
from twisted.conch import manhole, manhole_ssh
from twisted.conch.insults import insults

from twisted.application import service, internet
from twisted.internet import endpoints, reactor


def makeManholeService(namespace):
    checker = checkers.InMemoryUsernamePasswordDatabaseDontUse(
        username="password")

    realm = manhole_ssh.TerminalRealm()
    realm.chainedProtocolFactory = lambda: insults.ServerProtocol(
                                        manhole.ColoredManhole, namespace)
    prt = portal.Portal(realm, [checker])
    factory = manhole_ssh.ConchFactory(prt)

    endp = endpoints.serverFromString(reactor, 'tcp:6022')

    manholeService = internet.StreamServerEndpointService(endp, factory)
    return manholeService


application = service.Application("my app")
manholeService = makeManholeService({'foo': 'bar'})
manholeService.setServiceParent(application)

Мы можем подключиться к нему с помощью ssh:

$ ssh username@localhost -p 6022
username@localhost's password:

>>> foo
'bar'
>>>

Теперь я хочу заменить InMemoryUsernamePasswordDatabaseDontUse такой, что сервер может аутентифицировать пользователей, которые идентифицируют себя, используя ключи rsa / dsa.

Должен ли я реализовать проверку?

Например, у меня есть несколько открытых ключей, перечисленных в ~/.ssh/authorized_keys, Сервер SSH должен отклонять все соединения, кроме тех, которые могут быть проверены с использованием открытых ключей в этом файле.

1 ответ

Решение

Да, вам нужно сделать проверку. Но есть строительные блоки, которые вы можете использовать в Conch, которые должны сделать это довольно легко. У Ин Ли есть пример проекта "ess" ("SSH" без "SH"), в котором реализованы некоторые шашки, которые вы могли бы заинтересовать проверить.

Другие вопросы по тегам