PHP pam_auth()最佳管理指南

PHP pam_auth()最佳管理指南,php,linux,security,administration,pam,Php,Linux,Security,Administration,Pam,好的,所以我正在为一个新网站开发一个小的、临时的欢迎登录页面。公众访问者可以选择提交他们的电子邮件地址,如果他们愿意的话。但我还想为开发人员添加一个用户/通行证登录,以查看当前开发阶段的完整站点。开发者在本地LAMP系统上都有一个用户/通行证 现在,我想确定一个开发者,而不是在一个合适的网站用户系统上创建两个独立的用户系统,就是快速检查该用户是否可以使用本地系统登录。如果(pam_auth($_POST[“u”],$_POST[“p”])确实这样做了。简单,漂亮 但后来我发现,您需要允许apac

好的,所以我正在为一个新网站开发一个小的、临时的欢迎登录页面。公众访问者可以选择提交他们的电子邮件地址,如果他们愿意的话。但我还想为开发人员添加一个用户/通行证登录,以查看当前开发阶段的完整站点。开发者在本地LAMP系统上都有一个用户/通行证

现在,我想确定一个开发者,而不是在一个合适的网站用户系统上创建两个独立的用户系统,就是快速检查该用户是否可以使用本地系统登录。如果(pam_auth($_POST[“u”],$_POST[“p”])确实这样做了。简单,漂亮

但后来我发现,您需要允许apache用户访问*/security/pam_passwd文件(或者更好一点:pam_tally*)。这样做会造成安全漏洞

我想知道其他开发人员通过PHP(+apache)验证用户并通过本地LAMP安全系统做了什么?这是唯一的办法,还是有其他办法?有更好的建议吗


最好的答案不一定是代码,而更多的是库名称的建议或指向其他解决方案描述的链接。

我发现有人使用libpam API组合了这个实现

c实现

  • 原文:
C实现的摘录-pam.C

示例运行

我可以想象,只要稍加努力,这种方法就可以在PHP中适应您的需要

PHP实现

作为这种方法的另一种替代方法,您可以在PHP中使用自己的方法。我在PECL网站上找到了这个PAM库,看起来就像你想要的

我还要看看Moodle项目是如何做到这一点的。这里讨论了这个问题

使用LDAP 应该有很好的库的可访问性,这样就可以进行必要的调用,通过网络访问LDAP之类的东西,为您进行身份验证。LDAP服务器也可以安装在与Horde安装相同的系统上,配置它只供Horde使用

这将使您能够访问底层系统的身份验证,可能是通过将其“包装”到LDAP服务中,供PHP调用使用

工具书类

我发现有人使用libpam API组装了这个实现

c实现

  • 原文:
C实现的摘录-pam.C

示例运行

我可以想象,只要稍加努力,这种方法就可以在PHP中适应您的需要

PHP实现

作为这种方法的另一种替代方法,您可以在PHP中使用自己的方法。我在PECL网站上找到了这个PAM库,看起来就像你想要的

我还要看看Moodle项目是如何做到这一点的。这里讨论了这个问题

使用LDAP 应该有很好的库的可访问性,这样就可以进行必要的调用,通过网络访问LDAP之类的东西,为您进行身份验证。LDAP服务器也可以安装在与Horde安装相同的系统上,配置它只供Horde使用

这将使您能够访问底层系统的身份验证,可能是通过将其“包装”到LDAP服务中,供PHP调用使用

工具书类

这正式描述了我尝试过的过程:简单地使用标准http basic身份验证系统并使用它生成一些用户名/密码有什么问题?将网站登录绑定到底层服务器登录系统是一个非常糟糕的主意。当然,它提供了一种简单的强制方式,但随后您需要进行端口扫描或类似的操作,以了解哪些守护进程正在运行,您也可以在这些守护进程上尝试强制方式,仅限于http。如果有使用root登录的路径,那么如果只是临时登录,为什么不使用该网站呢?此外,我还了解到,您可以使用tally,这几乎可以消除暴力攻击的成功。在多次尝试之后,大多数底层系统都可以通过锁定帐户来限制/关闭。通过这些更改,现在可以将其视为DoS载体,但这与有人可以
ssh
进入系统并尝试登录和DoS帐户没有什么不同,因此我认为您的方法是有效的,关于这是一个坏主意的评论是严厉的。这正式描述了我尝试过的过程:简单地使用一个标准的http基本身份验证系统并使用它生成一些用户名/密码有什么问题?将网站登录绑定到底层服务器登录系统是一个非常糟糕的主意。当然,它提供了一种简单的强制方式,但随后您需要进行端口扫描或类似的操作,以了解哪些守护进程正在运行,您也可以在这些守护进程上尝试强制方式,仅限于http。如果有使用root登录的路径,那么如果只是临时登录,为什么不使用该网站呢?此外,我还了解到,您可以使用tally,这几乎可以消除暴力攻击的成功。在多次尝试之后,大多数底层系统都可以通过锁定帐户来限制/关闭。这些变化现在可以被视为DoS载体,但这与如果有人可以
ssh
进入系统并尝试登录和拒绝帐户没有什么不同,因此我认为你的方法是有效的,关于这是一个坏主意的评论是严厉的。
#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