您尚未登录。

#1 2021-02-21 13:36:27

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

怎样让systemd --user运行于单独的mount namespace中?

想法是这样的,将用户与系统分离开,系统进程进行所有特权操作,例如系统更新,账户管理之类的,用户的进程无法直接变更系统,必须与系统的特权服务进程通信,经过polkit之类的服务鉴权后由服务进程进行操作(例如系统更新,启停/启用禁用服务,账户管理之类的),整个系统再也不要有set-uid-root这种的东西。

如果从systemd --user开始所有的用户进程都运行于mount namespaces中,这个mount namespace将根目录改为系统根文件系统与某个用户可写目录的overlayfs,这样用户就可以直接使用系统级工具变更自己的配置而不影响OS,包括各种package manager(pip/pacman之类的)和 systemd user service,软件也不需要任何用户级配置文件的概念。

要做到这些该怎么办呢?我知道每次用户登录,display manager或者sshd会跟logind通信启动systemd --user,但是这个过程我怎么控制,是不是要自己写PAM模块控制用户session创建的过程?那个PAM的文档我感觉写的不是特别详细啊,能否有其他方式控制,让systemd --user在新的mount namespace运行?

最近编辑记录 xtricman (2021-02-21 19:10:58)


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#2 2021-02-21 13:51:55

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,384
个人网站

Re: 怎样让systemd --user运行于单独的mount namespace中?

可以是可以。你这是要把多用户系统伪装成单用户的?

离线

#3 2021-02-21 14:21:40

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

Re: 怎样让systemd --user运行于单独的mount namespace中?

依云 说:

可以是可以。你这是要把多用户系统伪装成单用户的?

…我又没说不让登录别的用户,别的用户照旧登录啊,只是系统用户互相分隔清楚,用户不要动系统。这Windows的UAC虚拟化不是就这样玩嘛

我是想问怎么做。

最近编辑记录 xtricman (2021-02-21 14:29:09)


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#4 2021-02-21 15:33:50

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,384
个人网站

Re: 怎样让systemd --user运行于单独的mount namespace中?

rootfs 准备好,然后 systemd-nspawn 一下?

离线

#5 2021-02-21 19:05:57

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

Re: 怎样让systemd --user运行于单独的mount namespace中?

依云 说:

rootfs 准备好,然后 systemd-nspawn 一下?

我想你可能没有明白我的意思,或者我说的不太清楚

一般的,登录管理器进程(sddm或者gdm或者sshd)会自己负责认证用户并让用户登录,这个登录实际上是与logind 进行dbus通信,创建用户session(如果该用户之前没有活着的session或者该用户设定了linger则还需要创建一个systemd --user进程并且systemd --user会启动所有该自启动的用户服务)。

systemd-nsspawn会生成沙盒或者容器,logind不会感知到,也不会形成原来logind的session概念。

如果这样,相当于彻底抛弃了logind提供的session管理功能(dropbear的某版本是这样的,客户端连接过来它会直接创建子进程,自己管理ssh登录会话,logind啥都不知道,loginctl也查不到系统上有某用户的remote session,用户虽然“登录”了,用户服务不会运行,要用sytemctl status就能看见此时系统的cgroup树状态)

我并不要求沙盒那么重的方案,仅仅需要整个user slice(也即用户登录的所有进程,包括systemd --user,用户级服务,用户session中的进程)运行于一个mount namespace中(以使得用户可以自由编辑系统配置而不真正影响系统),用户或特权进程依然可以靠原来的logind的dbus接口管理用户session

最近编辑记录 xtricman (2021-02-21 19:07:31)


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#6 2021-02-21 19:10:26

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

Re: 怎样让systemd --user运行于单独的mount namespace中?

你说的那种方案是一个用户即一个容器,实际上把logind完全抛弃了,用户甚至可以不用systemd,完全自主。我并不希望这么做,我还是很喜欢logind的


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#7 2021-02-21 19:20:44

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,384
个人网站

Re: 怎样让systemd --user运行于单独的mount namespace中?

你可以在 logind 登录完成之后再跑嘛。

离线

#8 2021-02-21 20:21:17

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

Re: 怎样让systemd --user运行于单独的mount namespace中?

依云 说:

你可以在 logind 登录完成之后再跑嘛。

等登录完了用户服务已经启动了啊,systemd --user和用户服务不就全部不在mount namespace里了吗?如果只有session进程那我session一开始就执行unshare就好了啊,都没必要用上任何沙盒软件,我就是要用户整个cgroup都在mount namespace里


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#9 2021-02-21 20:27:56

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,384
个人网站

Re: 怎样让systemd --user运行于单独的mount namespace中?

xtricman 说:

等登录完了用户服务已经启动了啊,systemd --user和用户服务不就全部不在mount namespace里了吗?如果只有session进程那我session一开始就执行unshare就好了啊,都没必要用上任何沙盒软件,我就是要用户整个cgroup都在mount namespace里

那个你不用不就好了。

离线

#10 2021-02-22 09:04:19

布丁酱
Arch!Arch!Arch!
所在地: 成都
注册时间: 2020-07-27
帖子: 196
个人网站

Re: 怎样让systemd --user运行于单独的mount namespace中?

我也以为在说systemd-nspawn。。。


布丁酱是菜鸡,没毛病,他是菜鸡:)

离线

页脚