硬件/BIOS安全


根据最小化权限原则,不需要的硬件最好直接拔掉排线,比如摄像头/麦克风。

有的BIOS可以选择禁用硬件,最好将不常用的摄像头、麦克风、蓝牙关闭。

安全启动

开启BIOS密码并把Linux设置为第一启动项。

很可惜的是Linux对微软提出的Security Boot支持并不好。

可选的开启grub密码。

磁盘加密与备份


开启全盘加密,这需要你先加密整个磁盘,并且你的内核支持luks、initramfs支持cryptsetup。

dm-crypt密钥有两种形式,口令或者文件。 我们需要生成一个高熵文件用作密钥。

dd if=/dev/urandom of=/etc/keys/enc.key bs=1 count=4096

推荐的做法是为cryptsetup打一个nuke patch。

https://github.com/offensive-security/cryptsetup-nuke-keys

这个patch由kali官方制作,提供一个nuke keys。输入key则覆盖磁盘的加密密钥。 导致磁盘无法解密。也就是自毁代码。

可以配合cryptsetup luksHeaderBackup使用,备份头部密钥。

Gentoo通过/etc/portage/patch使用补丁。

同样配置磁盘lvm,并使内核支持lvm,启动时需指定dolvm。

Mount

主要参数有nosuid, noexec, nodev

给/tmp禁止执行还是很有必要的。

Package校验


使用gpg对.DIGESTS文件进行校验。

gpg --keyserver hkps.pool.sks-keyservers.net --recv-keys <key id>
gpg --keyserver hkp://keys.gnupg.net --recv-keys 0xBB572E0E2D182910
gpg --verify <foo.DIGESTS.asc

shaXsum -c <foo.DIGESTS.asc>

安装后package也可以校验完整性

qcheck同样还有equery check @world

日志


据说linux下传统log软件存在日志伪造攻击,systemd解决了这个问题,不知openrc如何处理。

这里没有选择常见的sysklogd,而是更加可配置的syslog-ng

mark工具app-admin/logcheck

Staying up-to-date

这不废话么。

gentoo有个GLSA项目,常常发布安全公告glsa-check --list

glsa-check -t all检查有影响的公告

Kernel

wiki上并不详细。自己总结了一些。

  1. 内核模块签名。
  2. 内核基址随机化
  3. 关闭内核调试
  4. /dev/mem

参考: https://wiki.gentoo.org/wiki/Security_Handbook https://wiki.archlinux.org/index.php/Security

Firefox Secutiry

Simple Sandbox

官网里的Simple sandbox挺有意思。

https://wiki.gentoo.org/wiki/Simple_sandbox

原理是给应用程序单独建立用户,通过sudo改变程序执行用户。

修改/etc/sudoers.d/sanbox

lain ALL=(firefox) NOPASSWD:/usr/bin/firefox

X下需要xhost si:localuser:app允许连接到xorg server。

官网给出了个有意思的脚本

echo 'post_src_install() {
  chmod -R u-x,g-w,o-o ${D}
  chown -R root:ff ${D}
}' > /etc/portage/env/www-client/firefox

除了建立用户,还通过portage的env配置hook了emerge过程中的post_src_install函数,达到通用效果。

另一个hook点是post_pkg_postinst,用于bin包,但是不能自动获得安装路径。

但是单个桌面下的多用户程序还有不少问题

CJK Input Method in Multi-User Mode

fcitx输入法并不能在多个用户进程间通用。 这时我们需要启动多个输入法进程,每个用户各一个。

如果需要修改fcitxim名。则在/etc/sudoers允许修改运行时的环境变量。

Defaults env_keep += "XMODIFIERS GTK_IM_MODULE QT_IM_MODULE QT_IM_SWITCHER"

我们需要在程序启动前启动输入法。

xhost si:localuser:firefox
XMODIFIERS="@im=fcitx-firefox" sudo -u firefox /usr/bin/fcitx
sudo -u firefox /usr/bin/firefox

PulseAudio Mutiple Users

当Firefox运行在非但前X11用户时,将无法连接上pulseaudio。

解决方法有两个。一是运行PulseAudio在System-wide,使得多用户可用。

另一个是开启PulseAudio的TCP支持,让Firefox用户通过TCP连接到当前音频服务。

在当前用户~/.pulse/default.pa添加

load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1

在Firefox用户~/.pulse/client.conf添加

default-server = 127.0.0.1

Disable Firefox Extension Signatures

之前写过火狐扩展,但并不想提交获取签名。在firefox 48之后就不提供官方关闭签名验证的方法了。

其中一种方法就是通过对源码的Patch绕过验证了。

方法来自Githubhttps://github.com/5digits/dactyl/wiki/Disable-extension-signing-requirement-in-Firefox-49-or-later

通过修改火狐XPI安装过程的toolkit/mozapps/extensions/internal/XPIProvider.jsm文件对验证过程bypass。

const SIGNED_TYPES = new Set([
    "webextension",
    "extension",
    "experiment",
]);

SIGNED_TYPES常量定义了需要签名验证的扩展类型。去掉其中的webextensionextension即可完成bypass。

Gentoo给出的patch也很有意思

https://wiki.gentoo.org/wiki/Firefox

文档将patch放进/etc/portage/patches/www-client/firefox/no-signature-force-check.patch中。

这里利用了portage的patches配置自动加载了patch。

Firefox About:Config

在firefoxabout:config配置下有不少安全选项

  • browser.showQuitWarning true # 退出时弹窗警告