Gentoo Hardened常见问题
1.
问题
一般性问题
PaX
grsecurity
RSBAC
SELinux
2.
一般性问题
什么是工具链?
工具链是指一系列一般用于为特定架构作开发和构建的软件包。gentoo-hardened IRC频道里所说的工具链包括GCC、binutils和GLibC。
我应该用grsecurity、RSBAC还是SELinux?
这其实要由您自己决定。Hardened Gentoo项目组只是尝试把所有这些项目都引入到Gentoo中来供用户选择。您可能要参考很多研究来做出这个决定,因此我们也在hardened相关文档中给出了相关的研究信息供您参考。当然,如果您还有什么其它关于这些项目的安全模型的问题的话,您也可以到IRC频道上或者邮件列表中向相关的开发人员提问。
我能同时启用grsecurity、RSBAC、SELinux和PaX吗?
当然可以。PaX可以和grsecurity、RSBAC、SELinux共存的。至于grsecurity、RSBAC和SELinux的话有一点小冲突:您只能启用三种权限管理系统中的一种。
如果要在编译过程中打开PIE/SSP功能,我需要向LDFLAGS/CFLAGS中添加什么参数吗?
不用。通过GCC的specfile机制,我们已经为现有的工具链自动开启了CFLAGS="-fPIE -fstack-protector-all" LDFLAGS="-Wl,-z,now -Wl,-z,relro"。比起向LDFLAGS/CFLAGS加参数,这样做更合适。对于仍然在使用过去的hardened-gcc的用户,您需要在/etc/make.conf中设置USE="hardened pic"后用下面的命令更新:
代码 2.1: Hardened工具链安装 |
# emerge --oneshot binutils gcc virtual/libc
# emerge -e world
|
注意:
Gentoo为GCC打了补丁,让用户可以从环境变量中为GCC指定specfile。目前我们在系统中为用户提供了受支持架构下的几组specfile,以方便用户快速的打开或关闭工具链的相关功能。用户可以使用gcc-config工具来选择合适的specfile。
|
如何关闭编译过程中的PIE/SSP功能?
您可以使用gcc-config:
代码 2.2: gcc-config输出信息样例 |
# gcc-config -l
[1] i686-pc-linux-gnu-3.4.4 *
[2] i686-pc-linux-gnu-3.4.4-hardenednopie
[3] i686-pc-linux-gnu-3.4.4-hardenednopiessp
[4] i686-pc-linux-gnu-3.4.4-hardenednossp
[5] i686-pc-linux-gnu-3.4.4-vanilla
# gcc-config i686-pc-linux-gnu-3.4.4-hardenednossp
|
或者,您也可以修改CFLAGS实现相同的效果:
想要关闭hardened工具链中默认开启的SSP功能,请在CFLAGS中加入-fno-stack-protector-all -fno-stack-protector。
想要关闭hardened工具链中默认开启的PIE功能,请在CFLAGS中加入-nopie。
重要:
您不应该使用-fno-pic参数,因为它会使GCC产生非PIC(即位置相关)的代码。您如果想要关闭PIE功能让GCC还原成正常编译,您应该使用-nopie。
|
注意:
如果您对目前在Portage中实现软件包专属CFLAGS参数这一功能有兴趣的话,您可以参考solar开发的脚本:http://article.gmane.org/gmane.linux.gentoo.hardened/1204。
|
我内核编译的时候出现了类似“error: structure has no member named `curr_ip'”的错误,我该怎么办?
如果要用hardened-sources中的PaX功能,您必须在设置中同时启用grsecurity功能。这个情况可能会在未来的版本中得到修正。
我才注意到hardened项目;要安装一个Hardened Gentoo系统,我有必要把项目主页上所有东西都安装上吗?
没有必要。Hardened Gentoo项目是一系列关注安全的小项目的合集。您可以同时安装各个项目互不影响,但各个项目提供的不同的权限控制(ACL)之前也有冲突。
为什么我的hardened gcc用CFLAGS="-O3"参数编译的程序有问题?
打开了堆栈溢出保护功能(SSP)的gcc的-O3级优化有的时候会出现问题。官方目前不支持使用-O3编译,我们hardened项目组也强烈反对您使用-O3。用户提交的bug中一旦涉及到-O3将被参数为“无效”/“无法修复”的bug并关闭,或者干脆无视。
bootstrap-cascade.sh怎么没了?
最近我们废除了旧的bootstrap.sh和bootstrap-2.6.sh脚本文件,而bootstrap-cascade.sh就成了新的bootstrap.sh。
我如何启用hardened的系统配置文件?
代码 2.3: 设置make.profile |
# cd /etc
# rm make.profile
# ln -s ../usr/portage/profiles/hardened/x86 make.profile
# ln -s ../usr/portage/profiles/hardened/x86/2.6 make.profile
|
设置好系统配置文件后,您需要使用hardened工具链来重新编译您的系统,这样您才能有一个统一的系统底层:
代码 2.4: 改用hardened工具链 |
# emerge --oneshot binutils gcc virtual/libc
# emerge -e world
|
我应该如何使用gdb来调试?
GDB有一个小问题,就是不能解读PIE程序的符号。GDB不知道PIE中引用的地址是相对的而不是绝对的。这样当您做backtrace的时候,您会看到本来显示符号的那些行,显示了一堆??。
为了解决这个问题,请在最后的链接步骤时加上-nopie参数。之前所有的目的码编译过程都可以使用hardened编译器默认设置的-fPIE参数,这样您所生成的执行码就和最终产品尽可能接近。不过最后一步的链接是一定要生成一般的执行码的。如果您是用emerge编译的话,请在LDFLAGS中加上-nopie。
另外一个办法就是使用=sys-devel/gdb-6.3-r5。这个版本里有我们加入的专门补丁,让GDB可以调试链接时使用了-pie参数的那些程序。
另外一个小问题,如果内核设置不当,PaX可能会阻止GDB设置断点。这种情况包括在用来启动程序的main函数处设置断点的情况。为了避免这个情况,请为需要调试的程序设置m和x标记。x是默认设置,所以您只要:
代码 2.5: 让PaX不要干预调试过程 |
# /sbin/paxctl -m foo
|
这样您的GDB就应该一切正常了。请像平时一样的使用GDB吧。祝您好运!
3.
PaX相关问题
PaX项目组的主页在?
PaX项目组的主页在http://pax.grsecurity.net。
Gentoo有哪些有关PaX的文档?
目前只有一篇PaX快速配置指南,在http://www.gentoo.org/proj/en/hardened/pax-quickstart.xml。
系统一直提示“error while loading shared libraries: cannot make segment writable for relocation: Permission denied.”是什么意思?
当您像下面这样设置来开启CONFIG_PAX_NOELFRELOCS的话就会出现问题中所提到的错误:
代码 3.1: Menuconfig选项 |
Non-executable page ->
[*] Disallow ELF text relocations
|
如果您使用的是Gentoo Hardened工具链,正常情况下编译程序会生成PIC而不是代码重定位的ELF库文件。不过有些特定的库还是代码重定位的,这有很多原因。特别是一些含汇编代码的并且没有正确处理这些汇编代码的库常出现这样的情况。这种库很可能成为一个安全漏洞,攻击者可以利用非PIC的库来执行他准备的Shellcode代码。非PIC库在内存利用方面也表现不佳,因为它们会给共享库的共享代码带来麻烦。
为了消除这样的错误,让您的程序正常运行,您只能牺牲安全性,允许这样的程序生成运行时代码。PaX相应的功能叫MPROTECT。您需要为所有需要调用非PIC库的程序关闭MPROTECT功能。
为了检查系统中的代码重定位,您可以利用app-misc/pax-utils中的scanelf程序。更多关于利用pax-utils包中的工具的信息,您可以参考Gentoo PaX工具指南.
注意:
sys-apps/portage的新版本(>=2.0.53)会检测代码重定位,并根据您在/etc/make.conf中FEATURES变量的设置,打印一些有关安装过程的警告,甚至直接中止。
|
我一启用PaX的话Java就不运行了,这是怎么回事?
Java虚拟机因为设计需求,运行时有很多代码会和PaX有冲突。这里有两个方法可以解决:
代码 3.2: 安装Chpax |
# emerge chpax
# /etc/init.d/chpax start
|
或者如果您已经安装了chpax,也可以:
代码 3.3: Java的Chpax选项 |
# chpax -pemrxs /opt/*-jdk-*/{jre,}/bin/*
|
两个办法都会稍适修改ELF文件头,以确保二进制文件的PaX标记的正确。
注意:
如果您在使用PaX的同时还启用了其它如RSBAC、 grsecurity或者SELinux这样的安全组件,您应该使用这些安全组件中提供的内核hook来管理PaX。
|
在启用了RSBAC的系统中,您可以使用下面的命令来设置所有的Java文件:
代码 3.4: 在启用了RSBAC系统中为Java设置PaX选项 |
# for i in $(ls /opt/*(jdk|sdk)*/{jre,}/bin/*);do attr_set_file_dir FILE $i pax_flags pmerxs;done
|
4.
grsecurity相关问题
grsecurity项目组的主页在?
grsecurity项目组的主页在http://www.grsecurity.net。
Gentoo有哪些关于grsecurity的文档?
最新的关于grsecurity项目的文档是Grsecurity2快速配置指南,请参考:http://www.gentoo.org/proj/en/hardened/grsecurity.xml。
我能在2.6.8、2.6.8.1或者2.6.9版本的内核上使用grsecurity吗?
2.6.8内核的改动使得PaX无法正常工作,所以2.6.8、2.6.8.1和2.6.9版本的内核没有相应的PaX或者grsecurity补丁。2.6.10有一个实验性的补丁,但是请您在使用前注意一下作为官方的PaX项目组的立场并认真考虑: http://forums.grsecurity.net./viewtopic.php?t=968。
5.
RSBAC相关问题
RSBAC项目组的主页在?
RSBAC项目组的主页在http://www.rsbac.org。
Gentoo有哪些关于RSBAC的文档?
Gentoo所有有关RSBAC项目的文档都存放在RSBAC子项目的页面里:http://www.gentoo.org/proj/en/hardened/rsbac/index.xml。
RSBAC手册里还有一些不完全针对Gentoo的RSBAC文档,请参考:http://www.rsbac.org/documentation/rsbac_handbook。
我怎样为开启了RSBAC功能的内核配置一个initial ramdisk?
如果要为开启了RSBAC功能的内核配置一个initial ramdisk,您需要在内核中启用下面这个内核选项,否则RSBAC会把initrd设备误认为根设备:
代码 5.1: Menuconfig选项 |
General RSBAC options --->
[*] Delayed init for initial ramdisk
|
6.
SELinux相关问题
SELinux的常见问题在哪?
关于针对SELinux的常见问题,您可以参考http://www.gentoo.org/proj/en/hardened/selinux/selinux-handbook.xml?part=3&chap=3。
|