Linux 入侵检测系统入门

作者:Irfan Habib

随着 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

您可以运行make [x/menu]config并从安全部分选择 LIDS 选项,并使用以下命令编译内核

make

make modules_install

(如果您将内核的任何部分配置为模块)。

将 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 的服务器

本文假设您已安装 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 Web 服务器设置访问控制

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 二进制文件。我们还需要限制对 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

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,并在当地杂志和报纸上发表了多篇关于该主题的文章。

加载 Disqus 评论