LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2980|回复: 7

PAM 接触了PAM.你就知道PAM的强大不是几篇文章能完全说明的. 用自己的知识来构架吧

[复制链接]
发表于 2004-11-19 10:03:54 | 显示全部楼层 |阅读模式
content starts here

Pluggable Authentication Module (PAM) 是行业标准验证框架。

PAM 为系统管理员提供了选择系统上可用的任何验证服务来执行验证的灵活性。使用 PAM 框架还可以插入新的验证服务模块,并且无需修改应用程序即可使用。

例如,系统可以使用任何用户验证方法,如 /etc/passwd 文件、NIS、NIS+ 或受信任的系统。要求验证用户身份的程序将它们的请求传递给 PAM,PAM 在确定正确的验证方法后会返回适当的响应。程序不需要知道正在使用的是哪种验证方法。

    *

      HP-UX 10.20 引入 PAM 是为了验证 CDE 组件。
    *

      在 10.30 发行版中,对 PAM 进行了扩展,以便在标准 HP-UX、受信任的系统以及 DCE(Distributed Computing Environment,分布式计算环境)中为系统命令提供验证功能,并允许使用第三方模块。
    *

      在 11.0 发行版中,PAM 完全取代了 HP 集成逻辑技术。
    *

      在 11i 发行版中,PAM 处理扩展到了远程登录和执行守护程序 rexecd 和 remshd。请参阅 rexecd (1M) 和 remshd (1M)。

PAM 框架提供了将其他安全技术集成到 HP-UX 系统入口命令的简单方法。CDE 组件使用 PAM 来验证用户身份,以及建立用户凭据(例如,针对 DCE)。CDE 组件还可以使用商用安全数据库来验证用户身份。登录验证、帐户检查以及口令修改使用 PAM 界面。

属于 DCE 单元的系统 CDE 用户可以使用 DCE 注册表对自身进行验证,并在登录时获得 DCE 凭据。

系统管理员可以要求 CDE 用户遵守受信任的系统数据库中强制实施的安全策略。

可以在系统范围内以及各用户的基础上实施控制。

系统文件包括:
/etc/pam.conf                

系统范围控制文件。
/etc/pam_user.conf                

单个用户控制文件。
HP 参考资料

pam (3)、pam.conf (4)、pam_updbe (5)、pam_user.conf (4)。
8.17.1 对 PAM 使用 SAM

在 System Administration Manager (SAM) 上,可以使用 Auditing and Security 的 Authenticated Commands 子区域来管理 PAM 配置文件 (/etc/pam.conf)。对于 PAM 的每一种验证类型,即用户验证 (auth)、帐户管理 (account)、会话管理 (session) 以及口令管理 (password),都可以在 PAM 配置文件中添加、修改或删除服务名称。

SAM 无法管理每用户文件 (/etc/pam_user.conf) 或 DCE 接口;您必须手动对其进行修改。
8.17.2 系统范围内的配置

PAM 配置文件 /etc/pam.conf 定义用于验证用户身份的安全机制。它的缺省值提供系统在标准 HP-UX 和受信任的系统下的常规运行。它还支持对各个用户的控制以及 DCE 集成登录功能。

(对于 DCE,可以根据需要使用 auth.adm 实用程序来创建功能上与以前的 HP 集成登录 auth.conf 文件等价的配置文件。)

系统中必须存在 PAM 库(libpam 和 libpam_unix)和配置文件 (/etc/pam.conf),用户才能登录或更改口令。

HP-UX 验证依赖文件 /etc/pam.conf。该文件必须由具有下列文件权限的超级用户所有:

-r--r--r-- 1 root sys  1050 Nov  8 10:16 /etc/pam.conf

如果该文件被破坏或系统缺少该文件,将允许超级用户以单用户模式登录到控制台来解决该问题。

有关详细信息,请参阅 pam (3)、pam.conf (4) 和 sam (1M)。
8.17.3 每用户配置

PAM 配置文件 /etc/pam_user.conf 在每用户的基础上配置 PAM。/etc/pam_user.conf 是可选的。只有在 PAM 应用程序需要对不同用户表现出不同的行为方式时,才需要该文件。

有关详细信息,请参考 pam_user.conf (4) 和 pam.conf (4)。
8.17.4 pam.conf 配置文件

受保护的服务名在系统控制文件 /etc/pam.conf 中列出,分为四个测试类别 (module-type):验证、帐户、会话和口令。请参阅 pam.conf (4)。

/etc/pam.conf 中条目的形式为:

service-name module-type control module-path options

其中:
service-name                

是应用程序用来向 PAM 证明自身的名称,例如 login。该名称通常是用户调用的命令的名称。关键字 other
(或 OTHER)代表未对关联的 module-type 指定的任何应用程序。
module-type                

是验证类型的关键字:
account                

帐户管理
auth                

用户验证
password                

口令管理
session                

会话管理
control                

是指定如何处理同一个 service-name 和 module-type 的多个定义的关键字。它为下列值之一:
required                

模块测试必须成功。
optional                

模块测试可以失败。
sufficient                

如果测试成功,则不执行进一步的测试。
module-path                

是实现服务的共享库对象的路径名。如果非绝对路径,则假定相对于 /usr/lib/security,即驻留 HP 提供的模块的位置。标准 HP-UX 模块的 module-path 是 /usr/lib/security/libpam_unix.1。

如果使用 DCE 验证,则所有这类条目的 module-path 都是 /usr/lib/security/libpam_dce.1。

如果要对 service-name 和 module-type 实现单个用户控制,则该 service-name/module-type 的第一个条目应具有 module-path /usr/lib/security/libpam_updbe.1 和 control 关键字 required。请参阅 pam_updbe (5)。
options                

是零或模块可识别的更多选项。有关模块支持的选项的说明在其联机帮助页中提供。下面摘要说明了标准 HP-UX 模块 libpam_unix.1 和 DCE 模块 libpam_dce.1 的选项:

    *

      对于 module-type 的所有值:
      debug                

      将调试信息写入系统日志的 LOG_DEBUG 级。
      nowarn                

      关闭警告消息。
    *

      对于 auth:
      use_first_pass                

      测试用户对 module-type 的第一个模块输入的口令。如果它与数据库不匹配或尚未输入口令,将退出。
      try_first_pass                

      测试用户对 module-type 的第一个模块输入的口令。如果它与数据库不匹配或尚未输入口令,将提示用户输入口令。
      use_psd                

      要求用户的个人标识号 (Enter PIN,并使用它来读取和解码用户个人安全设备中的口令。如果口令与数据库不匹配,将退出。DCE 不支持该选项。

      缺省:如果未指定上述任何选项,则每个模块的行为方式都各不相同,每个模块都以其正常方式请求口令和数据。
    *

      对于 password:
      use_first_pass                

      测试用户对第一个 password 模块输入的旧口令和新口令。如果失败,将不会重新出现提示。control 字段应该为 optional。
      try_first_pass                

      测试用户对第一个 password 模块输入的旧口令和新口令。如果口令失败或未输入口令,将提示用户输入旧口令和新口令。
      use_psd                

      要求用户的个人标识号 (Enter PIN,并使用它来读取和解码用户个人安全设备中的口令。如果口令与数据库不匹配,将退出。如果匹配,将提示用户输入新口令。DCE 不支持该选项。

      缺省:如果未指定上述任何选项,则每个模块的行为方式都各不相同,每个模块都以其正常方式请求口令和数据。

以 # 开头的行表示注释。

/etc/pam.conf 的缺省内容为:

#
# PAM configuration
#
# Authentication management
#
login    auth required  /usr/lib/security/libpam_unix.1
su       auth required  /usr/lib/security/libpam_unix.1
dtlogin  auth required  /usr/lib/security/libpam_unix.1
dtaction auth required  /usr/lib/security/libpam_unix.1
ftp      auth required  /usr/lib/security/libpam_unix.1
OTHER    auth required  /usr/lib/security/libpam_unix.1
#
# Account management
#
login    account required       /usr/lib/security/libpam_unix.1
su       account required       /usr/lib/security/libpam_unix.1
dtlogin  account required       /usr/lib/security/libpam_unix.1
dtaction account required       /usr/lib/security/libpam_unix.1
ftp      account required       /usr/lib/security/libpam_unix.1
#
OTHER    account required       /usr/lib/security/libpam_unix.1
#
# Session management
#
login    session required       /usr/lib/security/libpam_unix.1
dtlogin  session required       /usr/lib/security/libpam_unix.1
dtaction session required       /usr/lib/security/libpam_unix.1
OTHER    session required       /usr/lib/security/libpam_unix.1
#
# Password management
#
login    password required      /usr/lib/security/libpam_unix.1
passwd   password required      /usr/lib/security/libpam_unix.1
dtlogin  password required      /usr/lib/security/libpam_unix.1
dtaction password required      /usr/lib/security/libpam_unix.1
OTHER    password required      /usr/lib/security/libpam_unix.1

8.17.5 pam_user.conf 配置文件

通过将各个用户在用户控制文件 /etc/pam_user.conf 中列出,可以对其分配不同的 options。对于这里列出的 login-name,相应列出的 options 将替换对 /etc/pam.conf 中的 module-type/module-path 指定的任何 options。请参阅 8.17.4 pam.conf 配置文件 。

/etc/pam_user.conf 中条目的形式为:

login-name module-type module-path options

其中:
login-name                

是用户的登录名。
module-type                

是在 /etc/pam.conf 中指定的 module-type。
module-path                

是与 /etc/pam.conf 中的 module-type 关联的 module-path。
options                

是零或模块可识别的更多选项。

/etc/pam_user.conf 的缺省内容为注释:

#
# This file defines PAM configuration for a user. The configuration
# here overrides pam.conf.
#
# The format for each entry is:
# user_name  module_type  module_path options
#
# For example:
#
# user_a        auth      /usr/lib/security/libpam_unix.1     debug
# user_a        auth      /usr/lib/security/libpam_dce.1      try_first_pass
# user_a        password  /usr/lib/security/libpam_unix.1     debug
#
# user_b        auth      /usr/lib/security/libpam_unix.1     debug use_psd
# user_b        password  /usr/lib/security/libpam_unix.1     debug use_psd
#
# See the pam_user.conf(4) manual page for more information
#

8.17.6 PAM 的工作原理:登录示例



本示例描述了 login 的 auth 进程。

如果 /etc/pam.conf 中存在一个标准的 login/auth 条目,例如:

login     auth  required  /usr/lib/security/libpam_unix.1

登录将正常进行。

如果存在两个或多个系统范围内的 login/auth 条目,例如:

login     auth  required  /usr/lib/security/libpam_unix.1
login     auth  required  /usr/lib/security/libpam_dce.1

将按顺序拾取这两个条目。在这种情况下,将执行标准 HP-UX 登录进程。然后 DCE 验证进程发生。如果二者均满足,登录将成功。即便用户的其中某个条目失败,也会执行这两个进程。

如果对不同的用户要求不同的验证方法,应将特殊条目 libpam_udpbe 放置在 /etc/pam.conf 中(为方便引用,各行均带编号)验证模块的前面:

#/etc/pam.conf
#1
login     auth  required  /usr/lib/security/libpam_udpbe.1
#2
login     auth  required  /usr/lib/security/libpam_unix.1
#3
login     auth  required  /usr/lib/security/libpam_dce.1

并将每个受影响的用户所对应的条目放置在 /etc/pam_user.conf 中:

#/etc/pam_user.conf
#4
allan  auth  /usr/lib/security/libpam_unix.1  debug
#5
allan  auth  /usr/lib/security/libpam_dce.1   try_first_pass
#6
isabel auth  /usr/lib/security/libpam_unix.1  debug  use_psd

当 allan 登录时,/etc/pam.conf 中的第 1 行将导致 PAM 读取 /etc/pam_user.conf。由于 /etc/pam_user.conf 的第 4 和第 5 行中的模块路径与 /etc/pam.conf 的第 2 和第 3 行中的模块路径匹配,PAM 将临时性地分别用“debug”和“try_first_pass”替换 /etc/pam.conf 的第 2 和第 3 行中的空 options 字段。然后用修改后的选项执行第 2 和第 3 行指定的模块。

当 isabel 登录时,/etc/pam.conf 中的第 1 行将导致 PAM 读取 /etc/pam_user.conf,并临时性地用“debug use_psd”替换 /etc/pam.conf 的第 2 行中的 options 字段。然后用修改后的选项执行第 2 和第 3 行指定的模块。

当 george 登录时,/etc/pam.conf 中的第 1 行将导致 PAM 读取 /etc/pam_user.conf。由于不存在对应 george 的条目,/etc/pam_user.conf 的第 2 和第 3 行将不会发生变化。然后将毫无变化地执行第 2 和第 3 行指定的模块。
 楼主| 发表于 2004-11-19 10:14:49 | 显示全部楼层

使用PAM进行统一身份的认证

转自 http://www.lslnet.com 2000年4月20日 09:25

作 者: bricks

PAM是 PLUGGABLE AUTHENTICATION MODULES 的缩写.
可插入的认证模块(并不是Linux指的模块)用于实现应用程序的认证机制,
是程序员或管理员不需要重新编写或编译程序就可以改变认证机制.
在linux它已经被广泛的应用了, 例如: /etc/securitty /etc/onlogin
/etc/ftpusers 实际上都是给它用的.你在登陆的时候的输入密码和你修改密码
时也都用的是它./etc/pam.conf和/etc/pam/* 都是它的配置文件.

它最大的优点是它的弹性和可扩充性. 你可以随意修改认证机制, 按你的实
际需要来定制系统.你了解后就会非常清楚了.

DESIGN GOALS(设计目标)

(a) 管理员可以选择认证方式, 从简单的密码到智能卡系统.

(b) 可以为不同的程序配置不同的认证机制.如 使telnet使用 S/Key认证.
而本机的 login 缺使用一般的 UNIX password.

(c) 支持程序的显示方式的需求. 如login 需要基于终端的显示, 而dtlogin
需要 X 显示, 而`ftp' 和 `telnet'需要透过网络来认证.

(d) 支持为一个程序配置同时使用多种认证机制.

(e) 可是用户在使用多种认证机制时,不必为同一个密码敲入多次.

(f) 可是用户在认真时需要输入多个密码.

(g) 当底层的认证机制改变时上层软件不需要修改.

(h) 结构为system authentication提供一个 _pluggable_ model.

(i) 必须能满足现有的服务需要.

4. OVERVIEW OF THE PAM FRAMEWORK (纵览PAM的框架)

其核心实际上是一些库函数. 你写的应用程序要调用它们.PAM为你提供
了一套入口(the front end). 而这套函数互调用 特定认证机制所定义的模块
(the back end).
简单的说是这样的: 你调用一个函数仅仅告诉它你要认正,这就足够了.至于
用那一种机制来认证是由配置文件规定的. 你只需要看一看返回值就知道认证是
否成功了. 对于开发应用程序的人来说只需要记住几个函数.

ftp telnet login (Applications)
| | |
| | |
+--------+--------+
|
+-----+-----+
| PAM API | <-- pam.conf file
+-----+-----+
|
+--------+--------+
UNIX Kerberos Smart Cards (Mechanisms)

Figure 1: 基本的 PAM 结构

PAM的功能被分为四个部分: (1) authentication(认证), (2)account
(账号管理), (3) session (对话管理), 和 (4) password (密码管理).

这四个东东都是什么呢?

(a) Authentication management:
包括 `pam_authenticate()' 来认证用户, `pam_setcred()' 来
设置 刷新和销毁用户的 credentials.

(b) Account management:
包括 `pam_acct_mgmt()' 来检查用的账号是否还有效.可以被用来
检查用户是否超时或账号是否过期.

(c) Session management:
包括 `pam_open_session()' 和 `pam_close_session()' 用于对话
过程的管理. 例如: 可以用来纪录用户的连接时间. 一次telnet过程
实际上也是一个session.

(d) Password management:
`pam_chauthtok()' 用来修该密码.


程序通过调用 `pam_start()'和 `pam_end()' 来开始或结束一次PAM 事务.
`pam_get_item()' 和 `pam_set_item()' 读写有关事务的信息.

可以用`pam_strerror()'来取得错误信息.

如何配置你的系统呢?

pam.conf的一个例子:
#服务名 模块类型 控制标志 模块的名字 选项
#------- ----------- ------------ ----------- -------
login auth required pam_unix_auth.so nowarn
login session required pam_unix_session.so
login account required pam_unix_account.so
ftp auth required pam_skey_auth.so debug
ftp session required pam_unix_session.so
telnet session required pam_unix_session.so
login password required pam_unix_passwd.so
passwd password required pam_unix_passwd.so
OTHER auth required pam_unix_auth.so
OTHER session required pam_unix_session.so
OTHER account required pam_unix_account.so

`OTHER' 被用来为没有它数指定的服务用的.
选项是随着模块的参数.为一个服务是可以指定多个auth模块的.它们一次被调用
来验证用户的身份.这叫做 Stacked Modules.
下面的例子为LOGIN指定了三个模块.
login
|
+--------+--------+
| | |
session auth account
| | |
+--+--+ +--+--+ +--+--+
| PAM | | PAM | | PAM |
+--+--+ +--+--+ +--+--+
| | |
UNIX UNIX UNIX
session auth account
|
Kerberos
auth
|
RSA
auth

Figure 2: Stacking With the PAM Architecture

pam.conf中的 `控制标志' 实际上是指明这些 Stacked module 的工作方式.
它可取的值如下:
(a) `required':
该模块的让正必须通过,失败者立即返回错误信息.

(b) `optional':
表示可以忽略它的错误而继续下面一个模块.

(c) `sufficient':
表明该模块的让正已经是足够了,下面的模块就不用调用了.立即
返回成功的消息.


Password-Mapping 密码的映射

多层的模块认证可能会需要多个密码. 则会使用户感到厌烦.一个简单的方法是
是用户使用同一个密码而透过mapping机制来加强安全性. 其实是通过一个密码来产
生另一个密码,使一个密码可被多个模块使用. 当然要保证第一个密码是强壮的.

auth的模块多有下列 `选项':
(a) `use_first_pass':
使用第一个模块要求输入的密码.不再向用户提示要密码.

(b) `try_first_pass':
先试着使用第一个模块要求输入的密码, 不对再要求用户输入.

(c) `use_mapped_pass':
使用 password-mapping 来得到密码, 不再向用户提示要密码.

(d) `try_mapped_pass':
先试着使用 password-mapping 来得到密码, 不对再向用户提示要密码.

下面的例子可以看懂了吧:
pam.conf
login auth required pam_unix.so debug
login auth required pam_kerb.so use_mapped_pass
login auth optional pam_rsa.so use_first_pass


这种设计使你没有办法来知道执行的具体情况. 当然它也是与应用程序无关的.
Notes:
在linux下, 也可以用/etc/pam.d中的文件来配置.这些文件的格式与pam.conf
类似,只是没有服务名. 其服务名就是它的文件名.
入上述的login也可以配置如下:
/etc/pam.d/login
auth required pam_unix.so debug
auth required pam_kerb.so use_mapped_pass
auth optional pam_rsa.so use_first_pass


APPENDIX A. PAM API'S

A.1. Framework Layer API's

int
pam_start(
char *service_name, // pam.conf中的服务的名字
char *user, // 用户名
struct pam_conv *pam_conversation,
// 一个用于互交的函数
pam_handle_t **pamh // 一个句柄
);

`pam_start()' 用于初始化一次pam事务
PAM modules 透过struct pam_conv *pam_conversation中定义的函数来与应用程序
通信.

int
pam_end(
pam_handle_t *pamh,
int pam_status //上一个pam函数的返回值
);

`pam_end()' 结束一次PAM 事务, 释放相关的内存.

int
pam_set_item(
pam_handle_t *pamh,
int item_type,
void *item
);

int
pam_get_item(
pam_handle_t *pamh,
int item_type,
void **item
);

`pam_get_item()' 和 `pam_set_item()' 用于一些特殊处理.读一些信息.

Table 5: Possible Values for Item_type

Item Name Description
--------- -----------
PAM_SERVICE The service name
PAM_USER The user name
PAM_TTY The tty name
PAM_RHOST The remote host name
PAM_CONV The pam_conv structure
PAM_AUTHTOK The authentication token (password)
PAM_OLDAUTHTOK The old authentication token
PAM_RUSER The remote user name


char *
pam_strerror(
int errnum
);


int
pam_set_data(
pam_handle_t *pamh,
char *module_data_name,
char *data,
(*cleanup)(pam_handle_t *pamh, char *data,
int error_status)
);

int
pam_get_data(
pam_handle_t *pamh,
char *module_data_name,
void **datap
);

用于读取与模块相关的数据.

A.2. Authentication API's

int
pam_authenticate(
pam_handle_t *pamh,
int flags
);

int
pam_setcred(
pam_handle_t *pamh,
int flags
);

A.3. Account Management API

int
pam_acct_mgmt(
pam_handle_t *pamh,
int flags
);

A.4. Session Management API's

int
pam_open_session(
pam_handle_t *pamh,
int flags
);

int
pam_close_session(
pam_handle_t *pamh,
int flags
);

A.5. Password Management API's

int
pam_chauthtok(
pam_handle_t *pamh,
int flags
);

APPENDIX B. SAMPLE PAM APPLICATION
/*
/etc/pam.conf
check_user auth required /lib/security/pam_unix_auth.so
check_user account required /lib/security/pam_unix_acct.so
注意要和你的系统一致redhat是这样
编译时要这样:
gcc check.c -ldl -lpam -lpam_misc -o check_user
*/

#include
#include
#include

static struct pam_conv conv = {
misc_conv, //定义在pam_misc.h中, 方便你编程
NULL
};

int main(int argc, char *argv[])
{
pam_handle_t *pamh=NULL;
int retval;
const char *user="nobody";

if(argc == 2) {
user = argv[1];
}

if(argc > 2) {
fprintf(stderr, "Usage: check_user [username]\n");
exit(1);
}

retval = pam_start("check_user", user, &conv, &pamh);
/* 开始 */
if (retval == PAM_SUCCESS)
retval = pam_authenticate(pamh, 0);
/* 认证是不是该用户? 提示你输入一个密码 */

if (retval == PAM_SUCCESS)

retval = pam_acct_mgmt(pamh, 0);
/* 账号是否有效? */

if (retval == PAM_SUCCESS) {
fprintf(stdout, "Authenticated\n");
} else {
fprintf(stdout, "Not Authenticated\n");
}

if (pam_end(pamh,retval) != PAM_SUCCESS) {
/* 结束 */
pamh = NULL;
fprintf(stderr, "check_user: failed to release authenticator\n");
exit(1);
}

return ( retval == PAM_SUCCESS ? 0:1 ); /* indicate success */
}
 楼主| 发表于 2004-11-19 10:20:31 | 显示全部楼层
PAM认证模块使用实例

    摘要
      本文给出几个通过自定义配置PAM提高网络服务安全性的例子,希望对试图进一步了解PAM的朋友起到抛砖引玉的作用。(2002-07-09 13:09:31)

By 书生

1.概述

  本文给出几个通过自定义配置PAM提高网络服务安全性的例子,希望对试图进一步了解PAM的朋友起到抛砖引玉的作用。

2.实例一:

  系统使用proftpd提供ftp服务,但是不希望任何用户都可以访问ftp服务,希望可以定义一个文件,只有在该文件中定义的用户可以使用ftp服务。

  通过分析需求,我们可以知道,也就是要实现基于用户名的ftp服务的访问控制。通过阅读proftpd的文档,我们可以发现,proftpd是完全支持PAM的。所以我们的实现的思路和步骤是这样的:

  首先,打开proftpd的PAM支持,也就是说,告诉proftpd用户认证让PAM去完成。这一点可以通过几个proftpd的配置选项来实现,以下是我们的proftpd.conf配置文件的内容:
  #/etc/proftpd.conf
  ServerName "proftpd for real user"
  ServerType standalone
  DefaultServer on
  ServerIdent off
  Port 21
  Umask 022
  MaxInstances 3
  User nobody
  Group nobody
  UseReverseDNS off
  AuthPAM on
  AuthPAMAuthoritative on
  AuthPAMConfig ftp
  DefaultRoot ~
  AllowOverwrite on

  我们对关于PAM的几个选项作个说明:

    * AuthPAM:设置是否采用PAM用户认证模块进行用户认证。
    * AuthPAMAuthoritative:是否使用PAM作为最终的用户认证方法。
    * AuthPAMConfig:指定进行PAM认证时使用的配置文件名称,PAM配置文件位于/etc/pam.d/目录下。

  这样设置以后,我们的proftpd就可以支持PAM认证方法了。

  我们这样定义/etc/pam.d/ftp文件:
  [root@test /root]# more /etc/pam.d/ftp
  #%PAM-1.0
  auth required /lib/security/pam_listfile.so item=user sense=allow file=/etc/ftpwho onerr=fail
  auth required /lib/security/pam_pwdb.so shadow nullok
  account required /lib/security/pam_pwdb.so
  session required /lib/security/pam_pwdb.so

  其中的pam_listfile.so模块就是用来实现基于用户的ftp控制。Item=user就表明是通过用户名进行控制,sense= allow表示如果用户名出现在/etc/ftpwho文件中就返回认证成功信息,file=/etc/ftpwho指定配置文件,onerr=fail 表示如果出现某些错误(比如无法打开配置文件等)时返回的结果,这里是失败信息。关于pam_listfile模块的详细资料,可以参考解决方案中的“常见的PAM认证模块简介”系列文章。

  然后,我们在/etc下建立ftpwho文件,并在其中加入可以进行ftp访问的用户名,要注意每个用户占一行,之后重启动proftpd,就可以根据这个配置文件通过用户名来对ftp访问进行控制了。

3.实例二:

  控制可以登录系统的用户,只有root可以从本地登录,bye2000以及tom用户可以从192.168.1.0网段登录,其他用户均不可以登录系统。

  修改/etc/pam.d/login文件如下所示:
  root@test /root]# more /etc/pam.d/login
  #%PAM-1.0
  auth required /lib/security/pam_securetty.so
  auth required /lib/security/pam_stack.so service=system-auth
  auth required /lib/security/pam_nologin.so
  account required /lib/security/pam_stack.so service=system-auth
  account required /lib/security/pam_access.so accessfile=/etc/login.conf
  password required /lib/security/pam_stack.so service=system-auth
  session required /lib/security/pam_stack.so service=system-auth
  session optional /lib/security/pam_console.so

  即,我们在原来的基础上加入了以下这一条规则:
  account required /lib/security/pam_access.so accessfile=/etc/login.conf

  这条规则的意思时,我们使用pam_access模块,通过配置文件/etc/login.conf来对用户访问进行控制,accessfile参数即指明了配置文件的完整路径。

  根据需求,我们的/etc/login.conf文件内容如下:
  [root@test /root]# more /etc/login.conf
  +:rootOCAL
  +:bye2000 tom:192.168.1.
  -:ALL:ALL

  该配置文件说明:

    * 该文件的每一行由如下三个字段构成,中间使用冒号分割:
      权限 : 用户 : 来源
    * 权限字段可以是”+”(即允许访问),”-”(禁止访问);
    * 用户字段可以是用户名、组名以及诸如user@host格式的用户名,ALL表示任何人,具有多个值时,可以用空格分开。
    * 来源字段可以是tty名称(本地登录时)、主机名、域名(以”.”开始),主机ip地址,网络号(以”.”结束)。ALL表示任何主机,LOCAL表示本地登录。
    * 可以使用EXCEPT操作符来表示除了…之外。

  所以:

    * +:rootOCAL---表示root用户可以从本地登录。
    * +:bye2000 tom:192.168.1.---表示bye2000和tom可以从192.168.1.0/24网段telnet登录。
    * -:ALL:ALL---表示拒绝其他任何人登录。

  关于pam_access模块的详细资料,可以参考解决方案中的“常见的PAM认证模块简介”系列文章。
发表于 2004-11-26 20:14:33 | 显示全部楼层
刚听老师说到这个,得细细看看呀
发表于 2004-11-27 14:22:13 | 显示全部楼层
顶,这篇不错啊

konds辛苦了
发表于 2004-11-29 21:39:09 | 显示全部楼层
支持
发表于 2004-12-5 21:59:54 | 显示全部楼层
好文,建议加精.
发表于 2004-12-7 19:23:29 | 显示全部楼层
个人觉得,文章的原理可以看,不过配置等,就别看了,有点旧。去看PAM的英文资料去。。配置文件的架构改了不少。。。:):)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表