硬件/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上并不详细。自己总结了一些。
- 内核模块签名。
- 内核基址随机化
- 关闭内核调试
- /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输入法并不能在多个用户进程间通用。 这时我们需要启动多个输入法进程,每个用户各一个。
如果需要修改fcitx
的im
名。则在/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
常量定义了需要签名验证的扩展类型。去掉其中的webextension
、extension
即可完成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 # 退出时弹窗警告