接続クライアントが提供するキーを受け入れるようにOpenSSH(または他の標準sshd)を設定できますか?
EGはssh -i ~/arbitraryKey hostname
ログインシェルを付与しますが、ssh hostanme
EGは付与しません。
間違って設定されたサーバーについての逸話があるので、この質問をします。 (再コンパイルなど)
答え1
PAMを使用してすべてのパスワードを受け入れるようにSSHサーバーを構成するのは簡単です。スタックpam_permit
にパスワードを置くだけですauth
。これらのオープンシステムを誤って設定する可能性は、PAMの柔軟性に固有のものです。これにより、必要なだけ多くのテストを接続できるため、テストがゼロになる可能性は避けられません(少なくともすべての場合に奇妙な異常現象を処理できなくなるわけではありません)。 。
鍵認証はPAMを経由せず、「すべての鍵を許可する」の構成設定はありません。これはまれな場合(テストまたはハニーポット)にのみ有用であるため、オプションとして提供する価値はありません(設定エラーの危険性が内在しています)。
答え2
Gilles は、匿名の SSH 構成が「非常にまれな場合にのみ役に立つ」と提案していますが、そのようなまれなケースの 1 つは次のとおりです。特殊マットペアプログラミングやその他のタイプの共有端末セッションに世界中の開発者が使用するサービスです。
あなたはそれを使用することができますパラミコssh
公開鍵を使用して接続を許可するサーバーを作成するためのPythonライブラリ。拒否する接続用のキーは提供されません。
たとえば、
#!/usr/bin/python
import paramiko
import socket
import threading
host_key = paramiko.RSAKey(filename='hostkey')
class Server(paramiko.ServerInterface):
def __init__(self):
self.event = threading.Event()
def check_channel_request(self, kind, chanid):
if kind == 'session':
return paramiko.OPEN_SUCCEEDED
def check_auth_publickey(self, username, key):
return paramiko.AUTH_SUCCESSFUL
def get_allowed_auths(self, username):
return 'publickey'
def check_channel_exec_request(self, channel, command):
# This is the command we need to parse
print('client sent command: {}'.format(command))
self.event.set()
return True
def listener():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', 2222))
sock.listen(100)
client, addr = sock.accept()
t = paramiko.Transport(client)
t.set_gss_host(socket.getfqdn(""))
t.load_server_moduli()
t.add_server_key(host_key)
server = Server()
t.start_server(server=server)
# Wait 30 seconds for a command
server.event.wait(30)
t.close()
while True:
try:
listener()
except KeyboardInterrupt:
pass
これにより、使用可能な秘密鍵を使用してSSH接続が許可されます。それは問題ではありませんどのキーが使用中です。公開鍵認証が不可能な接続は拒否されます。