巧设“监牢”保护Linux服务安全
2020-12-30河南郭建伟
■ 河南 郭建伟
编者按:为了增加Linux对Root权限的有效管控,利用Linux内核提供的Chroot机制,让某个服务器软件在限定的目录中运行,为对应的服务设置“牢笼”,来更加有效的保护系统安全。
在Linux中,各种服务都是以Root权限来启动的。这是因为相应的服务(例如Apache等)需要绑定特定的端口,才可以监听连接请求。这就需要依靠Root权限才可以实现。
随着针对缓冲区漏洞攻击的频繁出现,如果受到黑客攻击的某个网络服务存在安全漏洞,黑客就可以借此控制整个服务器,这对系统安全的危害是很大的。
为了避免出现这种情况,当前的服务器软件一般采取了先以Root权限启动,之后放弃Root权限,并以具有较低权限的账户运行服务。这样即使黑客利用某服务的漏洞侵入系统,得到的也只能是较低的权限,对系统危害不是很大。
Chroot的保护原理分析
为了进一步提高安全性,防止黑客利用其他的系统漏洞来非法提升权限,可以使用Chroot机制,为对应的服务设置“牢笼”,来更加有效的保护系统安全。
这里所说的“牢笼”,其实指的是利用Linux内核提供的Chroot机制,让某个服务器软件在限定的目录中运行,使其只能对该目录以及子目录中的数据进行操作,而无法看到之外的目录(例如根目录等),来最大限度的保护系统安全。即使黑客控制了该服务器软件,对系统也不会造成大的损坏。对服务器软件进行Chroot处理,需要将该软件运行所需的全部程序,配置文件和库文件安装到Chroot目录中,该Chroot目录就会成为“监牢”。
在这里就以Apache和DHCP服务为例,来说明如何将其置于“牢笼”中安全运行。
让DHCP在“监牢”中运行
如果在“牢笼”中运行DHCP服务,那么访问者根本看不到Linux中真实的目录。使用Chroot技术保护DHCP,一般需要先创建对应的目录,并将守护进程的可执行文件DHCPD以及其所需的库文件复制进来。
利用JAIL工具,可以轻松高效的创建Choot“牢笼”。首先将“jail_x.x.tar.gz”安装包下载到某个位置,其中的“x.x”表示其版本号。然后运行“tar xzvf jail.tar.gz &&cd jail/src”“make”命令,来编译和安装jail。在这里将jail安装到“/usr/local”目录中。
在其中的“bin”目录中提供了一些核心命令,“mk jailenv”命令用于创建“监牢”目录,并且从真实的文件系统中复制基本的软件环境。“addjailsw”命令的作用是从真实的文件系统中复制二进制可执行文件及其相关的库文件、设备文件、辅助文件的资源。“addjailuser”命令用来创建chroot“监牢”中的账户。
对于DHCP服务来说,创建“牢笼”的步骤是先执行“service dhcpd stop”命令,停止DHCP服务,并执行“mk jailenv/var/chapad”命令,创建“牢笼”目录。之后执行“addjailsw/var/chapad/-P/usr/sbin/dhcpd”命令,在“牢笼”目录中添加dhcpd程序。
对于该命令出现的警告信息,用户不必在意。因为JAIL会使用ldd功能来检查DHCPD用到的库文件。接下来执行以下命令:
mkdr -p/var/chapad/dhcp/etc
cp/etc/dhcpd.conf/root/chroot/dhcp/etc
mkdir -p/var/chapad/dhcp/var/dhcp
touch/var/chapad/dhcp/var/dhcp/dhcp.leases
将和DHCPD相关的文件复制到“监牢”目录中。其中的“/etc/dhcpd.conf”文件是DHCPD的配置文件。执行“/var/chapad/usr/sbin/dhcpd”命令,来重新启动DHCPD。之后执行“ps -ef |grep dhcpd”命令,可以看到DHCPD已经运行在上述“监牢”目录中。
让Apache在“监牢”中运行
Apache实际是安装在“/usr/local/httpd”目录中的,以Root用户(或者同权限的账户)身份启动,该Root权限的父进程会派生多个具有nobody的子进程。Apache的父进程会监听TCP 80端口,并将外界的连接请求非配给某个子进程。子进程所处的目录依然是“/usr/local/httpd”。
如果黑客对Apache的子进程攻击生效,就会利用存在目录权限设置上的漏洞,对“/usr/local/”等目录甚至整个文件系统进行渗透攻击。为了避免出现这种不利情况,可以利用Chroot机制,将Apache限定的“/usr/local/httpd”目录中运行。这样,Apache所能接触的文件只能是该目录及其子目录中的文件,即将Apache进程权限限制在文件系统中的某个目录中。
通过执行“service httpd stop”命令,可关闭Apache服务。执行“/usr/local/bin/mkjailenv/var/chapa”命令,可以针对“/var/chapa”目录来创建“监牢”。接下来执行“/usr/local/bin/addjailsw/var/chapa”命令,可以将一些基本的命令(例如ls、cp)等添加到该“监牢”中。这里需要将Apache服务器软件添加进来。
执行“addjailsw/var/chapa -P/usr/local/httpd/bin/httpd”命令,JAIL会自动调用LDD来检查httpd用到的所有库文件。LDD(Library Dependency Display,库从属关系显示)的作用是显示一个可执行程序必须使用的共享库。执行“cp -a/usr/local/httpd//var/chapa/usr/local/”命令,将和Apache相关的文件复制到“/var/chapa”。对于其他一些需要的文件,可以使用同样的方法,将其复制到上述“监牢”中。
仅仅有了“监牢”是不够的,还必须在其中添加相关的账户。例如,Apache服务就需要httpd、nobody账户的支持。
执行“useradd -d/var/chapa -s/usr/local/bin/jail httpd”命令,在真实的系统中创建名为“httpd”的账户,其Home目录为“/var/chapa”,所登录的Shell是“jail”。执行“/usr/local/bin/addjailuser/var/chapa/usr/local/httpd//usr/sbin/httpd httpd”命令,在“/var/chapa”中创建httpd账户。
使用VI命令,对“/var/chapa/usr/local/conf/httpd.conf”文件进行编辑,将其中的“User nobody”修改为“User httpd”,将“Port 80”修改为“Port 8001”。因为只有Root权限才可以将端口绑定在低于1024的端口上。
执行“/usr/local/bin/addjailsw/var/chapa -P httpd "-k start -DSSL"” “/usr/local/bin/addjailsw/var/chapa -P httpd "-k$ARGV"”命令,将保证Apache完整运行的所有库文件添加进来。执行“su -httpd &”命令,让Apache在“监牢”中运行。
访问Apache服务时,必须在网址后添加8001端口号。