Linux的鉴别 Authentication 机制--PAM

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
                 

Linux的鉴别(Authentication)机制--PAM

             

转载时请注明出处和作者联系方式:http://blog.csdn.net/absurd

作者联系方式:李先静<xianjimli at hotmail dot com>

更新时间:2007-4-23

 

随着智能手机的日益普及,手机中储存的隐私信息越来越多,而手机的丢失率又居高不下,所以手机的安全性就显得更加重要了。为了保障数据的安全性,我们手机中的很多功能都需要鉴别(Authentication)之后才能使用。为了遵循标准的做法,不想自己搞一套鉴别(Authentication)机制,我花了一些时间去研究Linux-PAM。

 

有人说鉴别(Authentication)不就是对用户名和密码进行验证,以确认使用者的身份吗?没错,最简单的情况就是如此。但是,让用于单机的Login方法去代替于网络环境的 Kerberos方法,用户一定会觉得有很多不便。除此之外,事情也不那简单,比如对用户有效期的检查、对使用者的时间限制、对用户组的限制和对本地用户和远程用户的区分等等,处理方法都是不同的。由此可见,不同的场境需要不同的鉴别(Authentication)方法,或者需要多种鉴别(Authentication)方法的组合。

 

实际上,不仅有多种不同的鉴别(Authentication)方法存在,而且即使同一种方法也可能多种不同的表现形式。比如,同是普通用户名和密码验证方法,在Client/Server下,在Console下和在GUI下,它们的表现形式也不一样,这也是需要特别注意的。

 

不同的鉴别(Authentication)方法有自己的适用范围,把这些鉴别(Authentication)方法独立出来,供不同的应用程序使用,可以大大提高代码的复用率。而同一个应用程序,在不同环境,甚至在不同的时期,也可能会选择不同的鉴别(Authentication)方法。所以让鉴别(Authentication)方法的使用者和实现者分离开来,让它们各自独立发展,互不影响,显然是有利于软件维护的。这正是PAM(Pluggable Authentication Modules)的动机所在。

 

顾名思义,PAM就是基于插件式设计的一套鉴别(Authentication)方法框架和相应的模块实现代码。我们可以从以下几个方面来看PAM:

 

1.       PAM的使用者。

 

任何需要鉴别(Authentication)功能的软件都是可以是PAM的使用者。它调用PAM提供的统一的接口函数,去确认用户的身份,保证相关功能不会被非法使用。PAM的使用者只关心鉴别(Authentication)的结果,以决定让不让用户使用这个功能,而不关心鉴别(Authentication)方法。

 

PAM的使用者不关心鉴别(Authentication)方法,并不意味着所有PAM的使用者都不毫无区别,su的鉴别(Authentication)方法和FTP的鉴别(Authentication)方法肯定有所不同。如何区分它们呢,那就是靠配置文件,用不同的配置文件区分它们。

 

有时候,鉴别(Authentication)方法的实现模块需要向用户显示一些信息,比如鉴别(Authentication)失败,或者要求用户输入一些信息,比如用户名和密码。这都是与用户界面相关的,要根据PAM的使用者的要求,以不种的风格出现(Console或者GUI)。这可以在pam_start函数的pam_conv结构中传入一个回调函数,它由PAM使用者实现,由PAM的实现模块调用(有的提示语可以通过pam_set_item函数设置)

 

2.       系统管理员。

 

PAM的使用者需要指定一个配置文件,这只是为了与其它PAM的使用者区分开来,PAM的使用者并不关心配置文件的内容。配置文件的内容是系统管理员根据安全策略来决定的,比如,来自本机的root用户可以不输入密码,来自局域网内部的用户可以访问,而来自外网的用户禁止访问,或者全部使用用户名/密码方法鉴别,或者使用Kerberos方法鉴别。总之,这都是配置文件决定的。

 

系统管理员只修改配置文件,就可以使用不同的鉴别(Authentication)方法,而不需要修改源代码,不需要重新编译,这大大提高了鉴别(Authentication)的灵活性。

 

配置文件可以放在/etc/pam.d目录下,或者/etc/pam.conf文件中,下面是gdm的配置文件:

       
           

#%PAM-1.0

           

auth       required    pam_env.so

           

auth       include     system-auth

           

account    required    pam_nologin.so

           

account    include     system-auth

           

password   include     system-auth

           

session    optional    pam_keyinit.so force revoke

           

session    include     system-auth

           

session    required    pam_loginuid.so

           

session    optional    pam_console.so

           

 

如果没有指定配置文件,那么PAM就会用缺省的配置文件other,other的配置通常是禁止一切访问。

 

3.       PAM框架。

 

PAM框架采用了插件式设计和职责链模式。每种鉴别(Authentication)方法都是一个插件,要实现指定的插件接口函数。基于职责链模式,PAM框架可以把多种鉴别(Authentication)方法组合起来,以实现功能更强大的鉴别(Authentication)方法。

 

在配置文件中,用required、requisite、optional和sufficient等几个关键来决定职责链的执行/停止规则。

 

框架的实现代码在libpam目录里,pam_start函数里会读取配置文件,根据配置文件中描述的规则加载并组合插件,而pam_authenticate等函数则会调用_pam_dispatch去驱动职责链的执行。

 

4.       PAM鉴别(Authentication)方法的实现者。

 

每种PAM鉴别(Authentication)方法都是PAM框架的一个插件,PAM内置的鉴别(Authentication)插件可以静态编译到框架中去,也编译成共享库,由框架动态加载。插件要求实现下列接口(静态编译):

 

       
           

struct pam_module {

           

    const char *name;       /* Name of the module */

           

 

           

    /* These are function pointers to the module's key functions.  */

           

 

           

    int (*pam_sm_authenticate)(pam_handle_t *pamh, int flags,

           

                   int argc, const char **argv);

           

    int (*pam_sm_setcred)(pam_handle_t *pamh, int flags,

           

              int argc, const char **argv);

           

    int (*pam_sm_acct_mgmt)(pam_handle_t *pamh, int flags,

           

                int argc, const char **argv);

           

    int (*pam_sm_open_session)(pam_handle_t *pamh, int flags,

           

                   int argc, const char **argv);

           

    int (*pam_sm_close_session)(pam_handle_t *pamh, int flags,

           

                int argc, const char **argv);

           

    int (*pam_sm_chauthtok)(pam_handle_t *pamh, int flags,

           

                int argc, const char **argv);

           

};

           

 

这些函数基本上和PAM的API一一对应,插件并不要求实现以上全部函数,可以根据需要有选择的实现。插件之间可以用pam_putenv/pam_getenv通信,实现数据共享。

 

参考资料:

http://www.kernel.org/pub/linux/libs/pam/

http://www.ibm.com/developerworks/cn/linux/l-pam/index.html

 

~~end~~

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

PAM模块初识 PAM模块初识 1. 简介 ​ PAM(Pluggable Authentication Modules)是由Sun提出的一种认证机制。 ​ PAM模块的中文全称为可拔插认证模块,从名字就可以看出该模块的一些特性作用——即可拔插用于系统认证。 ​ 准确的来说,PAM模块通过一套动态链接库一套统一的API,将系统提供的服务其认证分离,并将其认证统一托管给PAM模块,来实现更加快捷方便的统一管... 阅读详情

相关推荐

MySQL8认证插件——PAM Pluggable Authentication

MySQL Enterprise Edition支持一种身份验证方法,使MySQL Server能够使用PAM(可插拔身份验证模块)对MySQL用户进行身份验证。PAM使系统能够使用标准接口访问各种身份验证方法,例如传统的Unix密码或LDAP目录。● 外部身份验证:PAM身份验证使MySQL Server能够接受来自MySQL授权表之外定义的用户的连接,并使用PAM支持的方法进行身份验证。

贺浦力特的博客 1152

Linux鉴别(Authentication)机制--PAM

 Linux鉴别(Authentication)机制--PAM              转载时请注明出处作者联系方式:http://blog.csdn.net/absurd作者联系方式:李先静更新时间:2007-4-23 随着智能手机的日益普及,手机中储存的隐私信息越来越多,而手机的丢失率又居高不下,所以手机的安全性就显得更加重要了。为了保障数据的安全性,我们手机

国产开源 GUI 引擎 AWTK 8834

Linux PAM开发示例二:登录系统时使用自己的PAM模块进行密码认证

本文仅仅是一个示例,没有多余的说教内容,实现在登录Linux时命令行、图形界面、su等密码认证时使用自己的PAM模块进行密码认证,这个示例不需要编写应用程序,因为系统的登录程序就是应用程序,例如:login、su、lightdm。 1。编写PAM模块动态库 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <security/pam_appl.h> #include &

ljq32的专栏 3393

PAM从入门到精通(九)

PAM从入门到精通(九)

phmatthaus的专栏 730

Linux身份鉴别机制概述

PAM: 你是谁啊? 你的金光惊醒了石头的酣梦!21总体描述1.1 概述Linux身份鉴别机制是保护操作系统安全的重要机制之一,是防止恶意用户进入系统的一个重...

Linux阅码场 3927

linux身份鉴别检查方法,Linux身份鉴别机制实现分析(6)

原标题:Linux身份鉴别机制实现分析(6)2.4.2.5内部函数1. parse_args()函数原型:static int parse_args(pam_handle_t *pamh, struct login_info *loginfo,int argc, const char **argv)函数功能:是用于解析配置文件中的信息函数参数:pam_handle_t结构体表示整个PAM过程信息,...

weixin_35510630的博客 580

linux国际安全认证,Linux系统之安全认证.pdf

Linux系统之安全认证Copyright © 2013 cao hai yang. 曹海洋技术笔记Linux 系统之安全认证1.简介在 liunx 系统中有关安全软件:opens...

weixin_39740272的博客 195

Linux可插拔认证模块的基本概念与架构

\Linux用户认证方法简介\当今IT环境中,任何计算机系统都要充分考虑设计、使用运行过程中的安全性。所以在目前主流操作系统的各个环节当中都增加了很多安全方面的功能特性,而在众多的安全特性功能中有相当多的技术是确保用户鉴别身份认证方面的安全性的。\所谓用户鉴别,就是用户向系统以一种安全的方式提交自己的身份证明,然后由系统确认用户的身份是否属实的过程。换句话说,用户鉴别是系统的门户,每个用户...

cpongo5 234

Linux-PAM(即linux可插入认证模块)

Linux-PAM(即linux可插入认证模块)是一套共享库,使本地系统管理员可以随意选择程序的认证方式。换句话说,不用(重新编写)重新编译一个包含PAM功能的应用程序,就可以改变它使用的认证机制,这种方式下,就算升级本地认证机制,也不用修改程序。

qq_43420088的博客 3188

PAM介绍

PAM 概述 在linux中进行身份或者状态的验证程序是由PAM进行的,PAM是可动态加载验证模块,由于可以按需要动态的对验证的内容进行变更,因此可以大大提高验证的灵活性。 PAM使用/etc/pam.d/目录下的文件来管理对程序的认证方式,调用相应的配置文件,从而调用本地的认证模块(认证模块存放在/lib64/security)。 pam主要由动态库与配置文件构成: 动态库 库文件(认证模块)存放在目录/lib64/security下。 配置文件 /etc/pam.d/目录中定义了各种 程序服务 的P

weixin_42946318的博客 3510

LinuxPAM模块学习总结

Linux中执行有些程序时,这些程序在执行前首先要对启动它的用户进行认证,符合一定的要求之后才允许执行,例如login, su等。在Linux中进行身份或是状态的验证程序是由PAM来进行的,PAM(Pluggable Authentication Modules)可动态加载验证模块,因为可以按需要动态的对验证的内容进行变更,所以可以大大提高验证的灵活性。 一、PAM模块介绍 Linux-PA...

sunfei927的博客 996

linux pam mysql,Linux-PAM & PAM-MySQL的总结

1、理论知识1.1、PAM模块1.1.1、PAM的介绍Pluggable Authentication Modules简称PAM,是一个微缩的可插入认证模块(PAM is an acronym for Pluggable Authentication Modules)1.1.2、PAM的结构DSC0000.png (71.59 KB, 下载次数: 5)2018-9-29 08:43 上传1)模块层...

weixin_35881620的博客 267

linux身份鉴别检查方法,Linux身份鉴别机制实现分析(2)

2.3函数实现机制Linux中传统的UNIX验证方式中,crypt()函数是一个非常重要的函数,它是GNU标准库里面的函数,默认它是基于数据加密标准(Data Encryption Standard)算法,但是GNU也对这个函数进行了扩展,也可以使用MD5等其他的加密方式来进行加密。该函数原型为 char *crypt(const char *key,const char *salt);其中key...

weixin_30314045的博客 726

linux身份鉴别检查方法,Linux身份鉴别机制实现分析(5)

原标题:Linux身份鉴别机制实现分析(5)2.4.2文件二 pam_access.cPAM中具有多种服务模块,服务模块就是具体的身份验证方式,传统的UNIX验证方式也是以pam_unix.so的形式挂载在pam的服务模块中。2.4.2.1 文件描述pam_access模块提供基于登录用户名、客户IP或者主机名、网络号以及登录终端号的访问控制。所属类型是account,即帐号管理类型,该模块的配置...

weixin_30043767的博客 1072

Linux安全核心:UID/GID、身份鉴别与访问控制机制详解

在操作系统安全领域,身份标识与访问控制是构建安全体系的基石。其核心原理是通过唯一标识符区分不同用户与进程,再结合鉴别机制验证身份真实性,最终依据预设规则授权访问资源。这一机制的技术价值在于实现最小权限原则,防止越权操作,保障系统与数据安全。在Linux系统中,该机制通过用户ID(UID)组ID(GID)体系实现身份标识,替代了Windows中的SID概念;通过PAM模块、SSH密钥对等方式完成身份鉴别;并借助传统的UGO权限模型、访问控制列表(ACL)以及SELinux/AppArmor等强制访问控制(M

weixin_33739523的博客 383
上一篇: 软件设计本质论 Essential Design —白话面向对象
下一篇: 由GdkPixmap得到透明的GdkPixbuf
黎明的鹿
博客等级 码龄8年 18粉丝 226原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值