使用密钥进行Twisted SSH服务器认证

4 投票
1 回答
928 浏览
提问于 2025-04-18 14:45

这里有一个简单的Twisted应用:

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 个回答

3

是的,你需要做一个检查器。不过,在Conch里有一些现成的工具可以帮助你,这样会简单很多。Ying Li有一个示例项目,叫“ess”(就是“SSH”去掉了“SH”),里面有一些你可能会感兴趣的检查器,具体可以看看这个链接

撰写回答