查找 SUID/SGID 程序
寻求 root 访问权的恶意用户总是会在系统上寻找设置了 SUID 或 SGID 位的程序。就象我们在 LPI 101 系列第 3 部分中讨论的那样,这些位使程序始终作为拥有该文件的用户或组运行。有时这是程序正确运行所必需的。问题是任何程序都可能包含允许用户在不正确地使用程序时获得特权的错误。
应该仔细考虑每个程序以确定是否需要将其 SUID 或 SGID 位打开。系统上有些 SUID/SGID 程序可能是根本不需要的。
要搜索具有这样性质的程序,可使用 find 命令。例如,可以在 /usr 目录中启动对 SUID/SGID 程序的搜索:
# cd /usr # find . -type f -perm +6000 -xdev -exec ls {} \; -rwsr-sr-x 1 root root 593972 11-09 12:47 ./bin/gpg -r-xr-sr-x 1 root man 38460 01-27 22:13 ./bin/man -rwsr-xr-x 1 root root 15576 09-29 22:51 ./bin/rcp -rwsr-xr-x 1 root root 8256 09-29 22:51 ./bin/rsh -rwsr-xr-x 1 root root 29520 01-17 19:42 ./bin/chfn -rwsr-xr-x 1 root root 27500 01-17 19:42 ./bin/chsh -rwsr-xr-x 1 lp root 8812 01-15 23:21 ./bin/lppasswd -rwsr-x--- 1 root cron 10476 01-15 22:16 ./bin/crontab |
在这个清单中,我已经发现了需要更仔细检查的侯选对象:lppasswd 是 CUPS 打印软件分发版的一部分。因为没有在系统上提供打印服务,所以我会考虑除去 CUPS,那也会除去 lppasswd 程序。lppasswd 中可能没有危及安全性的错误,但为什么要在不使用的程序上冒险呢?同样地,应该关闭所有不使用的服务。您总是可以在需要时再启用它们。
用 ulimit 设置用户限制
bash 中的 ulimit 命令提供了限制特定用户的资源使用情况的方法。一旦限制降低,则在进程的生命期内无法提高该限制。此外,该限制会被所有子进程继承。结果是:可以在 /etc/profile 中调用 ulimit,而限制将以不能撤消的方式应用于所有用户(假设用户正在运行 bash 或另一个 shell,该 shell 在登录时运行 /etc/profile)。
要检索当前限制,可使用 ulimit -a:
# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited max locked memory (kbytes, -l) unlimited max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 stack size (kbytes, -s) unlimited cpu time (seconds, -t) unlimited max user processes (-u) 3071 virtual memory (kbytes, -v) unlimited |
以一种能实际提高系统安全性而不会对合法用户造成麻烦的方式设置这些限制是相当复杂的,所以调整这些设置时要小心。
用 ulimit 设置 CPU 时间限制
作为 ulimit 的一个示例,我们尝试将一个进程的 CPU 时间设置为 1 秒钟,然后用一个忙循环使它超时。一定要确保启动新的 bash 进程(象我们在下面做的那样),以在其中进行尝试;否则将被注销!
# time bash # ulimit -t 1 # while true; do true; done Killed real 0m28.941s user 0m1.990s sys 0m0.017s |
在上面的示例中,“user”时间加上“sys”时间等于该进程所用的全部 CPU 时间。当 bash 进程到达 2 秒标记时,Linux 断定它超过 1 秒的限制,因此该进程被杀掉。酷吧?
注:一秒钟只是示例而已。不要对您的用户这样做!即使几小时也是不对的,因为 X 真地很消耗时间(我当前的会话已用掉了 69+ 小时的 CPU 时间)。在实际的实现中,您可能要对某些项而不是 CPU 时间执行 ulimit。