PHP pam_auth() 最佳管理指南

标签 php linux security administration pam

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

目前,我想识别开发人员,而不是在适当的网站用户系统之上创建两个单独的用户系统,以便快速检查该用户是否可以使用本地系统登录。 if(pam_auth($_POST["u"], $_POST["p"])) 正是这样做的。简单,漂亮。

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

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

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

最佳答案

我发现有人使用 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 网站上找到了这个 PAM 库,它看起来像您想要的。

我还会看看 Moodle 项目是如何做到这一点的。此处讨论。

使用 LDAP

应该对库等具有良好的可访问性,以便进行必要的调用来通过网络访问 LDAP 等内容,从而为您进行身份验证。 LDAP 服务器也可以安装在与部落安装相同的系统上,将其配置为仅供部落使用。

这可能会让您访问底层系统的身份验证,方法是将其“包装”在 LDAP 服务中以供 PHP 调用使用。

引用文献

关于PHP pam_auth() 最佳管理指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16429149/

相关文章:

php - 从一个读取并写入第二个excel文件 - PHP

php - WordPress 管理员用户不应登录到 WooCommerce 帐户页面

java - Apache Shiro,数据库的权限控制

javascript - 在 javascript 中安全地存储数据(自动建议)

python - Pyramid .security : Is getting user info from a database with unauthenticated_userid(request) really secure?

PHP 代理 jQuery 部分到 javascript

php - php 中的正则表达式搜索具有给定模式的 url

linux - Code::Blocks 在 'adding files recursively' 之后崩溃到一个空项目

c - 在 Linux 上测试内核 Crypto API

linux - 将虚拟机升级到 debian 8 jessie 后,Proxmox 虚拟机未加载