摘要:本文主要介绍如何在 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/
对应项目的对策:
- Flathub 要求收紧权限: https://github.com/flathub/flathub/wiki/App-Requirements#permissions
- Gnome 41开始在Software里面增加明确的“不安全”警告(没有链接,自己去看😂)
- 维护者考虑转向白名单策略: https://github.com/flatpak/flatpak/security/advisories/GHSA-67h7-w3jq-vh4q
Firejail 的安全性有极大争议,虽然不代表它一定不安全,但既然指出了问题、维护者却没有去解决,而仅仅是解释“为什么我们需要 setuid ”,那仅从安全角度考虑确实不能把它当作非常安全的东西来看待。
Flatpak 其实和安卓很多地方挺像的,应该说它就是借鉴了安卓的那种沙箱设计。不过你要是乱开权限那它也一样会到处乱放东西。Flatpak 比安卓沙箱好一点的地方在于它考虑到了 home 里面到处乱放东西的问题,所以它自带了一个重定向功能。它还解决了Linux长久以来缺乏SDK和库依赖地狱问题。
补充:但是 Flatpak 能不能成为未来软件分发方式这个也是有争议的。反对 Flatpak 主要的声音来自太占位置了,就像 Windows 那样程序一言不合就把所有库全打包,以及桌面联动性很差,这个主要是程序适配的问题,沙箱里面很多桌面联动需要Portals。
我个人倒是实用派,所以我比较喜欢Flatpak,牺牲空间换取稳定性。