在 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-x,s位表示普通用户执行该命令时,会临时获取文件所有者(root)的权限,因此普通用户可通过su root输入密码提权; - su 命令的权限控制同时依赖
/etc/pam.d/su的 PAM 配置文件,其中pam_wheel.so模块可限制仅指定用户组能使用 su 命令。
1.2 禁用普通用户 su 的核心思路
Yocto 构建时通过两步配置实现普通用户 su 禁用,兼顾编译阶段的镜像定制与系统层的权限限制:
- 修改 su 文件权限:调整 SetUID 位权限,仅让 root 用户及指定组拥有执行权限,普通用户无执行权;
- 保留 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 构建镜像的核心配置步骤
环境准备
- 已搭建 Yocto 编译环境,包含 poky 核心层及对应硬件的 BSP 层(如 NXP 的 meta-freescale);
- 熟悉 Yocto 镜像构建流程,可正常编译
core-image-base等基础镜像; - 定位到 Yocto 源码根目录,确保
shadow.inc文件路径可访问:source/poky/meta/recipes-extended/shadow/shadow.inc。
步骤 1:修改 shadow.inc,定制 su 命令安装权限
shadow.inc是 shadow 组件的通用配置文件,通过修改其do_install()函数,在镜像构建阶段修改 su 文件的权限,核心是将普通用户的执行权限移除,并保留 SetUID 位供 root 使用。- 打开
shadow.inc文件:vi source/poky/meta/recipes-extended/shadow/shadow.inc - 在
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 - 保存并退出文件,配置生效后,Yocto 编译时会自动为 su 命令设置指定权限。
权限值说明:4750
- 第一位
4:表示启用SetUID 位,root 用户执行 su 时保持根权限,实现 root 向普通用户的身份切换; - 后三位
750:表示文件所有者(root)拥有读、写、执行权限,所属组拥有读、执行权限,其他普通用户无任何权限; - 对比默认权限
4755:移除了最后一位的5(普通用户的读、执行权限),从文件系统层面禁止普通用户访问 su 命令。
步骤 2:正常编译 Yocto 镜像
- 初始化 Yocto 编译环境(根据自身环境执行,示例为 NXP 平台):
source fsl-setup-release.sh -b build-imx -m imx8mn-lpddr4-evk - 执行镜像编译命令,以基础镜像
core-image-base为例:bitbake core-image-base - 编译完成后,在
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文件,步骤如下:- 在 Yocto 自定义层中创建 PAM 配置文件目录:
mkdir -p meta-custom/recipes-core/pam/files/ - 创建自定义
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 - 创建
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 } - 重新编译 Yocto 镜像,此时 su 命令不仅受文件权限
4750限制,还会被 PAM 模块限制为仅wheel用户组可使用。
5. 注意事项
- su 文件路径检查:Yocto 编译时,su 命令可能安装在
${bindir}/su(/usr/bin/su)或/bin/su,配置中需通过if-elif判断,避免因路径错误导致编译失败; - 权限值不可修改为 4700:若设置为
4700,则仅 root 用户可使用 su,root 无法切换至普通用户,影响系统正常使用;4750是兼顾 root 操作与普通用户禁用的最优选择; - 自定义层优先级:若修改 Yocto 核心层(poky)的
shadow.inc,后续同步 poky 源码时配置会被覆盖,建议基于自定义层创建shadow_%.bbappend文件,在 append 文件中添加权限修改代码,保持核心层无修改; - SetUID 位不可移除:若删除 SetUID 位(如权限改为
750),则 root 用户执行 su 时也无法临时获取根权限,导致 su 命令完全失效,无法实现任何用户身份切换。
Yocto 构建镜像时禁用普通用户 su 命令的核心是修改 shadow 组件的安装权限,通过在
shadow.inc的do_install()函数中设置 su 文件权限为4750,从编译阶段实现镜像定制,无需在系统启动后手动修改。该方案通过文件系统权限实现核心管控,配合/etc/pam.d/su的 PAM 配置,可实现双重权限限制,强化嵌入式 Linux 系统的安全性。整个配置流程无需修改内核或其他系统组件,仅需调整 Yocto 的配方文件,适配所有基于 Yocto Project 的嵌入式 Linux 开发平台,是嵌入式系统权限管控的轻量、高效方案。
阅读全文
110