カスタムssh認証メカニズムを作成する必要があるサーバーのコレクション(Debian/Ubuntu)があります。
Duo および Authy を参照するために、 'same-ish'の例をいくつか見つけました。彼らは独自のAPIを使用して認証を行っていますが、ssh認証プロセスを別のアプリケーションに委任するというアイデアが私が達成しようとしていることです。
理想的にはC++で認証プログラムを作成したいのですが、それが必要な場合はスクリプトを作成できます。
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-mic
(second認証レイヤー– 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
ファイルを介して構成できます。
階層は基本的に次のとおりです。
password
メソッド–1つのプレーンパスワードプロンプトpam_unix
pam_radius
pam_krb5
pam_opie
publickey
メソッド–チャレンジを送信し、クライアントにユーザーのキーで署名してもらいますkeyboard-interactive
メソッド–任意の数の質問と回答のプロンプトgssapi-with-mic
メソッド–GSSAPIライブラリを呼び出します。ライブラリとクライアント間でメッセージをシャッフルしますhostbased
メソッド–チャレンジを送信し、クライアントにHostキーで署名してもらいます