在 Firejail 中运行 Steam

摘要:本文主要介绍如何在 Firejail 中运行 Steam,包括使用中一些踩坑和感想。

前言

意义

Steam 会在用户目录下产生一些文件,比如 ~/.steam/~/.local/share/Steam/。更糟糕的是,从 Steam 商店下载的程序与游戏会随意地在用户目录下产生文件夹,例如 ~/.local/share/Paradox Interactive/~/.paradoxinteractive/。这些零散的文件显然会给管理带来麻烦。

另一方面,显然 Steam 是个闭源程序,下载的程序与游戏也多半是。程序可以随意的驻留后台、扫描磁盘、修改一些配置或者上传用户隐私,用户对这些软件的行为鞭长莫及。无论这种需要是精神上的洁癖,抑或哪天 Steam 上架了间谍软件,或者单纯的对所谓 steamchina 感到担忧,将程序关到笼子里依然是必要的。

本文于2021-6-30发布于 openSUSE 中文社区论坛

Firejail 与 systemd-nspawn 这种容器不同,Firejail 的首要用途是沙箱,即隔离程序所做的更改。这就导致了一下几点区别:

  • Firejail 内的程序可以直接使用宿主的动态链接库,而 systemd-nspawn 基本不能。
    • 使用 Firejail 你可以至少节省 500MB 的空间。
  • Firejail 不需要 root 权限或者 policykit 授权。

目的

综上,需要达成的目的有三个:

  • 隐私:Steam 不能读取 ~/ 目录下原有的文件;
  • 性能:游戏必须能够以正常性能运行;
  • 管理:Steam 不能在常规的 ~/ 目录下产生文件,而是被重定向到其他地方。

注意:比起 Flatpak 采用的 Bubblewrap 沙箱,Firejail 的安全性是有争议的,因为 Firejail 采用setuid 加上设计时没有考虑最低权级理念。同时本文的 Firejail 配置没有隔离 X.Org 与 D-Bus 这样的易受攻击点。世界上没有运行不可信代码的安全方法,沙箱无法改变这一点。Flatpak 版 Steam 也不是解决一切问题的银弹。对 Firejail 安全性的讨论在文末

懒人方式

这是我能得到的最简单的方式。如果你不介意在电脑上安装一个 Steam 软件包以及一堆 32bit 库(总计需要300MB额外空间),那么这个方法最适合。

简言之就是安装发行版软件源里的 Steam ,但是在 Firejail 中运行。同时 openSUSE 官方的 Steam 包含了一些额外 udev 规则与配置,这样出现的疑难杂症会更少。

准备

创建一个目录,作为 Steam 能看见的 ~/ 目录。本例中取 ~/Steam_Jail 为例。

mkdir ~/Steam_Jail

安装 Steam 与 Firejail:

sudo zypper in steam firejail

添加用户到 Firejail 组:

adduser [username] firejial

自定义配置

Firejail 内置了对 Steam 的配置,但并不完全符合我的目的。

基于 Firejail 官方修改:

配置文件

# Firejail profile for steam
# Description: Valve's Steam digital software delivery system
# This file is overwritten after every install/update
# Persistent local customizations
include steam.local
# Persistent global definitions
include globals.local

noblacklist ${HOME}/.killingfloor
noblacklist ${HOME}/.local/share/3909/PapersPlease
noblacklist ${HOME}/.local/share/aspyr-media
noblacklist ${HOME}/.local/share/bohemiainteractive
noblacklist ${HOME}/.local/share/cdprojektred
noblacklist ${HOME}/.local/share/FasterThanLight
noblacklist ${HOME}/.local/share/feral-interactive
noblacklist ${HOME}/.local/share/IntoTheBreach
noblacklist ${HOME}/.local/share/Paradox Interactive
noblacklist ${HOME}/.local/share/Steam
noblacklist ${HOME}/.local/share/SuperHexagon
noblacklist ${HOME}/.local/share/Terraria
noblacklist ${HOME}/.local/share/vpltd
noblacklist ${HOME}/.local/share/vulkan
noblacklist ${HOME}/.mbwarband
noblacklist ${HOME}/.paradoxinteractive
noblacklist ${HOME}/.steam
noblacklist ${HOME}/.steampath
noblacklist ${HOME}/.steampid
noblacklist ${HOME}/.local/share/themes/
noblacklist ${HOME}/.local/share/icons/
noblacklist ${HOME}/.local/share/fonts/
# needed for STEAM_RUNTIME_PREFER_HOST_LIBRARIES=1 to work
noblacklist /sbin
noblacklist /usr/sbin

# Allow java (blacklisted by disable-devel.inc)
include allow-java.inc

# Allow python (blacklisted by disable-interpreters.inc)
include allow-python2.inc
include allow-python3.inc

include disable-common.inc
include disable-devel.inc
include disable-interpreters.inc
include disable-passwdmgr.inc
include disable-programs.inc

include whitelist-common.inc
include whitelist-var-common.inc

caps.drop all
#ipc-namespace
netfilter
nodvd
# nVidia users may need to comment / ignore nogroups and noroot
nogroups
nonewprivs
noroot
notv
nou2f
# novideo should be commented for VR
novideo
protocol unix,inet,inet6,netlink
# seccomp sometimes causes issues (see #2951, #3267),
# comment it or add 'ignore seccomp' to steam.local if so.
seccomp !ptrace
shell none
# tracelog breaks integrated browser
#tracelog

# private-bin is disabled while in testing, but has been tested working with multiple games
#private-bin awk,basename,bash,bsdtar,bzip2,cat,chmod,cksum,cmp,comm,compress,cp,curl,cut,date,dbus-launch,dbus-send,desktop-file-edit,desktop-file-install,desktop-file-validate,dirname,echo,env,expr,file,find,getopt,grep,gtar,gzip,head,hostname,id,lbzip2,ldconfig,ldd,ln,ls,lsb_release,lsof,lspci,lz4,lzip,lzma,lzop,md5sum,mkdir,mktemp,mv,netstat,ps,pulseaudio,python*,readlink,realpath,rm,sed,sh,sha1sum,sha256sum,sha512sum,sleep,sort,steam,steamdeps,steam-native,steam-runtime,sum,tail,tar,tclsh,test,touch,tr,umask,uname,update-desktop-database,wc,wget,which,whoami,xterm,xz,zenity
# extra programs are available which might be needed for select games
#private-bin java,java-config,mono
# picture viewers are needed for viewing screenshots
#private-bin eog,eom,gthumb,pix,viewnior,xviewer

# comment the following line if you need controller support
private-dev
# private-etc breaks a small selection of games on some systems, comment to support those
private-etc alsa,alternatives,asound.conf,bumblebee,ca-certificates,crypto-policies,dbus-1,drirc,fonts,group,gtk-2.0,gtk-3.0,host.conf,hostname,hosts,ld.so.cache,ld.so.conf,ld.so.conf.d,ld.so.preload,localtime,lsb-release,machine-id,mime.types,nvidia,os-release,passwd,pki,pulse,resolv.conf,services,ssl
private-tmp

# breaks appindicator support
# dbus-user none
# dbus-system none

运行 Steam

直接运行:

firejail --profile=steam-jail.profile --private=~/Steam_Jail steam

记住,不要直接运行 Steam,一定要在 Firejail 里运行,不然功夫就白费。可以自己写个 .desktop 文件替换原来的 Steam 菜单项。

修复一些 Bug

字体

Source 引擎与大多数桌面环境默认的 Noto Sans 八字不合。需要对配置进行调整。

安装文泉驿字体:

sudo zypper in wqy-zenhei-fonts

修改内部的 fontconfig:

~/Steam_Jail/.config/fontconfig/fonts.conf
------------------------------------------
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<alias>
   <family>sans-serif</family>
   <prefer>
     <family>文泉驿正黑</family>
   </prefer>
 </alias>
</fontconfig>

安全性讨论

Calanthe Demetria 在 openSUSE 中文社区指出 Firejail 的问题并建议用 Flatpak、Bubblewrap 代替:

Firejail 的安全性是有争议的,setuid 加上设计时不考虑最低权级理念。如果想要更靠谱的沙箱请考虑Flatpak。 Flatkill 和 Whonix 维护者指出的几个 Flatpak 安全隐患基本要么已经被解决要么正在计划解决的路上。

Flatpak 使用 bubblewrap 来隔离应用程序,bwrap 是非常轻量化的沙箱程序,因此攻击面极小。但 bwrap 需要用户对 Linux 程序工作方式有准确的了解(使用哪些syscall),Flatpak 相当于充当了一个 bwrap 的前端帮助控制 bwrap 权限。

目前 Flatpak 的问题在于 seccomp 权限太过广泛,但目前 Flatpak 维护者已经意识到了这个问题(注释:在他们踩了一次坑之后),已经计划打算解决了。

另一个问题是程序请求的权限过于广泛,但这更多是一个决策问题而不是技术问题,而且你可以用 Flatseal 手动调整权限。

Flatpak 你不能用常规程序方式来理解,每个程序都是一个完全独立的空间,只有给予了权限才有对应访问权,也可以用 Portals 调用文件选择器来获得单独一个文件的完全访问权,Flatpak 版的 Steam 是把所有程序放在 ~/.local/share/flatpak ,配置文件放在 ~/.var/app 里面了,类似安卓下面的分区存储做法。

Flatpak 原本存在的问题: https://flatkill.org/
对应项目的对策:

Firejail 的安全性有极大争议,虽然不代表它一定不安全,但既然指出了问题、维护者却没有去解决,而仅仅是解释“为什么我们需要 setuid ”,那仅从安全角度考虑确实不能把它当作非常安全的东西来看待。

Flatpak 其实和安卓很多地方挺像的,应该说它就是借鉴了安卓的那种沙箱设计。不过你要是乱开权限那它也一样会到处乱放东西。Flatpak 比安卓沙箱好一点的地方在于它考虑到了 home 里面到处乱放东西的问题,所以它自带了一个重定向功能。它还解决了Linux长久以来缺乏SDK和库依赖地狱问题。

补充:但是 Flatpak 能不能成为未来软件分发方式这个也是有争议的。反对 Flatpak 主要的声音来自太占位置了,就像 Windows 那样程序一言不合就把所有库全打包,以及桌面联动性很差,这个主要是程序适配的问题,沙箱里面很多桌面联动需要Portals。

我个人倒是实用派,所以我比较喜欢Flatpak,牺牲空间换取稳定性。

发表回复

您的电子邮箱地址不会被公开。