扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

Yocto 构建镜像禁用普通用户 su 命令:权限管控与配置方案

5小时前
110
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

Linux 嵌入式系统中,su命令用于实现用户身份切换,普通用户可通过该命令提权至 root,带来一定的系统安全风险。基于 Yocto Project 构建嵌入式 Linux 镜像时,可通过修改编译配置与文件权限,实现普通用户禁止使用 su 命令,仅保留 root 用户的 su 切换权限,从系统层面强化权限管控。本文详解 Yocto 构建过程中的核心配置步骤、权限修改逻辑及效果验证方法,适用于 NXP 等基于 Yocto 的嵌入式 Linux 开发场景。

资料获取:使用Yocto编译镜像普通用户不能使用su功能

1. su 命令与权限管控核心原理

1.1 su 命令的作用与默认权限

su(switch user/substitute user)是 Linux 系统的身份切换工具,默认安装在/bin/su/usr/bin/su,其核心权限特性为SetUID 位启用
  • 默认文件权限为-rwsr-xr-xs位表示普通用户执行该命令时,会临时获取文件所有者(root)的权限,因此普通用户可通过su root输入密码提权;
  • su 命令的权限控制同时依赖/etc/pam.d/su的 PAM 配置文件,其中pam_wheel.so模块可限制仅指定用户组能使用 su 命令。

1.2 禁用普通用户 su 的核心思路

Yocto 构建时通过两步配置实现普通用户 su 禁用,兼顾编译阶段的镜像定制与系统层的权限限制:
  1. 修改 su 文件权限:调整 SetUID 位权限,仅让 root 用户及指定组拥有执行权限,普通用户无执行权;
  2. 保留 PAM 配置默认值/etc/pam.d/su中保持pam_wheel.so模块注释状态,配合文件权限实现双重管控,避免单独配置失效。

1.3 关键文件与路径

  • Yocto 配置文件:poky/meta/recipes-extended/shadow/shadow.inc(shadow 组件包含 su 命令,修改其安装逻辑);
  • 系统 su 命令路径:/bin/su(嵌入式 Linux 默认路径);
  • PAM 配置文件:/etc/pam.d/su(su 命令的权限验证配置)。

2. Yocto 构建镜像的核心配置步骤

环境准备

  1. 已搭建 Yocto 编译环境,包含 poky 核心层及对应硬件的 BSP 层(如 NXP 的 meta-freescale);
  2. 熟悉 Yocto 镜像构建流程,可正常编译core-image-base等基础镜像;
  3. 定位到 Yocto 源码根目录,确保shadow.inc文件路径可访问:source/poky/meta/recipes-extended/shadow/shadow.inc

步骤 1:修改 shadow.inc,定制 su 命令安装权限

shadow.inc是 shadow 组件的通用配置文件,通过修改其do_install()函数,在镜像构建阶段修改 su 文件的权限,核心是将普通用户的执行权限移除,并保留 SetUID 位供 root 使用。
  1. 打开shadow.inc文件:
    vi source/poky/meta/recipes-extended/shadow/shadow.inc
    
  2. do_install(){}函数中添加以下代码(直接追加至函数内任意位置即可):
    # 检查su命令路径,修改权限为4750
    if [ -f ${D}${bindir}/su ]; then
        chmod 4750 ${D}${bindir}/su
    elif [ -f ${D}/bin/su ]; then
        chmod 4750 ${D}/bin/su
    else
        echo "Error: su file not found!"
        exit 1
    fi
    
  3. 保存并退出文件,配置生效后,Yocto 编译时会自动为 su 命令设置指定权限。

权限值说明:4750

  • 第一位4:表示启用SetUID 位,root 用户执行 su 时保持根权限,实现 root 向普通用户的身份切换;
  • 后三位750:表示文件所有者(root)拥有读、写、执行权限,所属组拥有读、执行权限,其他普通用户无任何权限
  • 对比默认权限4755:移除了最后一位的5(普通用户的读、执行权限),从文件系统层面禁止普通用户访问 su 命令。

步骤 2:正常编译 Yocto 镜像

  1. 初始化 Yocto 编译环境(根据自身环境执行,示例为 NXP 平台):
    source fsl-setup-release.sh -b build-imx -m imx8mn-lpddr4-evk
    
  2. 执行镜像编译命令,以基础镜像core-image-base为例:
    bitbake core-image-base
    
  3. 编译完成后,在build-imx/tmp/deploy/images/对应硬件目录下,获取生成的镜像文件(如sdcard.img)。

步骤 3:镜像烧录与系统启动

将编译好的镜像烧录至开发板的存储设备(eMMC/SD 卡),启动系统后,默认以 root 用户登录(Yocto 基础镜像默认无普通用户),后续通过创建测试用户验证 su 禁用效果。

3. 禁用效果验证(开发板端操作)

步骤 1:创建普通测试用户

在 root 用户下创建新的普通用户newuser,用于验证 su 命令的使用权限:
# 创建用户newuser
useradd newuser
# 验证用户是否创建成功(查看/etc/passwd)
cat /etc/passwd | grep newuser
预期输出
newuser:x:1000:1000::/home/newuser:/bin/sh
表示普通用户创建成功,UID 为 1000(非 root 的 0 号 UID)。

步骤 2:验证 su 命令的文件权限

查看开发板中/bin/su的实际权限,确认 Yocto 编译时的配置已生效:
ls -al /bin/su
预期输出
-rwsr-x--- 1 root root 69272 Mar  9  2018 /bin/su
  • 权限位为rwsr-x---,对应数值4750,与 Yocto 配置一致;
  • 最后一位为---,表示普通用户无读、写、执行权限。

步骤 3:验证不同用户的 su 命令使用效果

1. root 用户切换至普通用户(允许)

root 用户拥有 su 命令的全部权限,可正常切换至普通用户newuser
# root用户执行su newuser
su newuser
# 切换成功后,命令行提示符变为普通用户
newuser@imx8mn-lpddr4-evk:/home/root$

2. 普通用户执行 su 命令(禁止)

在普通用户newuser下,尝试执行su root或直接su切换至 root,会提示权限拒绝,核心验证效果:
# 普通用户执行su root
su root
# 预期输出:权限拒绝
sh: /bin/su: Permission denied

# 普通用户直接执行su
su
# 预期输出:权限拒绝
sh: /bin/su: Permission denied

步骤 4:验证 PAM 配置文件(辅助确认)

查看/etc/pam.d/su的 PAM 配置,确认pam_wheel.so模块保持注释状态,配合文件权限实现双重管控:
cat /etc/pam.d/su
关键配置行
# auth required pam_wheel.so
该行为注释状态,表示未通过 PAM 模块限制 su 使用,此时文件权限是禁用普通用户 su 的核心依据;若取消注释,可进一步限制仅wheel用户组能使用 su,实现更严格的权限管控。

4. 进阶配置:结合 PAM 模块强化 su 管控

若需在文件权限基础上,通过 PAM 模块进一步限制 su 命令的使用(如仅允许指定用户组使用),可在 Yocto 中定制/etc/pam.d/su文件,步骤如下:
  1. 在 Yocto 自定义层中创建 PAM 配置文件目录:
    mkdir -p meta-custom/recipes-core/pam/files/
    
  2. 创建自定义su配置文件,取消pam_wheel.so注释:
    vi meta-custom/recipes-core/pam/files/su
    

    写入内容:

    # 允许root无密码su
    auth sufficient pam_rootok.so
    # 仅允许wheel用户组使用su命令
    auth required pam_wheel.so
    # 允许wheel用户组无密码su(可选)
    # auth sufficient pam_wheel.so trust
    
  3. 创建pam_%.bbappend文件,将自定义配置文件拷贝至镜像中:
    vi meta-custom/recipes-core/pam/pam_%.bbappend
    

    写入内容:

    FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
    SRC_URI += "file://su"
    do_install_append() {
        install -m 0644 ${WORKDIR}/su ${D}/etc/pam.d/su
    }
    
  4. 重新编译 Yocto 镜像,此时 su 命令不仅受文件权限4750限制,还会被 PAM 模块限制为仅wheel用户组可使用。

5. 注意事项

  1. su 文件路径检查:Yocto 编译时,su 命令可能安装在${bindir}/su/usr/bin/su)或/bin/su,配置中需通过if-elif判断,避免因路径错误导致编译失败;
  2. 权限值不可修改为 4700:若设置为4700,则仅 root 用户可使用 su,root 无法切换至普通用户,影响系统正常使用;4750是兼顾 root 操作与普通用户禁用的最优选择;
  3. 自定义层优先级:若修改 Yocto 核心层(poky)的shadow.inc,后续同步 poky 源码时配置会被覆盖,建议基于自定义层创建shadow_%.bbappend文件,在 append 文件中添加权限修改代码,保持核心层无修改;
  4. SetUID 位不可移除:若删除 SetUID 位(如权限改为750),则 root 用户执行 su 时也无法临时获取根权限,导致 su 命令完全失效,无法实现任何用户身份切换。
Yocto 构建镜像时禁用普通用户 su 命令的核心是修改 shadow 组件的安装权限,通过在shadow.incdo_install()函数中设置 su 文件权限为4750,从编译阶段实现镜像定制,无需在系统启动后手动修改。该方案通过文件系统权限实现核心管控,配合/etc/pam.d/su的 PAM 配置,可实现双重权限限制,强化嵌入式 Linux 系统的安全性。

整个配置流程无需修改内核或其他系统组件,仅需调整 Yocto 的配方文件,适配所有基于 Yocto Project 的嵌入式 Linux 开发平台,是嵌入式系统权限管控的轻量、高效方案。

相关推荐