在只读文件系统上有条件地解锁密码

在只读文件系统上有条件地解锁密码

我正在构建一个通常不会登录的嵌入式系统,但我们需要一种让开发人员可以进行调试和开发的方法。 rootfs 通常是只读的(但可以重新挂载为读写)。

我正在考虑的方案是保持 root 密码锁定(passwd -l)。如果特殊文件存在(在可移动介质上),请解锁密码以便您可以登录。重新启动后,如果特殊文件不存在,密码将再次锁定。

该特殊文件未记录,最终用户不会使用。开发人员通常会创建此文件,以便他们可以随意登录。另一种登录方式是 ssh 客户端,它打开一个转发到我们的服务器的端口,允许我们使用基于密钥的身份验证进行 ssh 登录。为了开发,需要有一种没有网络也能进入的方式。

实现这一点的最简单方法似乎是这样的:

if passwd_is_locked and enable_login_exists:
    remount_rw()
    unlock_passwd()
    remount_ro()
elif not passwd_is_locked and not enable_login_exists:
    remount_rw()
    lock_passwd()
    remount_ro()
else:
    pass

我不喜欢重新挂载和修改文件;我宁愿有一些暂时的备用配置(例如 中的某些内容/tmp)。

我深入研究了这个passwd命令。看起来它--repository通过名称服务切换系统 ( ) 支持某些数据 ( )的多个源nsswitch.conf。我不确定这是否是一个可行的选择,特别是对于 root 帐户,因为 root 帐户似乎应该始终回退到普通/etc/shadow文件。我承认我不是一个系统管理员,所以也许我只是不理解它。

passwd还有一个--root选项。我只需通过cp -a /etc /lib /tmp && passwd --root /tmp编辑/tmp.我不确定我是否可以用这个做一些有用的事情。

如果我将/etc/passwdet al 更改为指向某些可写区域的符号链接,并且如果我手动编辑文件,它似乎可以工作,但我无法使用该passwd命令。

我没有使用 PAM,但如果有好的解决方案,我可能可以启用它。

答案1

我最终使用了类似的东西(在 initrd 内):

if is_dev_mode ; then
    chroot $ROOTFS_MOUNT /usr/bin/passwd --delete root
else
    chroot $ROOTFS_MOUNT /usr/bin/passwd --lock root
fi
sync

这发生在 rootfs 以只读方式重新挂载之前。我不太喜欢它,但我认为它比使用另一个 unionfs (已经有几个)更好。 initrdpasswd没有主操作系统那样的花哨选项,但 achroot也能正常工作。

相关内容