web-dev-qa-db-ja.com

アプリケーションを開始したユーザーではなく、PAMでユーザーを認証する方法

現在、アプリケーションの認証モジュールを開発しています。 PAMを使用してこれを行うことが決定されました。私はこれを機能させましたが、アプリケーションを開始したユーザーしか認証できません。

これは、ユーザー「appname」としてアプリケーションを起動した場合、認証は、ユーザーが「some_user」ではなく「appname」である場合にのみ成功したことを通知することを意味します。

その「some_user」を使用してその端末でアプリケーションを起動した場合、「some_user」は認証できますが、「appname」は認証できません。

Common-authでpam_unixのデバッグフラグをオンにしました。拒否すると、次の出力が生成されます。

unix_chkpwd[4107]: check pass; user unknown
unix_chkpwd[4107]: password check failed for user (pamtest)
[app]: pam_unix(other:auth): authentication failure; logname=[appname] uid=1000 euid=1000 tty= ruser=[appname] rhost=  user=pamtest
3
Zimrilim

PAMはデーモンではなく、単なるライブラリです。通常のユーザーは認証データ(/etc/shadowなど)にアクセスできないため、通常のユーザーの下で実行されているプログラムは認証できません。小さな例外が1つあります。この場合、 [〜#〜] setgid [〜#〜]/ sbin/unix_chkpwd ヘルパープログラムが自動的に呼び出され、認証データにアクセスできます(ただし、他のユーザーの認証は許可されません)。

したがって、プログラム自体にSUIDフラグを介してroot権限を付与し(バックドアを開かないのは難しいためお勧めしません)、rootで実行するか、ネットワークサービスを介して、または次のようなSUIDプログラムを実行して認証する必要があります。 su

この質問 では、可能な解決策が議論されています。

8
jofel