web-dev-qa-db-ja.com

カスタムSSH認証メカニズム(OpenSSH)を使用する

カスタムssh認証メカニズムを作成する必要があるサーバーのコレクション(Debian/Ubuntu)があります。

Duo および Authy を参照するために、 'same-ish'の例をいくつか見つけました。彼らは独自のAPIを使用して認証を行っていますが、ssh認証プロセスを別のアプリケーションに委任するというアイデアが私が達成しようとしていることです。

理想的にはC++で認証プログラムを作成したいのですが、それが必要な場合はスクリプトを作成できます。

7
tarka

tl; dr version:入力したパスワードをチェックする独自の方法を実装する場合は、 pam_sm_authenticate()を持つPAMモジュールを記述します。 ) 関数、としてコンパイルし、サーバーの/etc/pam.d/sshdに追加します。

Linux-PAM Module Writer's Guide および 他のさまざまなソース を参照してください。次のようなものから始めます。

#define PAM_SM_AUTH

#include <security/pam_modules.h>
#include <security/pam_appl.h>

int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char *argv[]) {
    return PAM_SUCCESS;
}

struct pam_module pam_foobar_modstruct = {
    "pam_foobar",
    pam_sm_authenticate,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
};

[sshdの構成をいじる前に、 pamtester を使用してモジュールをローカルで検証できます。]


「「本当の」質問に答えようとしている」バージョン:これは、「カスタム認証メカニズム」の実際の意味によって異なります。

通常、「メカニズム」という言葉は、SASLやGSSAPIなどのプロトコルで使用され、クライアントとサーバー間の「ダイアログ」全体を表します。パスワードを使用するか、キーペアを使用するかは関係ありません。パスワードがハッシュされているか、暗号化されているか、またはプレーンで送信されているか。メカニズムがクライアントのIDのみを証明するのか、サーバーのIDも証明するのか。等々。 SSHでは、これは「認証方法」と呼ばれます。

SSH認証層には、いくつかの「トップレベル」認証方法があります。最も一般的なものは、password(サーバーに生のパスワードのみを送信する)、public-key(SSH id_rsaキーペアを使用してサーバーからのチャレンジに署名する)、およびgssapi-with-micsecond認証レイヤー– GSSAPI –そしてほとんどの場合 Kerberos チケットを送信します)。

これらの認証方法はOpenSSH内に直接実装されており、ソースコード(クライアントとサーバーの両方)を編集して最初から実装する必要があります。ただし、それらの一部はすでに外部ライブラリを呼び出しているため、拡張することができます。

  • passwordメソッドを使用すると、クライアントは生のパスワードを送信し、サーバーはPAMライブラリを呼び出してパスワードを検証します。次に、PAMはpam_unix(/ etc/passwd +/etc/shadowに対してチェック)、pam_radius(RADIUSサーバー)に対してチェック)などのモジュールを使用します。これらは/etc/pam.dを介して構成されます。

  • gssapi-with-micメソッドを使用すると、クライアントとサーバーの両方がGSSAPIライブラリを呼び出します。GSSAPIライブラリには通常、組み込みのGSSAPIメカニズムとしてKerberosがあり、カスタムのものを追加できます。 Linuxでは、/etc/gss/mechまたは/etc/gssapi_mech.confファイルを介して構成できます。

階層は基本的に次のとおりです。

  • SSH接続(sshd)
    • passwordメソッド–1つのプレーンパスワードプロンプト
      • 受信したパスワードを/ etc/shadowと照合します
      • 受信したパスワードをKerberosKDC(「偽のKerberos」)と照合します
      • 受信したパスワードをPAM(libpam)に渡し、PAMは構成済みのモジュールスタックを呼び出します:
        • / etc/shadowに対してチェックするためのpam_unix
        • RADIUSの場合はpam_radius
        • 「偽の」Kerberosの場合はpam_krb5
        • ワンタイムパスワードの場合はpam_opie
        • 等.
    • publickeyメソッド–チャレンジを送信し、クライアントにユーザーのキーで署名してもらいます
    • keyboard-interactiveメソッド–任意の数の質問と回答のプロンプト
      • pAMと対話する
        • 上記と同じPAMモジュールですが、複数のプロンプトを表示できます
      • bsdauthと対話する
      • 等.
    • gssapi-with-micメソッド–GSSAPIライブラリを呼び出します。ライブラリとクライアント間でメッセージをシャッフルします
      • Kerberos(99.9%の確率)–クライアントから送信されたチケットを確認します
      • NTLM、SPKM3、GSS-BrowserIDなど(まれですが可能です)
    • hostbasedメソッド–チャレンジを送信し、クライアントにHostキーで署名してもらいます
10
user1686