4.1. 配置文件语法

/etc/pam.conf配置文件的语法如下。该文件由规则列表组成,每个规则通常放在一行中,但可以通过转义的行尾\ '进行扩展。Comments 以“#”标记开头,并扩展到下一行。

每个规则的格式是用空格分隔的令牌集合,前三个不区分大小写:

服务类型控制模块-路径模块参数

/etc/pam.d/目录中包含的文件的语法相同,除了没有任何* service 字段。在这种情况下, service *是/etc/pam.d/目录中文件的名称。该文件名必须小写。

  • PAM 的一个重要 Feature 是,可以堆叠*多个规则,以组合用于给定身份验证任务的多个 PAM 的服务。

  • service 通常是相应应用程序的熟悉名称: login su *是很好的示例。 * service * -name * other 保留用于提供 default 规则。只有提到当前服务的行(或在没有这样的情况下, other *条目)将与给定的服务应用程序关联。

  • type *是规则对应的 Management 组。它用于指定后续模块要与哪个 Management 组关联。有效条目为:

  • account

    • 此模块类型执行基于非身份验证的帐户 Management。它通常用于根据一天中的时间,当前可用的系统资源(最大用户数)或申请人用户的位置来限制/允许对服务的访问-仅在控制台上以“ root”身份登录。
  • auth

    • 此模块类型提供了两个验证用户身份的方面。首先,它通过指示应用程序提示用户 Importing 密码或其他标识方式,确定用户是他们声称的身份。其次,模块可以通过其凭据授予属性来授予组成员身份或其他特权。
  • password

    • 此模块类型对于更新与用户关联的身份验证令牌是必需的。通常,每种基于“挑战/响应”的身份验证(auth)类型都有一个模块。
  • session

    • 此模块类型与在为用户提供服务之前/之后需要为用户完成的工作相关。这些事情包括记录有关与用户进行某些数据交换的打开/关闭,安装目录等信息。

如果上面列表中的* type 值前面带有-*字符,则由于无法在系统中丢失模块而无法加载模块,因此 PAM 库将不会记录到系统日志中。这对于那些并非总是安装在系统上并且不需要正确进行登录会话的身份验证和授权的模块尤其有用。

第三个字段* control ,指示模块无法成功完成身份验证任务时 PAM-API 的行为。此控制字段有两种语法:简单的具有一个简单的关键字;比较复杂的是对 value = action *对的方括号选择。

对于简单(历史)语法,有效的* control *值是:

  • required

    • 这种 PAM 的失败最终将导致 PAM-API 返回失败,但是仅在调用了其余的* stacked 模块(针对该 service type *)之后。
  • requisite

    • 像* required *一样,但是,在此类模块返回故障的情况下,控制权直接返回到应用程序或上级 PAM 堆栈。返回值是与第一个失败的必需或必需模块相关联的值。注意,此标志可用于防止用户获得通过不安全介质 Importing 密码的机会。可以想象,这种行为可能会通知攻击者系统上的有效帐户。应当权衡这种可能性与在敌对环境中公开敏感密码的重要性。
  • sufficient

    • 如果这样的模块成功并且没有先前的必需模块失败,则 PAM 框架会立即将成功返回给应用程序或上级 PAM 堆栈,而无需调用堆栈中的任何其他模块。 足够模块的故障将被忽略,并且 PAM 模块堆栈的处理将 continue 不受影响。
  • optional

    • 仅当该模块是堆栈中与此* service * * type *关联的唯一模块时,此模块的成功或失败才重要。
  • include

    • 包括从配置文件中指定为该控件参数的所有给定类型的行。
  • substack

    • 包括从配置文件中指定为该控件参数的所有给定类型的行。这与* include 的不同之处在于,对子堆栈中的 done die *操作的求值不会导致跳过整个模块堆栈的其余部分,而只会跳过子堆栈。子堆栈中的跳转也不能使评估跳出该子堆栈,并且在父堆栈中完成跳转时,整个子堆栈将被视为一个模块。 * reset *操作会将模块堆栈的状态重置为子堆栈评估开始时的状态。

对于更复杂的语法,有效的* control *值具有以下形式:

[value1=action1 value2=action2 ...]

其中* valueN 对应于在为其定义了行的模块中调用的函数的返回码。它是从以下之一中选择的:成功 open_err symbol_err service_err system_err buf_err perm_denied auth_err cred_insufficient authinfo_unavail user_unknown maxtries new_authtok_reqd acct_expired session_err cred_unavail cred_expired cred_err no_module_data conv_err authtok_err authtok_rebus_er,* authtok_recover_er * authtok_disable_aging try_again ignore abort authtok_expired module_unknown bad_item conv_again incomplete default *。

其中的最后一个* default 表示未明确提及“所有 valueN *”。请注意,PAM 错误的完整列表在/usr/include/security/_pam_types.h中可用。 * actionN *可以采用以下形式之一:

  • ignore

    • 当与一堆模块一起使用时,模块的返回状态不会影响应用程序获取的返回代码。
  • bad

    • 此操作表明应将返回码视为指示模块故障的指示。如果此模块是堆栈中第一个发生故障的模块,则其状态值将用于整个堆栈的状态值。
  • die

    • 相当于具有终止模块堆栈和 PAM 立即返回到应用程序的副作用。
  • ok

    • 这告诉 PAM,Management 员认为此返回码应直接有助于整个模块堆栈的返回码。换句话说,如果堆栈的先前状态将导致* PAM_SUCCESS *的返回,则模块的返回代码将覆盖此值。请注意,如果堆栈的前一个状态持有一些指示模块故障的值,则该“ ok”值将不会用于覆盖该值。
  • done

    • 等效于 ok,具有终止模块堆栈和 PAM 立即返回应用程序的副作用。
  • N(无符号整数)

    • 跳过堆栈中的下 N 个模块。请注意,不允许 N 等于 0,在这种情况下,它将被视为* ignore 。副作用取决于 PAM 函数调用:对于 pam_authenticate pam_acct_mgmt pam_chauthtok pam_open_session ,它是 ignore ;对于 pam_setcred pam_close_session ,它是 ignore ok bad *之一,具体取决于模块的返回值。
  • reset

    • 清除模块堆栈状态的所有内存,然后从下一个堆栈的模块重新开始。

四个关键字中的每个关键字:必填;必要条件足够;和可选的,在语法上有一个等效的表达式。它们如下:

  • required

    • [success=ok new_authtok_reqd=ok ignore=ignore default=bad]
  • requisite

    • [success=ok new_authtok_reqd=ok ignore=ignore default=die]
  • sufficient

    • [success=done new_authtok_reqd=done default=ignore]
  • optional

    • [success=ok new_authtok_reqd=ok default=ignore]
  • module-path *是应用程序要使用的 PAM 的完整文件名(以'/'开头),或者是默认模块位置/lib/security//lib64/security/的相对路径名,具体取决于体系结构。

  • module-arguments *是用空格分隔的令牌列表,可用于修改给定 PAM 的特定行为。将为每个单独的模块记录此类参数。请注意,如果希望在参数中包含空格,则应在该参数周围加上方括号。

squid auth required pam_mysql.so user=passwd_query passwd=mada \
          db=eminence [query=select user_name from internet_service \
          where user_name='%u' and password=PASSWORD('%p') and \
        service='web_proxy']

使用此约定时,可以在字符串中包含``]'字符以使参数解析有效,则应使用`]'。换一种说法:

[..[..\]..]    -->   ..[..]..

配置文件(其中一个)中的任何行,如果格式不正确,通常会趋向于(警告侧)使身份验证过程失败。通过调用 syslog(3)将相应的错误写入系统日志文件。