firejail沙盒测试命令

发布时间:2023年12月27日

测试环境 ubuntu 22.04

在这里插入图片描述

沙箱配置与运行:

  • --allow-debuggers:允许在沙箱中使用调试器。

出错

x@x:~/桌面$ firejail --allow-debuggers --profile=/etc/firejail/firefox.profile strace -f firefox
Reading profile /etc/firejail/firefox.profile
Reading profile /etc/firejail/whitelist-usr-share-common.inc
Reading profile /etc/firejail/firefox-common.profile
Reading profile /etc/firejail/disable-common.inc
Reading profile /etc/firejail/disable-exec.inc
Reading profile /etc/firejail/disable-interpreters.inc
Reading profile /etc/firejail/disable-programs.inc
Reading profile /etc/firejail/whitelist-common.inc
Reading profile /etc/firejail/whitelist-runuser-common.inc
Reading profile /etc/firejail/whitelist-var-common.inc
Warning: networking feature is disabled in Firejail configuration file
Seccomp list in: !chroot, check list: @default-keep, prelist: unknown,
Parent pid 16531, child pid 16534
Warning: cannot open source file /usr/lib/x86_64-linux-gnu/firejail/seccomp.debug32, file not copied
Warning: An abstract unix socket for session D-BUS might still be available. Use --net or remove unix from --protocol set.
Warning: cleaning all supplementary groups
Warning: cleaning all supplementary groups
Seccomp list in: !chroot, check list: @default-keep, prelist: unknown,
Child process initialized in 94.88 ms
strace: test_ptrace_get_syscall_info: PTRACE_TRACEME: Permission denied
strace: ptrace(PTRACE_TRACEME, ...): Permission denied
+++ exited with 1 +++

Parent is shutting down, bye...
  • --allusers:使所有用户都能使用该沙箱配置。

沙箱内部可见/home下的所有目录。默认情况下,只有当前用户的家庭目录是可见的。

运行 · firejail firefox 并在firefox 地址栏输入/home

运行 · firejail --allusers firefox 并在firefox 地址栏输入/home

可见访问到了其他用户目录

LibreOffice_7.6.4.1_Linux_x86-64_deb 测试也同样

  • --appimage:为 AppImage 应用程序启用特殊支持。

AppImage 是一种跨Linux发行版的应用程序打包格式,允许开发者将他们的应用程序打包为一个独立的可执行文件,用户可以在各种Linux发行版上直接运行,而无需安装。以下是一些使用 AppImage 格式分发的流行应用示例:

  1. LibreOffice
  2. GIMP
  3. Inkscape
  4. Blender
  5. HandBrake
  6. KiCad
  7. FreeCAD
  8. Etcher
  9. Signal
  10. Telegram
  11. Minecraft
  12. VLC media player
  13. Audacity
  14. FileZilla
  15. OBS Studio
  16. qbittorrent
  17. Deluge
  18. Sublime Text
  19. Atom
  20. Typora

这只是一个部分列表,实际上有成百上千的应用程序使用 AppImage 进行分发。你可以在官方的 AppImage 应用仓库 AppImageHub (https://appimage.github.io/) 或其他相关资源中找到更多 AppImage 格式的应用程序。需要注意的是,应用的可用性可能会随着时间的推移而变化,新的应用不断被添加,而一些旧的应用可能不再维护或更新其 AppImage 版本。

--appimage 命令行选项主要在以下几种情况下使用:

  1. 明确指定 AppImage 类型:在某些情况下,可能需要明确告诉系统这是一个 AppImage 文件,以便正确地解析和运行它。虽然大多数时候可以直接运行赋予执行权限的 AppImage 文件,但有些工具或脚本可能需要这个选项来确保正确的处理。

  2. 访问 AppImage 特殊功能或信息:AppImage 提供了一些特殊的环境变量和命令行选项,用于获取 AppImage 文件的信息或者改变其行为。使用 --appimage 选项可以访问这些功能。

  3. 解决兼容性问题:在某些罕见的情况下,直接运行 AppImage 文件可能会遇到兼容性问题。使用 --appimage 选项可以帮助解决这些问题,因为它确保了 AppImage 运行环境的一致性。

  4. 集成到脚本或自动化流程:在编写脚本或自动化流程时,使用 --appimage 选项可以确保一致性和可预测的行为,特别是在处理多个不同 AppImage 文件时。

总的来说,虽然在大多数情况下直接运行 AppImage 文件就足够了,但 --appimage 选项提供了一种更精细的控制方式,使得在特定场景下能够更好地管理和使用 AppImage 应用程序。

测试

firejail --private=. --net=none --appimage kdenlive-20.12.2-x86_64.appimage

你的命令使用firejail来运行Kdenlive的AppImage,并设置了以下选项:

  • --private=.:这个选项告诉firejail在当前目录下创建一个私有的文件系统挂载点。这意味着Kdenlive将在一个与主机系统隔离的环境中运行,无法访问除了指定路径之外的任何主机文件系统。

  • --net=none:这个选项禁止了Kdenlive访问网络。这意味着在firejail沙箱中运行的Kdenlive将无法进行任何网络通信。

  • --appimage kdenlive-20.12.2-x86_64.appimage:这个选项指定了要运行的AppImage文件。

这个命令可以在一个安全、隔离且无网络访问的环境中运行Kdenlive。

  • --build:从当前目录的文件系统快照构建一个新的沙箱配置文件。

  • --build=profile-file:从指定的配置文件构建一个新的沙箱配置。

创建一个这样的文件夹

/home/x/.config/firejail

运行如下命令启动blobby 程序(游戏),会创建对应的配置文件

firejail --build=blobby.profile /usr/games/blobby

生成的配置文件内容

# Save this file as "application.profile" (change "application" with the
# program name) in ~/.config/firejail directory. Firejail will find it
# automatically every time you sandbox your application.
#
# Run "firejail application" to test it. In the file there are
# some other commands you can try. Enable them by removing the "#".

# Firejail profile for /usr/games/blobby
# Persistent local customizations
#include /usr/games/blobby.local
# Persistent global definitions
#include globals.local

### Basic Blacklisting ###
### Enable as many of them as you can! A very important one is
### "disable-exec.inc". This will make among other things your home
### and /tmp directories non-executable.
include disable-common.inc      # dangerous directories like ~/.ssh and ~/.gnupg
#include disable-devel.inc      # development tools such as gcc and gdb
#include disable-exec.inc       # non-executable directories such as /var, /tmp, and /home
#include disable-interpreters.inc       # perl, python, lua etc.
include disable-passwdmgr.inc   # password managers
include disable-programs.inc    # user configuration for programs such as firefox, vlc etc.
#include disable-shell.inc      # sh, bash, zsh etc.
#include disable-xdg.inc        # standard user directories: Documents, Pictures, Videos, Music

### Home Directory Whitelisting ###
### If something goes wrong, this section is the first one to comment out.
### Instead, you'll have to relay on the basic blacklisting above.
whitelist ${HOME}/.config/alsa
whitelist ${HOME}/.pulse
whitelist ${HOME}/.Xdefaults-x
whitelist ${HOME}/.blobby
include whitelist-common.inc

### Filesystem Whitelisting ###
whitelist /usr/share/blobby
include whitelist-usr-share-common.inc
whitelist /var/lib/alsa/card0.conf.d
whitelist /var/lib/alsa/conf.d
include whitelist-var-common.inc

#apparmor       # if you have AppArmor running, try this one!
caps.drop all
ipc-namespace
netfilter
#no3d   # disable 3D acceleration
#nodvd  # disable DVD and CD devices
#nogroups       # disable supplementary user groups
#noinput        # disable input devices
nonewprivs
noroot
#notv   # disable DVB TV devices
#nou2f  # disable U2F devices
#novideo        # disable video capture devices
protocol unix,netlink,
net none
seccomp
# seccomp.keep clock_nanosleep,poll,ioctl,recvmsg,write,writev,openat,getpid,read,semtimedop,close,newfstatat,futex,mmap,access,lseek,munmap,lstat,fcntl,mprotect,readlink,getdents64,readlinkat,getuid,madvise,socket,connect,setsockopt,brk,memfd_create,mkdir,getgid,recvfrom,umask,pipe2,ftruncate,rt_sigprocmask,clone,stat,getrandom,clone3,sched_setaffinity,rt_sigaction,fsync,fstat,shmctl,prctl,sendmsg,mremap,uname,shmdt,sched_getscheduler,shmat,mlock,set_robust_list,gettid,shutdown,rseq,semctl,geteuid,setpriority,sched_getparam,bind,sched_yield,sched_getaffinity,shmget,getsockname,wait4,semget,getpeername,getresuid,set_tid_address,getegid,getresgid,prlimit64,arch_prctl,pread64,dup2,execve
# 79 syscalls total
# Probably you will need to add more syscalls to seccomp.keep. Look for
# seccomp errors in /var/log/syslog or /var/log/audit/audit.log while
# running your sandbox.
shell none
tracelog

#disable-mnt    # no access to /mnt, /media, /run/mount and /run/media
private-bin blobby,
#private-cache  # run with an empty ~/.cache directory
private-dev
private-etc asound.conf,alsa,machine-id,pulse,drirc,
#private-lib
private-tmp

#dbus-user none
#dbus-system none

#memory-deny-write-execute
  • --include=file.profile:包含另一个配置文件中的设置。
  • --name=name:为沙箱命名,用于标识和管理。

测试

firejail--private=.--net=none --name=my_kdenlive_sandbox --appimage kdenlive-23.08.4-x86_64-A.AppImage

--name=name 是 firejail 的一个选项,它允许你为正在创建的沙箱环境指定一个自定义名称。这个名称主要用于标识和管理不同的沙箱。

查看创建的沙箱

firejail --list

37889:x:my_kdenlive_sandbox:firejail --private=.--net=none --name=my_kdenlive_sandbox --appimage kdenlive-23.08.4-x86_64-A.AppImage

--name 选项在 firejail 中的主要应用场景包括:

  1. 标识和管理多个沙箱

    当你在同一系统上运行多个 firejail 沙箱时,使用 --name 选项可以为每个沙箱指定一个独特的名称。这有助于你在 firejail-list 命令的输出中轻松识别和区分不同的沙箱。

  2. 自动化脚本和工具

    在编写自动化脚本或使用第三方管理工具时,通过 --name 选项指定的沙箱名称可以让你更方便地控制和管理各个沙箱。例如,你可以编写一个脚本来启动、停止或监控特定名称的沙箱。

  3. 日志记录和审计

    使用 --name 选项可以将沙箱名称包含在日志记录和审计信息中,使得追踪和分析应用程序的行为变得更加容易。这对于安全性和故障排查非常有帮助。

  4. 组织和分组相关应用程序

    如果你正在使用 firejail 运行一组相关的应用程序,为它们分配相似或相关的名称可以帮助你更好地组织和理解这些沙箱的作用。

  5. 避免冲突

    在某些情况下,不同的应用程序可能默认使用相同的沙箱名称,导致冲突。通过明确指定 --name,你可以确保每个应用程序都有一个唯一的沙箱名称,从而避免潜在的冲突。

总的来说,--name 选项在提供更好的可管理性、可识别性和组织性方面对于 firejail 的使用者来说是非常有用的。它使你能够更精细地控制和监视在沙箱环境中运行的应用程序。

  • --private:创建一个私有文件系统挂载点。

测试

firejail --private firefox 

此时打开的firefox 就和刚刚下载的firefox 一样,有欢迎页。 而且 在打开期间(产生)下载的 任何文件和痕迹都将在浏览器关闭后抹去

firejail  --private wps
  • --private=directory:指定要作为私有挂载点的目录。
firejail  --private=/home/x/  wps
firejail --private=. firejail 

使用 directory 作为用户主目录。–private和–private=directory不能同时使用。

  • --private-bin=file,file

测试

这个命令是在Firejail环境中使用的,Firejail是一个用于Linux系统的轻量级沙箱工具。--private-bin=file,file选项用于在临时文件系统中创建一个新的/bin目录,并将列表中的程序复制到这个新的/bin目录中。

在这个例子中:

$ firejail --private-bin=bash,sed,ls,cat

这意味着我们将bash、sed、ls和cat这四个程序复制到新的/bin目录中。这些程序应该是存在于原来的/bin、/sbin、/usr/bin、/usr/sbin或/usr/local/bin目录中的。

然后,当我们列出新的/bin目录内容时,应该能看到我们刚刚指定的这几个程序:

$ ls /bin
bash  cat  ls  sed

需要注意的是,这个新的/bin目录只在Firejail的沙箱环境中存在,当沙箱关闭时,所有在这个目录中的修改都会被丢弃。此外,如果列表中的某个程序在指定的系统目录中找不到,那么该程序就不会被复制到新的/bin目录中。如果使用了多个private-bin命令,它们的效果会累积。同时,这个选项也支持文件通配符,具体规则可以参考Firejail的“FILE GLOBBING”部分。

这个用法主要是为了在Firejail的沙箱环境中创建一个独立的/bin目录,并在这个目录中只包含你指定的程序。

通常在Linux系统中,/bin、/sbin、/usr/bin、/usr/sbin和/usr/local/bin这些目录包含了大部分常用的命令行工具和系统程序。当你运行Firejail并使用--private-bin=file,file选项时,你可以指定哪些程序会被复制到新的/bin目录中。

这样做的好处是:

  1. 安全性:在沙箱环境中,只有你指定的程序可以运行,其他未被指定的程序无法访问。这可以限制潜在的安全风险。
  2. 资源隔离:只复制需要的程序到新的/bin目录,可以减少沙箱环境的资源占用。
  3. 环境定制:你可以根据你的需求,只复制你需要的程序到沙箱环境中,创建一个定制化的运行环境。

例如,你在命令中指定了--private-bin=bash,sed,ls,cat,这意味着在沙箱环境中,你只能运行bash、sed、ls和cat这几个程序。如果你试图运行其他不在这个列表中的程序,将会因为找不到该程序而失败。

当沙箱环境关闭时,所有在新的/bin目录中的修改都会被丢弃,系统会恢复到原来的状态。这就是所谓的“临时文件系统”的概念,它提供了一个临时的、独立的环境,用于运行特定的程序或任务。

  • --private-cache

firejail --private-cache firefoxfirejail --private firefox 两者在Firejail中用于提供不同的隔离级别。

  1. firejail --private-cache firefox

这个命令行选项告诉Firejail为Firefox创建一个私有的缓存目录。这意味着Firefox的所有缓存文件,如浏览历史、cookies、临时文件等,都将被存储在一个独立的、与系统其他部分隔离的目录中。这样做有助于保护用户的隐私,并在关闭Firejail沙箱时自动清理这些缓存数据。

  1. firejail --private firefox

相比之下,--private 选项提供了更高级别的隔离。它不仅创建一个私有的缓存目录,而且还创建了一个完全独立的文件系统环境。在这个环境中,Firefox将无法访问主机系统的任何文件或目录,除非你明确地通过其他Firejail选项(如--whitelist--read-only)允许访问。

使用--private选项时,Firefox将看到一个全新的、空的文件系统视图,这可以极大地增强安全性,防止恶意软件或意外的数据泄漏。然而,这也可能需要额外的配置来确保Firefox能够正常运行,例如,你可能需要指定一些必要的文件或目录的访问权限。

总结起来,--private-cache主要关注的是浏览器缓存的隔离,而--private则提供了全面的文件系统隔离,旨在为应用程序提供一个更加安全和独立的运行环境。


  • --private-cwd

  • --private-cwd=directory

--private-cwd--private-cwd=directory 是 Firejail 中的两个选项,它们用于在沙箱环境中设置工作目录。

  1. --private-cwd
    当你使用 --private-cwd 选项时,Firejail 会尝试将沙箱内的工作目录设置为你的主目录(通常是 /home/user)。如果由于某种原因(如权限问题或主目录不存在)设置主目录失败,Firejail 将默认将工作目录设置为根目录 /。这个选项不会影响配置文件中包含的路径的工作目录。

    示例:

    $ pwd
    /tmp
    $ firejail --private-cwd
    $ pwd
    /home/user
    

    在这个例子中,初始工作目录是 /tmp,运行 firejail --private-cwd 后,工作目录被设置为用户主目录 /home/user

  2. --private-cwd=directory
    当你使用 --private-cwd=directory 选项时,你需要提供一个完整的目录路径作为参数。Firejail 将在沙箱内将工作目录设置为你指定的目录。注意,这个选项不允许使用符号链接作为目标目录,并且也不会影响配置文件中包含的路径的工作目录。

    示例:

    $ pwd
    /tmp
    $ firejail --private-cwd=/opt
    $ pwd
    /opt
    

    在这个例子中,初始工作目录是 /tmp,运行 firejail --private-cwd=/opt 后,工作目录被设置为指定的 /opt 目录。

这两个选项主要用于控制在沙箱环境中运行的程序的工作目录,以便限制其对文件系统的访问范围,提高安全性。根据你的需求,你可以选择使用 --private-cwd 设置为主目录,或者使用 --private-cwd=directory 指定特定的目录作为工作目录。

工作目录(Working Directory)是在计算机文件系统中,当前活动的目录或路径。它是指你在操作系统中执行命令、打开文件或进行其他文件操作时所处的默认位置。

当你在命令行界面(如Windows的命令提示符或Linux的终端)中导航文件系统时,每当你使用 cd (change directory)命令进入一个新的目录,那个目录就成为了你的工作目录。当你运行一个程序或命令而没有指定完整路径时,系统会假设你指的是工作目录中的文件或子目录。

例如,如果你的工作目录是 /home/user/Documents,然后你运行 ls 命令(列出目录内容),它将显示 /home/user/Documents 目录下的文件和子目录。同样,如果你在这个目录下创建一个新文件,该文件将默认在这个目录中创建。

工作目录是一个相对概念,因为它是相对于文件系统的根目录(在Unix/Linux系统中通常是 /,在Windows系统中通常是 C:\ 或其他驱动器盘符)。你可以通过绝对路径或者相对路径来指定文件或目录的位置,其中相对路径是相对于当前工作目录的。

测试

x@x:~/Desktop$ pwd
/home/x/Desktop
x@x:~/Desktop$ firejail --private-cwd
Reading profile /etc/firejail/default.profile
Reading profile /etc/firejail/disable-common.inc
Reading profile /etc/firejail/disable-passwdmgr.inc
Reading profile /etc/firejail/disable-programs.inc
Warning: networking feature is disabled in Firejail configuration file

** Note: you can use --noprofile to disable default.profile **

Parent pid 4156, child pid 4157
Warning: cleaning all supplementary groups
Child process initialized in 33.46 ms
x@x:~$ pwd
/home/x
x@x:~$ exit
exit

Parent is shutting down, bye...
x@x:~/Desktop$

测试

x@x:~/Desktop$ firejail --private-cwd=/opt
Reading profile /etc/firejail/default.profile
Reading profile /etc/firejail/disable-common.inc
Reading profile /etc/firejail/disable-passwdmgr.inc
Reading profile /etc/firejail/disable-programs.inc
Warning: networking feature is disabled in Firejail configuration file

** Note: you can use --noprofile to disable default.profile **

Parent pid 4232, child pid 4233
Warning: cleaning all supplementary groups
Child process initialized in 33.35 ms
x@x:/opt$ pwd
/opt
x@x:/opt$ exit
exit

Parent is shutting down, bye...
x@x:~/Desktop$ pwd
/home/x/Desktop

  • --private-dev

--private-dev 是 Firejail 中的一个选项,它用于在沙箱环境中创建一个新的 /dev 目录。这个新的 /dev 目录只包含一组有限的、经过筛选的设备文件,这些设备文件被认为是安全的或者对于大多数应用程序来说是必要的。

以下是一些在使用 --private-dev 选项时默认可用的设备:

  • disc
  • dri
  • dvb
  • hidraw
  • null
  • full
  • zero
  • tty
  • pts
  • ptmx
  • random
  • snd
  • urandom
  • video
  • log
  • shm
  • usb

此外,你可以使用一些额外的选项来进一步限制设备访问:

  • --no3d: 禁止访问3D加速设备。
  • --nodvd: 禁止访问DVD设备。
  • --nosound: 禁止访问声音设备。
  • --notv: 禁止访问电视设备。
  • --nou2f: 禁止访问U2F(Universal 2nd Factor)设备。
  • --novideo: 禁止访问视频输出设备。

示例:

$ firejail --private-dev
父进程pid 9887,子进程pid 9888
子进程初始化完成
$ ls /dev
cdrom  cdrw  dri  dvd  dvdrw  full  log  null  ptmx  pts  random  shm  snd  sr0  tty  urandom  zero

在这个示例中,我们使用了 --private-dev 选项启动 Firejail,并列出了新创建的 /dev 目录中的内容。你可以看到,这个目录中只包含了默认允许的设备文件。通过这种方式,Firejail 可以限制沙箱内应用程序对系统设备的访问,从而提高安全性。如果你的应用程序需要访问其他特定设备,你可能需要使用其他 Firejail 选项或配置来允许这些设备的访问。

测试

x@x:~/Desktop$ firejail --private-dev
Reading profile /etc/firejail/default.profile
Reading profile /etc/firejail/disable-common.inc
Reading profile /etc/firejail/disable-passwdmgr.inc
Reading profile /etc/firejail/disable-programs.inc
Warning: networking feature is disabled in Firejail configuration file

** Note: you can use --noprofile to disable default.profile **

Parent pid 4182, child pid 4183
Warning: cleaning all supplementary groups
Child process initialized in 38.58 ms
x@x:~/Desktop$ ls /dev
cdrom  dri  dvdrw  full     log   ptmx  random  snd  stderr  stdout  urandom
cdrw   dvd  fd     hidraw0  null  pts   shm     sr0  stdin   tty     zero
x@x:~/Desktop$ exit
exit

Parent is shutting down, bye...
x@x:~/Desktop$ ls /dev 
autofs           initctl       psaux     tty11  tty35  tty59      ttyS23       vcs4
block            input         ptmx      tty12  tty36  tty6       ttyS24       vcs5
bsg              kmsg          pts       tty13  tty37  tty60      ttyS25       vcs6
btrfs-control    log           random    tty14  tty38  tty61      ttyS26       vcsa
bus              loop0         rfkill    tty15  tty39  tty62      ttyS27       vcsa1
cdrom            loop1         rtc       tty16  tty4   tty63      ttyS28       vcsa2
char             loop10        rtc0      tty17  tty40  tty7       ttyS29       vcsa3
console          loop2         sda       tty18  tty41  tty8       ttyS3        vcsa4
core             loop3         sda1      tty19  tty42  tty9       ttyS30       vcsa5
cpu              loop4         sda2      tty2   tty43  ttyprintk  ttyS31       vcsa6
cpu_dma_latency  loop5         sda3      tty20  tty44  ttyS0      ttyS4        vcsu
cuse             loop6         sg0       tty21  tty45  ttyS1      ttyS5        vcsu1
disk             loop7         sg1       tty22  tty46  ttyS10     ttyS6        vcsu2
dma_heap         loop8         sg2       tty23  tty47  ttyS11     ttyS7        vcsu3
dmmidi           loop9         shm       tty24  tty48  ttyS12     ttyS8        vcsu4
dri              loop-control  snapshot  tty25  tty49  ttyS13     ttyS9        vcsu5
ecryptfs         mapper        snd       tty26  tty5   ttyS14     udmabuf      vcsu6
fb0              mcelog        sr0       tty27  tty50  ttyS15     uhid         vfio
fd               mem           sr1       tty28  tty51  ttyS16     uinput       vga_arbiter
fd0              midi          stderr    tty29  tty52  ttyS17     urandom      vhci
full             mqueue        stdin     tty3   tty53  ttyS18     userfaultfd  vhost-net
fuse             net           stdout    tty30  tty54  ttyS19     userio       vhost-vsock
hidraw0          null          tty       tty31  tty55  ttyS2      vcs          vmci
hpet             nvram         tty0      tty32  tty56  ttyS20     vcs1         vsock
hugepages        port          tty1      tty33  tty57  ttyS21     vcs2         zero
hwrng            ppp           tty10     tty34  tty58  ttyS22     vcs3         zfs
x@x:~/Desktop$ 

两次 ls /dev 显示的设备数量不同


  • --private-etc, --private-etc=file,directory,@group

–private-etc=file,directory
在临时文件系统中构建一个新的/etc目录,并复制列表中的文件和目录。列表中的文件和目录必须表示为相对于/etc目录的相对路径(例如,/etc/foo应表示为foo)。如果未找到列表中的任何文件,/etc目录将为空。当沙箱关闭时,所有修改都将被丢弃。允许使用多个private-etc命令,并且它们会累积。

示例:

firejail --private-etc=group,hostname,localtime,nsswitch.conf,passwd,resolv.conf

在这个示例中,我们将以下文件和目录复制到新的/etc目录中:

  • group
  • hostname
  • localtime
  • nsswitch.conf
  • passwd
  • resolv.conf

这将在沙箱环境中创建一个精简的/etc目录,仅包含这些必要的配置文件,以确保在受限环境中运行的应用程序能够正常工作。当不再需要沙箱环境时,所有在新/etc目录中的修改都会被自动清除。

测试

x@x:~$ ls -m /etc
acpi, adduser.conf, alsa, alternatives, anacrontab, apg.conf, apm, apparmor, apparmor.d, apport, appstream.conf, apt, avahi, bash.bashrc, bash_completion, bash_completion.d, bindresvport.blacklist,
binfmt.d, bluetooth, brlapi.key, brltty, brltty.conf, ca-certificates, ca-certificates.conf, ca-certificates.conf.dpkg-old, chatscripts, console-setup, cracklib, cron.d, cron.daily, cron.hourly,
cron.monthly, crontab, cron.weekly, cups, cupshelpers, dbus-1, dconf, debconf.conf, debian_version, default, deluser.conf, depmod.d, dhcp, dictionaries-common, dpkg, e2scrub.conf, emacs, environment,
environment.d, ethertypes, firefox, firejail, fonts, fprintd.conf, fstab, fuse.conf, fwupd, gai.conf, gdb, gdm3, geoclue, ghostscript, glvnd, gnome, groff, group, group-, grub.d, gshadow, gshadow-, gss,
gtk-2.0, gtk-3.0, hdparm.conf, host.conf, hostid, hostname, hosts, hosts.allow, hosts.deny, hp, ifplugd, init, init.d, initramfs-tools, inputrc, insserv.conf.d, ipp-usb, iproute2, issue, issue.net,
kernel, kernel-img.conf, kerneloops.conf, ldap, ld.so.cache, ld.so.conf, ld.so.conf.d, legal, libao.conf, libaudit.conf, libblockdev, libnl-3, libpaper.d, libreoffice, locale.alias, locale.gen,
localtime, logcheck, login.defs, logrotate.conf, logrotate.d, lsb-release, machine-id, magic, magic.mime, mailcap, mailcap.order, manpath.config, mime.types, mke2fs.conf, ModemManager, modprobe.d,
modules, modules-load.d, mtab, nanorc, netconfig, netplan, network, networkd-dispatcher, NetworkManager, networks, newt, nftables.conf, nsswitch.conf, openvpn, opt, os-release, PackageKit, pam.conf,
pam.d, papersize, passwd, passwd-, pcmcia, perl, pki, pm, pnm2ppa.conf, polkit-1, ppp, printcap, profile, profile.d, protocols, pulse, python3, python3.10, rc0.d, rc1.d, rc2.d, rc3.d, rc4.d, rc5.d,
rc6.d, rcS.d, resolv.conf, rmt, rpc, rsyslog.conf, rsyslog.d, rygel.conf, sane.d, security, selinux, sensors3.conf, sensors.d, services, sgml, shadow, shadow-, shells, skel, snmp, speech-dispatcher, ssh,
ssl, subgid, subgid-, subuid, subuid-, sudo.conf, sudoers, sudoers.d, sudo_logsrvd.conf, sysctl.conf, sysctl.d, systemd, terminfo, thermald, thunderbird, timezone, tmpfiles.d, ubuntu-advantage, ucf.conf,
udev, udisks2, ufw, update-manager, update-motd.d, update-notifier, UPower, usb_modeswitch.conf, usb_modeswitch.d, vim, vmware-tools, vtrgb, vulkan, wgetrc, wpa_supplicant, X11, xattr.conf, xdg, xml,
zsh_command_not_found

x@x:~$ firejail --private-etc=group,hostname,localtime,nsswitch.conf,passwd,resolv.conf
Reading profile /etc/firejail/default.profile
Reading profile /etc/firejail/disable-common.inc
Reading profile /etc/firejail/disable-programs.inc

** Note: you can use --noprofile to disable default.profile **

Parent pid 8573, child pid 8574
Private /etc installed in 6.53 ms
Private /usr/etc installed in 0.00 ms
Child process initialized in 46.09 ms




x@x:~$ ls -m /etc
group, hostname, localtime, nsswitch.conf, passwd, resolv.conf




x@x:~$ exit
exit

Parent is shutting down, bye...
x@x:~$ ls -m /etc
acpi, adduser.conf, alsa, alternatives, anacrontab, apg.conf, apm, apparmor, apparmor.d, apport, appstream.conf, apt, avahi, bash.bashrc, bash_completion, bash_completion.d, bindresvport.blacklist,
binfmt.d, bluetooth, brlapi.key, brltty, brltty.conf, ca-certificates, ca-certificates.conf, ca-certificates.conf.dpkg-old, chatscripts, console-setup, cracklib, cron.d, cron.daily, cron.hourly,
cron.monthly, crontab, cron.weekly, cups, cupshelpers, dbus-1, dconf, debconf.conf, debian_version, default, deluser.conf, depmod.d, dhcp, dictionaries-common, dpkg, e2scrub.conf, emacs, environment,
environment.d, ethertypes, firefox, firejail, fonts, fprintd.conf, fstab, fuse.conf, fwupd, gai.conf, gdb, gdm3, geoclue, ghostscript, glvnd, gnome, groff, group, group-, grub.d, gshadow, gshadow-, gss,
gtk-2.0, gtk-3.0, hdparm.conf, host.conf, hostid, hostname, hosts, hosts.allow, hosts.deny, hp, ifplugd, init, init.d, initramfs-tools, inputrc, insserv.conf.d, ipp-usb, iproute2, issue, issue.net,
kernel, kernel-img.conf, kerneloops.conf, ldap, ld.so.cache, ld.so.conf, ld.so.conf.d, legal, libao.conf, libaudit.conf, libblockdev, libnl-3, libpaper.d, libreoffice, locale.alias, locale.gen,
localtime, logcheck, login.defs, logrotate.conf, logrotate.d, lsb-release, machine-id, magic, magic.mime, mailcap, mailcap.order, manpath.config, mime.types, mke2fs.conf, ModemManager, modprobe.d,
modules, modules-load.d, mtab, nanorc, netconfig, netplan, network, networkd-dispatcher, NetworkManager, networks, newt, nftables.conf, nsswitch.conf, openvpn, opt, os-release, PackageKit, pam.conf,
pam.d, papersize, passwd, passwd-, pcmcia, perl, pki, pm, pnm2ppa.conf, polkit-1, ppp, printcap, profile, profile.d, protocols, pulse, python3, python3.10, rc0.d, rc1.d, rc2.d, rc3.d, rc4.d, rc5.d,
rc6.d, rcS.d, resolv.conf, rmt, rpc, rsyslog.conf, rsyslog.d, rygel.conf, sane.d, security, selinux, sensors3.conf, sensors.d, services, sgml, shadow, shadow-, shells, skel, snmp, speech-dispatcher, ssh,
ssl, subgid, subgid-, subuid, subuid-, sudo.conf, sudoers, sudoers.d, sudo_logsrvd.conf, sysctl.conf, sysctl.d, systemd, terminfo, thermald, thunderbird, timezone, tmpfiles.d, ubuntu-advantage, ucf.conf,
udev, udisks2, ufw, update-manager, update-motd.d, update-notifier, UPower, usb_modeswitch.conf, usb_modeswitch.d, vim, vmware-tools, vtrgb, vulkan, wgetrc, wpa_supplicant, X11, xattr.conf, xdg, xml,
zsh_command_not_found
x@x:~$ 

补充

/etc 是一个在类Unix操作系统(如Linux、BSD等)中的系统目录,它包含了系统的配置文件和目录。这些文件通常由系统管理员或应用程序进行修改,以配置各种系统服务、网络设置、用户账户、主机名、密码文件、日志文件、启动脚本等。

以下是一些常见的 /etc 目录下的文件和目录及其用途:

  • /etc/passwd:存储用户账户信息,包括用户名、用户ID(UID)、组ID(GID)和其他一些元数据。
  • /etc/group:存储组账户信息,包括组名、组ID(GID)和该组中的用户列表。
  • /etc/shadow(或 /etc/master.passwd 在某些BSD系统中):存储加密的用户密码和相关账户安全信息。
  • /etc/sudoers:配置sudo命令,定义哪些用户可以以其他用户(通常是root)的权限执行命令。
  • /etc/profile/etc/bashrc(或类似的shell配置文件):全局 shell 配置文件,用于设置环境变量、别名和shell选项。
  • /etc/resolv.conf:DNS名称解析配置文件,包含用于域名解析的DNS服务器地址。
  • /etc/hosts:静态主机名到IP地址的映射文件。
  • /etc/network/interfaces(或类似文件,如 /etc/sysconfig/network-scripts/ifcfg-eth0):网络接口配置文件。
  • /etc/apt/sources.list(在基于Debian和Ubuntu的系统中)或 /etc/yum.repos.d/(在基于Red Hat和CentOS的系统中):包管理器的软件仓库配置文件。
  • /etc/init.d//etc/systemd/system/:系统服务的启动脚本或单元文件。

/etc 目录中的文件通常需要超级用户(root)权限才能修改,因为它们对系统的运行至关重要。在使用 Firejail 等工具时,可以通过 --private-etc 选项来控制哪些配置文件被复制到沙箱环境中,以限制应用程序对系统配置的访问。

  • --private-home=file,directory

–private-home=file,directory
在临时文件系统中构建一个新的用户主目录,并将列表中的文件和目录复制到新的主目录中。列表中的文件和目录必须表示为相对于当前用户主目录的相对路径。当沙箱关闭时,所有修改都将被丢弃。

示例:
$ firejail --private-home=.mozilla firefox

在这个示例中,我们将当前用户主目录下的 .mozilla 文件夹及其内容复制到新的用户主目录中,并在该环境中运行 Firefox。这样做可以限制 Firefox 对用户主目录中其他文件和目录的访问,仅允许访问 .mozilla 文件夹中的数据。当不再需要沙箱环境时,所有在新用户主目录中的修改都会被自动清除。这种方式有助于提高隐私和安全性,特别是当在不完全信任的环境中运行应用程序时。

测试

 firejail --private-home=Music firefox 
 
 

此时打开firefox 就和刚下载打开一样,会出现欢迎界面,而且打开期间产生的所有文件都会在沙盒关闭时候消失。 并且 firefox 不仅仅能访问到Music 还会访问到另外一个 下载目录,但这个下载目录并不是系统的下载目录(因为里面这个下载目录是全空的,我创建沙盒之前下载目录里面存放了东西)

  • --private-opt=file,directory

–private-opt=file,directory
在临时文件系统中构建一个新的/opt目录,并将列表中的文件和目录复制到新的/opt目录中。列表中的文件和目录必须表示为相对于/opt目录的相对路径,并且不能包含/字符(例如,/opt/foo应表示为foo,但/opt/foo/bar – 表示为 foo/bar – 是不允许的)。如果未找到列表中的任何文件,/opt目录将为空。当沙箱关闭时,所有修改都将被丢弃。

示例:

firejail --private-opt=firefox /opt/firefox/firefox

在这个示例中,我们将/opt目录下的"firefox"文件夹及其内容复制到新的/opt目录中,并在该环境中运行/opt/firefox/firefox。这样做可以限制Firefox对/opt目录中其他文件和目录的访问,仅允许访问"firefox"文件夹中的数据。当不再需要沙箱环境时,所有在新/opt目录中的修改都会被自动清除。这种方式有助于提高隐私和安全性,特别是当在不完全信任的环境中运行应用程序时。

firejail --private-opt=firefox /opt/firefox/firefox 这个命令中,/opt/firefox/firefox 是指实际系统上的 /opt/firefox/firefox 文件或程序。而 --private-opt=firefox 选项则是在临时文件系统中创建一个新的 /opt 目录,并将实际系统上 /opt/firefox 目录下的内容复制到这个新的 /opt 目录中。

所以,/opt/firefox/firefox 在这个命令中的含义是运行实际系统上 /opt/firefox 目录下的 Firefox 程序,但是在 Firejail 创建的沙箱环境中,这个环境中的 /opt 目录是一个临时的、独立于实际系统的新目录,其中只包含了从实际系统 /opt/firefox 目录复制过来的文件和目录。

当关闭 Firejail 沙箱时,这个临时创建的 /opt 目录及其所有修改都将被丢弃。这样做的目的是为了限制 Firefox 在沙箱环境中只能访问指定的文件和目录,提高安全性并减少潜在的风险。

补充

/opt 文件夹是在类Unix操作系统(如Linux、BSD等)中一个预定义的目录,用于存放第三方或者可选的软件包和应用程序。这个目录的设计目的是为了提供一个标准的位置来安装那些并不属于操作系统核心组成部分的软件。

以下是一些关于 /opt 目录的要点:

  1. 第三方软件:/opt 主要用于安装非系统默认提供的软件或服务。这些软件通常是由第三方开发者或供应商提供的,可能包括商业软件、开源软件或其他非标准的软件包。

  2. 结构化布局:在 /opt 目录下,每个单独的软件或应用应该有自己的子目录。例如,如果安装了名为 “FooBar” 的软件,它可能会被安装到 /opt/FooBar 目录下。

  3. 独立管理:由于 /opt 中的软件是独立安装和管理的,它们的文件和配置通常不会与系统其他部分相互影响,这有助于保持系统的组织性和稳定性。

  4. 许可和所有权:/opt 中的软件包可以有不同的许可协议和所有者。管理员需要确保正确设置权限和所有权,以维护系统的安全性和完整性。

  5. 不影响升级:将软件安装在 /opt 目录下,通常不会影响操作系统的常规更新和升级过程,因为这些软件不在操作系统的核心组件范围内。

  6. 非必需:虽然 /opt 是一个推荐的标准位置,但并非所有第三方软件都会遵循这个约定。一些软件可能选择安装在其他位置,如 /usr/local 或用户的主目录下。

总的来说,/opt 文件夹是一个为第三方和可选软件提供统一安装位置的系统目录,旨在帮助管理员更好地组织和管理非系统核心的软件资源。

  • --private-srv=file,directory

–private-srv=file,directory
在临时文件系统中构建一个新的/srv目录,并将列表中的文件和目录复制到新的/srv目录中。列表中的文件和目录必须表示为相对于/srv目录的相对路径,并且不能包含/字符(例如,/srv/foo应表示为foo,但/srv/foo/bar – 表示为 srv/bar – 是不允许的)。如果未找到列表中的任何文件,/srv目录将为空。当沙箱关闭时,所有修改都将被丢弃。

示例:

firejail --private-srv=www /etc/init.d/apache2 start

在这个示例中,我们将/srv目录下的"www"文件夹及其内容复制到新的/srv目录中,并在该环境中启动Apache2服务。这样做可以限制Apache2服务对/srv目录中其他文件和目录的访问,仅允许访问"www"文件夹中的数据。当不再需要沙箱环境时,所有在新/srv目录中的修改都会被自动清除。这种方式有助于提高隐私和安全性,特别是当在不完全信任的环境中运行服务时。注意,这个命令需要以root权限运行,因为通常需要root权限来启动系统服务。

补充

/srv 目录是在类Unix操作系统(如Linux、BSD等)中一个预定义的目录,用于存放服务数据或为特定服务提供的文件。这个目录的设计目的是为了提供一个标准的位置来存储由系统运行的服务相关的数据。

以下是一些关于 /srv 目录的要点:

  1. 服务数据:/srv 主要用于存储服务的数据文件,这些文件可能包括网站内容、数据库文件、共享文件、打印队列等。

  2. 结构化布局:在 /srv 目录下,每个服务通常都有自己的子目录。例如,如果有一个名为 “www” 的网站服务,其数据可能会被存储在 /srv/www 目录下。

  3. 第三方服务:/srv 通常用于存储第三方或非系统默认提供的服务数据。对于系统默认提供的服务,数据文件可能存储在其他预定义的目录中,如 /var

  4. 许可和所有权:/srv 中的文件和目录可以有不同的许可协议和所有者。管理员需要确保正确设置权限和所有权,以维护系统的安全性和完整性。

  5. 不影响系统:将服务数据放在 /srv 目录下,有助于将服务数据与系统文件分开,这样在进行系统更新或维护时,可以减少对服务数据的影响。

  6. 可选使用:虽然 /srv 是一个推荐的标准位置,但并非所有服务都会遵循这个约定。一些服务可能选择将数据存储在其他位置,这取决于服务的配置和管理者的决策。

总的来说,/srv 文件夹是一个为系统运行的服务提供统一数据存储位置的系统目录,旨在帮助管理员更好地组织和管理服务相关的数据资源。

  • --private-tmp

–private-tmp
/tmp 目录上挂载一个空的临时文件系统,并将 X11 和 PulseAudio 套接字列入白名单。

示例:
$ firejail --private-tmp
$ ls -al /tmp
drwxrwxrwt 4 nobody nogroup 80 Apr 30 11:46 .
drwxr-xr-x 30 nobody nogroup 4096 Apr 26 22:18 …
drwx------ 2 nobody nogroup 4096 Apr 30 10:52 pulse-PKdhtXMmr18n
drwxrwxrwt 2 nobody nogroup 4096 Apr 30 10:52 .X11-unix

在这个示例中,使用 firejail --private-tmp 命令启动了一个新的沙箱环境。在这个环境中,/tmp 目录被替换为一个新的、空的临时文件系统。这样做可以确保在沙箱环境中运行的程序无法访问到主机系统 /tmp 目录中的其他临时文件和数据。

同时,--private-tmp 选项还自动将 X11 和 PulseAudio 套接字列入白名单。这意味着即使在新的临时 /tmp 文件系统中,沙箱环境中的程序仍然能够访问到这些必要的套接字,以支持图形界面和音频功能。

通过查看 ls -al /tmp 的输出,我们可以看到在新的临时 /tmp 目录中有两个特殊的子目录:

  • pulse-PKdhtXMmr18n: 这是一个 PulseAudio 套接字目录,用于音频处理。
  • .X11-unix: 这是一个 X11 套接字目录,用于图形界面显示。

这两个目录由于被白名单允许,所以在新的临时 /tmp 文件系统中仍然存在,以便支持相应的功能。当关闭 Firejail 沙箱时,这个临时创建的 /tmp 目录及其所有修改都将被丢弃。这种方式有助于提高安全性并减少潜在的风险,特别是在不完全信任的环境中运行应用程序。

  • --profile=filename_or_profilename

–profile=filename_or_profilename
从指定的文件名或配置文件名加载自定义的安全配置文件。对于文件名,可以使用绝对路径或相对于当前路径的相对路径。有关更多信息,请参阅以下的“安全配置文件”部分。

示例:
$ firejail --profile=myprofile

在这个示例中,使用 firejail --profile=myprofile 命令启动了一个新的沙箱环境,并加载了名为 “myprofile” 的自定义安全配置文件。这个配置文件可以包含一系列用于限制和控制沙箱环境中程序行为的规则和设置。

安全配置文件通常包含以下内容:

  • 文件系统访问限制:定义哪些文件和目录可以在沙箱环境中访问,以及哪些应该被屏蔽。
  • 网络访问限制:限制沙箱环境中程序的网络连接和端口访问。
  • 进程和资源限制:设置内存、CPU、文件描述符等资源的使用限制。
  • 环境变量和命令行参数:定义在沙箱环境中可用的环境变量和传递给程序的命令行参数。

通过创建和使用自定义的安全配置文件,管理员可以根据具体的应用场景和安全需求来定制 Firejail 沙箱环境的行为和限制。这有助于提高安全性并减少潜在的风险,特别是在不完全信任的环境中运行应用程序。请注意,配置文件应具有适当的权限和所有者,以确保系统的安全性和完整性。

创建位置确实会影响 Firejail 安全配置文件的属性和作用范围。

  1. 系统级配置文件(位于 /etc/firejail 目录下):

    • 属性:这些文件通常由系统管理员创建和维护,对所有用户都有效。
    • 作用范围:系统级配置文件定义的是全局默认的安全设置,适用于所有使用 Firejail 的用户和应用程序。
    • 权限:由于这些文件影响所有用户,通常需要 root 或者具有相应权限的用户来修改。
  2. 用户级配置文件(位于用户家目录下的 .firejail 目录中):

    • 属性:这些文件由个人用户创建和维护,只对该用户有效。
    • 作用范围:用户级配置文件定义的是针对特定用户的自定义安全设置,仅在该用户运行 Firejail 时生效。
    • 权限:用户级配置文件可以由该用户自由修改,无需额外的权限。

创建位置的不同主要影响了配置文件的应用范围和管理权限。系统级配置文件提供了一种集中管理和控制所有用户 Firejail 安全设置的方式,而用户级配置文件则允许用户根据自己的需求进行个性化的安全设置定制。在实际使用中,可以根据具体的需求和环境选择合适的配置文件创建位置和管理方式。

创建位置确实会影响 Firejail 安全配置文件的属性和作用范围。

  1. 系统级配置文件(位于 /etc/firejail 目录下):

    • 属性:这些文件通常由系统管理员创建和维护,对所有用户都有效。
    • 作用范围:系统级配置文件定义的是全局默认的安全设置,适用于所有使用 Firejail 的用户和应用程序。
    • 权限:由于这些文件影响所有用户,通常需要 root 或者具有相应权限的用户来修改。
  2. 用户级配置文件(位于用户家目录下的 .firejail 目录中):

    • 属性:这些文件由个人用户创建和维护,只对该用户有效。
    • 作用范围:用户级配置文件定义的是针对特定用户的自定义安全设置,仅在该用户运行 Firejail 时生效。
    • 权限:用户级配置文件可以由该用户自由修改,无需额外的权限。

创建位置的不同主要影响了配置文件的应用范围和管理权限。系统级配置文件提供了一种集中管理和控制所有用户 Firejail 安全设置的方式,而用户级配置文件则允许用户根据自己的需求进行个性化的安全设置定制。在实际使用中,可以根据具体的需求和环境选择合适的配置文件创建位置和管理方式。

  • --restrict-namespaces

–restrict-namespaces
安装一个 seccomp(Secure Computing)过滤器,该过滤器会阻止尝试创建新的 cgroup、ipc、net、mount、pid、time、user 或 uts 命名空间。

示例:
$ firejail --restrict-namespaces

在这个示例中,使用 firejail --restrict-namespaces 命令启动了一个新的沙箱环境,并启用了命名空间限制。这个选项可以帮助增强沙箱的安全性,防止在沙箱环境中运行的程序创建新的命名空间,从而限制它们的隔离能力和潜在的逃逸攻击途径。

seccomp 是 Linux 内核提供的一种安全机制,允许用户空间程序定义一组允许的系统调用,从而限制程序的行为和可能的攻击面。通过启用 --restrict-namespaces 选项,Firejail 使用 seccomp 过滤器来阻止程序创建新的命名空间,进一步加强了沙箱的隔离效果。

请注意,启用此选项可能会对某些需要创建新命名空间的合法应用程序产生影响。因此,在实际使用中,应根据具体的应用场景和安全需求来决定是否启用此选项。

  • --restrict-namespaces=cgroup,ipc,net,mnt,pid,time,user,uts

–restrict-namespaces=cgroup,ipc,net,mnt,pid,time,user,uts
安装一个 seccomp 过滤器,该过滤器会阻止尝试创建指定的命名空间中的任何一个。过滤器会检查 cloneunsharesetns 系统调用的参数,如果有必要,会向进程返回错误 EPERM(或者按照以下 --seccomp-error-action 选项设置杀死进程或记录尝试)。

请注意,这个过滤器无法检查 clone3 系统调用的参数,并且总是对这些调用返回错误 ENOSYS。

示例:
$ firejail --restrict-namespaces=user,net

在这个示例中,使用 firejail --restrict-namespaces=user,net 命令启动了一个新的沙箱环境,并启用了用户和网络命名空间的限制。这意味着在沙箱环境中运行的程序将无法创建新的用户或网络命名空间,从而增强了沙箱的安全性和隔离效果。

通过指定要限制的命名空间类型,你可以根据具体的应用场景和安全需求来定制 Firejail 的命名空间限制策略。这有助于防止潜在的逃逸攻击和恶意行为,同时确保合法应用程序能够在受控的环境中运行。

firejail --restrict-namespacesfirejail --restrict-namespaces=user,net 的区别在于命名空间限制的范围和严格程度。

  1. firejail --restrict-namespaces

    • 这个选项会安装一个 seccomp 过滤器,阻止尝试创建以下所有类型的命名空间:
      • cgroup
      • ipc
      • net
      • mnt(mount)
      • pid
      • time
      • user
      • uts

    使用这个选项意味着对所有列出的命名空间类型都实施了严格的限制。

  2. firejail --restrict-namespaces=user,net

    • 这个选项同样会安装一个 seccomp 过滤器,但只阻止尝试创建特定类型的命名空间:
      • user
      • net

    使用这个选项时,只有用户和网络命名空间受到了限制,而其他类型的命名空间(如 cgroup、ipc、mnt、pid、time 和 uts)则不受此选项的影响。

总结来说,firejail --restrict-namespaces 是一个更严格的命名空间限制选项,适用于需要最大程度隔离和安全性的场景。而 firejail --restrict-namespaces=user,net 则是一个更加定制化的选项,仅限制特定类型的命名空间,可能更适合那些只需要限制特定功能的场景。在实际使用中,应根据具体的应用需求和安全策略来选择合适的命名空间限制选项。

  • --timeout=hh:mm:ss

--timeout=HH:MM:SS--timeout=time 选项用于在指定的时间过后自动杀死(终止)沙箱。时间以小时/分钟/秒的格式指定。

示例:
$ firejail --timeout=01:30:00 firefox

在这个示例中,使用 firejail --timeout=01:30:00 firefox 命令启动了一个新的沙箱环境,并设置了自动终止的时间为1小时30分钟。这意味着 Firefox 在沙箱环境中运行的最大时间为1小时30分钟,超过这个时间后,Firejail 将自动结束 Firefox 和整个沙箱环境。

通过设置超时时间,你可以控制应用程序在沙箱环境中运行的最长时间,这有助于防止资源滥用、潜在的安全风险以及不必要的系统负载。在实际使用中,应根据具体的应用需求和安全策略来设置合适的超时时间。请注意,如果应用程序在超时之前已经正常退出,那么 Firejail 沙箱也会相应地结束。

  • --veth-name=name

--veth-name=name 选项用于在使用 --net=bridge_interface 命令时,为连接到网桥的接口指定一个自定义名称,而不是使用默认名称。

示例:
$ firejail --net=br0 --veth-name=if0

在这个示例中,使用 firejail --net=br0 --veth-name=if0 命令启动了一个新的沙箱环境,并将沙箱网络接口连接到名为 “br0” 的网桥。同时,使用 --veth-name=if0 选项将这个接口命名为 “if0”,而不是使用默认的接口名称。

通过指定自定义的接口名称,你可以更清晰地识别和管理沙箱环境中的网络接口,特别是在同时运行多个沙箱或需要特定网络配置的情况下。在实际使用中,应确保所选的接口名称不会与系统中已存在的接口名称冲突。

进程资源限制:

  • --cpu=cpu-number,cpu-number,cpu-number

  • --cpu.print=name|pid

    --cpu=cpu-number,cpu-number,cpu-number 选项用于设置 CPU 关联(CPU affinity)。这允许你指定沙箱环境中运行的程序可以使用哪些 CPU 核心。

    示例:
    $ firejail --cpu=0,1 handbrake

    在这个示例中,使用 firejail --cpu=0,1 handbrake 命令启动了一个新的沙箱环境,并将 Handbrake 程序限制在 CPU 核心 0 和 1 上运行。这意味着 Handbrake 只能使用这两个核心,而不能使用系统中的其他核心。

    --cpu.print=name|pid 选项用于打印由名称或 PID 标识的沙箱正在使用的 CPU 核心。


    x@x:~$ 
    x@x:~$ firejail --list
    15584:x:myfirefox:firejail --cpu=0,1 --name=myfirefox firefox 
    x@x:~$ firejail --cpu.print=myfirefox
    Switching to pid 15587, the first child process inside the sandbox
      Cpus_allowed_list:	0-1
    x@x:~$ 
    

    示例:
    $ firejail --name=mygame --caps.drop=all warzone2100 &
    $ firejail --cpu.print=mygame

    在这个示例中,首先使用 firejail --name=mygame --caps.drop=all warzone2100 & 命令启动了一个名为 “mygame” 的沙箱环境,并在后台运行 Warzone 2100 游戏。然后,使用 firejail --cpu.print=mygame 命令打印出这个沙箱正在使用的 CPU 核心。


    另一个示例:
    $ firejail --list
    3272:netblue::firejail --private firefox
    $ firejail --cpu.print=3272

    在这个示例中,首先使用 firejail --list 命令列出当前运行的所有沙箱及其相关信息。然后,根据列出的沙箱信息,使用 firejail --cpu.print=3272 命令打印出 PID 为 3272 的沙箱正在使用的 CPU 核心。

    3272:netblue::firejail --private firefox 是一个示例,表示系统中正在运行的一个 Firejail 沙箱实例。这个信息可以通过 firejail --list 命令获取。

    在这个示例中:

    • 3272 是沙箱的进程 ID(PID)。
    • netblue 是为这个沙箱分配的名称,可以通过 --name 选项在启动 Firejail 时指定。
    • ::firejail --private firefox 表示用于启动这个沙箱的命令行参数。在这个例子中,使用了 firejail --private firefox 命令来启动 Firefox,并将其限制在一个私有的文件系统环境中。

    通过这个信息,你可以对特定的 Firejail 沙箱进行管理操作,例如查询其 CPU 使用情况、网络活动、资源限制等。例如,如果你想查看这个 Firefox 沙箱正在使用的 CPU 核心,可以使用以下命令:

    firejail --cpu.print=3272
    

    这将打印出 PID 为 3272 的沙箱(即运行 Firefox 的沙箱)正在使用的 CPU 核心。请注意,实际的输出可能会因系统的具体配置和沙箱的当前状态而有所不同。

  • --memory-deny-write-execute

--memory-deny-write-execute 选项是用来增强安全性的,它通过安装一个 seccomp 过滤器来阻止进程创建既可写又可执行的内存映射。这是为了防止恶意代码修改可执行代码,这是一种常见的攻击技巧,如代码注入。

当启用这个选项时,seccomp 过滤器会检查某些系统调用(如 mmap、mmap2、mprotect、pkey_mprotect、memfd_create 和 shmat)的参数。如果这些系统调用中的任何一项试图创建或修改既可写又可执行的内存映射,过滤器将会介入并返回 EPERM 错误给进程。

根据配置,过滤器也可以选择杀死进程或记录尝试(由 --seccomp-error-action 选项指定)。

值得注意的是,shmat 系统调用在某些平台(包括 i386)上并未实现为系统调用,因此在这些平台上无法由 seccomp-bpf 处理。尽管如此,该选项所覆盖的其他系统调用对于安全性来说仍然非常重要。

  • --nice=value

--nice=value 选项用于设置沙箱中所有运行进程的优先级(nice值)。只有root用户可以指定负值。

nice值是一个介于-20到19之间的整数,用于表示进程的优先级。较小的nice值表示较高的优先级,较大的nice值表示较低的优先级。默认情况下,新进程的nice值为0。

使用 --nice=value 选项,你可以调整在沙箱中运行的进程的优先级。例如,如果你希望Firefox在较低的优先级下运行,以便它不会影响其他更重要的进程,你可以使用以下命令:

$ firejail --nice=2 firefox

在这个例子中,--nice=2 将Firefox的优先级降低到第2个级别,使其在系统中的优先级低于默认值。这样,如果系统资源紧张,Firefox可能会被操作系统更频繁地暂停,以确保其他更高优先级的进程能够获得足够的资源。只有root用户可以指定负值。

  • --oom=value

--oom=value 选项用于配置该沙箱中内核的 OutOfMemory(OOM)杀手评分。对于普通用户,可接受的评分值在0到1000之间;对于root用户,可接受的评分值在-1000到1000之间。

OOM杀手是Linux内核的一个功能,当系统内存极度紧张时,它会选择杀死一些进程以释放内存。每个进程都有一个OOM评分,评分越高,被OOM杀手选中的可能性就越大。

通过使用 --oom=value 选项,你可以为沙箱中的进程设置特定的OOM评分。例如:

$ firejail --oom=300 firefox

在这个例子中,Firefox在沙箱中的OOM评分为300。这意味着在系统内存不足的情况下,Firefox相对于其他评分更低的进程更有可能被OOM杀手选中并终止。

要了解更多关于OOM内核特性的信息,可以查阅 man choom 手册页。

  • --rlimit-as=number

  • --rlimit-cpu=number

  • --rlimit-fsize=number

  • --rlimit-nofile=number

  • --rlimit-nproc=number

  • --rlimit-sigpending=number

这些选项都是用来设置沙箱中进程的资源限制的:

  • --rlimit-as=number:设置进程虚拟内存(地址空间)的最大大小,单位可以是字节(bytes),也可以使用 k(kilobyte,1024 字节)、m(megabyte,1024^2 字节)或 g(gigabyte,1024^3 字节)作为大小后缀。

  • --rlimit-cpu=number:设置每个沙箱化进程可以消耗的最大 CPU 时间限制,以秒为单位。当达到这个限制时,进程会被杀死。CPU 时间限制是基于 CPU 使用的秒数,而不是实际经过的时间。Linux 内核会为每个进程独立跟踪 CPU 秒数。

  • --rlimit-fsize=number:设置进程可以创建的最大文件大小,单位可以是字节(bytes),也可以使用 k(kilobyte,1024 字节)、m(megabyte,1024^2 字节)或 g(gigabyte,1024^3 字节)作为大小后缀。

  • --rlimit-nofile=number:设置进程可以打开的最大文件数量。

  • --rlimit-nproc=number:设置可以为调用进程的真实用户 ID 创建的最大进程数量。

  • --rlimit-sigpending=number:设置一个进程中可以挂起的最大信号数量。

通过使用这些选项,你可以对沙箱中的进程进行细致的资源管理,限制它们的内存使用、CPU 时间、文件大小、文件打开数量、进程创建数量以及挂起的信号数量等,从而更好地控制系统的资源分配和安全性。

文件系统与权限控制:

  • --blacklist=dirname_or_filename:添加黑名单目录或文件。
  1. 禁止访问/sbin和/usr/sbin目录:

    code
    $ firejail --blacklist=/sbin --blacklist=/usr/sbin
    

    在这个例子中,--blacklist 选项用于指定要禁止访问的目录。/sbin/usr/sbin 是两个常见的系统目录,其中包含了许多系统级别的命令和工具。通过将这两个目录添加到黑名单中,沙箱中的进程将无法访问这些目录下的文件和程序。

  2. 禁止访问用户家目录下的.mozilla目录及其所有内容:

    code
    $ firejail --blacklist=~/.mozilla
    

    在这个例子中,~ 符号代表当前用户的家目录。.mozilla 是一个隐藏目录,通常用于存储 Mozilla Firefox 浏览器的相关数据和配置文件。通过将 ~/.mozilla 添加到黑名单中,沙箱中的进程将无法访问这个目录及其所有子目录和文件。

总的来说,--blacklist 选项允许你指定一些路径,这些路径下的文件或目录将被限制访问。这可以用来增强系统的安全性和隔离性,防止沙箱中的进程访问或者修改不应该访问或修改的系统资源。在第一点和第二点的例子中,我们分别展示了如何禁止访问特定的系统目录和用户家目录下的特定隐藏目录。

  1. 使用引号包含包含空格的路径来禁止访问特定的虚拟机目录:

    code
    $ firejail "--blacklist=/home/username/My Virtual Machines"
    

    在这个例子中,由于路径名 /home/username/My Virtual Machines 中包含了空格,直接在命令行中使用可能会导致解析错误。通过在路径两边加上引号 "...",我们可以告诉 shell 这是一个完整的路径字符串,应该被作为一个整体处理,而不是分开的多个参数。

  2. 使用反斜杠 \ 转义空格来禁止访问特定的虚拟机目录:

    code
    $ firejail --blacklist=/home/username/My\ Virtual\ Machines
    

    在这个例子中,我们使用了反斜杠 \ 来转义路径中的空格。在 Unix 和 Linux 系统中,\ 是一个转义字符,它后面的字符将被特殊处理。在这里,\ 表示一个实际的空格字符,而不是表示参数分隔符。通过这种方式,我们也可以正确地指定包含空格的路径,并将其添加到黑名单中。

所以,第三点和第四点都是关于如何在路径名中包含空格的情况下,正确地使用 --blacklist 选项来禁止访问特定的文件或目录。

  • --chroot=dirname:更改沙箱的根目录。

--chroot 选项用于将沙箱 chroot 到一个指定的根文件系统。与常规的文件系统容器不同,使用 --chroot 选项时,系统目录将以读写模式挂载。

如果沙箱以普通用户身份启动,新的特权(nonew-privs)和默认的能力(capabilities)过滤器将被启用,这可以进一步增强系统的安全性和隔离性。

以下是一个使用 --chroot 选项的例子:

$ firejail --chroot=/media/ubuntu warzone2100

在这个例子中,我们使用 --chroot 选项将沙箱 chroot 到 /media/ubuntu 目录下,并运行 warzone2100 程序。这意味着 warzone2100 程序及其所有子进程只能访问 /media/ubuntu 目录及其子目录下的文件和资源,而不能访问主机系统的其他部分。

如果你想自动挂载 X11 和 PulseAudio 套接字,你可以设置环境变量 FIREJAIL_CHROOT_X11FIREJAIL_CHROOT_PULSE

需要注意的是,对这个命令的支持是由 firejail.config 文件中的 chroot 选项控制的。如果你在 firejail.config 文件中禁用了 chroot 选项,那么 --chroot 选项将无法使用。

  • --ignore=command:忽略指定的命令。

--ignore 选项用于在配置文件中忽略特定的命令或设置。这允许你在不修改配置文件的情况下,临时覆盖某些安全限制或设置。

以下是一些使用 --ignore 选项的例子:

  1. 忽略配置文件中的 seccomp 和 caps 设置,然后运行 Firefox:

    $ firejail --ignore=seccomp --ignore=caps firefox
    

    在这个例子中,--ignore=seccomp--ignore=caps 告诉 Firejail 忽略配置文件中关于 seccomp(系统调用过滤)和 capabilities(能力)的设置。这样,Firefox 将不会受到这些设置的限制。

  2. 忽略配置文件中与网络接口 eth0 相关的设置,然后运行 Firefox:

    $ firejail --ignore="net eth0" firefox
    

    在这个例子中,--ignore="net eth0" 告诉 Firejail 忽略配置文件中与网络接口 eth0 相关的所有设置。这样,Firefox 将可以自由地访问和使用 eth0 网络接口。

通过使用 --ignore 选项,你可以根据需要灵活地调整 Firejail 的安全策略,以便更好地适应你的具体需求和环境。但是请注意,过度使用 --ignore 选项可能会削弱系统的安全性和隔离性,因此在使用时应谨慎考虑。

  • --mkdir=dirname:在沙箱中创建目录。

--mkdir 选项用于在用户主目录下创建一个目录。如果需要,该选项还会自动创建父目录。

以下是一个使用 --mkdir 选项的例子:

$ firejail --mkdir=~/work/project

在这个例子中,--mkdir=~/work/project 告诉 Firejail 在用户主目录下的 work 目录中创建一个名为 project 的新目录。如果 work 目录尚不存在,Firejail 会先自动创建它。

这个选项通常与其他 Firejail 功能一起使用,例如 --chroot--private,以在沙箱环境中为应用程序提供一个安全、隔离的工作空间。通过使用 --mkdir 选项,你可以确保所需的目录结构已经存在,而无需手动创建它们。

  • --mkfile=filename:在沙箱中创建空文件。

--mkfile 选项用于在用户主目录下创建一个空文件。如果需要,该选项还会自动创建父目录。

以下是一个使用 --mkfile 选项的例子:

$ firejail --mkfile=~/work/project/readme

在这个例子中,--mkfile=~/work/project/readme 告诉 Firejail 在用户主目录下的 work/project 目录中创建一个名为 readme 的空文件。如果 workproject 目录尚不存在,Firejail 会先自动创建它们。

这个选项通常与其他 Firejail 功能一起使用,例如 --chroot--private,以在沙箱环境中为应用程序提供一个安全、隔离的工作空间,并确保所需的文件已经存在。通过使用 --mkfile 选项,你可以快速创建一个空文件,而无需手动打开文本编辑器或使用其他命令行工具。

  • --no3d:禁用 3D 硬件加速。
  1. --no3d:禁用 3D 硬件加速。

    示例:

    code
    $ firejail --no3d firefox
    

    在这个例子中,--no3d 选项告诉 Firejail 在运行 Firefox 时禁用 3D 硬件加速。这可能会降低图形性能,但有助于提高安全性或解决与硬件加速相关的兼容性问题。

  • --nodvd:禁用 DVD 设备。

--nodvd 选项用于禁用 DVD 和音频 CD 设备。

示例:

code
$ firejail --nodvd

在这个例子中,--nodvd 选项告诉 Firejail 在创建沙箱环境时不要挂载或允许访问任何与 DVD 或音频 CD 相关的设备。这有助于增强系统的安全性和隔离性,防止沙箱中的应用程序读取或写入这些设备上的数据。

通过使用 --nodvd 选项,你可以限制沙箱中的应用程序只能访问必要的文件和资源,从而降低潜在的安全风险和数据泄漏的可能性。请注意,这个选项可能会影响那些需要访问 DVD 或音频 CD 的应用程序的功能。在实际使用时,请根据你的具体需求和安全策略来决定是否启用这个选项。

  • --noexec=dirname_or_filename:禁止在指定目录或文件中执行文件。

--noexec=dirname_or_filename 选项用于将指定的目录或文件重新挂载为 “noexec”、“nodev” 和 “nosuid”。这些标志分别表示:

  • noexec:禁止在该文件系统上执行任何程序。
  • nodev:禁止访问任何设备文件。
  • nosuid:禁用 set-user-ID 和 set-group-ID 位的效果。

这个选项支持文件 globbing(通配符匹配),具体详情可以参考 FILE GLOBBING 部分。

示例:

$ firejail --noexec=/tmp

在这个例子中,--noexec=/tmp 选项告诉 Firejail 在创建沙箱环境时将 /tmp 目录重新挂载为 “noexec”、“nodev” 和 “nosuid”。这有助于增强系统的安全性和隔离性,防止沙箱中的应用程序在 /tmp 目录下执行程序、访问设备文件或利用 set-user-ID 和 set-group-ID 位。

默认情况下,如果沙箱以普通用户身份启动,/etc/var 目录会被设置为 “noexec”。通过使用 --noexec=dirname_or_filename 选项,你可以根据需要扩展这个限制,将其他目录或文件也设置为 “noexec”、“nodev” 和 “nosuid”。这可以帮助你更好地控制沙箱中的应用程序可以访问和执行的资源,从而提高系统的安全性。

  • --nogroups:禁用额外的用户组。

--nogroups 选项用于禁用补充组(supplementary groups)。如果不使用这个选项,启动沙箱的用户所属的补充组将会被启用。对于 root 用户,补充组总是被禁用的。

注意:默认情况下,所有常规用户组(除了当前用户所属的组)都会被删除。你可以使用 --allusers 命令选项来改变这个行为。

示例:

$ id
uid=1000(netblue) gid=1000(netblue) groups=1000(netblue),24(cdrom),25(floppy),27(sudo),29(audio)
$ firejail --nogroups
Parent pid 8704, child pid 8705
Child process initialized
$ id
uid=1000(netblue) gid=1000(netblue) groups=1000(netblue)
$

在这个例子中,首先使用 id 命令查看用户 netblue 所属的组,包括其主组(gid=1000)和其他几个补充组(如 cdrom、floppy、sudo 和 audio)。然后使用 firejail --nogroups 启动一个沙箱环境,并再次使用 id 命令查看用户所属的组。此时,只有主组(gid=1000)被保留,其他补充组都被移除。

通过使用 --nogroups 选项,你可以进一步限制沙箱中的应用程序可以访问的资源和权限,从而提高系统的安全性和隔离性。这可以帮助防止恶意程序或意外操作利用用户的补充组权限进行未经授权的操作。

在Linux和类Unix操作系统中,每个用户都有一个主用户组(primary group),同时还可以属于一个或多个补充组(supplementary groups)。这些补充组允许用户拥有额外的权限或者访问特定的系统资源。

当一个用户登录并执行命令时,该用户不仅具有其主用户组的权限,还具有其所属所有补充组的权限。这些权限可能包括访问特定的文件、目录或其他系统资源。

补充组的主要目的是提供一种灵活的方式来管理用户权限和资源访问。例如,可以为一组用户创建一个补充组,然后将某个特定的文件或目录的权限设置为只允许该补充组的成员访问。这样,无需为每个用户单独设置权限,只需要将他们添加到相应的补充组即可。

在运行进程时,也可以通过设置进程的有效用户ID(eUID)和有效组ID(eGID),以及补充组列表,来控制进程所能访问的资源和拥有的权限。这对于限制应用程序的权限和增强系统的安全性非常有用。

  • --nonewprivs:禁止获取新的特权。

NO_NEW_PRIVS 是一个由 prctl() 系统调用设置的标志。当设置了这个标志后,确保子进程无法通过 execve(2) 系统调用获取新的特权。具体来说,这意味着即使执行一个具有 setuid(或文件能力)的二进制文件,也不会导致权限提升。

如果启用了 seccomp(secure computing)过滤器,默认情况下也会启用 NO_NEW_PRIVS 标志。Seccomp 是一种内核安全机制,用于限制进程可以使用的系统调用,以增强系统的安全性。

通过启用 NO_NEW_PRIVS 标志,可以进一步限制沙箱中的应用程序能够获取的权限和执行的操作,从而降低潜在的安全风险和攻击面。这对于运行不受信任的代码、隔离敏感操作或者实现多租户环境等场景非常有用。

execve() 系统调用通常用于在当前进程中加载并执行一个新的程序。在某些情况下,这个新的程序可能会获取到比当前进程更高的特权,这主要通过以下两种机制:

  1. Setuid(Set user ID)和 Setgid(Set group ID)位:
    当一个可执行文件的权限设置中包含了 setuid 或 setgid 位时,当该文件被 execve() 执行时,进程的有效用户ID(eUID)或有效组ID(eGID)会被临时更改为文件的所有者或组ID。这样,即使执行该程序的用户没有足够的权限,也能暂时获得文件所有者的权限来执行特定的操作。

    例如,许多系统管理工具如 passwdsudo 等都设置了 setuid 位,使得普通用户能够以 root 权限更改密码或执行一些需要更高权限的任务。

  2. 文件能力(File capabilities):
    文件能力是 Linux 内核提供的一种更细粒度的权限控制机制。它允许为可执行文件分配特定的能力(capabilities),这些能力独立于文件的所有者和组,并且可以在执行时被进程继承。

    当一个具有特定能力的可执行文件被 execve() 执行时,进程会继承这些能力,从而能够执行通常需要超级用户权限才能进行的操作,如修改系统时间、操作 raw 套接字等。

然而,当 NO_NEW_PRIVS 标志被设置后,无论是通过 setuid/setgid 还是文件能力,execve() 都无法导致权限提升。这意味着即使执行了具有特殊权限的二进制文件,进程的权限也不会增加,从而增强了系统的安全性。

  • --noprinters:禁用打印机设备。

--noprinters 选项用于禁用打印机功能。当在 Firejail 或类似的沙箱环境中使用这个选项时,它会阻止沙箱内的应用程序访问和使用系统的打印机资源。

禁用打印机功能的主要目的是增强系统的安全性和隐私保护。通过禁止沙箱中的应用程序访问打印机,可以防止潜在的恶意软件或未经授权的用户打印敏感信息,或者进行其他与打印机相关的未授权操作。

例如,如果你在一个受限的环境中运行一个不受信任的应用程序,并且不希望该应用程序能够访问你的打印机,你可以使用 --noprinters 选项来确保这一点:

$ firejail -- noprinters <your_application>

在这个命令中,<your_application> 表示你要在沙箱环境中运行的程序。通过添加 --noprinters 选项,你将限制该程序访问和使用打印机资源。

  • --nosound:禁用声音设备。

--nosound 选项用于禁用声音系统。当在 Firejail 或类似的沙箱环境中使用这个选项时,它会阻止沙箱内的应用程序访问和使用系统的音频资源。

禁用声音系统的主要目的是增强系统的安全性和隐私保护。通过禁止沙箱中的应用程序访问音频设备,可以防止潜在的恶意软件或未经授权的用户录制、播放或修改音频数据,或者进行其他与音频相关的未授权操作。

例如,如果你在一个受限的环境中运行一个不受信任的应用程序,并且不希望该应用程序能够访问你的音频设备,你可以使用 --nosound 选项来确保这一点:

$ firejail --nosound <your_application>

在这个命令中,<your_application> 表示你要在沙箱环境中运行的程序。通过添加 --nosound 选项,你将限制该程序访问和使用音频资源,从而无法播放声音或录制音频。这有助于保护你的隐私和系统的安全性。

  • --notv:禁用 DVB TV 设备。

以下是这些选项的解释:

  1. --notv:禁用 DVB(Digital Video Broadcasting)电视设备。

    示例:

    $ firejail --notv vlc
    

    在这个例子中,--notv 选项告诉 Firejail 在运行 VLC 媒体播放器时禁用对 DVB 电视设备的访问。这有助于防止沙箱中的应用程序访问或控制电视设备,从而增强系统的安全性和隐私保护。

  2. --nou2f:禁用 U2F(Universal 2nd Factor)设备。

    示例:

    $ firejail --nou2f
    

    在这个例子中,--nou2f 选项告诉 Firejail 禁用对 U2F 设备的访问。U2F 是一种用于提供双因素身份验证的安全标准。通过禁用 U2F 设备,可以防止沙箱中的应用程序使用这些设备进行未经授权的身份验证或数据交换,从而增强系统的安全性。

  3. --novideo:禁用视频设备。

    示例:

    $ firejail --novideo <your_application>
    

    在这个命令中,<your_application> 表示你要在沙箱环境中运行的程序。通过添加 --novideo 选项,你将限制该程序访问和使用视频设备,如摄像头等。这有助于保护用户的隐私和系统的安全性,防止潜在的恶意软件或未经授权的用户访问和录制视频数据。

  • --nowhitelist=dirname_or_filename:从白名单中删除指定目录或文件。

--nowhitelist=dirname_or_filename 选项实际上是用于禁用指定目录或文件的白名单限制。

使用 --nowhitelist=dirname_or_filename,你可以临时取消对某个资源的白名单保护,使得沙箱环境中的应用程序无法访问原本被白名单允许的特定目录或文件。这在某些情况下可能很有用,例如当你需要临时限制对某个敏感资源的访问以进行安全检查或调试时。

示例:

$ firejail --nowhitelist=/path/to/directory-or-file <your_application>

在这个命令中,/path/to/directory-or-file 是你想要取消白名单限制的目录或文件路径,<your_application> 表示你要在沙箱环境中运行的程序。通过添加 --nowhitelist=/path/to/directory-or-file 选项,你将临时禁止该程序访问原本被白名单允许的指定资源。请注意,这可能会改变系统的安全性和隔离性设置,因此在使用时应谨慎考虑。

  • --read-only=dirname_or_filename:将指定的目录或文件设为只读。

--read-only=dirname_or_filename 选项用于将指定的目录或文件设置为只读。这个选项支持文件 globbing(通配符匹配),具体详情可以参考 FILE GLOBBING 部分。

使用 --read-only=dirname_or_filename,你可以限制沙箱环境中的应用程序对指定目录或文件的写入权限,确保这些资源不会被修改或删除。

示例:

$ firejail --read-only=~/.mozilla firefox

在这个命令中,~/.mozilla 是你想要设置为只读的目录路径,firefox 是你要在沙箱环境中运行的程序。通过添加 --read-only=~/.mozilla 选项,你将禁止 Firefox 或其子进程修改 ~/.mozilla 目录下的任何文件。这有助于保护用户的配置文件和数据不被意外更改或恶意篡改,同时保持系统的安全性和稳定性。请注意,这可能会限制某些应用程序的功能,如果它们需要写入这些只读资源的话。

  • --read-write=dirname_or_filename:将指定的目录或文件设为可读写。

--read-write=dirname_or_filename 选项用于将指定的目录或文件设置为可读写。这个选项只允许对当前用户所属的文件或目录进行操作,并支持文件 globbing(通配符匹配),具体详情可以参考 FILE GLOBBING 部分。

使用 --read-write=dirname_or_filename,你可以解除对指定目录或文件的只读限制,使得沙箱环境中的应用程序能够读取和修改这些资源。

示例:

$ mkdir ~/test
$ touch ~/test/a
$ firejail --read-only=~/test --read-write=~/test/a <your_application>

在这个命令中,首先创建了一个名为 test 的目录并在其中创建了一个名为 a 的文件。然后使用 firejail 命令启动一个沙箱环境,其中 --read-only=~/test 选项将 test 目录设置为只读,而 --read-write=~/test/a 选项则取消了对 a 文件的只读限制,使得在沙箱环境中运行的 <your_application> 程序能够读取和修改该文件。请注意,这可能会改变系统的安全性和隔离性设置,因此在使用时应谨慎考虑。

  • --whitelist=dirname_or_filename:添加白名单目录或文件。

--whitelist=dirname_or_filename 选项用于将指定的目录或文件添加到白名单中。当使用这个选项时,Firejail 会在一个临时文件系统上挂载顶层目录,并将白名单中的文件在内部进行挂载绑定。对白名单中的文件所做的修改是持久化的,而其他所有内容在沙箱关闭时都会被丢弃。

顶层目录可以是 /(除 /proc/sys 外的所有目录)、/sys/module/run/user/$UID$HOME 以及 /usr 中的所有目录。

对于符号链接的处理:如果将一个符号链接路径添加到白名单中,那么它指向的实际路径也会被添加到白名单中。例如,如果 ~/foo 被添加到白名单中,并且它指向 ~/bar,那么 ~/bar 也将被添加到白名单中。但是需要注意的是,除了用户主目录外,符号链接和实际文件都应位于同一顶层目录中。对于用户主目录中的符号链接,符号链接和实际文件都应由该用户拥有。

该选项支持文件 globbing(通配符匹配),具体详情可以参考 FILE GLOBBING 部分。

以下是一些使用 --whitelist 选项的例子:

  1. 只允许访问用户主目录下的 .mozilla 目录及其所有内容:
$ firejail --noprofile --whitelist=~/.mozilla
  1. 允许访问 /tmp/.X11-unix 目录和 /dev/null 文件:
$ firejail --whitelist=/tmp/.X11-unix --whitelist=/dev/null
  1. 使用引号包含包含空格的路径来允许访问特定的虚拟机目录:
$ firejail "--whitelist=/home/username/My Virtual Machines"
  1. 使用通配符匹配多个目录和文件:
$ firejail --whitelist=~/work* --whitelist=/var/backups*

通过这些例子,你可以看到如何使用 --whitelist 选项来限制沙箱中进程对特定文件或目录的访问,以增强系统的安全性和隔离性。只允许访问白名单中的资源,可以防止恶意程序或意外操作访问未经授权的系统资源。

  • --writable-etc:允许修改 /etc 目录。
  • --writable-run-user:允许修改 /run/user 目录。
  • --writable-var:允许修改 /var 目录。
  • --writable-var-log:允许修改 /var/log 目录。

以下是这些选项的解释:

  1. --writable-etc:将 /etc 目录挂载为可读写。

    示例:

    $ sudo firejail --writable-etc
    

    在这个例子中,使用 sudo 运行 Firejail,并添加 --writable-etc 选项,这将允许在沙箱环境中对 /etc 目录进行读写操作。请注意,由于 /etc 目录通常包含系统配置文件,因此只有在必要的情况下才应启用此选项,并且需要谨慎操作以防止意外更改系统设置。

  2. --writable-run-user:禁用对 /run/user/$UID/systemd/run/user/$UID/gnupg 的默认黑名单。

    示例:

    $ sudo firejail --writable-run-user
    

    在这个例子中,使用 sudo 运行 Firejail,并添加 --writable-run-user 选项,这将允许在沙箱环境中访问和修改 /run/user/$UID/systemd/run/user/$UID/gnupg 目录。这两个目录通常包含与用户会话相关的临时数据和密钥信息。启用此选项可能会增加系统的攻击面,因此只有在必要的情况下才应使用。

  3. --writable-var:将 /var 目录挂载为可读写。

    示例:

    $ sudo firejail --writable-var
    

    在这个例子中,使用 sudo 运行 Firejail,并添加 --writable-var 选项,这将允许在沙箱环境中对 /var 目录进行读写操作。请注意,由于 /var 目录通常包含系统日志、缓存和其他持久化数据,因此只有在必要的情况下才应启用此选项,并且需要谨慎操作以防止意外更改或泄露敏感数据。

  4. --writable-var-log:使用真实的 /var/log 目录,而不是一个克隆版本。默认情况下,Firejail 会在 /var/log 目录上挂载一个 tmpfs,并基于原始的 /var/log 目录创建一个骨架文件系统。

    示例:

    $ sudo firejail --writable-var-log
    

    在这个例子中,使用 sudo 运行 Firejail,并添加 --writable-var-log 选项,这将允许在沙箱环境中直接访问和修改真实的 /var/log 目录。启用此选项可能会暴露系统的日志数据,因此只有在必要的情况下才应使用,并且需要注意保护日志文件的安全性和隐私性。

安全与隔离:

  • --caps Linux capabilities is a kernel feature designed to split:Linux 内核能力是设计用来分割进程特权的功能。

Linux 的 capabilities 功能是内核级的一种机制,它将全能的 root 权限分割为一系列独立的权限。这意味着运行作为 root 的进程不再拥有对所有系统功能的完全访问权限,而是根据其需要仅启用特定的权限。

在 Firejail(一个 Linux 安全沙箱工具)中,–caps 选项启用了对沙箱中运行的进程的某些能力的限制。当使用此选项时,以下能力默认会被禁用,适用于在沙箱中启动的所有进程:

  1. CAP_SYS_MODULE:允许进程加载和卸载内核模块。
  2. CAP_SYS_RAWIO:授予访问原始硬件设备的权限。
  3. CAP_SYS_BOOT:启用系统重启和关闭的能力。
  4. CAP_SYS_NICE:允许修改进程优先级。
  5. CAP_SYS_TTY_CONFIG:授予修改终端设置的权限。
  6. CAP_SYSLOG:启用修改系统日志文件的能力。
  7. CAP_MKNOD:允许创建特殊文件,如设备节点。
  8. CAP_SYS_ADMIN:提供一系列广泛的管理权限,包括管理挂载点、控制网络接口和修改系统时间。

通过禁用这些能力,沙箱限制了可能恶意或存在缺陷的、以 root 运行的进程可以执行的操作,从而增强了系统的整体安全性。

以下是一个使用 --caps 选项在 Firejail 中以受限能力启动 Nginx 服务的示例命令:

$ sudo firejail --caps /etc/init.d/nginx start

在这个示例中,Nginx 将在具有指定能力被禁用的 Firejail 沙箱中启动,从而限制了其对某些系统函数的访问。

  • --caps.drop=all:移除所有能力。

–caps.drop=all 是 Firejail 中的一个选项,用于在沙箱中运行的进程中删除所有能力。这个选项对于运行不需要 root 权限的 GUI 程序或其他程序是推荐的。对于从非官方源(如游戏、Java 程序等)安装的不受信任的程序进行沙箱化时,这是一个必备选项。

使用 --caps.drop=all 选项可以极大地限制在沙箱中运行的进程的能力,从而降低潜在的安全风险。通过删除所有能力,这些进程无法执行需要特定权限的操作,进一步保障了系统的安全。

以下是一个使用 --caps.drop=all 选项在 Firejail 中运行 Warzone 2100 游戏的示例命令:

$ firejail --caps.drop=all warzone2100

在这个示例中,Warzone 2100 游戏将在没有任何能力的环境中运行,大大降低了其可能对系统造成的潜在威胁。这对于从非官方源安装的游戏等不受信任的程序来说是一种重要的安全措施。

  • --caps.drop=capability,capability,capability:移除指定的能力。

–caps.drop=capability,capability,capability 是 Firejail 中的一个选项,用于定义自定义的 Linux 能力黑名单过滤器。通过这个选项,你可以指定要删除的一系列特定能力,以进一步限制在沙箱中运行的进程的能力。

以下是一个使用 --caps.drop 选项在 Firejail 中删除特定 Linux 能力的示例命令:

$ firejail --caps.drop=net_broadcast,net_admin,net_raw

在这个示例中,我们指定了要删除的三个 Linux 能力:net_broadcast、net_admin 和 net_raw。这些能力分别与广播网络消息、管理网络设备和使用原始套接字相关。通过删除这些能力,运行在沙箱中的进程将无法执行依赖于这些权限的操作,从而提高了系统的安全性。

这个选项提供了高度的灵活性,允许用户根据需要定制能力黑名单,以适应不同的安全需求和应用程序特性。

  • --caps.keep=capability,capability,capability:保留指定的能力。

–caps.keep=capability,capability,capability 是 Firejail 中的一个选项,用于定义自定义的 Linux 能力白名单过滤器。通过这个选项,你可以指定要保留的一系列特定能力,以便在沙箱中运行的进程仍然能够执行依赖于这些权限的操作。

以下是一个使用 --caps.keep 选项在 Firejail 中保留特定 Linux 能力的示例命令:

$ sudo firejail --caps.keep=chown,net_bind_service,setgid,setuid /etc/init.d/nginx start

在这个示例中,我们指定了要保留的四个 Linux 能力:chown、net_bind_service、setgid 和 setuid。这些能力分别与改变文件所有者、绑定到特权网络端口、改变进程组 ID 和改变用户 ID 相关。对于 Nginx 这样的网络服务,可能需要这些特定的能力来正常运行。

通过使用白名单方式,除了指定的能力之外,所有其他能力都将被删除,从而限制了运行在沙箱中的进程的能力范围,提高了系统的安全性。同时,由于保留了必要的能力,进程仍能完成其预期的功能。

这个选项为用户提供了精细控制能力访问的灵活性,可以根据具体的应用程序需求和安全策略来定制能力白名单。

  • --caps.print=name|pid:打印沙箱的能力配置。

–caps.print=name|pid 是 Firejail 中的一个选项,用于打印由名称或进程 ID 标识的沙箱的能力过滤器。这个选项可以帮助你查看为特定沙箱设置的能力限制。

以下是一些使用 --caps.print 选项的示例:

# 首先,使用 --name=mygame 和 --caps.drop=all 选项启动 Warzone 2100 游戏,并将其放入后台运行
$ firejail --name=mygame --caps.drop=all warzone2100 &

# 然后,使用 --caps.print=mygame 选项打印名为 "mygame" 的沙箱的能力过滤器
$ firejail --caps.print=mygame

在这个示例中,我们首先启动了一个名为 “mygame” 的沙箱,其中所有能力都被删除。然后,我们使用 --caps.print 选项打印了该沙箱的能力过滤器,以确认所有能力是否已被正确地删除。

另一个示例:

# 使用 --list 选项列出当前运行的所有 Firejail 沙箱及其相关信息
$ firejail --list
3272:netblue::firejail --private firefox

# 然后,使用 --caps.print=PID 选项打印指定 PID(例如,3272)的沙箱的能力过滤器
$ firejail --caps.print=3272

在这个示例中,我们首先列出了当前运行的 Firejail 沙箱,并找到了一个 PID 为 3272 的沙箱。然后,我们使用 --caps.print 选项和该 PID 打印了该沙箱的能力过滤器,以了解其能力限制情况。

  • --debug-blacklists:启用黑名单调试。
  • --debug-caps:启用能力调试。
  • --debug-errnos:启用错误号调试。

–debug-blacklists 是 Firejail 中的一个选项,用于调试黑名单功能。当你遇到与黑名单相关的问题或想要了解黑名单的详细信息时,可以使用这个选项。

以下是一个使用 --debug-blacklists 选项的示例:

$ firejail --debug-blacklists firefox

在这个示例中,我们启动了 Firefox 浏览器,并启用了黑名单调试。这将帮助你查看和理解 Firejail 在处理黑名单规则时的行为和决策。


–debug-caps 是 Firejail 中的一个选项,用于打印当前 Firejail 软件构建中识别的所有能力,并随后退出。这个选项可以帮助你了解 Firejail 支持哪些能力。

以下是一个使用 --debug-caps 选项的示例:

$ firejail --debug-caps

在这个示例中,Firejail 将打印所有在当前软件构建中识别的能力列表,然后退出。


–debug-errnos 是 Firejail 中的一个选项,用于打印当前 Firejail 软件构建中识别的所有错误号码,并随后退出。这个选项可以帮助你了解 Firejail 支持哪些错误号码以及它们的含义。

以下是一个使用 --debug-errnos 选项的示例:

$ firejail --debug-errnos

在这个示例中,Firejail 将打印所有在当前软件构建中识别的错误号码列表,然后退出。这些错误号码可能在处理系统调用、文件权限等问题时出现。

  • --debug-protocols:启用协议调试。
  • --debug-syscalls:启用系统调用调试。
  • --debug-syscalls32:启用 32 位系统调用调试。

–debug-protocols 是 Firejail 中的一个选项,用于打印当前 Firejail 软件构建中识别的所有协议,并随后退出。这个选项可以帮助你了解 Firejail 支持哪些网络协议。

以下是一个使用 --debug-protocols 选项的示例:

$ firejail --debug-protocols

在这个示例中,Firejail 将打印所有在当前软件构建中识别的网络协议列表,然后退出。这些协议可能包括 TCP、UDP、ICMP 等。


–debug-syscalls 是 Firejail 中的一个选项,用于打印当前 Firejail 软件构建中识别的所有系统调用,并随后退出。这个选项可以帮助你了解 Firejail 支持哪些系统调用以及它们的作用。

以下是一个使用 --debug-syscalls 选项的示例:

$ firejail --debug-syscalls

在这个示例中,Firejail 将打印所有在当前软件构建中识别的系统调用列表,然后退出。这些系统调用可能包括 open、read、write、socket 等。


–debug-syscalls32 是 Firejail 中的一个选项,用于打印当前 Firejail 软件构建中识别的所有 32 位系统调用,并随后退出。这个选项主要适用于在 32 位环境中运行的系统或应用程序。

以下是一个使用 --debug-syscalls32 选项的示例:

$ firejail --debug-syscalls32

在这个示例中,Firejail 将打印所有在当前软件构建中识别的 32 位系统调用列表,然后退出。这些系统调用与 --debug-syscalls 类似,但专为 32 位环境设计。

  • --debug-whitelists:启用白名单调试。

–debug-whitelists 是 Firejail 中的一个选项,用于调试白名单功能。当你遇到与白名单相关的问题或想要了解白名单的详细信息时,可以使用这个选项。

以下是一个使用 --debug-whitelists 选项的示例:

$ firejail --debug-whitelists firefox

在这个示例中,我们启动了 Firefox 浏览器,并启用了白名单调试。这将帮助你查看和理解 Firejail 在处理白名单规则时的行为和决策。

  • --mac=address:设置 MAC 地址。

  • --machine-id:设置机器 ID。

–mac=address 是 Firejail 中的一个选项,用于为由 --net 选项定义的最后一个网络接口分配 MAC 地址。请注意,此选项不支持无线接口。

以下是一个使用 --mac 选项的示例:

$ firejail --net=eth0 --mac=00:11:22:33:44:55 firefox

在这个示例中,我们使用 --net=eth0 选项指定了要使用的网络接口(例如,eth0),并使用 --mac=00:11:22:33:44:55 选项为其分配了一个自定义的 MAC 地址。这样,当 Firefox 在 Firejail 沙箱中运行时,其网络通信将使用指定的 MAC 地址。这个选项可以帮助你控制沙箱中应用程序的网络标识和访问控制。


–machine-id 是 Firejail 中的一个选项,用于在沙箱内部伪造 /etc/machine-id 文件中的 ID 号。启用此选项后,将在沙箱内生成一个新的随机 ID。请注意,这将导致音频支持失效。因此,只有在不需要声音支持的情况下才应启用此选项。

以下是一个使用 --machine-id 选项的示例:

$ firejail --machine-id

在这个示例中,我们启用了 --machine-id 选项。这将导致在 Firejail 沙箱内部生成一个新的随机 machine-id,并将其写入 /etc/machine-id 文件中。这有助于进一步隔离沙箱中的应用程序和系统资源。

  • --noinput:禁用输入设备。

–noinput 是 Firejail 中的一个选项,用于禁用输入设备。启用此选项后,沙箱中的应用程序将无法接收来自键盘、鼠标或其他输入设备的输入。

以下是一个使用 --noinput 选项的示例:

$ firejail --noinput

在这个示例中,我们启用了 --noinput 选项。这将创建一个禁止输入设备的 Firejail 沙箱。当你在该沙箱中运行应用程序时,它们将无法接收任何输入,例如键盘输入或鼠标点击。

这个选项在某些情况下可能有用,例如当你想要运行一个不需要用户交互的后台任务,或者你想要限制特定应用程序访问你的输入设备以增强安全性。请注意,启用此选项可能会导致应用程序无法正常工作,因为它们可能依赖于用户的输入来执行某些操作。因此,在使用 --noinput 选项时,请确保你了解其对目标应用程序的影响。

  • --noblacklist=dirname_or_filename
  • --nodbus:禁用 D-Bus。

该命令使用Firejail工具以某些安全限制运行程序。

--nodbus是一个已弃用的选项,用于禁用对系统和会话总线的D-Bus访问。D-Bus是一种在类Unix操作系统中用于进程间通信的消息总线系统。通过禁用D-Bus访问,所运行的程序将无法通过D-Bus与其他进程通信。

--net=none是命令中使用的另一个选项,用于禁用程序的网络访问。这意味着该程序将无法发送或接收任何网络流量。

总的来说,这个命令用于通过禁用D-Bus和网络访问以增强安全性的方式运行程序。示例命令中未提及正在运行的具体程序。

  • --nou2f:禁用 U2F 设备。

  • --novideo:禁用视频输出。

  • --nowhitelist=dirname_or_filename:从白名单中删除指定目录或文件。

以上在文件系统与权限测试过

  • --private:创建一个完全独立的文件系统挂载点,使沙箱中的应用程序无法访问主机系统的文件和资源。

在沙箱配置与运行测试过

  • --private-bin=file,file:指定哪些二进制文件应作为私有,防止沙箱中的应用程序替换或篡改这些文件。

在沙箱配置与运行测试过

  • --private-cache:创建一个私有缓存目录,确保沙箱中的应用程序不能访问主机系统的缓存数据。

在沙箱配置与运行测试过

  • --private-cwd:将当前工作目录设为私有,防止沙箱中的应用程序访问主机系统的当前工作目录。

在沙箱配置与运行测试过

  • --private-cwd=directory:指定私有工作目录的位置。

在沙箱配置与运行测试过

  • --private-dev:创建一个私有设备文件系统挂载点,限制沙箱中的应用程序对主机系统设备的访问。

在沙箱配置与运行测试过

  • --private-etc, --private-etc=file,directory,@group:指定哪些/etc文件或目录应作为私有,防止沙箱中的应用程序修改系统配置。

在沙箱配置与运行测试过

  • --private-home=file,directory:指定哪些主目录文件或目录应作为私有,保护用户数据不受沙箱中应用程序的影响。

在沙箱配置与运行测试过

  • --private-opt=file,directory:指定哪些/opt文件或目录应作为私有,防止沙箱中的应用程序篡改或访问特定的可选软件包。

在沙箱配置与运行测试过

  • --private-srv=file,directory:指定哪些/srv文件或目录应作为私有,限制沙箱中的应用程序对服务数据的访问。

在沙箱配置与运行测试过

  • --private-tmp:创建一个私有临时文件系统挂载点,确保沙箱中的应用程序不会污染主机系统的临时文件。

在沙箱配置与运行测试过

  • --seccomp:启用 seccomp(secure computing mode)过滤器,限制沙箱中的应用程序可以执行的系统调用。

--seccomp选项用于启用seccomp过滤器,并将默认列表中的系统调用列入黑名单。默认列表为@default-nodebuggers,除非指定了--allow-debuggers选项,那时它将是@default

为了更轻松地创建有用的seccomp过滤器,定义了以下系统调用组:@aio@basic-io@chown@clock@cpu-emulation@debug@default@default-nodebuggers@default-keep@file-system@io-event@ipc@keyring@memlock@module@mount@network-io@obsolete@privileged@process@raw-io@reboot@resources@setuid@swap@sync@system-service@timer。关于这些组的更多信息可以在/usr/share/doc/firejail/syscalls.txt中找到。

默认列表可以自定义,有关描述请参见--seccomp=。也可以在全球范围内在/etc/firejail/firejail.config文件中进行自定义。

只有在使用--seccomp.block-secondary标志时,才会严格强制执行系统架构。如果检测到正确的架构,那么仅在运行时应用过滤器。对于I386和AMD64的情况,会同时安装32位和64位过滤器。

如果内核是在CONFIG_AUDIT标志下编译的,Firejail会将seccomp违规打印到审计日志中。

示例:

$ firejail --seccomp
  • --seccomp=syscall,@group,!syscall2:定义 seccomp 过滤器规则,允许、禁止或分组系统调用。

--seccomp=syscall,@group,!syscall2

启用seccomp过滤器,将默认列表和命令中指定的系统调用或系统调用组列入黑名单,但不将"syscall2"列入黑名单。在64位架构上,可以通过–seccomp.32安装针对32位系统调用的额外过滤器。

示例:

$ firejail --seccomp=utime,utimensat,utimes firefox

这将启动Firefox,并使用seccomp过滤器,只允许utime、utimensat和utimes这三个系统调用。

$ firejail --seccomp=@clock,mkdir,unlinkat transmission-gtk

这将启动Transmission-GTK,并使用seccomp过滤器,允许clock组中的系统调用以及mkdir和unlinkat这两个特定系统调用。

$ firejail '--seccomp=@ipc,!pipe,!pipe2' audacious

这将启动Audacious,并使用seccomp过滤器,允许ipc组中的系统调用,但排除pipe和pipe2这两个系统调用。注意这里的参数需要使用单引号包围,以防止 shell 对特殊字符(如!)进行解析。

Syscalls(系统调用)可以通过在其前面添加$符号并附上其数字来指定。例如,在i386架构上,$165代表的是mount系统调用。

除了通过返回EPERM错误来阻止syscall外,还可以使用syscall:errno语法来返回另一个错误编号。这可以通过–seccomp-error-action选项或在/etc/firejail/firejail.config文件中全局设置。此外,还可以使用syscall:kill语法来杀死执行syscall的进程,或者使用syscall:log语法来记录syscall的尝试。

示例:
命令:firejail --seccomp=unlinkat:ENOENT,utimensat,utimes
在这个例子中,unlinkat系统调用被设置为返回ENOENT错误,同时允许utimensat和utimes系统调用。

如果某些被阻止的syscall会影响到Firejail自身的运行,可以通过添加一个预加载库来处理,该库会在之后执行所需的seccomp系统调用。但是,这种方法与32位seccomp过滤器不兼容。

示例:
命令:firejail --noprofile --seccomp=execve sh
在这个例子中,execve系统调用被阻止,但为了保证Firejail的运行,添加了一个预加载库来处理后续的seccomp系统调用。执行此命令后,可以看到子进程已初始化,但在尝试执行ls命令时,由于权限问题,操作被拒绝。

? $ firejail --noprofile --seccomp=execve sh

Parent pid 32751, child pid 32752 Post-exec seccomp protector enabled list in: execve, check list: @default-keep prelist: (null), postlist: execve Child process initialized in 46.44 ms $ ls Operation not permitted

  • --seccomp.block-secondary:阻止沙箱中的应用程序使用 secondary CPU 特性。

--seccomp.block-secondary 是一个选项,用于启用 seccomp(安全计算模式)过滤器,并对系统调用架构进行过滤,确保只允许使用本机架构。例如,在 amd64 架构上,i386 和 x32 的系统调用将被阻止。

此外,该选项还会阻止使用 personality(2) 系统调用来更改执行域。这有助于增强安全性,因为限制了进程可以使用的系统调用类型和范围,减少了潜在的安全风险和攻击面。通过这种方式,只有与当前运行架构匹配的系统调用才能被执行,其他非本机架构的系统调用请求将会被拒绝。这对于防止恶意代码或者不兼容的系统调用尝试来说是非常有用的防护措施。

  • --seccomp.drop=syscall,@group:从 seccomp 过滤器中删除指定的系统调用或调用组。

--seccomp.drop=syscall,@group 是一个选项,用于启用 seccomp 过滤器,并将命令中指定的系统调用或系统调用组列入黑名单。在64位架构上,可以通过 --seccomp.32.drop 安装针对32位系统调用的额外过滤器。

示例:

$ firejail --seccomp.drop=utime,utimensat,utimes,@clock

在这个例子中,utime、utimensat、utimes 系统调用以及 clock 系统调用组都被列入了黑名单。

除了通过返回 EPERM 错误来阻止系统调用外,还可以使用 syscall:errno 语法返回另一个错误编号。这可以通过 --seccomp-error-action 选项或在 /etc/firejail/firejail.config 文件中全局更改。还可以使用 syscall:kill 语法来杀死进程,或者使用 syscall:log 语法来记录尝试。

示例:

$ firejail --seccomp.drop=unlinkat:ENOENT,utimensat,utimes
Parent pid 10662, child pid 10663
Child process initialized
$ touch testfile
$ ls testfile
testfile
$ rm testfile
rm: cannot remove `testfile': No such file or directory

在这个例子中,unlinkat 系统调用被设置为返回 ENOENT 错误,同时 utimensat 和 utimes 系统调用也被列入黑名单。当尝试删除 testfile 时,由于 unlinkat 被阻止,所以会出现 “cannot remove `testfile’: No such file or directory” 的错误信息。

  • --seccomp.keep=syscall,@group,!syscall2:在 seccomp 过滤器中保留指定的系统调用或调用组。

这个命令启用 seccomp(安全计算模式)过滤器,并将所有未列出的系统调用以及"syscall2"列入黑名单。这意味着除了明确指定要保留的系统调用(如poll、select等)外,其他所有系统调用都将被阻止。

Firejail 所需的一些基本系统调用(如 group @default-keep 中的 prctl、execve、execveat 等)通过预加载库进行处理,以确保 Firejail 的正常运行。

在64位架构上,可以使用 --seccomp.32.keep 选项安装针对32位系统调用的额外过滤器。这样可以进一步控制32位应用程序的系统调用权限。

示例:

$ firejail --seccomp.keep=poll,select,[...] transmission-gtk

在这个例子中,transmission-gtk 应用程序将只能使用 poll、select 等指定的系统调用,而所有其他未明确列出的系统调用都将被阻止。这有助于增强系统的安全性,限制潜在的攻击面。

  • --seccomp.print=name|pid:打印沙箱的 seccomp 配置。

这个示例展示了如何使用 --seccomp.print=name|pid 选项来打印指定沙箱(由名称或PID标识)的seccomp过滤器。

首先,通过以下命令启动一个名为"browser"的Firefox沙箱:

$ firejail --name=browser firefox &

然后,使用 --seccomp.print 选项打印该沙箱的seccomp过滤器:

$ firejail --seccomp.print=browser

输出是一系列的seccomp规则,这些规则定义了哪些系统调用被允许或拒绝。每一行都包含操作码(OP)、跳转目标真值(JT)、跳转目标假值(JF)和关键字(K)等信息。

例如,第一条规则是:

0000: 20 00 00 00000004   ld  data.architecture

这条规则加载数据架构。

接下来的规则检查是否为64位架构,并根据结果执行不同的操作。然后,它检查并处理特定的系统调用,如read、modify_ldt、lookup_dcookie等。对于不允许的系统调用,返回错误编号(如ERRNO(1))。

这个输出帮助你理解Firejail为特定沙箱应用了哪些seccomp规则,以及如何控制系统的安全性和限制潜在的攻击面。

  • --seccomp-error-action= kill | ERRNO | log:设置当 seccomp 过滤器检测到非法系统调用时的行为。

--seccomp-error-action 是 Firejail 中的一个选项,用于指定当 seccomp 过滤器阻止一个系统调用时的行为。

默认情况下,如果 seccomp 过滤器阻止了一个系统调用,进程会收到 EPERM 错误。但是,通过使用 --seccomp-error-action=error,可以返回另一个错误编号,例如 ENOSYS 或 EACCES。

此外,还可以使用 --seccomp-error-action=kill 语法来杀死进程(这在 Firejail 版本 <0.9.63 中是默认行为)。或者,可以使用 --seccomp-error-action=log 来记录尝试。

不杀死进程会在试图遏制入侵时略微削弱 Firejail 的安全性,但如果唯一的替代方法是允许系统调用,那么这种方法也可能允许更严格的过滤器。因此,选择哪种行为取决于你的安全需求和具体的应用场景。

以下是一些使用 --seccomp-error-action 选项的示例:

  1. 使用 --seccomp-error-action=kill 来杀死尝试执行被阻止系统调用的进程:
firejail --seccomp.drop=unshare --seccomp-error-action=kill my_app

在这个例子中,如果 my_app 尝试执行被 --seccomp.drop=unshare 阻止的 unshare 系统调用,那么 Firejail 将杀死该进程。

  1. 使用 --seccomp-error-action=ERRNO 返回一个特定的错误编号(例如 ENOSYS):
firejail --seccomp.drop=unshare --seccomp-error-action=ERRNO:ENOSYS my_app

在这个例子中,如果 my_app 尝试执行被 --seccomp.drop=unshare 阻止的 unshare 系统调用,那么 Firejail 将返回 ENOSYS 错误编号。

  1. 使用 --seccomp-error-action=log 记录尝试执行被阻止系统调用的信息:
firejail --seccomp.drop=unshare --seccomp-error-action=log my_app

在这个例子中,如果 my_app 尝试执行被 --seccomp.drop=unshare 阻止的 unshare 系统调用,那么 Firejail 将记录这次尝试的信息,而不是杀死进程或返回特定的错误编号。这可以帮助你分析和调试应用程序的行为。

  • --shutdown=name|pid:关闭指定的沙箱。

--shutdown=name|pid 是 Firejail 中的一个选项,用于关闭或终止指定的沙箱。

当你使用 --shutdown=name|pid 时,你可以通过沙箱的名称或进程ID来标识要关闭的沙箱。以下是一些示例:

  1. 关闭名为 “my_sandbox” 的沙箱:
firejail --shutdown=my_sandbox
  1. 终止进程ID为 12345 的沙箱:
firejail --shutdown=12345

这个选项对于管理多个运行中的沙箱或者在特定条件下(如应用程序崩溃或需要强制退出)关闭沙箱非常有用。通过这种方式,你可以确保在不需要时正确地清理和关闭沙箱环境,以释放系统资源并保持系统的整洁和安全。

网络与通信设置:

  • --defaultgw=address:设置默认网关地址。

    这个例子展示了如何使用 firejail--net--defaultgw 选项来创建一个新的网络命名空间,并为在该命名空间中运行的程序设置默认网关。

    在这个例子中:

    • --net=eth0:指定使用名为 “eth0” 的网络接口在新的网络命名空间中创建一个虚拟接口。这将使在沙箱中运行的程序(在这个例子中是 Firefox)只能访问通过这个虚拟接口的数据包。

    • --defaultgw=10.10.20.1:设置新网络命名空间中的默认网关为 10.10.20.1。这意味着所有从沙箱中发出的目的地不在本地网络中的数据包都将通过这个默认网关转发。

    整个命令如下:

    firejail --net=eth0 --defaultgw=10.10.20.1 firefox
    

    执行这个命令后,Firefox 将在一个隔离的网络环境中运行,其网络通信受到限制,并且所有非本地流量都将通过 10.10.20.1 这个默认网关进行路由。这种方式有助于增强安全性,因为可以限制应用程序的网络访问权限,并防止其与不受信任的网络进行交互。

    这个错误信息 “Error: cannot find network device eth0” 表示在你的系统中找不到名为 “eth0” 的网络设备。

    这可能有以下几个原因:

    1. 设备名称不正确:现代Linux系统可能会为网络设备分配不同的名称,如 enp0s3、enp1s0、enp2s0, wlp2s0 等。你可以通过运行 ip addrifconfig(如果已安装)命令来查看你的系统中可用的网络设备及其名称。
  • --dns=address:设置 DNS 服务器地址。

--dns=address 是 Firejail 中的一个选项,用于为沙箱设置 DNS 服务器。你可以定义最多三个 DNS 服务器。当你不信任网络上的 DNS 设置时,这个选项非常有用。

以下是一个例子:

firejail --dns=8.8.8.8 --dns=8.8.4.4 firefox

在这个例子中,我们设置了两个 DNS 服务器地址:8.8.8.8 和 8.8.4.4。当在沙箱中运行 Firefox 时,它将使用这些指定的 DNS 服务器进行名称解析,而不是使用网络上默认的 DNS 设置。

需要注意的是,如果您的系统使用 systemd-resolved 进行 DNS 解析管理,那么这个功能可能不受支持。在这种情况下,你可能需要调整系统的 DNS 设置或者寻找其他的解决方案来满足你的需求。

  • --dns.print=name|pid:打印沙箱的 DNS 配置。

--dns.print=name|pid 是 Firejail 中的一个选项,用于打印指定沙箱(通过名称或进程ID标识)的 DNS 配置。

以下是一些使用 --dns.print 选项的例子:

  1. 打印名为 “mygame” 的沙箱的 DNS 配置:
firejail --name=mygame --caps.drop=all warzone2100 &
firejail --dns.print=mygame

在这个例子中,我们首先启动了一个名为 “mygame” 的沙箱,并在其中运行了 “warzone2100” 程序。然后,我们使用 --dns.print=mygame 选项来打印该沙箱的 DNS 配置。

  1. 打印进程ID为 3272 的沙箱的 DNS 配置:
firejail --list
firejail --dns.print=3272

首先,我们使用 --list 选项列出所有运行中的 Firejail 沙箱及其相关信息。然后,我们找到目标沙箱的进程ID(在这个例子中是 3272),并使用 --dns.print=3272 选项来打印该沙箱的 DNS 配置。

这个选项可以帮助你了解和调试特定沙箱的 DNS 设置,以便于诊断和解决网络相关的问题。

测试

x@x:~/Desktop$ firejail --list
18418:x::firejail --seccomp.drop=unlinkat:ENOENT,utimensat,utimes 
20228:x::firejail --dns=8.8.8.8 --dns=8.8.4.4 firefox 
x@x:~/Desktop$ firejail --dns.print=20228
Switching to pid 20231, the first child process inside the sandbox
nameserver 8.8.8.8
nameserver 8.8.4.4
x@x:~/Desktop$ 

  • --dnstrace[=name|pid]:跟踪 DNS 查询。

--dnstrace[=name|pid] 是 Firejail 中的一个选项,用于监控 DNS 查询。你可以通过沙箱的名称或进程ID来指定要监控的沙箱。只有使用 --net 选项创建的网络化沙箱才支持这个功能。注意,这个选项只能在以 root 用户身份运行沙箱时使用。

如果没有提供名称或PID,Firejail将监视主系统网络命名空间的DNS查询。

以下是一个使用 --dnstrace 选项的例子:

sudo firejail --dnstrace

在这个例子中,我们以 root 用户身份运行 firejail --dnstrace 命令,开始监控主系统网络命名空间的 DNS 查询。

命令的输出会显示每个 DNS 查询的时间戳、使用的 DNS 服务器地址、查询的域名以及查询结果类型(如NXDOMAIN表示域名不存在)。这可以帮助你了解应用程序正在进行哪些 DNS 查询,并诊断可能的网络问题或安全问题。

如果你想要监控特定沙箱的 DNS 查询,可以提供沙箱的名称或进程ID,如下所示:

sudo firejail --dnstrace=mygame

或者

sudo firejail --dnstrace=3272

这里,我们分别通过沙箱名称 “mygame” 和进程ID 3272 来监控特定沙箱的 DNS 查询。

测试

$ sudo firejail --dnstrace
          11:31:43  9.9.9.9        linux.com (type 1)
          11:31:45  9.9.9.9        fonts.googleapis.com (type 1) NXDOMAIN
          11:31:45  9.9.9.9        js.hs-scripts.com (type 1) NXDOMAIN
          11:31:45  9.9.9.9        www.linux.com (type 1)
          11:31:45  9.9.9.9        fonts.googleapis.com (type 1) NXDOMAIN
          11:31:52  9.9.9.9        js.hs-scripts.com (type 1) NXDOMAIN
          11:32:05  9.9.9.9        secure.gravatar.com (type 1)
          11:32:06  9.9.9.9        secure.gravatar.com (type 1)
          11:32:08  9.9.9.9        taikai.network (type 1)
          11:32:08  9.9.9.9        cdn.jsdelivr.net (type 1)
          11:32:08  9.9.9.9        taikai.azureedge.net (type 1)
          11:32:08  9.9.9.9        www.youtube.com (type 1)
  • --interface=interface:指定网络接口。

新网络命名空间是指在操作系统中创建的一个独立的网络环境。在Linux等支持网络命名空间的操作系统中,每个网络命名空间都有自己的网络资源和配置,如网络接口、路由表、防火墙规则、DNS设置等。

当使用 --interface=interface 选项时,Firejail 会在操作系统中创建一个新的网络命名空间,并将指定的网络接口移动到这个新的命名空间中。这样,该网络接口及其相关的网络通信就会与主机系统的其他部分隔离。

在新创建的网络命名空间中运行的应用程序只能访问被移动到该命名空间中的网络接口,而不能访问主机系统或其他网络命名空间中的网络资源。这使得你可以控制应用程序的网络行为,限制其网络访问权限,从而提高系统的安全性和隔离性。

例如,在上面的命令中:

firejail --interface=eth1 --interface=eth0.vlan100 your_application

“your_application” 将在一个包含网络接口 “eth1” 和 “eth0.vlan100” 的新网络命名空间中运行。这个应用程序无法直接访问主机系统或其他网络命名空间中的网络接口和资源。这种方式可以帮助你实现更精细的网络控制和安全隔离。

这个选项 --interface=interface 是 Firejail 命令的一个参数,用于将指定的网络接口移动到一个新的网络命名空间中。这样可以实现网络层面的隔离,使得在沙箱环境中运行的应用程序只能通过指定的接口进行网络通信。

以下是对这个选项的一些详细说明:

  • --interface=interface: 这里的 “interface” 需要替换为实际的网络接口名称,如 eth0, eth1, wlan0, 等等。但是需要注意的是,无线设备(wlan)不支持这个选项。

  • 新的网络命名空间:当使用 --interface 选项时,Firejail 会创建一个新的网络命名空间,并将指定的接口移动到这个命名空间中。这样,沙箱中的应用程序将无法访问主机系统或其他命名空间中的网络资源。

  • 多个接口:你可以指定最多四个 --interface 选项,以便将多个接口移动到新的网络命名空间中。例如,firejail --interface=eth1 --interface=eth0.vlan100 将会把接口 eth1eth0.vlan100 都移动到新的网络命名空间。

  • 示例:给定的命令行示例 $ firejail --interface=eth1 --interface=eth0.vlan100 表示在 Firejail 的沙箱环境中运行一个应用程序(在这个例子中没有明确指定),同时只允许通过 eth1eth0.vlan100 这两个网络接口进行网络通信。其他接口将不会在沙箱环境中可见或可用。

x@x:~/Desktop$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
3: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:85:30:eb brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 192.168.72.130/24 brd 192.168.72.255 scope global dynamic noprefixroute ens33
       valid_lft 1738sec preferred_lft 1738sec
    inet6 fe80::c2c9:ca48:6953:161e/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
x@x:~/Desktop$ 

这个命令 ip addr 是用来显示系统中所有网络接口的IP地址和相关网络配置信息的。以下是对输出内容的详细解释:

  1. Interface编号和名称:

    1: lo:
    3: ens33:
    

    这里显示了系统的网络接口编号和名称。“lo” 是回环接口(Loopback Interface),用于本地通信。“ens33” 是一个以太网接口。

  2. Interface状态和属性:

    <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    

    这部分描述了接口的状态和属性。例如:

    • LOOPBACK:表示这是一个回环接口。
    • BROADCAST, MULTICAST:表示这是一个可以进行广播和多播的接口。
    • UP, LOWER_UP:表示接口已经启动并且物理层已经准备好。
    • mtu:最大传输单元(Maximum Transmission Unit),表示数据包的最大尺寸。
    • qdisc:排队规则(Queueing Discipline),用于处理网络流量。
    • state:接口的状态,如UNKNOWN或UP。
    • group:接口所属的组。
    • qlen:队列长度,表示接口缓冲区中等待处理的数据包数量。
  3. Link层信息:

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    link/ether 00:0c:29:85:30:eb brd ff:ff:ff:ff:ff:ff
    

    这部分显示了接口的链路层信息。对于回环接口(lo),它显示的是一个全零的MAC地址和广播地址。对于以太网接口(ens33),它显示的是实际的MAC地址和广播地址。

  4. IPv4地址信息:

    inet 127.0.0.1/8 scope host lo
    inet 192.168.72.130/24 brd 192.168.72.255 scope global dynamic noprefixroute ens33
    

    这部分显示了接口的IPv4地址、子网掩码和一些附加信息:

    • “inet” 表示这是IPv4地址。
    • “127.0.0.1/8” 和 “192.168.72.130/24” 分别是回环接口和以太网接口的IPv4地址和子网掩码。子网掩码中的数字表示CIDR记法中的前缀长度。
    • “scope host” 表示这个地址只能在本地主机上使用(对于回环接口)。
    • “scope global” 表示这个地址可以在整个互联网上路由(对于以太网接口)。
    • “dynamic” 表示这个地址是动态分配的,可能由DHCP服务器提供(对于以太网接口)。
    • “noprefixroute” 表示没有为这个地址设置任何前缀路由(对于以太网接口)。
    • “brd” 后面的地址是广播地址。
  5. IPv6地址信息:

    inet6 ::1/128 scope host 
    inet6 fe80::c2c9:ca48:6953:161e/64 scope link noprefixroute 
    

    这部分显示了接口的IPv6地址、前缀长度和一些附加信息:

    • “inet6” 表示这是IPv6地址。
    • “::1/128” 是回环接口的IPv6地址和前缀长度,“/128” 表示这是一个单播地址。
    • “fe80::c2c9:ca48:6953:161e/64” 是以太网接口的IPv6地址和前缀长度,“/64” 是许多IPv6网络中常见的前缀长度。
    • “scope host” 表示这个地址只能在本地主机上使用(对于回环接口)。
    • “scope link” 表示这个地址只能在同一链路上使用(对于以太网接口)。
    • “noprefixroute” 表示没有为这个地址设置任何前缀路由(对于以太网接口)。

如何观察到这个新创建的网络命名空间,而且如何判断这个接口真的移动到这个网络命名空间

查看新创建沙盒的网络命名空间

x@x:~/Desktop$ firejail --list
6481:x::firejail --interface=ens33 firefox 
x@x:~/Desktop$ firejail --join 6481
Error: invalid --join command line option
x@x:~/Desktop$ firejail --join=6481
Switching to pid 6484, the first child process inside the sandbox
Changing root to /proc/6484/root
Child process initialized in 1.35 ms
bash: /usr/share/bash-completion/bash_completion: No such file or directory
x@x:~$ ls /proc/self/ns
cgroup  ipc  mnt  net  pid  pid_for_children  time  time_for_children  user  uts
x@x:~$ ll /proc/self/ns
total 0
dr-x--x--x 2 x x 0 12月 26 17:52 ./
dr-xr-xr-x 9 x x 0 12月 26 17:52 ../
lrwxrwxrwx 1 x x 0 12月 26 17:52 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 x x 0 12月 26 17:52 ipc -> 'ipc:[4026531839]'
lrwxrwxrwx 1 x x 0 12月 26 17:52 mnt -> 'mnt:[4026532817]'
lrwxrwxrwx 1 x x 0 12月 26 17:52 net -> 'net:[4026532832]'
lrwxrwxrwx 1 x x 0 12月 26 17:52 pid -> 'pid:[4026532827]'
lrwxrwxrwx 1 x x 0 12月 26 17:52 pid_for_children -> 'pid:[4026532827]'
lrwxrwxrwx 1 x x 0 12月 26 17:52 time -> 'time:[4026531834]'
lrwxrwxrwx 1 x x 0 12月 26 17:52 time_for_children -> 'time:[4026531834]'
lrwxrwxrwx 1 x x 0 12月 26 17:52 user -> 'user:[4026532888]'
lrwxrwxrwx 1 x x 0 12月 26 17:52 uts -> 'uts:[4026532826]'
x@x:~$ 

在另一个终端查看沙盒之外的 网络空间是和沙盒的网络空间不同的

x@x:~/Desktop$ ll /proc/self/ns
total 0
dr-x--x--x 2 x x 0 12月 26 17:54 ./
dr-xr-xr-x 9 x x 0 12月 26 17:54 ../
lrwxrwxrwx 1 x x 0 12月 26 17:54 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 x x 0 12月 26 17:54 ipc -> 'ipc:[4026531839]'
lrwxrwxrwx 1 x x 0 12月 26 17:54 mnt -> 'mnt:[4026531841]'
lrwxrwxrwx 1 x x 0 12月 26 17:54 net -> 'net:[4026531840]'
lrwxrwxrwx 1 x x 0 12月 26 17:54 pid -> 'pid:[4026531836]'
lrwxrwxrwx 1 x x 0 12月 26 17:54 pid_for_children -> 'pid:[4026531836]'
lrwxrwxrwx 1 x x 0 12月 26 17:54 time -> 'time:[4026531834]'
lrwxrwxrwx 1 x x 0 12月 26 17:54 time_for_children -> 'time:[4026531834]'
lrwxrwxrwx 1 x x 0 12月 26 17:54 user -> 'user:[4026531837]'
lrwxrwxrwx 1 x x 0 12月 26 17:54 uts -> 'uts:[4026531838]'
x@x:~/Desktop$ 
  • --ip=address:设置 IPv4 地址。

这个命令 firejail --net=eth0 --ip=10.10.20.56 firefox 是在使用 Firejail 工具运行 Firefox 浏览器时,为网络接口 eth0 分配特定的 IP 地址,并默认为其分配一个默认网关。

以下是对这个命令中选项的详细说明:

  • --net=eth0: 这个选项指定使用网络接口 eth0 为沙箱环境提供网络连接。Firejail 会创建一个新的网络命名空间,并将 eth0 接口移动到该命名空间中。

  • --ip=10.10.20.56: 这个选项用于为最后一个由 --net 选项定义的网络接口(在这个例子中是 eth0)分配一个特定的 IP 地址。在这个例子中,分配的 IP 地址是 10.10.20.56

  • 默认网关:当使用 --ip 选项时,Firejail 默认会为分配了 IP 地址的接口设置一个默认网关。这使得沙箱中的应用程序能够通过默认路由访问其他网络资源。

  • 示例:给定的命令行示例 $ firejail --net=eth0 --ip=10.10.20.56 firefox 表示在 Firejail 的沙箱环境中运行 Firefox 浏览器,同时将网络接口 eth0 移动到新的网络命名空间,并为其分配 IP 地址 10.10.20.56。此外,还会为这个接口设置一个默认网关,以便 Firefox 能够访问其他网络资源。

通过这种方式,你可以更精细地控制沙箱环境中网络接口的配置,以满足特定的安全或隔离需求。

测试

沙盒内的ip

x@x:~/Desktop$ firejail --list
8487:x::firejail --net=ens33 --ip=192.168.72.133 firefox 
x@x:~/Desktop$ firejail --join=8487
Switching to pid 8490, the first child process inside the sandbox
Changing root to /proc/8490/root
Child process initialized in 1.31 ms
bash: /usr/share/bash-completion/bash_completion: No such file or directory
x@x:~$ ifconfig
bash: /usr/lib/command-not-found: /usr/bin/python3: bad interpreter: Permission denied
x@x:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0-8487@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 86:e0:07:d6:8d:54 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.72.133/24 brd 192.168.72.255 scope global eth0-8487
       valid_lft forever preferred_lft forever
    inet6 fe80::84e0:7ff:fed6:8d54/64 scope link 
       valid_lft forever preferred_lft forever
x@x:~$ 



沙盒外的ip

x@x:~/Desktop$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
3: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:85:30:eb brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 192.168.72.130/24 brd 192.168.72.255 scope global dynamic noprefixroute ens33
       valid_lft 1540sec preferred_lft 1540sec
    inet6 fe80::c2c9:ca48:6953:161e/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

  • --ip=none:禁用 IPv4。

这个错误信息 “Error: no network device configured” 表示在使用 firejail --ip=none firefox 命令时,Firejail 无法找到或配置任何网络设备。

当你使用 --ip=none 选项时,你告诉 Firejail 不要为 Firefox 分配任何 IP 地址。然而,这并不意味着 Firejail 不需要一个网络设备来提供网络连接。

在这种情况下,你需要确保至少有一个网络设备可供 Firejail 使用,并且该设备已经启用和连接到网络。你可以通过以下步骤来检查和解决这个问题:

  1. 首先,列出系统中的网络接口:
ip addr show

这将显示所有可用的网络接口及其相关信息。

  1. 确认是否有可用的网络接口,并记下你想让 Firejail 使用的接口名称(例如,eth0enp0s3 等)。

  2. 如果你找到了一个可用的网络接口,尝试使用 --net=<interface> 选项来指定该接口给 Firejail:

sudo firejail --net=<interface> --ip=none firefox

<interface> 替换为你在上一步中找到的接口名称。

如果这样做仍然出现错误,可能是由于权限问题或其他配置问题。在这种情况下,你可能需要进一步排查网络接口的配置和权限设置。

firejail --net=ens33 --ip=none firefox

  • --ip=dhcp:使用 DHCP 获取 IPv4 地址。

这个说明描述了如何使用 firejail 命令的 --ip=dhcp 选项来启动一个网络接口,并通过 DHCP(动态主机配置协议)自动获取 IP 地址、默认网关和 DNS 服务器信息。

以下是一个示例命令:

firejail --net=<interface> --ip=dhcp <application>

在这个命令中:

  • --net=<interface>:指定要使用的网络接口。将 <interface> 替换为你想要使用的实际网络接口名称,如 br0eth0enp0s3 等。
  • --ip=dhcp:告诉 Firejail 使用 DHCP 协议为指定的网络接口自动获取 IP 地址、默认网关和 DNS 服务器信息。

当你使用 --ip=dhcp 选项时,Firejail 会创建一个新的网络命名空间,并将指定的网络接口移动到该命名空间中。然后,它会自动启动 ISC dhclient DHCP 客户端来请求和接收网络配置信息。

请注意以下几点:

  1. DHCP 客户端要求: 这个选项需要你的系统上已经安装了 ISC dhclient DHCP 客户端。

  2. DNS 配置: 如果你的 DHCP 服务器配置为为客户端设置 DNS 服务器,那么你就不应该同时使用 --ip=dhcp--dns 选项,因为手动指定的 DNS 服务器信息会被 DHCP 服务器提供的信息覆盖。

  3. DHCP 租约释放: 当沙箱终止时,DHCP 客户端不会自动释放 DHCP 租约。如果你的 DHCP 服务器要求租约被显式释放,你可能需要在不使用 --ip=dhcp 选项的情况下运行一个 DHCP 客户端,并在沙箱终止后手动释放租约。

通过使用 --ip=dhcp 选项,你可以简化网络配置过程,特别是在需要频繁更改 IP 地址或在不同网络环境中工作的场景中。

  • --ip6=address:设置 IPv6 地址。

这个说明描述了如何使用 firejail 命令的 --ip6=address 选项来为网络接口分配一个静态的 IPv6 地址。

以下是一个示例命令:

firejail --net=<interface> --ip6=address <application>

在这个命令中:

  • --net=<interface>:指定要使用的网络接口。将 <interface> 替换为你想要使用的实际网络接口名称,如 eth0enp0s3 等。
  • --ip6=address:告诉 Firejail 为指定的网络接口分配一个静态的 IPv6 地址。将 address 替换为你想要分配的实际 IPv6 地址和前缀长度,格式为 address/prefix_length。例如,2001:0db8:0:f101::1/64

当你使用 --ip6=address 选项时,Firejail 会创建一个新的网络命名空间,并将指定的网络接口移动到该命名空间中。然后,它会为该接口配置指定的静态 IPv6 地址。

请注意以下几点:

  1. IPv6 地址格式: 确保你提供的 IPv6 地址和前缀长度的格式正确。IPv6 地址通常由一串十六进制数字组成,每组四个数字之间用冒号分隔。前缀长度表示地址中的多少位用于网络标识,剩余部分用于主机标识。

  2. 默认网关: 使用 --ip6=address 选项只配置了 IPv6 地址,但不会自动配置默认网关。如果你需要设置默认网关,可以使用 --route 选项来添加路由规则。

  3. SLAAC 自动配置: 如果你的系统已经通过状态less地址自动配置(SLAAC)从路由器获取了 IPv6 地址和默认路由,那么你不需要使用 --ip6=address 选项,因为内核会自动配置这些信息。

通过使用 --ip6=address 选项,你可以为网络接口手动分配静态的 IPv6 地址,这在某些需要固定 IPv6 地址或不支持 SLAAC 的网络环境中可能会有用。

firejail --net=eth0 --ip6=2001:db8:abcd:f101::1/64 firefox
  • --ip6=dhcp:使用 DHCP 获取 IPv6 地址。

这个说明描述了如何使用 firejail 命令的 --ip6=dhcp 选项来启动一个网络接口,并通过 DHCPv6(IPv6 动态主机配置协议)自动获取 IPv6 地址、默认网关和 DNS 服务器信息。

以下是一个示例命令:

firejail --net=<interface> --ip6=dhcp <application>

在这个命令中:

  • --net=<interface>:指定要使用的网络接口。将 <interface> 替换为你想要使用的实际网络接口名称,如 br0eth0enp0s3 等。
  • --ip6=dhcp:告诉 Firejail 使用 DHCPv6 协议为指定的网络接口自动获取 IPv6 地址、默认网关和 DNS 服务器信息。

当你使用 --ip6=dhcp 选项时,Firejail 会创建一个新的网络命名空间,并将指定的网络接口移动到该命名空间中。然后,它会自动启动 ISC dhclient DHCP 客户端来请求和接收 IPv6 网络配置信息。

请注意以下几点:

  1. DHCP 客户端要求: 这个选项需要你的系统上已经安装了 ISC dhclient DHCP 客户端,并且该客户端支持 DHCPv6。

  2. DNS 配置: 如果你的 DHCPv6 服务器配置为为客户端设置 DNS 服务器,那么你就不应该同时使用 --ip6=dhcp--dns 选项,因为手动指定的 DNS 服务器信息会被 DHCPv6 服务器提供的信息覆盖。

  3. DHCP 租约释放: 当沙箱终止时,DHCP 客户端不会自动释放 DHCPv6 租约。如果你的 DHCPv6 服务器要求租约被显式释放,你可能需要在不使用 --ip6=dhcp 选项的情况下运行一个 DHCPv6 客户端,并在沙箱终止后手动释放租约。

通过使用 --ip6=dhcp 选项,你可以简化 IPv6 网络配置过程,特别是在需要频繁更改 IPv6 地址或在不同网络环境中工作的场景中。

如果浏览器突然启动不了,就 reboot 系统

  • --iprange=address,address:设置 IP 地址范围。

这个说明描述了如何使用 firejail 命令的 --iprange=address,address 选项来为网络接口分配一个指定范围内的 IP 地址。

以下是一个示例命令:

firejail --net=<interface> --iprange=start_address,end_address <application>

在这个命令中:

  • --net=<interface>:指定要使用的网络接口。将 <interface> 替换为你想要使用的实际网络接口名称,如 eth0enp0s3 等。
  • --iprange=start_address,end_address:告诉 Firejail 从指定的 IP 地址范围内为网络接口分配一个 IP 地址。将 start_addressend_address 替换为你想要指定的起始和结束 IP 地址。

当你使用 --iprange=address,address 选项时,Firejail 会创建一个新的网络命名空间,并将指定的网络接口移动到该命名空间中。然后,它会在提供的 IP 地址范围内为该接口随机选择一个可用的 IP 地址,并为其配置默认网关。

请注意以下几点:

  1. IP 地址范围: 确保你提供的起始和结束 IP 地址位于同一子网内,并且没有被其他设备占用。

  2. 默认网关: 使用 --iprange=address,address 选项会自动配置默认网关。

通过使用 --iprange=address,address 选项,你可以为网络接口在指定范围内动态分配 IP 地址,这在某些需要多个沙箱环境共享同一子网但又需要隔离 IP 地址的场景中可能会有用。

以下是一个使用 firejail 命令的 --net--iprange 选项为网络接口分配指定范围内 IP 地址的具体例子:

假设你有一个名为 eth0 的网络接口,你想在 Firejail 沙箱环境中为它分配一个位于 192.168.1.100192.168.1.150 范围内的 IP 地址,并且你想在沙箱中运行 Firefox 浏览器。

你可以使用以下命令来实现这个目标:

firejail --net=eth0 --iprange=192.168.1.100,192.168.1.150 firefox

在这个命令中:

  • --net=eth0:指定要使用的网络接口为 eth0
  • --iprange=192.168.1.100,192.168.1.150:告诉 Firejail 从 192.168.1.100192.168.1.150 的 IP 地址范围内为网络接口分配一个 IP 地址。

当你运行这个命令时,Firejail 会创建一个新的网络命名空间,并将 eth0 接口移动到该命名空间中。然后,它会在 192.168.1.100192.168.1.150 的范围内随机选择一个可用的 IP 地址,并为其配置默认网关。最后,它会在沙箱环境中启动 Firefox 浏览器。

  • --ipc-namespace:创建独立的 IPC 命名空间。

这个说明描述了如何使用 firejail 命令的 --ipc-namespace 选项来启用一个新的 IPC(进程间通信)命名空间。

以下是一个示例命令:

firejail --ipc-namespace <application>

在这个命令中:

  • --ipc-namespace:告诉 Firejail 为沙箱环境启用一个新的 IPC 命名空间。

默认情况下,当以 root 用户身份启动沙箱时,Firejail 会自动启用一个新的 IPC 命名空间。但是,当以普通用户身份启动沙箱时,默认情况下不会启用新的 IPC 命名空间。

通过使用 --ipc-namespace 选项,你可以强制 Firejail 在以普通用户身份启动沙箱时也启用一个新的 IPC 命名空间。这可以进一步增强应用程序之间的隔离,防止它们在沙箱环境中相互干扰或访问彼此的 IPC 资源。

以下是一个使用 firejail 命令的 --ipc-namespace 选项为两个不同版本的 Firefox 浏览器启用独立 IPC 命名空间的具体例子:

假设你有两个不同的 Firefox 浏览器版本,一个在 /opt/firefox-v1 目录下,另一个在 /opt/firefox-v2 目录下。你想在 Firejail 沙箱环境中分别运行这两个版本,并确保它们之间的 IPC 资源是隔离的。

你可以使用以下命令来实现这个目标:

# 启动第一个 Firefox 版本,启用新的 IPC 命名空间
firejail -- ipc-namespace /opt/firefox-v1/firefox

# 启动第二个 Firefox 版本,启用新的 IPC 命名空间
firejail --ipc-namespace /opt/firefox-v2/firefox

在这个例子中:

  • 对于第一个 Firefox 版本,我们使用 firejail --ipc-namespace /opt/firefox-v1/firefox 命令启动它,并启用一个新的 IPC 命名空间。
  • 对于第二个 Firefox 版本,我们使用 firejail --ipc-namespace /opt/firefox-v2/firefox 命令启动它,并启用另一个新的 IPC 命名空间。

通过使用 --ipc-namespace 选项,我们确保了这两个 Firefox 版本在沙箱环境中运行时,它们之间的 IPC 资源(如信号、消息队列和共享内存)是完全隔离的。这可以防止它们相互干扰或意外地访问彼此的数据。

--join=name|pid

这个说明描述了如何使用 firejail 命令的 --join 选项来加入一个已经存在的沙箱环境。

以下是一些具体例子:

  1. 首先,创建一个名为 mygame 的沙箱,并运行 Warzone 2100 游戏,同时限制所有能力(capabilities):
firejail --name=mygame --caps.drop=all warzone2100 &

在这个命令中:

  • --name=mygame:为沙箱指定一个名称 mygame
  • --caps.drop=all:限制所有能力,以增加安全性。
  • warzone2100:要运行的游戏程序。

该命令将在后台启动 Warzone 2100,并将其放入名为 mygame 的沙箱中。

  1. 然后,你可以使用 --join 选项加入到名为 mygame 的沙箱中,并启动一个 /bin/bash shell:
firejail --join=mygame

在这个命令中:

  • --join=mygame:告诉 Firejail 加入名为 mygame 的沙箱。

当你运行这个命令时,你将进入一个新的 /bin/bash shell,它在 mygame 沙箱环境中运行。这意味着你在这个 shell 中执行的所有命令都将受到与 Warzone 2100 相同的安全过滤和资源限制。

  1. 另一个例子是通过 PID 加入沙箱:

首先,使用 --list 选项列出当前运行的 Firejail 沙箱及其相关信息:

firejail --list

这将输出类似以下的内容:

3272:netblue::firejail --private firefox

从输出中,你可以看到一个 PID 为 3272 的沙箱正在运行 Firefox。

然后,你可以使用 --join 选项通过 PID 加入到这个沙箱中:

firejail --join=3272

在这个命令中:

  • --join=3272:告诉 Firejail 加入 PID 为 3272 的沙箱。

当你运行这个命令时,你将进入一个新的 /bin/bash shell,它在 PID 为 3272 的沙箱环境中运行。

请注意,根据你的用户权限(普通用户或 root 用户),--join 命令对新进程应用的安全过滤和资源限制可能会有所不同。

  • --join-filesystem=name|pid:将沙箱加入到现有文件系统命名空间中。

    这个说明描述了如何使用 firejail 命令的 --join-filesystem=name|pid 选项来加入一个已经存在的沙箱环境的挂载命名空间。

    以下是一个具体例子:

    1. 首先,创建一个名为 myfiles 的沙箱,并挂载一个特定的文件系统:
    sudo firejail --name=myfiles --private /path/to/some/filesystem &
    

    在这个命令中:

    • --name=myfiles:为沙箱指定一个名称 myfiles
    • --private:创建一个新的私有挂载命名空间。
    • /path/to/some/filesystem:要挂载的文件系统路径。

    该命令将在后台启动一个新的沙箱,并将其挂载命名空间设置为私有,同时挂载指定的文件系统。

    1. 然后,你可以使用 --join-filesystem 选项作为 root 用户加入到名为 myfiles 的沙箱的挂载命名空间中,并启动一个 /bin/bash shell:
    sudo firejail --join-filesystem=myfiles
    

    在这个命令中:

    • --join-filesystem=myfiles:告诉 Firejail 加入名为 myfiles 的沙箱的挂载命名空间。

    当你运行这个命令时,你将进入一个新的 /bin/bash shell,它在 myfiles 沙箱的挂载命名空间环境中运行。这意味着你在这个 shell 中可以访问和操作与沙箱中相同的文件系统。

    请注意,--join-filesystem 选项只能由 root 用户使用,并且新进程不会应用任何安全过滤或 CPU 配置。这个选项主要用于在不同进程中共享相同的文件系统视图,而不需要完全加入到沙箱环境中。

    --join-network=name|pid

这个说明描述了如何使用 firejail 命令的 --join-network=name|pid 选项来加入一个已经存在的沙箱环境的网络命名空间。

以下是一个具体例子:

  1. 首先,创建一个名为 browser 的沙箱,并配置网络连接:
sudo firejail --net=eth0 --name=browser firefox &

在这个命令中:

  • --net=eth0:使用 eth0 网络接口。
  • --name=browser:为沙箱指定一个名称 browser
  • firefox:要运行的程序(Firefox 浏览器)。

该命令将在后台启动一个新的沙箱,并将其网络命名空间设置为使用 eth0 接口。

  1. 然后,你可以使用 --join-network 选项作为 root 用户加入到名为 browser 的沙箱的网络命名空间中,并执行一些网络相关的操作:
# 更改 netfilter 配置
sudo firejail --join-network=browser bash -c "cat /etc/firejail/nolocal.net | /sbin/iptables-restore"

# 验证 netfilter 配置
sudo firejail --join-network=browser /sbin/iptables -vL

# 验证 IP 地址
sudo firejail --join-network=browser ip addr

在这个例子中:

  • sudo firejail --join-network=browser bash -c "cat /etc/firejail/nolocal.net | /sbin/iptables-restore":使用 --join-network 选项加入到 browser 沙箱的网络命名空间,并通过 bash -c 执行一个命令来更改 netfilter 配置。
  • sudo firejail --join-network=browser /sbin/iptables -vL:再次使用 --join-network 选项加入到 browser 沙箱的网络命名空间,并验证 netfilter 配置是否已成功应用。
  • sudo firejail --join-network=browser ip addr:最后,再次使用 --join-network 选项加入到 browser 沙箱的网络命名空间,并查看当前的 IP 地址配置。

请注意,--join-network 选项只能由 root 用户使用,并且新进程不会应用任何安全过滤或 CPU 配置。这个选项主要用于在不同进程中共享相同的网络视图,而不需要完全加入到沙箱环境中。在上述示例中,我们展示了如何更改和验证沙箱中的 netfilter 配置以及查看其 IP 地址。

  • --net=bridge_interface:将沙箱连接到指定的网桥接口。

这个说明描述了如何使用 firejail 命令的 --net=bridge_interface 选项来启用一个新的网络命名空间,并将其连接到指定的桥接接口。

以下是一个具体例子:

  1. 首先,创建两个桥接接口 br0br1,并分别为它们配置 IP 地址和子网掩码:
sudo brctl addbr br0
sudo ifconfig br0 10.10.20.1/24

sudo brctl addbr br1
sudo ifconfig br1 10.10.30.1/24

在这个命令中:

  • sudo brctl addbr br0:创建一个名为 br0 的桥接接口。
  • sudo ifconfig br0 10.10.20.1/24:为 br0 接口配置 IP 地址 10.10.20.1 和子网掩码 /24
  • sudo brctl addbr br1:创建一个名为 br1 的桥接接口。
  • sudo ifconfig br1 10.10.30.1/24:为 br1 接口配置 IP 地址 10.10.30.1 和子网掩码 /24
  1. 然后,你可以使用 --net 选项启动一个沙箱,并将其连接到这两个桥接接口:
firejail --net=br0 --net=br1 your_application

在这个命令中:

  • --net=br0:将沙箱连接到 br0 桥接接口。
  • --net=br1:将沙箱连接到 br1 桥接接口。
  • your_application:要运行的应用程序。

当你运行这个命令时,Firejail 将创建一个新的网络命名空间,并将其连接到指定的 br0br1 桥接接口。除非你使用 --ip--defaultgw 选项显式指定 IP 地址和默认网关,否则 Firejail 会自动为沙箱分配 IP 地址和默认网关。分配的 IP 地址会通过 ARP(地址解析协议)进行验证,而默认网关则设置为桥接设备的 IP 地址。

请注意,你最多可以使用四个 --net 选项来指定多个网络接口。这个功能在需要将沙箱连接到多个网络环境或者实现网络隔离的情况下非常有用。在上述示例中,我们将沙箱连接到了两个不同的网络段 10.10.20.0/2410.10.30.0/24

  • --net=ethernet_interface|wireless_interface:将沙箱连接到指定的以太网或无线接口。

这个说明描述了如何使用 firejail 命令的 --net=ethernet_interface|wireless_interface 选项来启用一个新的网络命名空间,并将其连接到指定的以太网或无线网络接口。

以下是一些具体例子:

  1. 使用 --net=ethernet_interface--ip--dns 选项启动一个沙箱,并将其连接到以太网接口 eth0,同时为沙箱分配特定的 IP 地址和 DNS 服务器:
firejail --net=eth0 --ip=192.168.1.80 --dns=8.8.8.8 firefox

在这个命令中:

  • --net=eth0:将沙箱连接到以太网接口 eth0
  • --ip=192.168.1.80:为沙箱分配 IP 地址 192.168.1.80
  • --dns=8.8.8.8:为沙箱设置 DNS 服务器为 8.8.8.8
  • firefox:要运行的应用程序。

当你运行这个命令时,Firejail 将创建一个新的网络命名空间,并将其连接到指定的 eth0 接口。由于你已经指定了 --ip--dns 选项,所以 Firejail 不会自动分配 IP 地址和默认网关。

  1. 使用 --net=wireless_interface 选项启动一个沙箱,并将其连接到无线网络接口 wlan0
firejail --net=wlan0 firefox

在这个命令中:

  • --net=wlan0:将沙箱连接到无线网络接口 wlan0
  • firefox:要运行的应用程序。

当你运行这个命令时,Firejail 将创建一个新的网络命名空间,并将其连接到指定的 wlan0 接口。除非你使用 --ip--defaultgw 选项显式指定 IP 地址和默认网关,否则 Firejail 会自动为沙箱分配 IP 地址和默认网关。分配的 IP 地址会通过 ARP(地址解析协议)进行验证,而默认网关则设置为主机的默认网关。

请注意,你最多可以使用四个 --net 选项来指定多个网络接口。这个功能在需要将沙箱连接到多个网络环境或者实现网络隔离的情况下非常有用。在上述示例中,我们将沙箱分别连接到了以太网接口 eth0 和无线网络接口 wlan0。此外,对于无线网络接口的支持,Firejail 使用了 Linux 内核中的 macvlan 或 ipvlan 驱动程序(从 Linux 内核 3.19 开始支持 ipvlan)。

  • --net=none:禁用网络。

这个说明描述了如何使用 firejail 命令的 --net=none 选项来启用一个新的、未连接的网络命名空间。

以下是一个具体例子:

firejail --net=none vlc

在这个命令中:

  • --net=none:启用一个新的、未连接的网络命名空间。
  • vlc:要运行的应用程序(在这个例子中是 VLC 媒体播放器)。

当你运行这个命令时,Firejail 将创建一个新的网络命名空间,但不会将其连接到任何网络接口。在新的命名空间中,唯一可用的网络接口是一个新的回环接口(lo)。使用 --net=none 选项可以阻止应用程序访问网络,这对于那些实际上不需要网络访问的程序非常有用。

请注意,尽管 --net=none 是一个有效的选项,但在某些平台上,它可能会导致应用程序崩溃。在这种情况下,你可以考虑使用 --protocol=unix 选项作为替代方案,该选项会限制应用程序只能使用 Unix 域套接字进行通信,从而有效地限制其网络访问。然而,请注意 --protocol=unix 并不等同于完全禁用网络访问,因为 Unix 域套接字仍然允许在同一主机上的进程间通信。

  • --net=tap_interface:将沙箱连接到指定的 TAP 接口。

这个说明描述了如何使用 firejail 命令的 --net=tap_interface 选项来启用一个新的网络命名空间,并将其连接到指定的以太网 TAP 接口。

以下是一个具体例子:

firejail --net=tap0 --ip=10.10.20.80 --netmask=255.255.255.0 --defaultgw=10.10.20.1 firefox

在这个命令中:

  • --net=tap0:将沙箱连接到以太网 TAP 接口 tap0
  • --ip=10.10.20.80:为沙箱分配 IP 地址 10.10.20.80
  • --netmask=255.255.255.0:为沙箱设置子网掩码为 255.255.255.0
  • --defaultgw=10.10.20.1:为沙箱设置默认网关为 10.10.20.1
  • firefox:要运行的应用程序。

当你运行这个命令时,Firejail 将创建一个新的网络命名空间,并将其连接到指定的 tap0 接口。由于你已经指定了 --ip--netmask--defaultgw 选项,所以 Firejail 不会尝试在沙箱内部配置 TAP 接口。

请注意,TAP 接口通常用于虚拟化和网络模拟环境,因为它允许主机系统上的应用程序直接与虚拟网络设备进行通信。在本例中,我们将沙箱连接到了 TAP 接口 tap0,并为其配置了特定的 IP 地址、子网掩码和默认网关。这使得 Firefox 在沙箱环境中可以通过 TAP 接口访问特定的网络资源。

  1. TUN/TAP接口: TAP和TUN是Linux内核中的虚拟网络设备接口。它们用于在用户空间程序和内核的网络协议栈之间传输数据。TAP工作在数据链路层(二层),可以模拟一个以太网设备,允许用户空间程序发送和接收带有MAC头部的数据帧。而TUN工作在网络层(三层),只传输IP数据包,不包括MAC头部。

    这些接口常用于虚拟化环境、网络仿真、网络安全应用以及各种需要在用户空间处理网络数据的场合。

  • --net.print=name|pid:打印沙箱的网络配置。

    这个说明描述了如何使用 firejail 命令的 --net.print=name|pid 选项来打印指定沙箱的网络接口配置。

    以下是一个具体例子:

    firejail --net.print=browser
    

    在这个命令中:

    • --net.print=browser:指定要打印网络接口配置的沙箱名称为 browser

    当你运行这个命令时,Firejail 会查找名为 browser 的沙箱,并打印其网络接口配置。输出将包括接口名称、MAC 地址、IP 地址、子网掩码和接口状态。

    以下是一个示例输出:

    Switching to pid 1853, the first child process inside the sandbox
    Interface  MAC               IP            Mask         Status
    lo                           127.0.0.1     255.0.0.0    UP
    eth0-1852  5e:fb:8e:27:29:26 192.168.1.186 255.255.255.0 UP
    

    在这个输出中,我们可以看到沙箱中的两个网络接口:一个回环接口(lo)和一个以太网接口(eth0-1852)。每个接口的 MAC 地址、IP 地址、子网掩码和状态都已列出。

    --net.print=name|pid 选项可以帮助你了解特定沙箱的网络配置,这对于诊断网络问题或验证网络隔离设置非常有用。在本例中,我们查看了名为 browser 的沙箱的网络接口配置。如果你知道沙箱的进程 ID(PID),也可以使用 PID 替换沙箱名称。

  • --netfilter:启用 netfilter 规则。

这个命令行选项--netfilter在Firejail中用于在沙箱内部创建新的网络命名空间时启用默认防火墙。如果沙箱使用系统网络命名空间,此选项将无效。

设置的默认防火墙针对常规桌面应用程序进行了优化,并遵循限制性策略:

  1. 默认情况下,所有入站连接都被拒绝。
  2. 回环流量(来自和到本地接口’lo’)被允许。
  3. 已建立和相关连接(即,对外部连接的响应或已建立的连接)被允许。
  4. ICMP错误消息和回显请求(ping)的数据包被允许。
  5. STUN(NAT会话遍历实用程序)请求,通常在WebRTC(Web实时通信)中使用,对UDP和TCP的端口3478和3479上的数据包被丢弃。这样做是为了防止潜在的私人信息泄露。

示例命令展示了如何使用Firejail运行Firefox,创建一个新的使用以太网接口’eth0’的网络命名空间并启用默认防火墙:

$ firejail --net=eth0 --netfilter firefox

这种配置通过限制沙箱化应用程序(在此例中为Firefox)的网络访问,提供了额外的安全层。

  • --netfilter=filename:加载 netfilter 规则文件。

这个命令行选项--netfilter=filename,arg1,arg2,arg3 ...是上一个命令的模板版本。在防火墙脚本中的 $ARG1, $ARG2, $ARG3 … 将被命令行上传递的arg1, arg2, arg3 … 替换。最多支持16个参数。以下是一个示例:

$ firejail --net=eth0 --ip=192.168.1.105 \
--netfilter=/etc/firejail/tcpserver.net,5001 server-program

在这个示例中:

  • --net=eth0 指定了使用以太网接口’eth0’创建新的网络命名空间。
  • --ip=192.168.1.105 为沙箱内的应用程序分配了IP地址192.168.1.105。
  • --netfilter=/etc/firejail/tcpserver.net,5001 指定了一个防火墙脚本文件/etc/firejail/tcpserver.net,并将5001作为第一个参数传递给脚本。在防火墙脚本中, $ARG1 将被替换为5001
  • server-program 是要运行的服务器程序。

这种配置允许用户根据需要自定义防火墙规则,并通过命令行参数将特定值插入到防火墙脚本中,从而提供了更高的灵活性和控制权。

  • --netfilter.print=name|pid:打印 netfilter 配置。

这个命令行选项--netfilter.print=name|pid用于打印指定名称或PID的沙箱中安装的防火墙。以下是一个示例:

$ firejail --name=browser --net=eth0 --netfilter firefox &
$ firejail --netfilter.print=browser

在这个示例中:

  • firejail --name=browser --net=eth0 --netfilter firefox & 启动了一个名为"browser"的Firejail沙箱,使用以太网接口’eth0’并启用默认防火墙来运行Firefox。
  • firejail --netfilter.print=browser 打印了名为"browser"的沙箱中安装的防火墙规则。

通过使用--netfilter.print选项,用户可以查看已应用于特定沙箱的防火墙配置,以便于调试、理解和管理网络访问控制。

  • --netfilter6=filename:加载 netfilter6 规则文件。

这个命令行选项--netfilter6=filename用于在沙箱内部创建新的网络命名空间时启用由filename指定的IPv6防火墙。如果沙箱使用系统网络命名空间,此选项将无效。

要使用此选项,您需要提供一个符合iptables-save/iptables-restore格式的过滤器文件。这个文件应包含IPv6防火墙规则,这些规则将在新的网络命名空间中应用。

以下是一个基本的示例:

  1. 首先,创建一个包含IPv6防火墙规则的文件,例如ipv6firewall.rules
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT
-A INPUT -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT
-A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT
COMMIT
  1. 然后,使用Firejail启动应用程序并启用IPv6防火墙:
$ firejail --net=eth0 --netfilter6=/path/to/ipv6firewall.rules your_application

在这个示例中,/path/to/ipv6firewall.rules应替换为您的IPv6防火墙规则文件的实际路径,your_application是您想要运行的应用程序。

通过使用--netfilter6选项,您可以为沙箱内的应用程序设置专门的IPv6防火墙规则,以增强网络安全性并控制IPv6流量。

  • --netfilter6.print=name|pid:打印 netfilter6 配置。

这个命令行选项--netfilter6.print=name|pid用于打印指定名称或PID的沙箱中安装的IPv6防火墙规则。以下是一个示例:

$ firejail --name=browser --net=eth0 --netfilter firefox &
$ firejail --netfilter6.print=browser

在这个示例中:

  • firejail --name=browser --net=eth0 --netfilter firefox & 启动了一个名为"browser"的Firejail沙箱,使用以太网接口’eth0’并启用默认防火墙来运行Firefox。
  • firejail --netfilter6.print=browser 打印了名为"browser"的沙箱中安装的IPv6防火墙规则。

通过使用--netfilter6.print选项,用户可以查看已应用于特定沙箱的IPv6防火墙配置,以便于调试、理解和管理IPv6网络访问控制。请注意,如果沙箱未启用IPv6防火墙(即未使用--netfilter6选项指定防火墙规则文件),则此命令可能不会显示任何内容。

  • --netlock:锁定网络设备。

--netlock选项用于在沙箱中实现网络锁定功能。这种功能特别适用于那些只与少量IP地址通信的程序,如电子邮件客户端、多人在线游戏等。其中,Tor浏览器是一个很好的例子。它只与一个守卫节点通信,同时还有两到三个备用节点以防主节点失效。在启动时,浏览器会联系所有这些节点,之后则持续与主节点通信,可能长达数周。

通过使用网络锁定功能,您可以在沙箱中构建和部署自定义网络防火墙。这个防火墙只允许在程序启动期间检测到的IP地址的流量,而对于任何其他地址的流量都会静默丢弃。默认的网络监控时间为一分钟。

要使用此功能,需要为沙箱配置网络命名空间(例如,使用--net=eth0选项)。

以下是一个示例:

$ firejail --net=eth0 --netlock --private=~/tor-browser_en-US ./start-tor-browser.desktop

在这个示例中:

  • --net=eth0 指定了使用以太网接口’eth0’创建新的网络命名空间。
  • --netlock 启用了网络锁定功能。
  • --private=~/tor-browser_en-US 指定了Tor浏览器的私有数据目录。
  • ./start-tor-browser.desktop 是启动Tor浏览器的.desktop文件。

通过使用--netlock选项,您可以增强沙箱的安全性,确保程序仅与启动期间检测到的IP地址通信,从而减少潜在的安全风险。

  • --netmask=address:设置网络掩码。

--netmask=address选项用于在为新命名空间分配IP地址时,指定子网掩码。当使用--net选项指定的父接口未配置时,需要使用此选项。此外,还需要添加一个IP地址和默认网关地址。默认情况下,新命名空间接口没有配置IP地址和默认网关。

以下是一个示例:

$ sudo /sbin/brctl addbr br0
$ sudo /sbin/ifconfig br0 up
$ firejail --ip=10.10.20.67 --netmask=255.255.255.0 --defaultgw=10.10.20.1 your_application

在这个示例中:

  • sudo /sbin/brctl addbr br0 创建了一个名为br0的网络桥接器。
  • sudo /sbin/ifconfig br0 up 启用了网络桥接器br0
  • firejail --ip=10.10.20.67 --netmask=255.255.255.0 --defaultgw=10.10.20.1 your_application 使用Firejail启动应用程序,并为其分配IP地址10.10.20.67、子网掩码255.255.255.0和默认网关10.10.20.1

通过使用--netmask选项,您可以为沙箱内的应用程序配置特定的子网掩码,以适应您的网络环境和需求。这有助于确保应用程序能够在正确的网络范围内进行通信。请注意,您可能需要具有适当的权限才能执行这些网络配置命令。

  • --netns=name:将沙箱放入指定的网络命名空间。

--netns=name选项用于在指定的命名且持久化的网络命名空间中运行程序。这些网络命名空间可以使用"ip netns"命令创建和配置。

以下是一个创建和配置网络命名空间的基本示例:

  1. 首先,创建一个名为"my_namespace"的网络命名空间:
$ sudo ip netns add my_namespace
  1. 然后,为该命名空间配置接口和IP地址(假设您有一个名为eth0的物理接口):
$ sudo ip link set dev eth0 netns my_namespace
$ sudo ip netns exec my_namespace ip addr add 192.168.1.10/24 dev eth0
$ sudo ip netns exec my_namespace ip link set dev eth0 up
  1. 最后,使用Firejail在创建的网络命名空间中运行程序:
$ firejail --netns=my_namespace your_application

在这个示例中,your_application是您想要在"my_namespace"网络命名空间中运行的应用程序。

通过使用--netns选项,您可以将应用程序隔离到特定的网络环境中,从而增强安全性并控制网络访问。请注意,您可能需要具有适当的权限才能执行这些网络配置命令。

  • --netstats:监控网络流量。

--netstats选项用于监控网络命名空间的统计信息。这包括接收(RX)和发送(TX)的数据流量速率(以KB/s为单位)。以下是在使用Firejail时查看网络统计信息的示例:

$ firejail --netstats
PID  User    RX(KB/s) TX(KB/s) Command
1294 netblue 53.355   1.473    firejail --net=eth0 firefox
7383 netblue 9.045    0.112    firejail --net=eth0 transmission

在这个示例中,输出显示了两个正在运行的Firejail沙箱及其相关的网络统计信息:

  • 第一行显示了一个运行Firefox的沙箱,其PID为1294,用户为"netblue"。该沙箱在接收数据方面的速率为53.355 KB/s,发送数据的速率为1.473 KB/s。
  • 第二行显示了一个运行Transmission的沙箱,其PID为7383,用户也为"netblue"。该沙箱在接收数据方面的速率为9.045 KB/s,发送数据的速率为0.112 KB/s。

通过使用--netstats选项,您可以实时监控Firejail沙箱中的网络活动,这对于诊断网络问题、优化资源使用或确保应用程序在预期范围内运行非常有帮助。请注意,此选项可能需要相应的权限才能访问网络统计信息。

  • --nettrace[=name|pid]:跟踪网络包。
文章来源:https://blog.csdn.net/qq_55125921/article/details/135244488
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。