加固的Gentoo (Hardened Gentoo)
"Gentoo Hardened" 是一个 Gentoo 项目,它在现有 Gentoo Linux 安装上提供了多种额外的安全服务。虽然这些服务可以分别单独使用,但是 "Gentoo Hardened" 启用了 toolchain 中几个可以降低被攻击风险的选项,支持 PaX, grSecurity, SELinux, TPE 等等功能。
无论你是运行一台面向互联网的服务器还是一台灵活的工作站,当你面对多种威胁的时候你会更愿意加固你的系统,而不是仅仅自动升级最新的安全补丁。 加固(Hardening) 系统意味着你会采取额外的措施来应对攻击和其他风险,这些措施通常是在系统上执行的一系列活动的组合。
"Gentoo Hardened" 中的几个项目都很活跃,这些项目可以帮助你进一步加固你的 Gentoo 系统,通过:
- 使能工具链中的特定选项(编译器、链接器...),例如:强制PIE(position-independent executables),堆栈粉碎保护(stack smashing protection)以及编译阶段的缓存检查。
- 使能Linux内核的PaX扩展,它提供了一些额外的防护方法如随机安排地址空间和不可执行内存。
- 在Linux内核中使能grSecurity扩展,包括额外的chroot限制,额外的审计,进程限制等。
- 在Linux内核中使能SELinux 扩展,它提供了一套强制的访问控制系统来增强标准的Linux权限限制。
- 使能Integrity相关技术,例如完整性评估框架(Integrity Measurement Architecture)用来为系统应对篡改增强弹性。
当然,这还包括了必要的用户工具来管理这些扩展。
切换到“加固的配置文件(Hardened profile)”
Read relevant documentation before performing any profile changes.
选择一个“hardened profile”, 这样“程序包管理”将会以“加固模式”来运行。
root #
eselect profile list
root #
eselect profile set [加固的配置文件编号]
root #
source /etc/profile
通过选择“hardened profile”,某些包管理设置(masks, USE标记等等)会成为系统默认设置,这些设置会应用在很多包上面,包括 toolchain 。 toolchain 用于建立/编译你的程序,包括:GCC(GNU Compiler Collection)、binutils(链接器等)和 glibc(GNU C library)。通过重新编译安装 toolchain,这些新的默认设置将会应用到 toolchain 上面,这会让所有后面的“包编译”都以加固模式来完成。
root #
emerge --oneshot gcc
root #
emerge --oneshot binutils virtual/libc
上面的命令重建了 GCC,现在可以用它来编译出已加固的软件。确定 GCC 启用了“hardened”选项。
root #
gcc-config -l
[1] i686-pc-linux-gnu-4.5.3 * [2] i686-pc-linux-gnu-4.5.3-hardenednopie [3] i686-pc-linux-gnu-4.5.3-hardenednopiessp [4] i686-pc-linux-gnu-4.5.3-hardenednossp [5] i686-pc-linux-gnu-4.5.3-vanilla
Finally source the new profile settings:
root #
source /etc/profile
如果你使用“预链接”的包,删除它,因为它和“hardened profile”不兼容。
root #
emerge --depclean prelink
现在你用新的加固后的 toolchain 来重新安装所有的包。
root #
emerge --emptytree --verbose @world
安装已加固的内核源代码(hardened kernel sources),这样内核将以加固模式 来管理你运行中的系统(特别是使用 PaX):
root #
emerge --ask hardened-sources
现在配置/编译源代码并将内核添加到你的启动管理器(如:GRUB)。
提示与技巧
每个包单独的加固设置
该方法 Gentoo 不提供技术支持。
修改 GCC 配置来处理特定的软件包是一件很痛苦的事情。避免这种情况的一个方法是通过使用 package.env 来设置针对单个软件包的 C(XX)FLAGS。创建文件 /etc/portage/env/nossp 并添加以下内容:
CFLAGS="${CFLAGS} -fno-stack-protector"
CXXFLAGS="${CXXFLAGS} -fno-stack-protector"
允许关闭 PIE, 创建 /etc/portage/env/nopie 并添加如下内容:
CFLAGS="${CFLAGS} -no-pie"
CXXFLAGS="${CXXFLAGS} -no-pie"
LDFLAGS="${LDFLAGS} -no-pie"
最后,添加你想关闭 PIE 或者 SSP 的软件包到 /etc/portage/package.env 和相关的 /etc/portage/env/<文件名>,下面是针对 sys-libs/zlib 的一个范例:
sys-libs/zlib nopie
另请参阅
查看下列资源以获取更多信息: