1

わかりました。現在、新しいサイト用の小さな一時的なウェルカム ランディング ページを開発中です。一般の訪問者は、必要に応じて電子メール アドレスを送信できます。しかし、現在の開発段階で、完全なサイトをそのまま表示するために、開発者用のユーザー/パス ログインも追加したいと考えています。開発者はそれぞれ、ローカル LAMP システムにユーザー/パスを持っています。

今のところ、適切な Web サイト ユーザー システムの上に 2 つの個別のユーザー システムを作成せずに開発者を特定したいのは、そのユーザーがローカル システムにログインできるかどうかをすばやく確認するためです。if(pam_auth($_POST["u"], $_POST["p"])) はまさにそれを行います。シンプル、いいね。

しかし、その後、apache ユーザーに */security/pam_passwd ファイルへのアクセスを許可する必要があることを発見しました (または、少し良い方法: pam_tally*)。それを行うと、セキュリティ ホールが作成されます。

PHP(+apache) から、他の開発者がユーザーを検証し、ローカル LAMP セキュリティ システムに合格するために何をしたか知りたいですか? これが唯一の方法ですか、それとも代替手段はありますか? より良い提案はありますか?

最良の答えは必ずしもコードではなく、ライブラリ名の提案または他のソリューションの説明へのリンクです。

4

1 に答える 1

1

誰かが 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 サービスで認証を「ラップ」することによって可能になります。

参考文献

于 2013-12-14T03:27:57.640 に答える