PAM 教程:二、Linux-PAM 的配置文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAM 教程:二、Linux-PAM 的配置文件相关的知识,希望对你有一定的参考价值。

参考技术A

本系列讲解了 Linux-PAM 的工作机制和配置方式,并利用几个 Linux-PAM 模块做一些有趣的小实验。附录中介绍了一些常用的 Linux-PAM 模块。

本文的目标读者是期望了解 PAM 认证机制的 Linux 用户或者系统管理员。如果您是开发人员,希望编写一个使用 PAM 认证的应用程序,或者是为 PAM 写插件的开发人员,本文的内容可能并不能满足您的需求,请参阅 《Linux-PAM应用开发指南》 (英文)和 《Linux-PAM 模块开发指南》 (英文)。

PAM 的各个模块一般存放在 /lib/security/ 或 /lib64/security/ 中,以动态库文件的形式存在(可参阅 dlopen(3) ),文件名格式一般为 pam_*.so 。PAM 的配置文件可以是 /etc/pam.conf 这一个文件,也可以是 /etc/pam.d/ 文件夹内的多个文件。如果 /etc/pam.d/ 这个文件夹存在,Linux-PAM 将自动忽略 /etc/pam.conf 。

/etc/pam.conf 类型的格式如下:

/etc/pam.d/ 类型的配置文件通常以每一个使用 PAM 的程序的名称来命令。比如 /etc/pam.d/su , /etc/pam.d/login 等等。还有些配置文件比较通用,经常被别的配置文件引用,也放在这个文件夹下,比如 /etc/pam.d/system-auth 。这些文件的格式都保持一致:

不难看出,文件夹形式的配置文件中只是没有了服务名称这一列:服务名称已经是文件名了。

由于很难在时下的发行版本中找到使用 /etc/pam.conf 这一独立文件作为 PAM 配置的例子,此处仅就 /etc/pam.d/ 格式举例。在笔者安装的 CentOS(x64) 7.2.1511 中, /etc/pam.d/login 的内容如下:

# 表示注释。

每一行代表一条规则。但也可以用 \\\\ 来放在行末,来连接该行和下一行。

例子的最后一行开头有一个短横线 - ,意思是如果找不到这个模块,导致无法被加载时,这一事件不会被记录在日志中。这个功能适用于那些认证时非必需的、安装时可能没被安装进系统的模块。

我们在[第一篇](% post_url 2016-03-30-pam-tutorial-1-intro %)中接触了 Linux-PAM 的四种工作类别(type)。在上面的例子中,工作类别作为第一列出现。

讲到这里,我们有必要聊一聊 PAM 的 流程栈(stack) 概念:它是认证时执行步骤和规则的堆叠。在某个服务的配置文件中,它体现在了配置文件中的自上而下的执行顺序中。栈是可以被引用的,即在一个栈(或者流程)中嵌入另一个栈。我们之后和它会有更多的接触。

第二列为 控制模式(control) ,用于定义各个认证模块在给出各种结果时 PAM 的行为,或者调用在别的配置文件中定义的认证流程栈。该列有两种形式,一种是比较常见的“关键字”模式,另一种则是用方括号( [] )包含的“返回值=行为”模式。

“关键字”模式下,有以下几种控制模式:

“返回值=行为”模式则更为复杂,其格式如下:

其中, valueN 的值是各个认证模块执行之后的返回值。有 success 、 user_unknown 、 new_authtok_reqd 、 default 等等数十种。其中, default 代表其他所有没有明确说明的返回值。返回值结果清单可以在 /usr/include/security/_pam_types.h 中找到,也可以查询 pam(3) 获取详细描述。

流程栈中很可能有多个验证规则,每条验证的返回值可能不尽相同,那么到底哪一个验证规则能作为最终的结果呢?这就需要 actionN 的值来决定了。 actionN 的值有以下几种:

我们在前文中已经介绍了控制模式(contro)的“关键字”模式。实际上,“关键字”模式可以等效地用“返回值=行为”模式来表示。具体的对应如下:

正如前文所述,模块一般保存在 /lib/security 或 /lib64/security 中(取决于操作系统位数)。Linux-PAM 配置文件中的模块位置可以是相对于上述文件夹的相对路径,也可以是文件的全路径。

模块参数用空格与模块路径相隔。该参数将只和特定模块相关,因此某个模块的文档中一定包含其参数的信息。如果需要在单个参数中使用空格,可以将整个参数用方括号( [] )包裹起来。

Makefile 使用单个 make 文件构建两个源代码

【中文标题】Makefile 使用单个 make 文件构建两个源代码【英文标题】:Makefile to build two source code using a single make file 【发布时间】:2015-07-13 07:36:55 【问题描述】:

我正在尝试使用单个 makefile 构建两个源代码。我想先构建 Linux-PAM-1.2.0,然后再构建 pam_radius-1.4.0。 pam_radius-1.4.0 是最外层目录,Linux-PAM-1.2.0 是内层目录。

| pam_radius-1.4.0 -- Linux-PAM-1.2.0

每个都有自己的 make 文件。我需要先编译Linux-PAM-1.2.0,然后我需要编译pam_radius-1.4.0,因为我需要提供Linux-PAM-1.2.0的路径来编译pam_radius-1.4.0。

我在 pam_radius-1.4.0 makefile 中做了一些修改。我需要先编译Linux-PAM-1.2.0,然后我需要编译pam_radius-1.4.0,因为我需要提供Linux-PAM-1.2.0的路径来编译pam_radius-1.4.0 makefile。我的制作文件失败。在做之前我需要创建一个安装目录。已对 pam_radius-1.4.0 Makefile 进行了如下更改。我在 Makefile 中启用了 mkdir mkdir $(SUBDIR)/install/ 并确实让我得到了一个错误。如果我禁用 mkdir,我会收到一条消息 make: Linux-PAM-1.2.0' is up to date.。我已经在 make 中完成了 make clean: `Linux-PAM-1.2.0' is up to date.

我的make文件如下

SUBDIR = Linux-PAM-1.2.0
CC = arc-linux-uclibc-gcc
INSTALL_PATH = $(shell pwd)
LINUX_PAM_PATH = $(shell pwd)/$(SUBDIR)/
mkdir $(SUBDIR)/install/

$(SUBDIR):
    $(MAKE) -C $(LINUX_PAM_PATH)
    $(MAKE) -C install
CFLAGS = -Wall -fPIC -I $(INSTALL_PATH)/$(LINUX_PAM)/install/include/
LDFLAGS = -L $(INSTALL_PATH)/$(LINUX_PAM)/install/lib/
all:pam_radius_auth.so
pam_radius_auth.o: src/pam_radius_auth.c src/pam_radius_auth.h
    $(CC) $(CFLAGS) -c $< -o $@
md5.o: src/md5.c src/md5.h
    $(CC) $(CFLAGS) -c $< -o $@
pam_radius_auth.so: pam_radius_auth.o md5.o
pam_radius_auth.so: pam_radius_auth.o md5.o
    $(CC) $(CFLAGS) $(LDFLAGS) -shared pam_radius_auth.o md5.o -lpam -o pam_radius_auth.so

你能告诉我我在这里做错了什么吗?如果我取消注释 mkdir 我得到一个错误,如果我评论然后它说 make: `Linux-PAM-1.2.0' 是最新的。

【问题讨论】:

尝试在 '$(SUBDIR):' 之后移动 'mkdir $(SUBDIR)/install/' 行 厌倦了还是同样的问题 您不构建源代码(以某种方式生成的 C 或 C++ 代码不是源代码!)。您从源代码构建程序。 【参考方案1】:

您的 Makefile 应如下所示:

SUBDIR = Linux-PAM-1.2.0
CC = arc-linux-uclibc-gcc
INSTALL_PATH = $(shell pwd)
LINUX_PAM_PATH = $(shell pwd)/$(SUBDIR)/

CFLAGS = -Wall -fPIC -I $(INSTALL_PATH)/$(LINUX_PAM)/install/include/
LDFLAGS = -L $(INSTALL_PATH)/$(LINUX_PAM)/install/lib/

all: pam_radius_auth.so
    mkdir -p $(SUBDIR)/install/
    $(MAKE) -C $(LINUX_PAM_PATH)
    $(MAKE) -C install

pam_radius_auth.so: pam_radius_auth.o md5.o
    $(CC) $(CFLAGS) $(LDFLAGS) -shared pam_radius_auth.o md5.o -lpam -o pam_radius_auth.so

pam_radius_auth.o: src/pam_radius_auth.c src/pam_radius_auth.h
    $(CC) $(CFLAGS) -c $< -o $@

md5.o: src/md5.c src/md5.h
    $(CC) $(CFLAGS) -c $< -o $@

clean:
    rm -f *.o *.so

【讨论】:

【参考方案2】:

    allrecipe 移到所有其他食谱之上。将其称为 all 只是惯例——Makefile 中的默认目标始终是第一个目标。

    使all 取决于您的子目录规则的结果。一个常见的技巧是使用stamp file,例如。

    all: pam_radius_auth.so $(SUBDIR)/install/stamp
    
    $(SUBDIR)/install/stamp:
            mkdir -p $(SUBDIR)/install/
            $(MAKE) -C $(LINUX_PAM_PATH)
            $(MAKE) -C $(LINUX_PAM_PATH) install
            touch $(SUBDIR)/install/stamp
    

    尝试了解 Makefile 的一般工作原理。它们不是脚本。你不能只是在任何地方放一个命令......它总是

    <target>: <dependencies>
            <commands to build target>
    

    也就是说,这个概念有点缺陷。您的 $(SUBDIR)/install/stamp 规则必须依赖于该子目录的任何输入文件,才能使依赖项工作并根据需要重建。现在你可以通过删除戳文件来强制它。

【讨论】:

谢谢。正如你所说,我浏览了 make 文件并告诉了你所要求的更改。在我做了一个 make 我得到 make: `Linux-PAM-1.2.0' is up to date 。但我已经做了清理。 将“干净”规则扩展为类似rm -f $(SUBDIR)/install/stamp; make -C $(SUBDIR) clean

以上是关于PAM 教程:二、Linux-PAM 的配置文件的主要内容,如果未能解决你的问题,请参考以下文章

Linux-PAM中的禁止root远程连接(CentOS 7)

[转帖]Linux-PAM认证机制

linux系统之pam模块

Linux系统安全之pam后门安装使用详解

pam_tally2身份验证模块

PAM - 可插拔认证模块