PAM を使用せずにユーザーを認証する正しい方法は何ですか?

PAM を使用せずにユーザーを認証する正しい方法は何ですか?

私の関連する質問はあまり注目されていないようですので、別の質問をします。 最近の Linux でユーザー名/パスワードプロンプトを介してユーザーを認証する適切な方法は何ですか?

原則的には、ユーザー名とパスワードを取得し、対応するユーザーのソルトとハッシュを から読み取る必要があると思います/etc/shadow。次に、指定されたパスワードと保存されているソルトのハッシュを計算し、結果が に保存されているハッシュと一致するかどうかを確認します/etc/shadow

通常、PAM (例 ) を介して認証するだけpam_unixで、これらすべてをすでに実行できますが、私のアプリケーションはカスタム PAM モジュールであり、ある PAM モジュールを別の PAM モジュールから呼び出す方法が見つかりませんでした。これが何らかの方法で可能であれば、喜んでこのソリューションを採用します。

今のところ、この非常に古いチュートリアルを見つけましたhttp://www.tldp.org/HOWTO/Shadow-Password-HOWTO-8.html1996 年から、どうやら shadow サポートがまだ libc に組み込まれていなかったようです。認証のヘルパー関数としてpw_authと が言及されていますvalid。これらをコードに埋め込み、shadow-tools にリンクしようとしましたが、とlibshadow.aで「未解決の外部参照」エラーが発生します。コードは次のようになります。pw_authvalid

if ((pw->pw_passwd && pw->pw_passwd[0] == '@'
     && pw_auth (pw->pw_passwd+1, pw->pw_name, PW_LOGIN, NULL))
    || !valid (passwd, pw)) {
    return (UPAP_AUTHNAK);
}

これ以上詳しくは確認していませんが、いずれにしても、shadow-utils が更新されるたびにコードを更新する必要があるため、これは推奨される解決策ではありません。

に対する認証を提供するライブラリ (PAM ではない) にリンクしたいのですが/etc/shadow、そのようなものがあって、私がまだ見つけていないのでしょうか? または、他の解決策はありますか?

答え1

shadow-utils のアップデートに対するあなたの懸念は、私の意見では不当です。その HOWTO で説明されているルーチンは、特別なものをインストールしなくても、私の Ubuntu 12.04 および Mint 17 システムで使用できます。

/etc/shadowC プログラムで情報を読み取るための構造は、/usr/include/shadow.hおよびで見つけることができます。また、で定義されてman 5 shadowいる名前によるシャドウ パスワード エントリなど、検索する必要がある関数は、およびで見つけることができます。これにより、それおよび関連するすべての関数について説明しているマニュアル ページ () も取得できます。/usr/include/shadow.hgetspnamman getspnam

これに基づいて、任意の名前のハッシュされたパスワード エントリを取得できるはずです。ハッシュされたパスワードには複数の '$' トークンがあり、ハッシュされたパスワードから最後の '$' 以降のすべてを切り取って、それを にソルトとして提示します。glibccrypt()バージョン ( によるとman 3 crypt) は、現在より一般的になっている SHA512 エントリを示す「拡張」ソルトを処理できるはずです。

関連情報