誰かが libpam API を使用してまとめたこの実装を見つけました。
c 実装
C 実装の抜粋 - pam.c
#include <security/pam_appl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct pam_response *reply;
int null_conv(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr) {
*resp = reply;
return PAM_SUCCESS;
}
static struct pam_conv conv = { null_conv, NULL };
int main(int argc, char *argv[]) {
int retval;
char *user, *pass;
if(argc == 3) {
user = argv[1];
pass = strdup(argv[2]);
} else {
fprintf(stderr, "Usage: login [username] [password]\n");
exit(1);
}
return authenticate("system-auth", user, pass);
}
int authenticate(char *service, char *user, char *pass) {
pam_handle_t *pamh = NULL;
int retval = pam_start(service, user, &conv, &pamh);
if (retval == PAM_SUCCESS) {
reply = (struct pam_response *)malloc(sizeof(struct pam_response));
reply[0].resp = pass;
reply[0].resp_retcode = 0;
retval = pam_authenticate(pamh, 0);
if (retval == PAM_SUCCESS)
fprintf(stdout, "Authenticated\n");
else
fprintf(stdout, "Not Authenticated\n");
pam_end(pamh, PAM_SUCCESS);
return ( retval == PAM_SUCCESS ? 0:1 );
}
return ( retval == PAM_SUCCESS ? 0:1 );
それをコンパイルするコマンド
$ gcc -g -lpam -o chkpasswd pam.c
実行例
$ ./chkpasswd myusername mypassword
少し努力すれば、このアプローチを PHP 内からニーズに合わせて適応させることができると思います。
PHP 実装
このアプローチの別の代替手段として、PHP で独自のロールを作成できる可能性があります。PECL の Web サイトで、この PAM ライブラリーを見つけました。
また、Moodle プロジェクトがどのようにそれを行っているかも見てみたいと思います。ここで議論されています。
LDAP の使用
LDAP などにアクセスして認証を行うために必要な呼び出しを行うために、ライブラリなどへのアクセスが良好である必要があります。Horde のインストールと同じシステムに LDAP サーバーをセットアップして、Horde だけが使用できるように構成することもできます。
これにより、基になるシステムの認証にアクセスできる可能性があります。これは、PHP 呼び出しが使用できるように LDAP サービスで認証を「ラップ」することによって可能になります。
参考文献