通过pam_cap配置特权失效的原因

缘由

阅读官网上对于pam_cap介绍的用户特权配置,如果不特别注意官网介绍中的几个关键词,通常配置后并不起效。

而这段对于非root的运行的特权设定与传递、传播的研究,均来自于这个疑问,所以,想再深入谈谈这个问题,而非蜻蜓点水。

官网配置说明

# /etc/security/capability.conf配置pam_cap作用的相关用户

# Simple
cap_sys_ptrace               developer
cap_net_raw                  user1

# Multiple capablities
cap_net_admin,cap_net_raw    jrnetadmin
# Identical, but with numeric values
12,13                        jrnetadmin
...

服务相关程序在PAM中配置启用pam_cap

借助其它已有程序完成启动

Nearly all applications/daemons which use PAM for authentication contain a configuration line:
@include common-auth. Thus, to set inheritable capabilities in all of these applications, add the following as the last line to /etc/pam.d/common-auth

auth optional pam_cap.so
可参见/etc/pam.d/中几个使用PAM程序的系统程序

To set inheritable capabilities for a user in a specific application, or in application(s) which do not >@include common-auth, add the line below to the application-specific file; e.g. /etc/pam.d/myapp

auth optional pam_cap.so

注意:独自配置应用程序,需要做到对PAM Aware

几个原因

  • su、runuser系统程序的PAM鉴权任务栈提前返回
  • 单独配置服务并非PAM Aware,对于PAM模块没有进行接口编程,不能自动生效
  • inheritable capabilities并不能实现自动传递
  • libcap.so版本比较低

PAM鉴权任务栈提前返回

# CentOS7 su的鉴权任务栈
auth            sufficient      pam_rootok.so
auth            substack        system-auth
auth            include         postlogin
# 省略不重要的配置行,详细可见/etc/pam.d/su文件内容
# Ubuntu18.04 su鉴权任务栈虽然包括官网建议的common-auth,但是同样存在提前返回的可能
#
# The PAM configuration file for the Shadow `su' service
#

# This allows root to su without passwords (normal operation)
auth       sufficient pam_rootok.so

# 省略不重要的配置行,详细可见/etc/pam.d/su文件内容
...
@include common-auth
...

对于配置的鉴权任务sufficientrequisite描述符会导致任务栈提前中止

服务并非PAM Aware

su source codePAM的主动编程,它是PAM Aware

独自在/etc/pam.d/中配置的程序,需要做到PAM Aware

inheritable capabilities并不能实现自动传递

所运行子进程程序是否经由setcap进行特权授权,如果没有特殊授权,根据特权生效算法,并不能自动实现传递

可以借助ambient set,通过根启动程序,类似容器方式实现特权在父子进程树内的传递、传播

libcap.so版本比较低

在libcap.so 2.58+的高版本中,对于ambient set环境特权集实现了支持,但这个版本已经是2021年才发布的,而一般的发行版携带的libcap库是比较低的

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个使用 pam_chauthtok(localAuthHandle, PAM_SILENT) 函数检查密码过期的示例: ```c #include <security/pam_appl.h> #include <security/pam_misc.h> 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_chauthtok(pamh, PAM_SILENT); } if (retval == PAM_SUCCESS) { printf("Password change successful!\n"); } else { printf("Password change failed!\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; } ``` 在这个示例程序中,我们同样使用 pam_start() 函数来初始化 PAM 系统并启动认证流程。然后,我们调用 pam_chauthtok() 函数来检查密码是否过期,并在需要时强制用户更改密码。不同的是,我们使用 PAM_SILENT 选项来指定这个过程是静默的,不需要提示用户输入密码。 最后,我们同样使用 pam_end() 函数来结束 PAM 会话并释放资源。 需要注意的是,使用 PAM_SILENT 选项静默地检查密码过期可能会降低安全性。因为用户没有机会确认他们的密码是否过期,也没有机会输入一个强密码来替换过期的密码。因此,在生产系统中,我们需要谨慎使用 PAM_SILENT 选项,并确保用户密码的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值