分类: LINUX
2009-07-08 11:32:27
作为系统管理员,我们首先要担心的问题是一个系统的安全性和稳定性,其次才是它的效能和效率。
一个系统是否安全,一般来说取决于以下几点:
对于必须开放访问的系统来说,成熟而可靠的系统保护措施是十分重要的。而对作为各种程序运行平台的操作系统而言,系统中的各种列表,例如目录、文件、进程等,都可以成为怀有恶意的用户甚至是骇客的窥探的窗口。例如一个已经侵入系统获得普通用户权限的骇客,可以通过观察系统中的各种服务器进程和相关的配置文件,探测系统的保护机制和各种漏洞。譬如一个普通用户,如果具有执行 Apache 的权限,那他就很有可能可以通过 Apache 的编译参数、版本查找服务器的漏洞。一个很重要的原则是:把服务器上的所有用户都看成是怀有恶意的使用者,所以系统必须限制普通使用者的权限。这是一个无关道德的问题,而是一个技术问题。
对于 Windows 来说,系统的权限控制可以通过 Active Directory 来实现。但这只是对文件访问的控制,而并没有涉及系统的进程、网络接口。当然,复杂的 AD 规则当然包括对网络服务的访问,可是这只是限制的系统的接口部分,并没有从根本上解决上述问题。Linux 本身也并没有复杂的系统安全机制,一如传统的 Unix 一样,Linux 是通过普通的文件权限来保护系统,而这并不足够。
为了解决上述问题,Linux 内核有几个相关的 patch,包括由 开发的 、Brad Spengler 开发的 GRSecurity 和 RSBAC Team 开发的 。由于效能和简便性方面的原因,这里选择使用 GRSecurity。相关的比较可以看、这里、这里和。
GRSecurity (grsec) 内核的安装和配置
在 kernel 网站和 grsecurity 网站分别下载内核源代码和对应版本的 grsec patch。这里以目前的最新版,kernel 2.6.17.11 以及 grsec-2.1.9为例。
解开 linux-2.6.17.11.tar.bz2 压缩包之后,就可以进行 patch 了。以下是关键命令:
然后找到你的原来的内核配置文件,并配置之。
在 make oldconfig 的时候,请根据你的需要回答Y/N。后面将会继续 make menuconfig。
这里要选择 Security Level。可以根据你的需求选择 Low/Medium/High/Custom。不过一般来说,我在这里是选择 Medium 的。其它选项可以根据需求配置。下面是配置 Address Space Protection:
这里可以选择这样配置,但是 Disable privileged I/O 最好取消。因为很有可能某些服务器进程要用到 ioperm/iopl 这样的系统调用。然后是 RBAC 的配置:
这里可以把 Hide kernel processes 勾上,这样当开启 RBAC 时,内核进程都会被隐藏起来。Then, 文件系统保护:
这里可以全部勾上。Then, Kernel Auditing,也可以全部勾上。图片就不提供了。
下面是可执行文件保护:
如果系统是属于开放系统的话,可以把 Invert GID option 勾上,这样下面规定的 GID 就是 Trusted Users 的 ID,将不会收到 TPE 的限制。Network Protections,里面的内容也可以全部勾上。Sysctl support,sysctl 功能一定要打开,但是 Turn on by default 最好关闭,否则的话启动的时候设置的余地就不大了。
而至于 PaX 的设置,按照默认配置就可以了。
内核的编译和安装可以按照正常的步骤进行。不过值得一提的是,在 Ubuntu 6.06 LTS 中,需要更新 initrd 的时候,只需要使用 update-initramfs 命令就可以了。
重启后 grsec 的配置
比起 SELinux 来说,配置 grsec 并不困难。由于之前在配置内核时,已经打开了 sysctl 选项,所以我们接下来的配置只需要使用 sysctl 就可以了。我们可以打开相关需要的选项,下面是一个很简单的例子,可以写入 /etc/rc.local 中。
运行之后,就可以发现,世界一切都不同了:
这是 grsec 的效果之一,可以保护进程信息,用户只能查看到自己的进程,也不能用 netstat 查看网络连接情况。
RBAC 的配置和应用
RBAC (Role-based Access Control) 是 grsec 其中一项很强大的功能,它可以限制系统进程的各种访问权限,包括对文件、资源、网络以及系统调用、系统的capability的访问限制。例如,可以限制系统的 web 服务器 /usr/sbin/httpd,只允许它访问 /etc/httpd,/var/www,/var/log/httpd 以及 /var/run/httpd,/tmp 这几个目录,而其它目录,可以仅对它隐藏起来以限制它的访问。更可以限制这个进程,只允许其接受入站的信息,而不允许其 connect 到其它网络服务器。这种访问策略,更有利于建立安全的系统。
RBAC 功能由两部分来实现:内核的 grsec 接口 (/dev/grsec 设备) 和用户端的 gradm 程序界面。
gradm 程序源代码,可以在 grsecurity 网站下载。必须下载与 patch 对应版本的 gradm 程序。下载之后直接 make install 就可以安装了。
以下以 /usr/sbin/sshd 为例子说明 grsec 的策略设置:
subject /usr/sbin/sshd dp {
/ h
/bin/bash x
/dev h
/dev/log rw
/dev/random r
/dev/urandom r
/dev/null rw
/dev/ptmx rw
/dev/pts rw
/dev/tty rw
/dev/tty? rw
/etc r
/etc/grsec h
/home
/lib rx
/root
/proc r
/proc/kcore h
/proc/sys h
/usr/lib rx
/usr/share/zoneinfo r
/var/log
/var/mail
/var/log/lastlog rw
/var/log/wtmp w
/var/run/sshd
/var/run/utmp rw-CAP_ALL
+CAP_CHOWN
+CAP_SETGID
+CAP_SETUID
+CAP_SYS_CHROOT
+CAP_SYS_RESOURCE
+CAP_SYS_TTY_CONFIG
}
在这里,/ 作为默认的路径,是被完全隐藏的。这就是说,ssh server 进程只能看到标记为 r 的文件和目录。下面 CAP_* 系列的设置,可以参看 /usr/include/linux/capability.h 中的说明。
参考:RBAC 配置说明,以及 gradm 的 policy 文件。