使用密钥对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服务器应该拒绝所有连接,除了那些可以使用该文件中的公钥验证的连接。

是的,你需要做一个检查器。但是你可以在Conch中使用一些构建块,这应该会让它变得非常容易。Ying Li有一个示例项目"ess"(不带"SH"的"SSH"),它实现了一些您可能感兴趣的检查器。

最新更新