Linux 入侵检测系统入门
随着 Linux 在各种计算环境中的使用日益增多,在基于 GNU/Linux 的系统中发现了许多安全漏洞。由于开源世界中应用程序开发的开放性,许多漏洞正在被迅速解决。但是,可能会发生补丁没有及时解决的情况,在此期间,所有运行该应用程序的系统都将暴露在外。恶意用户可能会获得 root 权限并对这些系统造成严重破坏。这就是 Linux 入侵检测系统 (LIDS) 发挥作用的地方。
LIDS 是 Linux 内核的一个补丁;它实现了访问控制和参考监视器。LIDS 通过其两个管理工具 lidsconf 和 lidsadm 进行配置。
lidsadm 是一个实用程序,允许您在终端中禁用 LIDS,以便您可以设置各种设置,这些设置在启用 LIDS 后您将无法执行,并且您可以使用此工具查看 LIDS 安装的当前状态。
lidsconf 是一个工具,允许您向某些文件(可以是二进制文件或任何其他文件)添加和删除访问控制。LIDS 将这些文件称为对象,而我们允许或禁止的功能称为主体。LIDS 覆盖了文件系统权限之类的东西。您实际上可以使用 LIDS 使您无法访问几乎任何对象,无论是文件、原始设备、内存还是 I/O,即使您尝试以 root 用户身份访问该对象。
简而言之,LIDS 是 Linux 内核的完整安全模型实现。
LIDS 的开发人员已在 INSTALL 文件中包含了安装说明。但是,我在本文中描述了主要任务。
LIDS 的稳定版本是针对 vanilla Linux 内核源代码创建的。建议仅将 LIDS 补丁应用于原始内核源代码,而不是特定于发行版的源代码,因为它可能会导致各种编译错误,因为大多数发行版都为自己的用途定制了内核。已知 LIDS 在非 i386 架构上使用时存在问题。
例如,lids-2.2.1-2.6.13.tar.gz 应应用于 2.6.13 内核。
在用以下命令修补内核后
patch -p1 /dir_to_the_patch_file/patch-lids-2.2.1-2.6.13
(如果您将内核的任何部分配置为模块)。
将 bzImage 从 /kernelpath/arch/i386/boot 复制到您的 /boot 目录,并重新初始化您的引导加载程序。重启进入您增强了 LIDS 的内核。
您可以通过键入以下命令查看 LIDS 安装的状态
lidsadm -V
如果您收到错误,则 LIDS 未安装到内核中;检查您的内核配置并重新编译。
在我们为各种服务器应用程序设置访问控制之前,这里是 lidsconf 的一般语法
lidsconf -A [-s subject] -o object [-d] [-t from-to] [-i level] -j ACTION
主体是添加功能的程序。对象可以是二进制文件、目录、套接字名称或功能。
-d 开关告诉 LIDS 域是 exec 域。-t 允许您为功能设置特定的时间依赖性,-i 定义继承级别。
-j 开关是一个动作,可以是以下之一
DENY:拒绝访问对象。
READONLY:将对象设置为只读。
APPEND:主要用于日志,这允许某个程序仅附加该文件,而不是删除它。
WRITE:允许其他二进制文件写入该文件。
GRANT:与功能结合使用,用于授予主体功能。
IGNORE 和 DISABLE:两个选项,允许您禁用在特定对象上设置任何权限,并分别禁用某些扩展功能。
LIDS 支持的功能如下,可以通过键入以下命令查看
lidsadm -h|grep CAP
CAP_CHOWN:chown/chgrp。
CAP_DAC_OVERRIDE:DAC 访问。
CAP_DAC_READ_SEARCH:DAC 读取。
CAP_FOWNER:所有者 ID,不等于用户。
ID CAP_FSETID:有效用户 ID,不等于所有者。
ID CAP_KILL:真实/有效 ID,不等于进程。
ID CAP_SETGID:set*gid(2)。
CAP_SETUID:set*uid(2)。
CAP_SETPCAP:传输功能。
CAP_LINUX_IMMUTABLE:不可变和附加文件属性。
CAP_NET_BIND_SERVICE:绑定到 1024 以下的端口。
CAP_NET_BROADCAST:广播/监听多播。
CAP_NET_ADMIN:接口/防火墙/路由更改。
CAP_NET_RAW:原始套接字。
CAP_IPC_LOCK:锁定共享内存段。
CAP_IPC_OWNER:IPC 所有权检查。
CAP_SYS_MODULE:插入和删除内核模块。
CAP_SYS_RAWIO:ioperm(2)/iopl(2) 访问。
CAP_SYS_CHROOT:chroot(2)。
CAP_SYS_PTRACE:ptrace(2)。
CAP_SYS_PACCT:进程记帐的配置。
CAP_SYS_ADMIN:大量管理内容。
CAP_SYS_BOOT:reboot(2)。
CAP_SYS_NICE:nice(2)。
CAP_SYS_RESOURCE:设置资源限制。
CAP_SYS_TIME:设置系统时间。
CAP_SYS_TTY_CONFIG:tty 配置。
CAP_MKNOD:mknod 操作。
CAP_LEASE:获取文件租约。
CAP_HIDDEN:隐藏进程。
CAP_KILL_PROTECTED:终止受保护的程序。
CAP_PROTECTED:保护进程免受信号干扰。
本文假设您已安装 LIDS 及其相关的管理工具。
我们将设置一个具有严格安全设置的系统,允许运行的服务是 MySQL、Apache 和 Bind。
下面的示例命令假定 Apache 安装位于 /usr/local/apache,日志目录为 /var/log/httpd,并且还假定您的 Apache 配置文件目录为 /etc/httpd。MySQL 假定安装在 /usr/local/mysql 中。显然,如果您的安装不同,您需要更改命令以适合您的安装。
本文的范围不包括完全保护您的系统所需的一切内容。但是,这些关于如何在 LIDS 中管理访问控制的示例应该能让您入门。
重启 LIDS 后,您可以开始向各种系统二进制文件和库添加访问控制。以下命令将 /sbin、/bin、/usr/bin 和 /lib 设置为只读
lidsconf -A -o /sbin -j READONLY lidsconf -A -o /bin -j READONLY lidsconf -A -o /usr/bin -j READONLY lidsconf -A -o /lib -j READONLY
接下来,我们为 /opt、/etc 和 /usr/local/etc 定义一些额外的访问控制,这些目录应为只读,并且我们拒绝所有对 /etc/shadow 和引导管理器文件的访问
lidsconf -A -o /etc -j READONLY lidsconf -A -o /usr/local/etc -j READONLY lidsconf -A -o /etc/shadow -j DENY lidsconf -A -o /etc/lilo.conf -j DENY
因为我们拒绝了所有对 /etc/shadow 的访问,系统将无法验证登录,因此我们需要允许 login 和 vlock 对该文件具有只读访问权限。此外,su 也应该对 /etc/shadow 文件具有只读访问权限
lidsconf -A -s /bin/login -o /etc/shadow -j READONLY lidsconf -A -s /usr/bin/vlock -o /etc/shadow -j READONLY lidsconf -A -s /bin/su -o /etc/shadow -j READONLY
我们需要为 su 设置一些其他访问控制,以便它可以使用 UID 和 GID,并访问 /etc/shadow 文件
lidsconf -A -s /bin/su -o CAP_SETUID -j GRANT lidsconf -A -s /bin/su -o CAP_SETGID -j GRANT lidsconf -A -s /bin/su -o /etc/shadow -j READONLY
现在,我们需要允许 init、login 和关联的应用程序对日志文件具有写入权限
lidsconf -A -o /var/log -j APPEND lidsconf -A -s /bin/login -o /var/log/wtmp -j WRITE lidsconf -A -s /bin/login -o /var/log/lastlog -j WRITE lidsconf -A -s /sbin/init -o /var/log/wtmp -j WRITE lidsconf -A -s /sbin/init -o /var/log/lastlog -j WRITE lidsconf -A -s /sbin/halt -o /var/log/wtmp -j WRITE lidsconf -A -s /sbin/halt -o /var/log/lastlog -j WRITE lidsconf -A -s /etc/rc.d/rc.sysinit -o /var/log/wtmp -i 1 -j WRITE lidsconf -A -s /etc/rc.d/rc.sysinit -o /var/log/lastlog -i 1 -j WRITE
现在,我们为 root 的主文件夹设置访问控制。我们只允许附加 bash 历史记录文件
f -A -o /root -j READONLY lidsconf -A -s /bin/bash -o /root/.bash_history -j APPEND
最后,我们允许 init 程序在关机时终止进程
lidsconf -A -s /sbin/init -o CAP_INIT_KILL -j GRANT lidsconf -A -s /sbin/init -o CAP_KILL -j GRANT
现在,我们允许 fstab 和 init 脚本挂载文件系统、终止进程和卸载文件系统
lidsconf -A -s/etc/fstab -o CAP_SYS_ADMIN -j 1 -j GRANT lidsconf -A -s /etc/rc.d/init.d/halt -o CAP_INIT_KILL -i 1 -j GRANT lidsconf -A -s /etc/rc.d/init.d/halt -o CAP_KILL -i 1 -j GRANT lidsconf -A -s /etc/rc.d/init.d/halt -o CAP_NET_ADMIN -i 1 -j GRANT lidsconf -A -s /etc/rc.d/init.d/halt -o CAP_SYS_ADMIN -i 1 -j GRANT
Apache 需要具有 setuid 和 setgid 功能。我们还需要允许 Apache 访问日志文件,并拒绝其他应用程序访问 httpd 二进制文件
lidsconf -A -s /usr/local/apache/bin/httpd -o CAP_SETUID -j GRANT lidsconf -A -s /usr/local/apache/bin/httpd -o CAP_SETGID -j GRANT lidsconf -A -o /etc/httpd -j DENY lidsconf -A -s /usr/local/apache/bin/httpd -o /etc/httpd -j READONLY lidsconf -A -o /usr/local/apache -j DENY lidsconf -A -s /usr/local/apache/bin/httpd -o /usr/local/apache -j READONLY lidsconf -A -o /var/log/httpd -j DENY lidsconf -A -s /usr/local/apache/bin/httpd -o /var/log/httpd -j APPEND lidsconf -A -s /usr/local/apache/bin/httpd -o /usr/local/apache/logs -j WRITE
对于 MySQL,我们需要拒绝其他应用程序访问 mysql 二进制文件。我们还需要限制对 mysql/var 目录的访问,使其仅为追加=only,并允许 mysqld 守护进程对 mysql 目录具有只读访问权限
lidsconf -A -o /usr/local/mysql/var -j APPEND lidsconf -A -o /usr/local/mysql -j DENY lidsconf -A -s /usr/local/mysql/libexec/mysqld -o /usr/local/mysql -j READONLY lidsconf -A -s /usr/local/mysql/libexec/mysqld -o /usr/local/mysql/var -j WRITE
Bind 需要许多功能才能运行
lidsconf -A -s /usr/sbin/named -o CAP_NET_BIND_SERVICE 53 -j GRANT lidsconf -A -s /usr/sbin/named -o CAP_SETPCAP -j GRANT lidsconf -A -s /usr/sbin/named -o CAP_SYS_CHROOT -j GRANT lidsconf -A -s /usr/sbin/named -o CAP_SYS_RESOURCE -j GRANT lidsconf -A -s /usr/sbin/named -o CAP_SETUID -j GRANT lidsconf -A -s /usr/sbin/named -o CAP_SETGID -j GRANT
登录是允许用户登录到 GNU/Linux 系统的程序
lidsconf -A -s /bin/login -o /etc/shadow -j READONLY lidsconf -A -s /bin/login -o CAP_SETUID -j GRANT lidsconf -A -s /bin/login -o CAP_SETGID -j GRANT lidsconf -A -s /bin/login -o CAP_CHOWN -j GRANT lidsconf -A -s /bin/login -o CAP_FSETID -j GRANT
在指定了之前的命令后,我们需要密封内核,以便系统可以充分利用 LIDS。我们将此行添加到 rc.local
lidsadm -I
重启机器以应用所有新的访问控制。使用先前提到的访问控制,您将无法运行 X 服务器,因为它使用原始 I/O,但大多数服务器无论如何都不运行 X 服务器。如果您确实需要它,请添加以下访问控制(此命令假定您的 X 服务器二进制文件位于 /usr/X11R6/bin/startx)
lidsconf -A -s /usr/X11R6/bin/startx
正如我们所见,LIDS 是 Linux 内核的强大补充,它可以完全保护您的系统,即使是 root 用户也无法入侵。LIDS 也非常易于使用。
Irfan Habib 是巴基斯坦国立科技大学的软件工程专业学生。他从高中起就对 Linux 和开源技术产生了浓厚的兴趣——从嵌入式 Linux 开发到 Web 服务,无所不包。在过去的两年里,他一直在巴基斯坦倡导 GNU/Linux,并在当地杂志和报纸上发表了多篇关于该主题的文章。