すべて/すべての接続ユーザー名のOpenSSHシェルの構成

すべて/すべての接続ユーザー名のOpenSSHシェルの構成

DebianのデフォルトのOpenSSH sshdパッケージを使用してすべてのユーザー名を同じように処理するように設定する方法はありますか?

たとえば、誰かが任意のユーザー名(たとえば、8LaRiQRd8Qjh)で接続したが、そのユーザー名がLinuxユーザーとして存在しない場合は、「testuser」などの一貫したユーザー名として扱うようにsshdを構成できますか?

SSHクライアントの観点からこれを行う方法を知っていますが、SSHサーバー自体がすべての接続資格情報を受け入れるようにしたいと思います(私のシェルがそのレベルの認証を処理できるようにします)。

理想的には、「既存のユーザー名がない場合はこのユーザー名を使用してください」のようなルールです。 「常にこのユーザー名を使用してください」も機能しますが、理想的ではありません。

独自のsshdサービスを実行する代わりに、基本的なOpenSSH sshdサービスを使用して簡単なソリューションを見つけることができれば良いでしょう。

答え1

なぜこのようなことをしようとするのかはわかりませんが、それは悪い考えのようです。

しかし、何らかの理由でこの質問が私を魅了し、私は答えを見つけなければなりません。

簡単に言えば、Debianで利用可能なパッケージを設定するだけではこれを行うことはできません。

これを行うには、2つのモジュール(NSS用モジュールとPAM用モジュール)を作成する必要があります。

~のためネットワークサービスモジュール少なくとも順序で提供する必要があります_getpwbynam_rPAMモジュールより多くの定型句があります。

これは多くの作業のように見え、望むものではありませんが、認証を直接処理したいと言われているので、これを行う方法は次のとおりです。

より簡単なオプション(おそらく安全性が低いかもしれません)は、以下を使用することです。パラミコPython SSHサーバーを設定し、認証機能をカスタマイズ/フックします。

幸いなことに、paramikoの人々はすでにこの問題のほとんどの重い仕事をしています。デモサーバー彼らは倉庫にそれを持っています。

代替またはcheck_auth_password有効なcheck_auth_publickeyユーザーを受け入れることができます。パスワード確認の例(*):

# pip install pam
import pam
MYUSER = 'testuser'

class Server(paramiko.ServerInterface):
    def check_auth_password(self, username, password):
        if password and pam.authenticate(username=MYUSER, password=password):
            return paramiko.AUTH_SUCCESSFUL
        return paramiko.AUTH_FAILED

これはStackOverflowではないので、ここで停止します:)

これにより、ユーザー名のパスワード認証を無視し、指定されたパスワードを確認するSSHサーバーが作成されますtestuser

デフォルトでは、サーバーは名前の入力を求めて終了します。これをシェルまたはカスタムアプリケーションに置き換えることもできます。

ユーザー名をハードコーディングしましたが、構成ファイルやデータベース検索などから簡単に取得できます。

host_key変数とポート番号を置き換えることもできます。

足に銃を撃つ方法はいくつかあります。非常に非常に非常に注意してください。このコードは本番目的で使用する準備ができていません。全体の内容を確認してください。問題がなければ、良いレビューを書いているわけではありません;-)。


*Server:これはクラスの関数を置き換えdemo_server.py、その上に何かを追加します。

関連情報