源出处:
[url]http://www.linuxsir.org/bbs/showthread.php?t=173615[/url]
Debian 安全手册
第 4 章 – 安装后
系统安装完成后您还要作一系列的工作来使系统更安全; 可以采取本章描述的一些步骤. 当然这取决于您的设定, 为了防止被物理访问,你需要参阅 修改 BIOS (再次), 第 4.3 节,设置 LILO 或 GRUB 密码, 第 4.4 节,取消 root 的提示等待, 第 4.5 节, 禁用软盘启动, 第 4.6 节, 限制控制台登录, 第 4.7 节, 和 限制系统通过控制台重起, 第 4.8 节.
在连入任何网络前, 特别是将要连入公网之前, 至少应该执行一次安全更新(参阅 进行安全更新, 第 4.2 节). 最好,您能对系统进行系统快照(参阅 生成系统快照, 第 4.18 节).
4.1 订阅 Debian 安全公告邮件列表
您可以通过订阅 debian-security-announce 邮件列表,接收 Debian 的安全公告(DSAs), 关于 Debian 安全小组的更多内容, 参阅 ee Debian 安全小组, 第 7.1 节 . 如何订阅邮件列表参见 http://lists.debian.org.
由 Debian 安全小组签署的 DSAs 也可以从 http://security.debian.org 处获取.
您还应该考虑订阅 debian安全邮件列表 以获取对 Deian 操作系统的一般性安全问题讨论. 您可以与列表里的其他系统管理员, Debian 开发者, 安全工具软件上游开发者, 取得联系,他们可以回答您的问题,并提供建议.
FIXME: 增加知识点?
4.2 进行安全更新
当软件包中发现新的安全问题时, Debian的维护者与软件开发者一般会在几天甚至几个小时内将其修复. 问题修复后,新的软件包可以从 http://security.debian.org 得到.
如果您安装了一个 Debian 的发行版, 你必须考虑到, 这个版本发行后可能因为安全问题进行了多次更新. 并且,还可能发行了些包括更新软件包的次发行版(ebian 2.2 potato 有7个次发行版.
应当注意可移动介质(如果你使用了的话)的制作日期, 并检查安全站点有无更新. 如果在系统连入互联网之前(你还没有连入互联网,不是吗?), 不能从别的系统下载安全更新包, (如果您没有外部防火墙的保护)可以考虑增加防火墙规则, 使之只能访问 security.debian.org, 进行更新. 防火墙保护下的安全更新, 附录 F 提供了一个示例配置.
注:从 Debian woody 3.0 开始, 安装完成后, 系统提供一个安全更新的提示. 如果回答’是’, 安装系统将给出相应步骤为您的系统添加安全更新的源. 如果您可以连入互联网, 就可以下载并进行安全更新. 如果您升级的 Debian 是一个早期版本或者您没有要求系统进行更新, 您应该采取下边的步骤.
手工更新系统, 将下边一行加入您的 sources.list. 这样每当您更新您的系统时, 您将自动的进行安全更新.
deb http://security.debian.org/ stable/updates main contrib non-free
然后,您可以使用 apt 或 dselect 进行升级:
* 使用 apt, 应如下操作:
# apt-get update
# apt-get upgrade
* 如果使用 dselect, 那么, 首先[U]pdate, 然后 [I]nstall 最后, [C]onfigure the installed/upgraded packages.
如果愿意, 您也可以在 /etc/apt/sources.list 中加入 deb-src 行. 更多内容参阅 apt(8).
注: 您 不 必加入如下行:
deb http://security.debian.org/debian-non-US stable/non-US main contrib non-free
这是因为 security.debian.org 位于 non-US 站点上, 并且没有单独的 non-US 内容.
4.3 修改 BIOS (再次)
还记得 选择一个BIOS密码, 第 3.1 节 吗? 很好, 当你不必从可移动介质启动的时候, 应当更改 BIOS 的默认设置,使之只能从硬盘引导. 确保不会丢失 BIOS 密码, 否则, 硬盘启动失败的时候您将不能回到 BIOS 和更改设置, 例如从 CD-ROM 启动.
其它不太安全但很方便的方式是, 设置系统从硬盘引导, 失败后则尝试从可移动介质引导. 通常是这样设置的, 因为 BIOS 密码不常使用,很容易忘记.
4.4 设置 LILO 或 GRUB 密码
任何人能很容易的通过在启动提示符后输入 init=/bin/sh 来获取 root-shell, 并修改您的密码. 修改密码后, 重新启动, 就获取了 root 权限, 可以对您的系统做任何想做的事情. 设置 LILO 或 GRUB 密码后, 不是root登录系统, 就不会获取 root 密码.
您应该为启动加载器设置一个密码以确保这类事情不会发生. 您可以选择设置全局密码或为某个影像设置密码.
对于LILO 您需要编辑配置文件文件 /etc/lilo.conf 增加 password 和 restricted, 如下所示.
image=/boot/2.2.14-vmlinuz
label=Linux
read-only
password=hackme
restricted
然后重新运行 lilo. 这样启动时, lilo 总是提示输入密码, 不管是否使用了启动参数. 缺省 /etc/lilo.conf 的权限是 root可读写,root 组只读.
如果您使用GRUB 代替 LILO, 则要编辑 /boot/grub/menu.lst, 在顶部加入下边两行(当然, 用您的密码替换hackme). 这样可以防止用户编辑起动选项. timeout 3 是指 grub 使用默认启动选项前仅有3秒延迟.
timeout 3
password hackme
您可以加密存储密码, 来更进一步强化密码. grub-md5-crypt 工具可以生成密码的hash值, 它与grub的加密算法(md5)相兼容. 使用如下方法在 grub 中指定使用 md5 格式密码:
timeout 3
password –md5 $1$bw0ez$tljnxxKLfMzmnDVaQWgjP0
–md5 参数通知 grub 执行 md5 认证过程. 后边的密码是 hackme 的 md5 转换. 使用 md5 加密方法相对于明码通讯是一个很好的选择. 更多关于 grub 密码的信息可以从 grub-doc 软件包找到.
4.5 取消 root 的提示等待
Linux 2.4 kernel 在加载了 cramfs 文件系统后, 提供一个访问 root shell 的方法, 加载cramf文件系统后, 将要启动的时候, 出现提示信息, 此时允许管理员输入具有 root 权限的可执行shell命令, 通常用于自动检测失败后手动装载模块. 缺省为 initrd 的 linuxrc. 随后出现如下信息:
Press ENTER to obtain a shell (waits 5 seconds)
可以通过编辑 /etc/mkinitrd/mkinitrd.conf 作如下设置, 来修改这一特性:
# DELAY The number of seconds the linuxrc script should wait to
# allow the user to interrupt it before the system is brought up
DELAY=0
然后重新生成您的 ramdisk image. 例如您可以这样做:
# cd /boot
# mkinitrd -o initrd.img-2.4.18-k7 /lib/modules/2.4.18-k7
或 (推荐):
# dpkg-reconfigure -plow kernel-image-2.4.x-yz
注意,Debian 3.0 woody 允许用户安装 2.4 kernel(根据喜好选择), 但是 缺省 kernel 是 2.2 (除了在某些平台上没有移植 kernel 2.2). 如果您认为这是一个 Bug, 提交前参见 Bug 145244.
4.6 禁用软盘启动
在 Debian 2.2 以前, 缺省 MBR 并不是主要引导方式, 并且有一个很容易进入系统:
* 引导时按下shift键, 出现 MBR 提示符
* 然后按 F, 这样您的系统将从软盘引导. 这样就可作为root登录.
如下命令可以改变这一特性:
lilo -b /dev/hda
现在 LILO 被装入MBR. 在 lilo.conf 中加入 boot=/dev/hda 可以达到同样效果. 还有其他的方法完全禁用MBR提示符:
install-mbr -i n /dev/hda
另一方面, 这个”后门”, 许多人还没有意识到, may save your skin as well if you run into deep trouble with your installation for whatever reasons.
FIXME 检查是否适用于2.2或2.1? INFO: The bootdisks as of Debian 2.2 do NOT install the mbr, but only LILO.
4.7 限制控制台登录
一些安全策略或许强制管理员通过控制台用普通用户/密码登录系统, 然后变成超级用户(通过su 或 sudo). 可以通过编辑 /etc/login.defs文件实现此策略, 当使用 PAM 时 则是 /etc/securetty 文件:
* login.defs, 编辑 CONSOLE 变量, 为终端定义一个允许 root 登录文件或列表
* securetty [6] by adding/removing the terminals to which root access will be allowed. If you wish to allow only local console access then you need console,ttyX [7] and vc/X (if using devfs devices), you might want to add also ttySX [8] if you are using a serial console for local access (where X is an integer, you might want to have multiple instances [9] depending on the number of virtual consoles you have enabled in /etc/inittab [10]).For more information on terminal devices read he Text-Terminal-HOWTO
使用PAM时, 可以通过配置 /etc/pam.d/login 文件来完成对于登录过程的其他更改, 这可能包括用户和组给定时间的约束. 很重要的一个特性是, 可以禁止空密码. 这一特性可以通过把下行中的 nullok 删除来实现:
auth required pam_unix.so nullok
4.8 限制系统通过控制台重起
如果您的系统配有一个键盘, 任何人(是的 任何人)都可以用它重启系统, 并不一定要登入系统. 这也许符合, 或违背了您的安全策略. 如果你想对此有所限制, 则必须检查 /etc/inittab 文件中含有 ctrlaltdel 并带有 -a 选项 (记得文件修改后运行 init q). 在Debian中缺省包含此选项:
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
现在,为了允许 一些 用户可以关闭系统, 如shutdown(8) 中所述,您需要创建 /etc/shutdown.allow 文件, 并包括那些能启动系统用户的名字. 当 使用 三指礼(a.k.a. ctrl+alt+del)时, 系统就会检查用户列表, 如果用户不在列表中, shutdown关机不会重起系统.
4.9 正确的挂接分区
当挂接 ext2 分区时, 有些附加选项您可以mount时使用, 或写入/etc/fstab. 例如,这是我的fstab中 /tmp 分区部分:
/dev/hda7 /tmp ext2 defaults,nosuid,noexec,nodev 0 2
注意选项部分的不同, 选项 nosuid 将完全忽略setuid 和setgid 位, noexec 禁止任一个程序在挂接点上运行, nodev则忽略设备. 这听起来很棒, 但是这
* 只适用于 ext2 文件系统
* 很容易绕过
选项 noexec, 禁止二进制程序直接执行, 但很容易绕过:
alex@joker:/tmp# mount | grep tmp
/dev/hda7 on /tmp type ext2 (rw,noexec,nosuid,nodev)
alex@joker:/tmp# ./date
bash: ./date: Permission denied
alex@joker:/tmp# /lib/ld-linux.so.2 ./date
Sun Dec 3 17:49:23 CET 2000
然而, 很多脚本小子会在 /tmp 目录下创建和执行文件. 如果找不到别的线索, 他们会利用这个pit. 换句话说, 用户将不会被欺骗在 /tmp 目录下执行一个木马程序, 例如偶尔将/tmp加入他的PATH中.
并且事先说明,一些脚本可能依赖于 /tmp 执行. 特别是,Debconf 就有(有过?) 这样的问题, 更多信息参见 116448.
下边是一个更加详尽的例子. 注意, 虽然: /var 可以被设为 noexec, 但一些软件[11]把它们的程序存放在 /var 目录下.nosuid 选项也是一样.
/dev/sda6 /usr ext2 defaults,ro,nodev 0 2
/dev/sda12 /usr/share ext2 defaults,ro,nodev,nosuid 0 2
/dev/sda7 /var ext2 defaults,nodev,usrquota,grpquota 0 2
/dev/sda8 /tmp ext2 defaults,nodev,nosuid,noexec,usrquota,grpquota 0 2
/dev/sda9 /var/tmp ext2 defaults,nodev,nosuid,noexec,usrquota,grpquota 0 2
/dev/sda10 /var/log ext2 defaults,nodev,nosuid,noexec 0 2
/dev/sda11 /var/account ext2 defaults,nodev,nosuid,noexec 0 2
/dev/sda13 /home ext2 rw,nosuid,nodev,exec,auto,nouser,async,usrquota,grpquota 0 2
/dev/fd0 /mnt/fd0 ext2 defaults,users,nodev,nosuid,noexec 0 0
/dev/fd0 /mnt/floppy vfat defaults,users,nodev,nosuid,noexec 0 0
/dev/hda /mnt/cdrom iso9660 ro,users,nodev,nosuid,noexec 0 0
4.9.1 将 /tmp 设为 noexec
如果将 /tmp 设为 noexec 您想要安装新软件时应当小心, 因为一些程序可能使用它进行安装. Apt 就是这样一个程序 (参见 http://bugs.debian.org/116448)是否正确配置了 APT::ExtractTemplates::TempDir (参见apt-extracttemplates(1)). 您可以在 /etc/apt/apt.conf 中设置此变量为有执行权限的其他目录.
关于 noexec, 请注意它可能会影响到您的安全. 考虑一下:
$ cp /bin/date /tmp
$ /tmp/date
(does not execute due to noexec)
$/lib/ld-linux.so.2 /tmp/date
(works since date is not executed directly)
4.9.2 设置 /usr 为只读
如果将 /usr 设为只读, 就不能在您的 Debian GNU/Linux 系统中安装新软件了. 您必须首先以读写方式重新挂接, 安装软件, 然后以只读方式重新挂接. 最新版的apt(Debian 3.0 ‘woody’) 可以设为在安装软件之前之后运行命令, 因此您也许想正确的设置它.
修改 /etc/apt/apt.conf 并加入:
DPkg
{
Pre-Invoke { “mount /usr -o remount,rw” };
Post-Invoke { “mount /usr -o remount,ro” };
};
注意 Post-Invoke 也许会失败并给出 “/usr busy” 错误信息. 这主要因为在更新过程中, 您使用了被更新的文件. 不要太在意. 确定不再被使用并且手工手动运行.
4.10 提供安全的用户访问
4.10.1 用户认证: PAM
PAM (可插入认证模块) 允许系统管理员选择应用程序如何认证用户. 注意只有在编译应用程序时加入PAM支持才可能起作用. Debian 2.2 中的大多数应用程序是内建支持的. 此外, Debian在2.2版本以前并不支持PAM. 当前任何一个 PAM-enabled 服务的默认设置都是仿照 UNIX 认证 (关于Debian中PAM服务的更多信息见/usr/share/doc/libpam0g/Debian-PAM-MiniPolicy.gz).
每个带有PAM支持的服务在 /etc/pam.d/ 下都有一个配置文件, 可以通过修改它来完成配置:
* 认证使用什么样的后端.
* 会话使用什么样的后端.
* 如何进行密码检测.
下边扯的远了点, 如果要更多了解您可以阅读Linux PAM 系统管理员的指南 (在 PAM主发行站点), 此文档在 libpam-doc 中也有提供.
PAM 为您提供了在没有用户信息的情况下进行分步认证的可能. 您可以依靠伯克利数据库和普通的passwd文件, 并且用户只有两个都通过认证才能登录. 您可以对 PAM 作更多限制, 以使您的系统更加宽松. 如过这样您要小心. 一条典型的配置行有控制域作为其第二个元素. 通常这是必需的, 当一个模块失败后,返回一个认证错误.
我喜欢首先对 PAM 应用加入 MD5 支持, 因为这有助于免受字典攻击(使用MD5密码可以更长). 应该将以下两行加入 /etc/pam.d/ 下的所有文件中, 以控制对机器的访问, 如login和ssh.
# Be sure to install libpam-cracklib first or you will not be able to log in
password required pam_cracklib.so retry=3 minlen=12 difok=3
password required pam_unix.so use_authtok nullok md5
这样,有什么作用? 第一行加载 cracklib PAM 模块, 提供密码强力检查, 提示对于一个新密码最短为12个字符, 至少有3个字符与旧口令不同, 允许3次尝试. 第二行说明标准认证模块带有 MD5 密码支持并且允许零长度密码. use_authtok 直接从前边的模块接收密码. 这个软件包依赖于 wordlist (譬如 wenglish, wspanish, wbritish…), 确保您安装适合您的语言的(否则它也许根本不起作用). [12]
可以在 /etc/pam.d/login 中加入一下行, 以确保root用户只能从本地终端登录:
auth requisite pam_securetty.so
然后您应该在 /etc/security/access.conf 中增加用户root可以登录到系统的终端. 最后如果您要设置用户限制, 至少要设置一下行.
session required pam_limits.so
这样就可以限制用户允许使用的系统资源(参见后面的 资源的限制使用: limits.conf 文件, 第 4.10.2 节). 例如, 您可以限制同时登录用户的数量(一个指定的用户组,或系统范围), 进程数量, 内存容量…
现在, 编辑 /etc/pam.d/passwd, 更改第一行. 您使用MD5密码需加入”md5″选项, 将密码的最小长度由4改为6(或更长), 并设置最大长度,如果需要的话. 例似如下行:
password required pam_unix.so nullok obscure min=6 max=11 md5
如果您想要保护 su, 以便使得只有一些用户可以使用它成为 root 用户, 您需要在系统里增加一个新组”wheel” (这是最干净的方式, 因为没有文件有这样的组许可). 添加 root 和其他应当能使用 su 的用户到这个组. 然后在 /etc/pam.d/su 中加入如下行:
auth requisite pam_wheel.so group=wheel debug
以确保只有组 “wheel” 的用户可以使用 su 成为root. 其它用户不能成为root. 事实上如果他们试图成为root将会得到一条拒绝信息.
如果您只要某些用户需要 PAM 服务的认证, 使用文件存储允许(或拒绝)登录的用户列表非常容易做到这一点. 假设你只允许用户 ‘ref’ 使用 ssh 登录. 把他加入到 /etc/sshusers-allowed 文件, 并把如下行加入/etc/pam.d/ssh:
auth required pam_listfile.so item=user sense=allow file=/etc/sshusers-allowed onerr=fail
最后,但不是至少,创建 /etc/pam.d/other 文件并加入如下内容:
auth required pam_securetty.so
auth required pam_unix_auth.so
auth required pam_warn.so
auth required pam_deny.so
account required pam_unix_acct.so
account required pam_warn.so
account required pam_deny.so
password required pam_unix_passwd.so
password required pam_warn.so
password required pam_deny.so
session required pam_unix_session.so
session required pam_warn.so
session required pam_deny.so
这些内容为所有的支持 PAM 的应用程序提供了很不错的默认设置(默认访问拒绝).
4.10.2 资源的限制使用: limits.conf 文件
您应该仔细的研究一下这个文件. 您可以在此处定义用户资源限制. 如果您使用PAM, 应该使用 /etc/security/limits.conf 而不是/etc/limits.conf.
如果您不限制资源使用, 任何可以获取合法shell的用户(甚至攻击您的系统的入侵者) 都可以耗尽系统可能提供资源如CPU, 内存, 堆栈, 等等. 这种资源耗尽问题只能通过PAM来解决. 注意, 还有别的方法对一些shell设置资源限制(例如, bash 有 ulimit, 参阅 bash(1)),但因为这些shell提供的限制方法不同且用户有可能更换shell(参阅 chsh(1)), 最好的方法还是使用 PAM 模块.
更多信息请阅读:
* 配置文章.
* Seifried 的 Securing Linux Step by Step 中 用户限制概述 部分.
* LASG 的 限制与监测用户 部分.
FIXME: 在这里提供一个经典的 limits.conf 文件
4.10.3 用户登录: 编辑 /etc/login.defs
下一步就是编辑基本的配置以影响用户登录.
FAIL_DELAY 10
这个变量可以设的更大一点, 以增强终端登录的安全性. 如果键入了一个错误的密码, 可能是攻击者(或正常用户!)必须等待10 秒才能得到新的登录提示, 如果您(手工)测试密码这将相当费时. 注意这样一个事实, 如果您使用getty以外的程序, 如 mingetty, 则这个设置并没有什么作用.
FAILLOG_ENAB yes
如果您使用这个变量, 将会记录失败的登录. 这对跟踪尝试暴力攻击者非常重要.
LOG_UNKFAIL_ENAB yes
如果您设置变量 FAILLOG_ENAB 为 yes, 您也应该将这个变量设为 yes. 这将记录登录失败的未知用户名. 如果这样设置, 要确保日志文件设置了正确的访问权限(例如 640,和适当的组设定, 如adm), 因为有时用户会把密码当作用户名输入, 你当然不希望别人看到这些内容.
SYSLOG_SU_ENAB yes
启用这个参数将在 syslog 中记录试图 su 的操作. 对于重要的机器这相当重要, 同时也要注意这可能引起保密性问题.
SYSLOG_SG_ENAB yes
与 SYSLOG_SU_ENAB 相同,但用于 sg 程序.
MD5_CRYPT_ENAB yes
如上述, MD5 密码极大的减少了字典攻击问题, 因为您可以使用更长的密码. 如果您使用slink,使用这个选项前请阅读MD5的相关文档. 否则在PAM中设置这一选项
PASS_MAX_LEN 50
如果在 PAM 配置中启用 MD5 密码选项, 这个变量值应该其设置相同.
4.10.4 限制ftp: 编辑 /etc/ftpusers
文件 /etc/ftpusers 包含不允许使用 ftp 登录主机的用户名单. 如果你真的想允许 ftp 就使用这个文件(通常不推荐使用, 因为它使用明文传送密码). 如果您的守护进程支持PAM, 您也可用它来定义某些服务对用户的允许和拒绝.
FIXME (BUG): 这是一个缺陷,Debian中缺省的 ftpusers 不包括所有管理员用户 (在base-passwd中).
4.10.5 使用 su
如果您真的需要系统中的用户变为超级用户, 例如, 安装软件包或增加用户, 您可以使用 su 命令来改变身份. 您应该设法避免任何人使用 root 登录系统, 而应当使用su. 实际上, 最好的解决办法是删除su, 而是使用sudo, 因为它比 su 有更多特点. 但是, su 在类unix系统上 更具通用性.
4.10.6 使用 sudo
sudo 允许用户执行以其他用户身份定义的命令, 甚至是 root. 如果用户被加入 /etc/sudoers 并且通过认证, 他就能运行 /etc/sudoers 定义的命令. 违规, 如密码不正确, 或者试图运行没有授权的程序, 将被记录下来, 并邮寄给root.
4.10.7 禁止管理员远程访问
您应当修改 /etc/security/access.conf 以禁止管理员远程登录. 这样用户就需要使用 su (或 sudo), 无论本地用户什么时候使用管理员权限, 就都可以进行跟踪了.
您需要在 /etc/security/access.conf 中加入如下行, 缺省的Debian 配置文件中这一行被注释掉了:
-:wheel:ALL EXCEPT LOCAL
4.10.8 限制用户访问
有时候您也许认为需要创建本地用户以执行特定的服务(pop3邮件服务或ftp). 动手前, 首先记得, Debian GNU/Linux 系统中的PAM工具允许使用各种外部地址服务器提供的libpam软件包来认证用户(radius, ldap, 等等).
如果需要建立此类用户, 且考虑到用户有可能远程访问系统. 则可以通过给用户指定一个空(/dev/null)shell(需要在 /etc/shells 中列出) 来对此作出修正. 如果您想允许用户访问系统但要限制其访问范围, 则可以使用 /bin/rbash, 这与 bash 加入 -r 选项等效 (RESTRICTED SHELL 参见bash(1)). 请注意即使是受限的shel, 用户访问交互式程序(可能允许一个执行 subshell), 也能绕过shell的限制.
Debian 当前的 unstable 版本(也许在下一个稳定版中)提供了 pam_chroot 模块(在libpam-chroot). 除此之外的另一种选择是对提供远程登录的服务进行chroot (ssh, telnet). [13]
如果您要对通过ssh访问你的系统的用户有所限制, 可以按照自己的需求来编辑 /etc/security/access.conf .
关于 chroot 用户如何通过 ssh 服务访问系统的内容参见ref id=”chroot-ssh-env”>.
4.10.9 手动用户检测
如果您是个偏执狂, 也许希望添加一个系统范围的 /etc/profile文件, 其设置的环境使得用户不能绕过shell的认证(将命令放入 $HISTFILE 变量). /etc/profile 可以作如下设置:
HISTFILE=~/.bash_history
HISTSIZE=100000000000000000
HISTFILESIZE=10000000000000000
readonly HISTFILE
readonly HISTSIZE
readonly HISTFILESIZE
export HISTFILE HISTSIZE HISTFILESIZE
这样, 用户只能在 .bash_history 中增加附加信息. 您还需要使用chattr 程序将 .bash_history 设为对所有的用户都是append-only. [14].
注意可以对每个用户的 .profile 做如此操作. 但另一方面, 您也要设置合适的权限: 有的用户的主目录并 not 隶属于用户, 但是要使他们有读取 .profile 和对 .bash_history 写操作的权限. 为 .profile 文件设置 inmutable 标志位(同样用到 chattr)是个不错的选择
如果您非常的偏执, 想要验证用户的每个命令, 您可以编辑 bash 的源码, 使其将用户所有的输入写入其他的文件. 或者使用 ttysnoop 频繁监听每个新的ttys [15] 并输入到一个文件. snoopy(参见 the project page) 是另一个有用的程序, 其对用户透明,作为一个库,提供一个execve() 调用 wrapper, 任何执行的命令都通过 authpriv 工具被 syslogd 记录(通常被存放在 /var/log/auth.log).
注意您无法通过脚本命令来完成, 因为并不是作为shell来运行的(即使您把它加入/etc/shells).
4.10.10 完全的用户验证
前边是一个简单的配置用户认证的例子, 对于复杂的系统也许没有什么用处. 如果您碰到这种情况, 您需要查看 acct, 这个记账程序, 这些会占用大量磁盘空间来记录所有用户运行的命令或系统进程.
启用记账程序, 进程和用户的所有信息都被保存在 /var/account/ 目录下, 更加详细的在 pacct 中. 记账软件包包括一些分析这些数据的工具(sa 和 ac).
4.10.11 检查用户的 profile
如果您要查看用户通常在做些什么, 可以在用户连入时使用包括所有登录信息的 wtmp 数据库. 有几个工具可以处理这个文件, 其中sac可以对每个用户产生一个profile 文件,显示此用户经常登录的时间段.
如果您启用了记账系统, 您还可以用其提供的工具来确定用户的登录时间和执行的命令.
4.10.12 设置用户的umask
根据您的用户策略, 您也许想修改用户间分享信息的方法, 即新建文件的默认权限. 这可以通过正确设定所有用户的 umask 来实现. 您可以在 /etc/limits.conf, /etc/profile, /etc/csh.cshrc, /etc/csh.login, /etc/zshrc 或者其他的配置文件(依赖与您系统中安装的shell)中设定 UMASK. 这些文件最后一个装载的优先级最高. 顺序是: PAM 的 limits.conf,用户 shell 的系统缺省设置, 用户的shell(他的 ~/.profile, ~/.bash_profile…)
Debian 的缺省 umask 设置是 022, 这意味着, 文件(和目录)可由组用户和系统里的其他用户读取和访问. 如果您觉得对于系统来说这样太过宽松, 则需要修改所有 shell (和PAM)的 umask 设定, 不要忘记修改 /etc/skel/ 下的文件, 因为这些是使用adduser创建用户的默认设置.
注, 然而只要用户愿意, 他们可以修改自己的 umask 设置, 使得限制更宽松,或更加苛刻.
4.10.13 限制用户查看/访问的内容
FIXME: 需要丰富内容. 讲述升级对于软件包权限的影响 (and admin this paranoid should chroot his users BTW).
如果您需要授予用户通过 shell 访问系统的权限, 应该仔细考虑清楚. 一个用户, 除非是在非常苛刻的环境下(如 chroot jail) ,可以查看有关您系统的许多信息,包括:
* /etc 下的一些配置文件. 然而, Debian 对于一些敏感文件的默认权限, 将防止对重要文件(它们也许, 例如包含密码)的访问. 要查看哪些文件只允许root用户访问, 例如以超级用户的身份运行 find /etc -type f -a -perm 600 -a -uid 0 .
* 通过查看软件包数据库, 或者查看/usr/share/doc目录, 或通过查看您系统中的二进制文件和库, 来猜测您所安装的软件包.
* 一些 /var/log 下的日志文件. 注意, 一些日志文件只允许root和adm组成员访问 (试试 find /var/log -type f -a -perm 640),一些甚至只有root有权限 (试试 find /var/log -type f -a -perm 600 -a -uid 00).
一个用户在您的系统里可以看到什么? 可能许多东西, 试试这个(先做一下深呼吸):
find / -type f -a -perm +006 2>/dev/null
find / -type d -a -perm +007 2>/dev/null
输出的为用户可以看到的文件列表和可以访问的目录.
4.10.13.1 限制用户对于其他用户信息的访问
如果您允许用户通过 shell 访问, 但是想限制其对于其他用户信息的查看. 用户通过 shell 访问会在其主目录下产生很多文件: 邮箱, 个人文件, X/GNOME/KDE 应用程序的配置文件…
在Debian中每个用户创建是都产生一个附加组, 并且没有两个用户属于同一个组. 这是缺省设置: 当userX创建时, 产生一个他所属的名为userX组. 这样可以避免因为用户组的概念, 难以对其他用户隐藏信息.
然而, 用户的 $HOME 目录创建时的权限是0775(组成员可读, 其他成员可读). 组权限不会有问题, 因为用户是这个组的唯一成员, 然而根据您的本地策略, 其他权限可能(或不)存在问题.
您可以修改规则, 使得创建的用户 $HOME 权限不同. 修改这种规则, 改变 /etc/adduser.conf 中变量 DIR_MODE 的值为0750 (其他用户不可读)即可.
用户仍然可以分享信息, 但不能直接访问他们的 $HOME 目录, 除非修改其权限.
注意, 如果网络服务器存在的话, 这将会影响用户设置个人主页(~userX), 因为网络服务器将不能读取 $HOME 目录, 而 public_html 目录就在它下面. 如果您想允许用户在他们的 ~userX/public_html 目录下发布HTML页面,则需要将 DIR_MODE 修改为 0751. 这将允许网络服务器访问该目录(其权限应该是0755)和用户发布的内容.
4.10.14 产成用户密码
很多情况下, 管理员需要创建多个账号, 并为其设置密码. 当然, 管理员可以简单的将其设为与用户账号相同, 但是这是非常不明智的. 一个比较好的办法是使用密码生成程序. Debian提供了 makepasswd, apg 和 pwgen 软件包(程序名与包名相同). Makepasswd 可以产生注重于安全而不是可读性的真正的随机密码, pwgen 则试图产生无意义但具有可读性的密码. Apg 则同时提供了这两种算法 (这个程序还有个C/S版本, 但其并不在Debian软件包中提供).
Passwd 并不允许密码的非交互式分配(因为它直接通过tty访问). 当你创建了很多用户时, 如果要修改其密码, 可以创建使用 adduser 带 –disabled-login 选项进行创建, 然后使用 chpasswd [16] (在您已经安装的 passwd 软件包中). 如果您要使用一个包含所有信息的文件进行批量创建用户的话, 许使用 newusers 会更好.
4.10.15 用户密码检查
有时用户密码可能是一个特定系统的安全中最弱的一环. 这归结于一些用户为他们的账户选择了弱密码 (越弱,则被攻击的可能性越大). 既使您创建了使用cracklib PAM 模块的检测和密码限制,如在 用户认证: PAM, 第 4.10.1 节 中所述. 用户仍然可以使用弱密码. 因为访问也许包括远程shell访问(ssh, 希望是), 一个远程攻击(在他们用其他的方法做过用户枚举之后)无法猜测用户密码是非常重要的.
系统管理员必须检查大数量用户的密码是否与本地安全策略相一致. 如何检查? 就象真正的攻击者一样去破解, 如果他可以访问经过hash的密码(/etc/shadow 文件).
管理员可以使用john 或 crack (都是暴力密码破解器) 和一个合适的字典(wordlist)[17], 来检测用户的密码, 并对检测出的密码采取相应的对策.
4.10.16 注销闲置的用户
闲置用户通常是一个安全隐患, 用户闲置, 可能因为他外出午餐, 或远程连接断掉, 但是没有重新建立. 无论什么原因,闲置用户可能导致系统受到威胁:
* 因为用户的控制台或许没有锁定,可能被入侵者所利用.
* 因为攻击者能重新加入一个关闭的网络连接并把命令发送到远端shell (如果远端shell不是被加密的,如telnet,这相当容易做到).
一些远程系统甚至因为闲置的(分离的)屏幕而受到威胁.
强制断开闲置的用户是本地安全策略的一部分. 有一些几种方式s:
* 如果用户使用 bash shell, 系统管理员可以设置 TMOUT 缺省值(参见 bash(1)), 使得shell自动断开远程的闲置用户. 注意设置时必需使用 -o 选项, 或者用户可以自行(或者不)设定.
* 安装 timeoutd 并根据您的本地安全策略配置 /etc/timeouts. 守护进程将监视闲置用户,在shell之外对其记时.
* 安装 autolog 并配置其删除闲置用户.
使用 timeoutd 或 autolog 守护进程是不错的方法, 因为, 终究, 用户可以修改其缺省shell,或运行默认shell以后,切换到其他的(未受控制的)shell.
4.11 使用 tcpwrappers
TCP wrappers 用于满足当包过滤器不存在时的访问控制的需求. TCP wrappers 允许你设定对于一个主机或域服务访问的允许或拒绝和定义一个默认规则。更多信息见 hosts_access(5).
Debian 中安装的很多服务可以:
* 通过 tcpwrapper(tcpd)服务加载
* 通过编入libwrapper 来内建支持.
一方面, 如果通过 /etc/inetd.conf配置服务(这包括 telnet, ftp, netbios, swat 和 finger), 则您会看到配置文件首先执行 /usr/sbin/tcpd. 另一方面, 既使服务没有通过 inetd 守护进程加载, 仍可将对tcp wrapper 规则的支持编译进服务. 在 Debian 系统中可以编译进tcp wrapper 的服务包括ssh, portmap, in.talk, rpc.statd, rpc.mountd, gdm, oaf (GNOME的激活精灵),nessus 等等很多.
查看使用tcpwrappers的软件包:
$ apt-cache showpkg libwrap0 | egrep ‘^[[:space:]]’ | sort -u |
sed ‘s/,libwrap0$//;s/^[[:space:]]+//’
考虑到 tcpchk 的运行. 您可以在hosts.deny 和 hosts.allow文件中增加那些与 wrapper库相连的服务. 但是, 当tcpchk 找不到那些服务时会发出警告, 因为它通过 /etc/inetd.conf 查找(manpage 不是很准确).
现在, 有一个小小的把戏, 或许可以得到一个最小入侵检测系统. 通常, 您应当有一条不错的防火墙规则作为第一行, tcp wrappers 作为防御的第二行. 这个小把戏就是在 /etc/hosts.deny 中设置一条SPAWN [18] 命令, 每当一个被拒绝的服务触发wrappers时, 就会发送邮件给root:
ALL: ALL: SPAWN (
echo -e ”
TCP Wrappers: Connection refused
By: $(uname -n)
Process: %d (pid %p)
User: %u
Host: %c
Date: $(date)
” | /usr/bin/mail -s “Connection to %d blocked” root) &
当心: 上边的例子对于短时间内建立许多连接的Dos攻击是开放的. 很多邮件就意味着很少的数据包就会浪费大量的文件I/O.
4.12 日志与警告的重要性
显而易见, 日志和警告对于一个安全的系统非常重要. 假设一个系统配置的非常完美并且99%的安全, 当1%的攻击发生时, 如果没有到位的安全工具, 首先, 检测到, 其次, 发出警告, 那么这个系统根本就不安全.
Debian GNU/Linux 提供一些完成日志分析的工具,著名的swatch, [19] logcheck or log-analysis(需要一些相关信息,并删除多余的). 如果系统就在旁边, 将系统日志信息输出到虚拟终端也非常有用. 这是有用的, 因为您能看到系统是否正常. Debian 的 /etc/syslog.conf 中注释掉了默认的配置; 去掉注释, 重起 syslogd, 就可生效了( /etc/init.d/syslogd restart):
daemon,mail.*;
news.=crit;news.=err;news.=notice;
*.=debug;*.=info;
*.=notice;*.=warn /dev/tty8
相关的日志分析太多, 这里无法完全涉及,Counterpane 的日志分析资源是不错的资料. 无论如何, 没有任何分析工具可以和最佳的分析工具相媲美: 您的脑子.
4.12.1 使用和定制 logcheck
在 Debian中, logcheck 分为三部分, logcheck(主程序), logcheck-database(程序的正则表达式库)和 logtail (打印未读的日志内容). 在 Debian 中缺省(/etc/cron.d/logcheck)logcheck系统空闲时每小说运行一次和系统重起时运行一次.
如果配置合适, 这个工具可能对于管理员发现系统的异常事件相当有用. Logcheck 可以设置为, 从日志中发现值得注意的事件, 并发送邮件. 默认安装的profile忽略事件和违规策略, 分为三种不同的设定(workstation, server, paranoid). Debian的软件包包括一个/etc/logcheck/logcheck.conf, 源自程序,用于定义检查给哪些用户发送邮件. 它还为软件包在以下目录下实现新的策略提供了一种方法: /etc/logcheck/cracking.d/_packagename_, /etc/logcheck/violations.d/_packagename_, /etc/logcheck/violations.ignore.d/_packagename_, /etc/logcheck/ignore.d.paranoid/_packagename_, /etc/logcheck/ignore.d.server/_packagename_, 和 /etc/logcheck/ignore.d.workstation/_packagename_. 但是, 并非当前的包都是如此. 如果您有一种对其他用户有用的策略. 请将其作为对应软件包的一个问题报告提交 (作为一个wishlist问题). 更多信息请参阅/usr/share/doc/logcheck/README.Debian.
最佳的配置 logcheck 的方式是安装后,编辑其配置文件/etc/logcheck/logcheck.conf 将缺省用户(root)修改为邮件接收者. 您还需要设置报告级别:logcheck-database有三种报告级别: workstation, server, paranoid. “server” 为缺省级别, paranoid只有在运行着尽可能少的服务的高安全性机器上才需要, workstation 使用于,受保护的安全性不高的机器. 如果您想补充日志文件, 将其加入/etc/logcheck/logcheck.logfiles即可. It is tuned for default syslog install.
一旦设置完成, 你也许想检查一下发送的最初几 天/周/月 的邮件. 如果您发现发送了你不希望收到的邮件, 在 /etc/logcheck/ignore.d.reportlevel/local 中添加对应于这些消息的正则表达式 (参见regex(7) and egrep(1))即可. 在 /usr/share/doc/logcheck-database/README.logcheck-database.gz 中有关于如何编写规则的解释. 这是一个不断调整的过程; 一旦发送的消息都是相关的, 即可认为您的调整完成. 注意, 如果 logcheck 没有在您的系统中发现什么相关事件它是不会给您发送邮件的,即使其在运行中(因此您也许只是每周得到一封邮件, 如果您很幸运).
4.12.2 配置警告发送地
Debian 带有一个标准的 syslog 配置(in /etc/syslog.conf), 其根据系统配置, 在适当的文件中写入日志信息. 您应该对此熟悉了; 如果不是, 请浏览一下 syslog.conf 文件和对应文档. 如果要维护一个安全系统, 您应当知道, 日志信息发送到什么地方才不会被忽视.
例如, 发送信息至控制台就是一个很棒的设定, 对生产系统很有用. 但是为多个这种系统增加一台设备作为日志主机(即从其他系统接收日志)也是非常重要.
也应当被考虑root的邮件, 许多安全控制台(象snort) 发送警告信息到root的邮箱. 这个邮箱通常是指系统创建的第一个用户(检查/etc/aliases). 注意要把root的邮件发送到他能接收的地方(本地或远程).
在您的系统里还有其他的角色账号和别名. 在一个小型系统里, 将所有这类别名指向root账号并将给root的邮件转送的系统管理员的个人邮箱应当非常简单.
FIXME: 讲述Debian系统接收/发送与安全相关的SNMP陷阱一定非常有趣. 检查:snmptraglogd, snmp 和 snmpd.
4.12.3 使用日志主机
loghost 就是收集网络中的远程系统日志的主机. 如果您的一台机器被攻击, 入侵者无法消除其痕迹, 除非他也攻占了日志主机. 如此, 日志主机应当是特别安全的. 做一台日志主机非常简单. 只需要以 syslogd -r 方式启动 syslogd, 一台新的loghost就建成了. 在Debian系统中, 通过编辑/etc/init.d/sysklogd 并修改一下内容即可完成永久配置:
SYSLOGD=””
改为
SYSLOGD=”-r”
其次, 配置其它机器发送数据到日志主机. 在/etc/syslog.conf中增加如下类似内容:
facility.level @your_loghost
查找文献, 看用什么可以替代 facility 和 level (它们不应当象这样逐字输入). 如果您要纪录远程的所有信息, 仅需这样写:
*.* @your_loghost
到您的syslog.conf文件. 远程纪录同本地纪录一样是很好的解决方案 (攻击者也许假定通过删除本地日志文件来掩盖的它的痕迹). 更多信息见 syslog(3), syslogd(8) 和 syslog.conf(5) 联机手册.
4.12.4 日志文件的权限
不仅确定如何使用警告信息很重要, 谁对日志文件(如果使用远程日志主机)有读取/修改许可也不可忽视. 在入侵事件中攻击者可以修改和禁用的安全警告没有什么价值. 并且, 您必需考虑到也许日志文件向攻击者泄漏了有关您的系统的很多信息,如果可以对其访问的话.
系统安装后, 一些日志文件的权限并不理想(但这当然取决于你的本地安全策略). 首先/var/log/lastlog和/var/log/faillog对于普通用户不应当是可读的. 在lastlog文件中您会看到最近谁登录了, 在faillog中, 您则能看到失败的登录列表. 作者推荐修改两个文件chmod 660. 检查一下您的日志文件,然后谨慎的确定对哪个 UID 不为0且不属于’adm’或’root’组的用户设置 可读/可写 权限. 您可以简单运行下边的命令, 对您的系统做出检查::
# find /var/log -type f -exec ls -l {} ; | cut -c 17-35 |sort -u
(查看/var/log 属于哪些用户)
# find /var/log -type f -exec ls -l {} ; | cut -c 26-34 |sort -u
(查看/var/log 下的文件属于什么组)
# find /var/log -perm +004
(哪些文件对所有用户可读)
# find /var/log ! -group root ! -group adm -exec ls -ld {} ;
(查看哪些文件不属于root 或 adm 组)
为了定制日志文件的创建, 您可能需要定制生成它们的程序. 如果日志文件是轮换的, 您则需要定制创建和轮换性能.
4.13 增加内核补丁
Debian GNU/Linux 为Linux 内核提供了一些增强其安全性的补丁。 它们包括:
* Linux 入侵监测(在 lids-2.2.19 包中), 由 Huagang Xie 和 Philippe Biondi 制作. 这个内核补丁通过允许您限制, 隐藏, 保护甚至是源自root的进程, 使得加固您的linux系统更加简单. 还允许您保护或隐藏某些文件, 这样即使是root也不能修改它们. 此外, 还能设置对某些特定进程的支持. 这是偏执型系统管理员不可缺少的一个补丁. 主页: http://www.lids.org
* Linux版的 POSIX 访问控制列表 (ACLs) (在 kernel-patch-acl包中). 这个内核补丁增加了访问控制列表, 一个高级的控制文件访问权限的方法. 允许您控制对文件和目录的细粒度访问. 这个补丁加进了 kernel 2.5 开发版, 并将缺省加入 kernel 2.6. 主页: http://acl.bestbits.at/
* Linux Trustees (在 trustees 包中). 这个补丁为您的内核增加一个不错的权限管理系统. 每个文件或目录都绑定特定的对象(叫做委托人), 并存放在内核内存中, 允许快速查询所有权限主页: http://trustees.sourceforge.net/
* NSA Enhanced Linux (在 selinux 包中,也可从 开发者的网站处获得)
* kernel-patch-2.2.18-openwall, Solar Designer 制作. 这是个很有用的内核限制设定, 就象一个限制连接, /tmp 目录下的 FIFO, 一个受限制的/proc文件系统, 专用文件描述处理, 非可执行用户堆栈区和其他. 主页: http://www.openwall.com/linux/
* kernel-patch-2.4-grsecurity: Grsecurity补丁,仅用于kernel 2.4 [20] , 实现了命令访问控制, 提供缓冲溢出保护, ACLs, 网络随机性(使提取操作系统指纹更加困难) 和许多其它特性.
* kernel-patch-2.2.19-harden. FIXME 增加内容.
* IPSEC 内核支持 (在 kernel-patch-freeswan 包中). 如果您想在linux下使用 IPsec 协议, 则需要这个补丁. 有了这个补丁, 您创建VPN相当容易, 即使是对windows计算机, 因为 IPsec 是一个通用标准. kernel 2.5 开发版中加入了对IPSec的支持, 这个特性将在 kernel 2.6 中成为缺省. 主页: http://www.freeswan.org. FIXME: Debian 提供的最新的 kernel 2.4 包括了从2.5中移植过来的IPSEC代码.相关评论.
* cryptoapi-core-source. 这个补丁增加了Linux内核的密码支持, 如密码和digest功能. 此功能通常用于文件系统和交换数据的加密. 注意自 2.5.45 版后, 在官方Linux内核源码中加入了相似的功能. 因此在将来的 kernel 2.6 中可能不再需要这个补丁了. 注: 在Debian的先前版本Sarge 中没有这个补丁. 主页: http://www.kerneli.org/
* cryptoloop-source. 这个补丁允许您使用crytoapi-core-source 包的功能创建 loopback 设备的加密文件系统.
* kernel-patch-int. 这个补丁也为Linux内核增加了密码支持, 在Debian的Potato发行版中得到了应用. 在Woody中不支持, 如果使用 Sarge 或更新版本, 您应该使用最新的 cryptoapi-core-source.
FIXME: 增加更多内容, 解释使用 kernel-2.x.x-patch-XXX 软件包如何将特定补丁装入Debian系统.
FIXME: 区分只适用于kernel 2.2 和只适用于 kernel 2.4 的补丁, 以及都适用的.
然而, 一些补丁仍未在Debian中提供. 如果您觉得应该包含其中的一些, 请到Work Needing and Prospective Packages查找. 其中一些是:
* PaX patch
* HAP patch
* Stealth patch
* SubDomain. 内核外围设计提供最少特权以减少对不安全程序的引入. SubDomain 完善和扩大本地存取控制. 类似于一个chroot环境, 它声称更加容易构建并且比chroot环境更加灵活. 主页: http://www.immunix.org/subdomain.html
* UserIPAcct. 这并不是真正的安全补丁, 但确实允许为您系统上的每个用户创建流量配额, 并可用于统计用户的流量. 主页: http://ramses.smeyers.be/useripacct.
4.14 保护免受缓冲溢出
缓冲溢出 是一种利用程序的边界检查缺陷(程序的问题), 通过程序输入来执行机器代码的对软件[21] 的普通攻击. 此种攻击是针对监听远程连接的服务器软件和针对可以授予用户更高特权 (setuid 或 setgid) 的本地软件, 进行指定系统的攻击.
主要有四中方法保护免受缓冲溢出:
* 给内核打补丁, 以防止堆栈的执行(可以使用 OpenWall 或 Grsecurity 补丁)
* 使用库, 譬如 libsafe, 重写易受攻击的部分, 并引入适当的检查(安装libsafe的方法参阅这里).
* 使用工具查找源码中易受攻击的片断, 并修正它.
* 重新编译源码, 引入适当的防止溢出的检查, 使用, 例如StackGuard StackGuard(通常由Immunix使用) 或者打了Stack Smashing Protector (SSP)补丁的GCC(通常由 Adamantix使用)
Debian GNU/Linux, 如 3.0 发行版, 提供了引入以上方法的软件, 这不包括对源代码的保护(但已在 Bug #213994 中提交).
注意既使 Debian 提供了带有 堆栈/缓冲溢出保护的编辑器,所有的软件也都要需要重新编译,才能引入这些特性. 实际上, Adamantix 确实如此(包括其它一些特性). 此特性对于软件稳定性的影响仍未得到确定(某些程序或处理器构架会因此崩溃).
应当清楚, 在某些情况下, 即使这样也无法防止缓存溢出, 因为有很多方法可以绕过它们, 如 phrack杂志第58期,或在CORE的 Advisory Multiple vulnerabilities in stack smashing protection technologies 中所描述的.
4.14.1 内核补丁对缓冲溢出的保护
与缓冲溢出有关的内核补丁包括 kernel 2.2 中提到的免受内核溢出的 Openwall 补丁. 至于 kernel 2.4 您则需要Grsecurity补丁(在kernel-patch-2.4-grsecurity包中) 其包括Openwall补丁, 和更多特性 (包括ACLs和网络随机性使得其使用远程网络指纹更加困难), 或Linux 安全模块(在 kernel-patch-2.4-lsm 和 kernel-patch-2.5-lsm 包中). 有关使用这些软件包的更多内容, 参阅增加内核补丁, 第 4.13 节.
4.14.2 Libsafe 保护
使用 libsafe 保护一个 Debian GNU/Linux 系统相当容易. 安装软件包和回答 Yes 以预载library即可. 然而, 应当注意, 因为这样可能会致使软件崩溃(特别是, 与旧版 libc5连接的程序),因此首先要阅读错误报告, 并使用 libsafe wrapper 程序在您的系统上对关键程序进行测试.
重要提示: Libsafe 保护当前也许不再如173227所述有效. 考虑到以前测试使用的运行环境, 并不能完全依赖它来保护您的系统.
4.14.3 程序的溢出测试
使用工具来检测溢出是有必要的, 不管怎样, 即使可以依靠来编程经验修正(和重新编译) 代码. Debian 提供, 例如: bfbtester(通过命令行和环境溢出进行暴力检测的缓冲溢出测试器) 和njamd.
4.15 文件的安全传送
在正常系统管理过程中, 通常需要从安装的系统传输文件. 从一个主机向其他主机复制文件的安全方式是使用sshd服务器软件包. 另一个可能的方式是使用ftpd-ssl, 使用加密套接字协议层加密传输的ftp服务器.
当然, 这些方法都需要特殊的客户端. Debian提供了这类客户端,如 ssh 提供了scp. 其使用如rcp, 但是是完全加密的, 因此那些坏家伙 甚至不能发现您在复制什么. 还有一个对应的服务器的ftp-ssl客户端软件包. 你可以找到这些软件的客户端, 甚至是基于其他操作系统(非Unix), putty和 winscp 是基于微软操作系统任何版本的安全复制工具.
注意, 用户可以使用 scp 对所有文件系统进行访问, 除非使用了如Chrooting ssh, 第 5.1.1 节中描述的chroot. FTP访问可以设置为chroot,基于您选择的守护进程或许更容易,如FTP 安全化, 第 5.3 节中所述. 如果担心用户浏览您的本地文件, 并想进行加密通讯, 您可以使用带有SSL支持的ftp守护进程, 或结合明码通信的ftp和VPN的设定(参阅 虚拟专用网, 第 8.5 节).
4.16 文件系统的限制和控制
4.16.1 使用配额
有一个好的配额策略是很重要的,因为它可以防止用户填满硬盘.
您可以使用两个不同的配额系统: 用户配额和组配额. 就象您所猜到的, 用户配额是指限制用户磁盘空间的占用量, 组配额则是限制组的. 在你设置配额时这一点要记清楚.
在设置配额时有几个需要考虑的关键点:
* 使得配额尽量小, 防止用户吃光您的硬盘空间.
* 使得配额足够大,防止用户抱怨或邮件配额使他们可以长时间的保留邮件.
* 在所有用户可写范围内使用配额, /home 以及 /tmp.
用户具有完全写权限的每个分区和目录都应该启用配额设置. 结合实用性和安全性, 来计算和分配这些分区和目录的可用配额大小.
那么, 现在您想使用配额了. 首先, 需要检查您是否在内核中启用配额支持. 如果没有, 您需要重新编译内核. 然后, 是否安装了控制quota的软件包. 如果没有请安装.
为每个文件系统启用配额非常简单, 仅需在 /etc/fstab文件中修改 defaults为 defaults,usrquota 即可. 如果你需要组配额, 用 grpquota 替换usrquota. 也可以同时使用. 然后在要启用配额的文件系统的根目录下创建空文件 quota.user 和 quota.group (如为 /home 文件系统 touch /home/quota.user /home/quota.group ).
通过运行/etc/init.d/quota stop;/etc/init.d/quota start重起quota. 现在配额已经运行,可以设置配额大小了.
可以运行edquota -u ref,为一个指定用户(叫做’ref’)设置配额. 可以运行 edquota -g 设置组配额. 然后设定缓冲值和限定值, 和/或 节点值, 如果需要的话.
关于配额的更多信息, 参阅配额的联机手册,和配额的 mini-howto(/usr/share/doc/HOWTO/en-html/mini/Quota.html).
您可能喜欢或者不喜欢lshell, 因为其违背FHS. 并且考虑到 pam_limits.so 能够提供相同的功能, lshell当前是处于orphaned状态的.
4.16.2 ext2 文件系统的特定属性(chattr/lsattr)
除了通常Unix的权限, ext2 和 ext3 文件系统还提供了一套特别的属性用于控制您的文件和系统. 不同于基本的权限, 这些属性并不能通过 ls -l 命令显示出来, 也不能使用chmod命令修改, 您需要额外的两个工具 lsattr 和 chattr (在e2fsprogs 包中)来管理它们. 注意, 这意味着, 您在备份系统时, 通常不能保存这些属性, 所以, 如果您对它们做了任何修改, 也许可以将其有价值部分 对应的chattr命令写入脚本, 这样就可以在以后必需恢复系统时重新设置.
在所有的属性中, 对于增强安全性最有价值的是参考字符 ‘i’ 和 ‘a’, 它们只能由超级用户设定(或删除):
* ‘i’ 属性 (‘immutable’): 带有此属性的文件, 不能被修改, 删除或重命名, 建立连接, 即使是超级用户也不能.
* ‘a’ 属性 (‘append’): 除了您能以附加的方式打开此文件外,此属性与immutable属性具有同样的效果. 这意味着, 您仍可以在文件中增加更多的内容, 但是不能修改以前的内容. 这个属性对于存储于/var/log/ 目录的日志文件特别有用, 尽管应该考虑到有时候根据日志循环脚本, 它们有可能被移动.
也可以为目录设置这些属性, 这样任何人都没有修改这个目录的内容的权限(即, 重命名或删除一个文件, …). 当用于目录时, append 属性仅允许创建文件.
很容易看出 ‘a’ 属性对于系统安全的改善, 给由非超级用户运行的程序以向文件中添加内容的权限, 而不赋予修改以前内容的权限. 另一方面, ‘i’ 属性看上去似乎并不那么有趣: 终究, 超级用户已经可以使用基本的 Unix 权限来限制对于一个文件的访问, 入侵者可以获取超级用户权限后总能使用chattr 程序删除此属性. 因此, 入侵者当发现不能删除一个文件时, 可能有点不知所措, 但是您不应当假设他是个瞎子, 毕竟他进入了您的系统! 一些手册中(包括本文档的一个早期版本)建议从系统中删除 chattr 和 lsattr 以增加安全性, 但是这种做法, 也叫做”含糊的安全性(security by obscurity)”, 应当绝对避免, 因为它提供的是假安全感.
这个问题一个安全解决方法是使用 Linux 内核能力特征, 如主动防护, 第 9.4.2.1 节所述. 这里我们所关心的是CAP_LINUX_IMMUTABLE: 如果您从能力约束集中将其删除 (例如使用命令lcap CAP_LINUX_IMMUTABLE), 将不再可能更改您系统中的任何 ‘a’ 或 ‘i’ 属性, 即使是超级用户! 如下是一个完整的操作:
1. 对您选定的文件设置 ‘a’ and ‘i’ 属性;
2. 在一个启动脚本中添加命令 lcap CAP_LINUX_IMMUTABLE (也可以是 lcap CAP_SYS_MODULE, 如在 主动防护, 第 9.4.2.1 节 中所建议的);
3. 为此脚本和其他配置文件设置’i’属性, 包括 lcap 二进制文件本身;
4. 手工执行上述命令(或重新起动您的系统确定一切如设想的一样运行).
现在能力已从系统取消了, 入侵者不改变任何被保护文件的属性了, 因此不能更改或删除这些文件. 如果他强制机器重起(这是唯一恢复能力约束集的方法), 将很容易被察觉, 并且当系统完成启动后, 能力将再次被删除. 唯一更改被保护文件的方法是以单用户模式引导系统或者使用其他的引导盘引导, 这两种方法都需要物理接触机器 !
4.16.3 文件系统的完整性检查
几个月后, 您能肯定硬盘上的 /bin/login 仍然是您安装的那个吗? 如果是一个被黑的版本, 其将输入的密码存储到隐藏的文件中, 或者以明文方式通过邮件发送到网上呢?
唯一的方法是选择一种保护措施, 每 小时/天/月(我推荐每天) 检查您现在文件的 md5sum 与以前的是否一致. 两个文件不可能有相同的md5sum(MD5为128bit强度, 两个不同文件有相同md5sum的几率大概是 1/3.4e3803), 这样即可确保您的站点安全,除非有人也黑了那台机器上的生成 md5sum 的算法. 这非常困难, 几乎是不可能的. 认真考虑这种对于文件审核的方式非常重要, 这是发现您的文件被修改的非常简单的办法. 常用的工具有 sXid, AIDE(高级入侵监测环境), TripWire (non-free;新的版本将是符合GPL), integrit 和 samhain.
安装 debsums 对检查文件系统的完整性很有帮助, 通过比较每个文件的 md5sum 与对应的debian软件包中的 md5sum. 但当心, 那些文件很容易被修改.
此外您可以用slocate替换locate. slocate 是 GNU 的 locate 的安全改进版. 使用 slocate 时, 用户只能看到他真正可以访问的文件, 并且不会显示系统中其他的文件和目录.
FIXME: 加入安装后的参考截图.
FIXME: 增加有关软件包不提供所安装程序的 debsums 的备注(不是必须的).
4.16.4 设置 setuid 检查
Debian 在 /etc/cron.daily/standard中提供了一个每日运行 cron 任务. 此 cron 任务将会运行 /usr/sbin/checksecurity 脚本, 以存储对应改变的信息.
您必需在/etc/checksecurity.conf中设置 CHECKSECURITY_DISABLE=”FALSE” 才能进行这个检查. 注意, 这是默认设置, 除非您修改了某些东西, 这选项已经被设为 “FALSE”.
默认设置并不给超级用户发送邮件, 而是在/var/log/setuid.changes中保存每日修改的拷贝. 您应当设置CHECKSECURITY_EMAIL变量(在/etc/checksecurity.conf中)值为 ‘root’, 使得其向root用户发送信息. 更多配置信息参见checksecurity(8).
4.17 安全的网络访问
FIXME. 需要更多的(Debian相关)内容
4.17.1 配置内核的网络特性
FIXME: 内容丢失
内核的许多特性都是可以通过回送信息到 /proc 下的对应文件或使用sysctl在运行过程中修改的. 通过运行 /sbin/sysctl -A 可以看到可以配置的内容和可以使用的参数, 并可通过/sbin/sysctl -w variable=value(参阅 sysctl(8))修改. 只有在很少的情况下, 需要您编辑对应的东西, 但是这样可以增加安全性. 例如:
net/ipv4/icmp_echo_ignore_broadcasts = 1
这是一个 Windows emulator 仿真器, 因为如果这个选项设为1, 它的动作就象 Windows 里的广播 ping. ICMP_ECHO 将会忽略接收的广播请求, 即什么也不做.
如果您想拦截系统里所有的 ICMP 回送请求, 启用这个配置选项:
net/ipv4/icmp_echo_ignore_all = 0
记录您网络中的地址不可用的数据包(由于错误路由):
/proc/sys/net/ipv4/conf/all/log_martians = 1
有关对 /proc/sys/net/ipv4/* 操作的更多信息, 参见 /usr/src/linux/Documentation/filesystems/proc.txt. /usr/src/linux/Documentation/networking/ip-sysctl.txt中有所有选项的详尽描述 [22].
4.17.2 配置 Syncookies
这个选项是一把双刃剑. 一方面它保护您的系统免受 syn 湮灭; 另一方面它违背了定义的标准(RFCs).
net/ipv4/tcp_syncookies = 1
如果您想要每次内核运行时都改变这个选项, 则需要在 /etc/network/options 中设置 syncookies=yes. 此设置在 /etc/init.d/networking 再次运行后起作用. 而下边的设置只对当前运行的内核有效:
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
此选项只有编译内核时启用 CONFIG_SYNCOOKIES 才会有效. 所有的 Debian 内核都是内置此选项编译的, 您可以运行下边的命令来确认:
$ sysctl -A |grep syncookies
net/ipv4/tcp_syncookies = 1
有关 TCP syncookies 的更多信息, 参阅 http://cr.yp.to/syncookies.html.
4.17.3 增强启动时网络的安全性
当设置了您需要的内核网络选项后, 那么每次重起时这些参数都会被加载. 下边的例子启用了很多前边提到的选项和其他有用的选项.
FIXME 为 sysctl.conf 提供一个实例配置文件, 而不仅仅是这个脚本(see: sysctl.conf(5)). 并将此作为字典错误提交给 procps 软件包.
在/etc/network/interface-secure(这个名字仅仅是个例子)中创建此脚本, 并从 /etc/network/interfaces 中调用, 如下:
auto eth0
iface eth0 inet static
address xxx.xxx.xxx.xxx
netmask 255.255.255.xxx
broadcast xxx.xxx.xxx.xxx
gateway xxx.xxx.xxx.xxx
pre-up /etc/network/interface-secure
# Script-name: /etc/network/interface-secure
# Modifies some default behaviour in order to secure against
# some TCP/IP spoofing & attacks
#
# Contributed by Dariusz Puchalak
#
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# broadcast echo protection enabled
echo 0 > /proc/sys/net/ipv4/ip_forward # ip forwarding disabled
echo 1 > /proc/sys/net/ipv4/tcp_syncookies # TCP syn cookie protection enabled
echo 1 >/proc/sys/net/ipv4/conf/all/log_martians # Log strange packets
# (this includes spoofed Packets, source routed Packets, redirect Packets)
# but be careful with this on heavy loaded web servers
echo 1 > /proc/sys/net/ipv4/ip_always_defrag
# defragging protection always enabled
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# bad error message protection enabled
# now ip spoofing protection
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
# and finally some more things:
# Disable ICMP Redirect Acceptance
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
# Disable Source Routed Packets
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
您还可以创建一个 init.d 脚本, 并使其在系统引导时运行(使用 update-rc.d 创建对应的 rc.d 链接) .
4.17.4 配置防火墙
为了获得防火墙支持, 保护本地系统或其他处于其后的系统, 您需要在编译内核将其启用。标准的 Debian 2.2 kernel(也是 2.2 )提供了过滤数据包的 ipchains 防火墙, 标准的 Debian 3.0 kernel(kernel 2.4) 提供了 stateful 数据包过滤的iptables(netfilter)防火墙. 更旧的 Debian 版本则需要对应的内核补丁(Debian 2.1 使用 kernel 2.0.34).
无论如何, 使用一个与 Debian 提供的不同的内核并不是一件难事. 您可以找到预编译的内核包, 然后简单的把它安装到 Debian 系统中. 您也可以通过下载 kernel-source-X 获取内核源码, 然后使用 make-kpkg 构建内核软件包.
在增加防火墙, 第 5.14 节处有关于在 Debian 中配置防火墙的更详细的讨论.
4.17.5 禁用弱客户主机问题
系统可能配置了不止一个接口在不同的网络上提供服务, 因此它们可能绑定到一个指定的IP地址上. 这通常可以防止指定的地址的服务请求. 但是, 这并不意味着(尽管这是普遍的误解, 包括我在内) 服务绑定到了指定的硬件地址(网卡). [23]
这不是 ARP 问题, 也不是 RFC 问题(它在 RFC1122, 3.3.4.2部分称作weak end host). 记住, IP 地址与物理接口无关.
在 2.2 (和更早)的内核中, 可以做如下修正:
# echo 1 > /proc/sys/net/ipv4/conf/all/hidden
# echo 1 > /proc/sys/net/ipv4/conf/eth0/hidden
# echo 1 > /proc/sys/net/ipv4/conf/eth1/hidden
…..
在最新的内核中, 还可以做如下操作:
* iptables 规则.
* 恰当的配置路由. [24]
* 内核补丁. [25]
根据本文, 将会有许多内容描述如何配置一些服务(sshd 服务, apache, 打印服务…), 使其监听指定的地址, 读者应该考虑到, 这里没有给定修正,修正不会阻止同一(本地)网络内部的访问. [26]
FIXME: 有关 bugtraq 的评论表明有 某种 Linux 方法可以绑定到一个指定的接口.
FIXME: 提交一个netbas的错误, 使得 routing fix 成为Debian标准的动作?
4.17.6 保护系统免受ARP 攻击
当您不再信任您的局域网内(经常会出现这种情况, 因为这才是安全的态度) 的其他系统时, 您需要保护自己免受各种各样的 ARP 攻击.
如您所知, ARP协议用于IP地址和MAC地址的转换. (更多细节参阅RFC826). 当您向某个IP地址发送数据包时, arp将其解析(首先查询本地ARP缓存, 如果此IP在缓存中不存在, 则进行查询广播), 得到其物理地址. 所有的 ARP 攻击都是试图欺骗您的主机, 认为主机 B 的 IP 对应于入侵者的主机的MAC地址; 那么, 所有的您发送给对应主机 B 的 IP 的数据包都被发送给入侵者的主机…
这些攻击(Cache poisonning,ARP 欺骗…)允许攻击者嗅探数据传输即使是在交换网上, 很容易的捕获连接, 将任何一个主机从网络上断开… Arp 攻击强度很高, 并且实施简单, 有这么几个工具: arpspoof (在最近的 dsniff 包中), arpmim, arpoison…
但是, 总有一个解决办法:
* 使用静态 arp 缓存. 对您的arp缓存设置 “static” 选项:
arp -s host_name hdwr_addr
对每个您网络中的重要的主机作如此设置, 确保没有人会 创建/修改这些主机的一个(假的)记录(static记录不会到期, 也不能修改), 这样arp欺骗就会被忽略.
* 检查可疑的 ARP 通讯. 您可以使用arpwatch, karpski 或其它的可以监测可疑的 arp 通讯的IDS (snort, prelude…).
* 实行确认主机MAC地址的IP通讯过滤.
4.18 生成系统快照
在系统投入使用以前, 您最好生成系统快照. 此快照可用于系统被攻击的情况下(参见攻陷之后(事件响应), 第 10 章). 然后您应该重新升级, 不管您是否进行了升级, 特别是如果您升级到了 Debian 新的发行版.
你应该使用可以设为只读的可写式移动介质保存快照, 这可能是软盘(使用后设置写保护), 或光盘(您可以使用刻录机, 这样您就可以备份不同时间的md5sum).
下边的脚本将创建这样的快照:
#!/bin/bash
/bin/mount /dev/fd0 /mnt/floppy
/bin/cp /usr/bin/md5sum /mnt/floppy
echo “Calculating md5 database”
>/mnt/floppy/md5checksums.txt
for dir in /bin/ /sbin/ /usr/bin/ /usr/sbin/ /lib/ /usr/lib/
do
find $dir -type f | xargs /usr/bin/md5sum >>/mnt/floppy/md5checksums-lib.txt
done
/bin/umount /dev/fd0
echo “post installation md5 database calculated”
注意将 md5sum 程序放到软盘上, 这样就可用于以后的系统程序的检查(防止置入木马)
快照不包括 /var/lib/dpkg/info 下的文件, 它们的 md5 哈希值包含在安装包中 (以.md5sums为扩展名的文件中). 您也可以复制这些信息,但是应当注意到:
* Debian 软件包提供的 md5sums 为其所有文件的值, 这使数据库更大 (5Mbs ~600kbs 带有图形系统的Debian系统,大约有2.5G的软件被安装)
* 不是所有的 Debian 软件包都为其安装的文件提供 md5sums, 因为这不(当前)是代理策略.
一旦生成了快照完, 您应当确保其被存储于只读介质上. 您也可以存储其备份, 将其置于磁盘上,用于每晚的cron检查比较.
4.19 其它建议
4.19.1 不要使用基于 svgalib 的软件
SVGAlib 非常受控制台爱好者的喜爱, 比如我. 但是, 过去它已被多次证明是不安全的. 发布的基于 zgv 的Exploits, 很容易获取root权限. 只要可能尽量避免使用 SVGAlib 程序
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8225414/viewspace-945934/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/8225414/viewspace-945934/