系统安装完成后您还需要做一系列的工作来使系统更安全; 可以采取本章描述的一些步骤. 当然这取决于您的设定, 为了防止被物理访问,你需要参阅 修改 BIOS (再次), 第 4.3 节,设置 LILO 或 GRUB 密码, 第 4.4 节,取消 root 的提示等待, 第 4.5 节, 禁用软盘启动, 第 4.6 节, 限制控制台登录, 第 4.7 节, 和 限制系统通过控制台重起, 第 4.8 节.
在连入任何网络前, 特别是将要连入公网之前, 至少应该执行一次安全更新(参阅 进行安全更新, 第 4.2 节). 最好, 您能对系统进行系统快照(参阅 生成系统快照, 第 4.18 节).
您可以通过订阅 debian-security-announce 邮件列表,接收 Debian 的安全公告(DSAs),
关于 Debian 安全小组的更多内容, 参阅 Debian 安全小组, 第 7.1 节.
如何订阅邮件列表参见 http://lists.debian.org
.
由 Debian 安全小组签署的 DSAs 也可以从 http://security.debian.org
处获取.
您还应该考虑订阅 debian
安全邮件列表
以获取对 Deian 操作系统的一般性安全问题讨论.
您可以与列表里的其他系统管理员, Debian 开发者, 安全工具软件上游开发者,
取得联系,他们可以回答您的问题,并提供建议.
FIXME: 增加知识点?
当软件包中发现新的安全问题时,
Debian的维护者与软件开发者一般会在几天甚至几个小时内将其修复.
问题修复后,新的软件包可以从 http://security.debian.org
得到.
如果您安装了一个 Debian 的发行版, 必须考虑到, 这个版本发行后可能因为安全问题进行了多次更新. 并且,还可能发行了些包括更新软件包的次发行版(Debian2.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 内容.
还记得 选择一个 BIOS 密码, 第 3.1 节 吗? 很好, 当你不必从可移动介质启动的时候, 应当更改 BIOS 的默认设置,使之只能从硬盘引导. 确保不会丢失 BIOS 密码, 否则, 硬盘启动失败的时候您将不能回到 BIOS 和更改设置, 例如从 CD-ROM 启动.
其它不太安全但很方便的方式是, 设置系统从硬盘引导, 失败后则尝试从可移动介质引导. 通常是这样设置的, 因为 BIOS 密码不常使用, 很容易忘记.
任何人都能很容易的通过在启动提示符后输入 <name-of-your-bootimage> 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
软件包找到.
Linux2.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
注意,Debian3.0 woody 允许用户安装 2.4 kernel(根据喜好选择),
但是 缺省 kernel 是 2.2 (除了在某些平台上没有移植 kernel2.2).
如果您认为这是一个 Bug, 提交前参见 Bug 145244
.
在 Debian2.2 以前, 缺省 MBR 并不是主要引导方式, 并且有一个很容易进入系统:
如下命令可以改变这一特性:
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: Debian 2.2 的引导盘确实没有安装 mbr, 而仅仅安装了 LILO.
一些安全策略或许强制管理员通过控制台用普通用户/密码登录系统,
然后变成超级用户(通过su
或 sudo
). 可以通过编辑
/etc/login.defs
文件实现此策略, 当使用 PAM 时则是
/etc/securetty
文件:
login.defs
, 编辑 CONSOLE 变量, 为终端定义一个允许 root
登录文件或列表
securetty
[6]
通过添加/移除它的终端来完成配置. 如果您希望只允许本地终端登录, 那么您需要
console,ttyX [7] 和 vc/X (如果使用 devfs 设备),
您可能还想添加 ttySX [8] 如果您使用串行终端进行本地访问(这里的 X 是一个整数, 根据您在
/etc/inittab
[9]
中定义的虚拟终端的数量, 您可以有多个实例 [10]). 有关终端设备的更多信息F参阅 Text-Terminal-HOWTO
使用 PAM 时, 可以通过配置 /etc/pam.d/login
文件来完成对于登录过程的其他更改, 这可能包括用户和组给定时间的约束.
很重要的一个特性是, 可以禁止空密码. 这一特性可以通过把下行中的 nullok
删除来实现:
auth required pam_unix.so nullok
如果您的系统配有一个键盘, 任何人(是的 任何人)都可以用它重启系统,
并不一定要登入系统. 这也许符合, 或违背了您的安全策略. 如果你想对此有所限制,
则必须检查 /etc/inittab
文件中含有 ctrlaltdel 并带有
-a 选项 (记得文件修改后运行 init q).
在Debian中缺省包含此选项:
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
现在, 为了允许 一些 用户可以关闭系统, 如shutdown(8)
中所述,您需要创建 /etc/shutdown.allow
文件,
并包括那些能启动系统用户的名字. 当使用 三指礼(即 ctrl+alt+del)时,
系统就会检查用户列表, 如果用户不在列表中,
shutdown
关机不会重起系统.
当挂接 ext2 分区时, 有些附加选项您可以 mount 时使用, 或写入
/etc/fstab
. 例如,这是我的fstab中 /tmp
分区部分:
/dev/hda7 /tmp ext2 defaults,nosuid,noexec,nodev 0 2
注意选项部分的不同, 选项 nosuid 将完全忽略 setuid 和 setgid 位, noexec 禁止任一个程序在挂接点上运行, nodev 则忽略设备. 这听起来很棒, 但是这
选项 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
/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)
如果将 /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" 错误信息. 这主要因为在更新过程中, 您使用了被更新的文件. 不要太在意. 确定不再被使用并且手工手动运行.
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次尝试.
这个软件包依赖于 wordlist (譬如 wenglish
, wspanish
,
wbritish
...), 确保您安装适合您的语言的(否则它也许根本不起作用).
[12]
第二行说明标准认证模块带有 MD5 密码支持并且允许零长度密码.
use_authtok 直接从前边的模块接收密码.
可以在 /etc/pam.d/login
中加入一下行, 以确保 root
用户只能从本地终端登录:
auth requisite pam_securetty.so
然后, 您需要在 /etc/securetty
中修改 root
用户可以直接登录的终端列表. 您也可以, 启用 pam_access 模块,
修改允许更常用的 /etc/security/access.conf
, 以进行 fine-tuned
的访问控制, 但是(很不幸)这缺少合适的日志信息(使用 PAM 登录不是标准化的,
特别是对于无益问题的处理). 过一会我们还会回来配置 access.conf
.
最后, 但不是最不重要, 应当在 /etc/pam.d/login
中启用下边的内容,
以进行用户资源限制. 然后您应该在 /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 的应用程序提供了很不错的默认设置(默认访问拒绝).
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
文件
/etc/login.defs
下一步就是编辑基本的配置以影响用户登录.
这个变量可以设的更大一点, 以增强终端登录的安全性. 注意这个文件不是 PAM
配置的一部分, 它是 login 和 su 程序的一个配置文件,
因此, 它不是针对这两个程序被间接调用时的协调工作的
(getty
程序提供初始 login 提示附对 login
的调用).
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 密码选项, 这个变量值应该其设置相同.
/etc/ftpusers
文件 /etc/ftpusers
包含不允许使用 ftp 登录主机的用户名单.
如果你真的想允许 ftp 就使用这个文件(通常不推荐使用, 因为它使用明文传送密码).
如果您的守护进程支持 PAM, 您也可用它来定义某些服务对用户的允许和拒绝.
FIXME(BUG): 这是一个缺陷,Debian 中缺省的 ftpusers
不包括所有管理员用户(在 base-passwd
中).
如果您真的需要系统中的用户变为超级用户, 例如, 安装软件包或增加用户, 您可以使用
su
命令来改变身份. 您应该设法避免任何人使用 root 登录系统,
而应当使用su. 实际上, 最好的解决办法是删除 su
, 而是使用
sudo
, 因为它比 su
有更多特点. 但是, su
在类unix系统上 更具通用性.
sudo
允许用户执行以其他用户身份定义的命令, 甚至是 root.
如果用户被加入 /etc/sudoers
并且通过认证, 它就能运行
/etc/sudoers
定义的命令. 违规, 如密码不正确,
或者试图运行没有授权的程序, 将被记录下来, 并邮寄给 root.
您应当修改 /etc/security/access.conf
以禁止管理员远程登录.
这样用户就需要使用 su
(或 sudo
),
无论本地用户什么时候使用管理员权限, 就都可以进行跟踪了.
您需要在 /etc/security/access.conf
中加入如下行, 缺省的 Debian
配置文件中这一行被注释掉了:
-:wheel:ALL EXCEPT LOCAL
记住, 在/etc/pam.d/
中对所有服务启用 pam_access
模块(或使用默认配置), 如果您希望自己的修改对
/etc/security/access.conf
产生影响.
有时候您也许认为需要创建本地用户以执行特定的服务(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
服务访问系统的内容参见SSH
的 chroot
环境, 附录 G.
如果您是个偏执狂, 也许希望添加一个系统范围的配置文件来来检测用户在您的系统里所做的操作. 本部分提供一些不同工具使用的小窍门.
您可以使用本 script
命令来审核用户运行的命令和这些命令的输出.
您不能把 script
配置为一个 shell(即使您把它添加到
/etc/shells
中). 但是您可以配置 shell 的初始化程序运行下边的内容:
umask 077 exec script -q -a "/var/log/sessions/$USER
当然, 如果您要在系统范围内设置, 那就意味着
shell不嗯个连续的读取个人初始化文件(因为 shell已经被 script
修改).
另一种可用的方法是在用户的初始化文件中完成这一工作(但,
这样的话用户就可能将其删除, 参阅下边的内容)
您还需要在检测目录中(这个例子中是 /var/log/sessions/
)配置此文件,
这样用户就可写入内容, 但是不能删除. 例如, 可以通过预先创建用户会话文件, 并用
chattr
设置 append-only 标志来完成这一配置.
另一个对系统管理有用的方案, 其包括日期信息:
umask 077 exec script -q -a "/var/log/sessions/$USER-`date +%Y%m%d`"
如果您想回顾一下您在 shell 中键入的内容(不是它们的输出), 则可以配置系统范围的
/etc/profile
配置环境将所有的命令保存到 history 文件.
这个系统范围的配置需要确保用户不能将这种检测删除.
这就需要您确保所有的用户都使用同样的 shell.
例如, 对于 bash, /etc/profile
文件应作类似下边的设置 [14] :
HISTFILE=~/.bash_history HISTSIZE=10000 HISTFILESIZE=999999 # Don't let the users enter commands that are ignored # in the history file HISTIGNORE="" HISTCONTROL="" readonly HISTFILE readonly HISTSIZE readonly HISTFILESIZE readonly HISTIGNORE readonly HISTCONTROL export HISTFILE HISTSIZE HISTFILESIZE HISTIGNORE HISTCONTROL
这样, 用户只能在 .bash_history
文件中增加附加信息.
您还需要使用 chattr
程序将 .bash_history
设为对所有的用户都是 append-only. [15].
注意, 您应当在每个用户的 .profile
文件引入上边的配置. 但另一方面,
您应当设置正确的权限, 以防止用户修改此文件. 这包括: 使用户的主目录并
不 隶属于用户(否则, 他就可以删除这个文件), 但同时又要使他对于
.profile
配置文件有读权限, 并对 .bash_history
文件有写权限.
前边的例子是一个配置用户检测的简单方法,
但是对于复杂系统或用户根本就不(或很少)使用 shell 的系统, 用处不大.
如果碰到这种情况, 您需要求助于acct
, 这个帐号检测工具.
这个工具会在空闲磁盘上记录用户或系统进程运行的所有命令.
当启用的帐号, 所有的有关进程和用的信息保存在 /var/account/
目录下,
更确切的是在 pacct
中.
这个帐号软件包包括一些分析这些数据的工具(sa
和 ac
).
.profile
文件设置 inmutable 标志位(同样用到 chattr
)是个不错的选择
如果您非常的偏执, 想要验证用户的每个命令, 您可以编辑 bash
的源码,
使其将用户所有的输入写入其他的文件. 或者使用 ttysnoop
频繁监听每个新的 ttys [16]
并输入到一个文件. snoopy
(参见 the project
page
) 是另一个有用的程序, 其对用户透明,作为一个库,提供一个
execve() 调用 wrapper, 任何执行的命令都通过 authpriv
工具被 syslogd
记录(通常被存放在 /var/log/auth.log
).
如果您要查看用户通常在做些什么, 可以在用户连入时使用包括所有登录信息的
wtmp
数据库. 有几个工具可以处理这个文件, 其中 sac
可以对每个用户产生一个 profile 文件,显示此用户经常登录的时间段.
如果您启用了记账系统, 您还可以用其提供的工具来确定用户的登录时间和执行的命令.
根据您的用户策略, 您也许想修改用户间分享信息的方法, 即新建文件的默认权限.
这可以通过正确设定所有用户的 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 设置, 使得限制更宽松,或更加苛刻.
FIXME: 需要丰富内容. 讲述升级对于软件包权限的影响 (顺便加入:偏执型的管理员应当
chroot
他的用户).
如果您需要授予用户通过 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
输出的为用户可以看到的文件列表和可以访问的目录.
如果您允许用户通过 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.
这将允许网络服务器访问 public_html
目录(其权限应该是0755)和用户发布的内容. 当然, 我们在这里只是讨论默认设置;
用户可以使用他们喜欢模式, 或者您可以将 web 内容放到不是用户 $HOME
目录的子目录其它的地方.
很多情况下, 管理员需要创建多个账号, 并为其设置密码. 当然,
管理员可以简单的将其设为与用户账号相同, 但是这是非常不明智的.
一个比较好的办法是使用密码生成程序. Debian提供了 makepasswd
,
apg
和 pwgen
软件包(程序名与包名相同).
Makepasswd
可以产生注重于安全而不是可读性的真正的随机密码,
pwgen
则试图产生无意义但具有可读性的密码. apg
则同时提供了这两种算法 (这个程序还有个C/S版本, 但其并不在 Debian 软件包中提供).
Passwd
并不允许密码的非交互式分配(因为它直接通过 tty 访问).
当你创建了很多用户时, 如果要修改其密码, 可以创建使用 adduser
带
--disabled-login 选项进行创建, 然后使用 chpasswd
[17] (在您已经安装的
passwd
软件包中).
如果您要使用一个包含所有信息的文件进行批量创建用户的话, 也许使用
newusers
会更好.
有时用户密码可能是一个特定系统的安全中最弱的一环.
这归结于一些用户为他们的账户选择了弱密码 (越弱,则被攻击的可能性越大).
既使您创建了使用 cracklib PAM 模块的检测和密码限制,如在 用户认证: PAM, 第 4.10.1 节 中所述.
用户仍然可以使用弱密码. 因为访问也许包括远程 shell 访问(ssh
,
希望是),
一个远程攻击(在他们用其他的方法做过用户枚举之后)无法猜测用户密码是非常重要的,
特别是如果他们不知什么原因收集到了类似用户名甚至 passwd
和
shadow
文件本身等重要信息.
系统管理员必须检查大数量用户的密码是否与本地安全策略相一致. 如何检查?
就象真正的攻击者一样去破解,
如果他可以访问经过hash的密码(/etc/shadow
文件).
管理员可以使用 john
或 crack
(都是暴力密码破解器)
和一个合适的字典(wordlist), 来检测用户的密码, 并对检测出的密码采取相应的对策.
您可以使用 apt-cache search wordlist
搜索可能提供字典的软件包.
还可以从网上的很多ftp中找到字典, 参阅 ftp://ftp.ox.ac.uk/pub/wordlists
或 ftp://ftp.cerias.purdue.edu/pub/dict
.
闲置用户通常是一个安全隐患, 用户闲置, 可能因为他外出午餐, 或远程连接断掉, 但是没有重新建立. 无论什么原因,闲置用户可能导致系统受到威胁:
telnet
,这相当容易做到).
一些远程系统甚至因为闲置的(分离的)屏幕
而受到威胁.
强制断开闲置的用户是本地安全策略的一部分. 有以下几种方式:
bash
shell, 系统管理员可以设置 TMOUT
缺省值(参见 bash(1)
), 使得shell自动断开远程的闲置用户.
注意设置时必需使用 -o 选项, 或者用户可以自行(或者不)设定.
timeoutd
并根据您的本地安全策略配置
/etc/timeouts
. 守护进程将监视闲置用户,在 shell 之外对其记时.
autolog
并配置其删除闲置用户.
使用 timeoutd
或 autolog
守护进程是不错的方法, 因为,
终究, 用户可以修改其缺省 shell,或运行默认 shell 以后,切换到其他的(未受控制的)
shell.
TCP wrappers 用于满足当包过滤器不存在时的访问控制的需求. 同时, 也很有趣和有用.
TCP wrappers
允许你设定对于一个主机或域服务访问的允许或拒绝和定义一个默认规则(这些都是在应用程序级别完成的)。更多信息见
hosts_access(5)
.
Debian 中安装的很多服务可以:
tcpd
)服务加载
一方面, 如果通过 /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
(非常有用的 CP wrappers
配置文件规则和符号检查器)的运行. 当您在 hosts.deny
和
hosts.allow
文件中添加独立的服务时(它们时 wrapper 库的符号连接),
tcpdchk
会因找不到那些服务而发出警告, 因为它通过
/etc/inetd.conf
查找(联机手册 不是很准确).
现在, 有一个小小的把戏, 或许可以得到一个最小入侵检测系统. 通常,
您应当有一条不错的防火墙规则作为第一行, tcp wrappers 作为防御的第二行.
这个小把戏就是在 /etc/hosts.deny
中设置一条 SPAWN[18] 命令,
每当一个被拒绝的服务触发 wrappers 时, 就会发送邮件给 root:
ALL: ALL: SPAWN ( \ echo -e "\n\ TCP Wrappers\: Connection refused\n\ By\: $(uname -n)\n\ Process\: %d (pid %p)\n\ User\: %u\n\ Host\: %c\n\ Date\: $(date)\n\ " | /usr/bin/mail -s "Connection to %d blocked" root) &
当心: 上边的例子对于短时间内建立许多连接的 Dos 攻击是开放的. 很多邮件就意味着很少的数据包就会浪费大量的文件 I/O.
显而易见, 日志和警告对于一个安全的系统非常重要. 假设一个系统配置的非常完美并且 99% 的安全, 当 1% 的攻击发生时, 如果没有到位的安全工具, 首先, 检测到, 其次, 发出警告, 那么这个系统根本就不安全.
Debian GNU/Linux 提供一些完成日志分析的工具,著名的 swatch
, [19] logcheck
或
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
如果想得到菜色的警告信息, 可以求助于 colorize
, ccze
和 glark
. 它们能转换日志的大部分, 但不是全部. Log Analysis
是不错的资料.
无论如何, 没有任何分析工具可以和最佳的分析工具相媲美: 您的脑子.
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
即可. 这对于默认的 syslog
安装来说是适宜的.
一旦设置完成, 你也许想检查一下发送的最初几 天/周/月 的邮件.
如果您发现发送了你不希望收到的邮件, 在
/etc/logcheck/ignore.d.reportlevel/local
中添加对应于这些消息的正则表达式 (参见regex(7)
and
egrep(1)
)即可. 在
/usr/share/doc/logcheck-database/README.logcheck-database.gz
中有关于如何编写规则的解释. 这是一个不断调整的过程; 一旦发送的消息都是相关的,
即可认为您的调整完成. 注意, 如果 logcheck
没有在您的系统中发现什么相关事件它是不会给您发送邮件的,即使其在运行中(因此您也许只是每周得到一封邮件,
如果您很幸运话).
Debian 带有一个标准的 syslog 配置(在 /etc/syslog.conf
中), 其根据系统配置, 在适当的文件中写入日志信息. 您应该对此熟悉了; 如果不是,
请浏览一下 syslog.conf
文件和对应文档. 如果要维护一个安全系统,
您应当知道日志信息发送到什么地方才不会被忽视.
例如, 发送信息至控制台就是一个很棒的设定, 对生产系统很有用. 但是为多个这种系统增加一台设备作为日志主机(即从其他系统接收日志)也是非常重要.
也应当被考虑 root 的邮件, 许多安全控制台(象 snort
) 发送警告信息到
root 的邮箱. 这个邮箱通常是指系统创建的第一个用户(检查
/etc/aliases
). 注意要把 root
的邮件发送到他能接收的地方(本地或远程).
在您的系统里还有其他的角色账号和别名. 在一个小型系统里, 将所有这类别名指向 root 账号并将给 root 的邮件转送的系统管理员的个人邮箱应当非常简单.
FIXME: 讲述 Debian 系统接收/发送与安全相关的 SNMP 陷阱一定非常有趣.
检查:snmptraglogd
, snmp
和 snmpd
.
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)
联机手册.
不仅确定如何使用警告信息很重要, 谁对日志文件(如果使用远程日志主机)有读取/修改许可也不可忽视. 在入侵事件中攻击者可以修改和禁用的安全警告没有什么价值. 并且, 您必需考虑到也许日志文件向攻击者泄漏了有关您的系统的很多信息, 如果可以对其访问的话.
系统安装后, 一些日志文件的权限并不理想(但这当然取决于你的本地安全策略). 首先
/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 组)
为了定制日志文件的创建, 您可能需要定制生成它们的程序. 如果日志文件是轮换的, 您则需要定制创建和轮换性能.
Debian GNU/Linux 为 Linux 内核提供了一些增强其安全性的补丁。 它们包括:
lids-2.2.19
包中), 由 Huagang Xie 和 Philippe
Biondi 制作. 这个内核补丁通过允许您限制, 隐藏, 保护甚至是源自 root 的进程,
使得加固您的 linux 系统更加简单. 还允许您保护或隐藏某些文件, 这样即使是 root
也不能修改它们. 此外, 还能设置对某些特定进程的支持.
这是偏执型系统管理员不可缺少的一个补丁. 主页: http://www.lids.org
kernel-patch-acl
包中). 这个内核补丁增加了访问控制列表, 一个高级的控制文件访问权限的方法.
允许您控制对文件和目录的细粒度访问. 这个补丁加进了 kernel 2.5 开发版,
并将缺省加入 kernel 2.6. 主页: http://acl.bestbits.at/
trustees
包中).
这个补丁为您的内核增加一个不错的权限管理系统.
每个文件或目录都绑定特定的对象(叫做委托人), 并存放在内核内存中,
允许快速查询所有权限主页: http://trustees.sourceforge.net/
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 增加内容.
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
查找. 其中一些是:
chroot
环境,
它声称更加容易构建并且比 chroot
环境更加灵活.
jail
相似. 主页: http://www.immunix.org/subdomain.html
http://ramses.smeyers.be/useripacct
.
缓冲溢出 是一种利用程序的边界检查缺陷(程序的问题, 通常为 C 语言), 通过程序输入来执行机器代码的对软件[21] 的普通攻击. 此种攻击是针对监听远程连接的服务器软件和针对可以授予用户更高特权 (setuid 或 setgid) 的本地软件, 进行指定系统的攻击.
主要有四中方法保护免受缓冲溢出:
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
中所描述的.
与缓冲溢出有关的内核补丁包括 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 节.
使用 libsafe
保护一个 Debian GNU/Linux 系统相当容易.
安装软件包和回答 Yes 以预载library即可. 然而, 应当注意,
因为这样可能会致使软件崩溃(特别是, 与旧版 libc5
连接的程序),因此首先要阅读 错误报告
, 并使用
libsafe
wrapper 程序在您的系统上对关键程序进行测试.
重要提示: Libsafe 保护当前也许不再如173227
所述有效.
考虑到以前测试使用的运行环境, 并不能完全依赖它来保护您的系统.
使用工具来检测溢出是有必要的, 不管怎样, 即使可以依靠来编程经验修正(和重新编译)
代码. Debian 提供, 例如:
bfbtester
(通过命令行和环境溢出进行暴力检测的缓冲溢出测试器)
和njamd
. rats
, pscan
flawfinder
和 splint
是另外一些相关的软件包.
在正常系统管理过程中, 通常需要从安装的系统传输文件.
从一个主机向其他主机复制文件的安全方式是使用 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 节).
有一个好的配额策略是很重要的,因为它可以防止用户填满硬盘.
您可以使用两个不同的配额系统: 用户配额和组配额. 就象您所猜到的, 用户配额是指限制用户磁盘空间的占用量, 组配额则是限制组的. 在你设置配额时这一点要记清楚.
在设置配额时有几个需要考虑的关键点:
/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 <group> 设置组配额. 然后设定缓冲值和限定值, 和/或 节点值, 如果需要的话.
关于配额的更多信息, 参阅配额的联机手册,和配额的
mini-howto(/usr/share/doc/HOWTO/en-html/mini/Quota.html
).
您可能喜欢或者不喜欢 lshell
, 因为其违背 FHS. 并且考虑到
pam_limits.so 能够提供相同的功能, lshell
当前是处于 orphaned
状态的.
除了通常Unix的权限, ext2 和 ext3
文件系统还提供了一套特别的属性用于控制您的文件和系统. 不同于基本的权限,
这些属性并不能通过 ls -l
命令显示出来,
也不能使用chmod
命令修改, 您需要额外的两个工具 lsattr
和 chattr
(在e2fsprogs
包中)来管理它们. 注意,
这意味着, 您在备份系统时, 通常不能保存这些属性, 所以, 如果您对它们做了任何修改,
也许可以将其有价值部分 对应的chattr
命令写入脚本,
这样就可以在以后必需恢复系统时重新设置.
在所有的属性中, 对于增强安全性最有价值的是参考字符 'i' 和 'a', 它们只能由超级用户设定(或删除):
/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' 属性, 即使是超级用户! 如下是一个完整的操作:
lcap
二进制文件本身;
现在能力已从系统取消了, 入侵者不改变任何被保护文件的属性了, 因此不能更改或删除这些文件. 如果他强制机器重起(这是唯一恢复能力约束集的方法), 将很容易被察觉, 并且当系统完成启动后, 能力将再次被删除. 唯一更改被保护文件的方法是以单用户模式引导系统或者使用其他的引导盘引导, 这两种方法都需要物理接触机器 !
几个月后, 您能肯定硬盘上的 /bin/login
仍然是您安装的那个吗?
如果是一个被黑的版本, 其将输入的密码存储到隐藏的文件中,
或者以明文方式通过邮件发送到网上呢?
唯一的方法是选择一种保护措施, 每 小时/天/月(我推荐每天) 检查您现在文件的 md5sum
与以前的是否一致. 两个文件不可能有相同的 md5sum(MD5为128bit 强度,
两个不同文件有相同 md5sum 的几率大概是 1/3.4e3803), 这样即可确保您的站点安全,
除非有人也黑了那台机器上的生成 md5sum 的算法. 这非常困难, 几乎是不可能的.
认真考虑这种对于文件审核的方式非常重要, 这是发现您的文件被修改的非常简单的办法.
常用的工具有 sXid
, AIDE
(高级入侵监测环境),
TripWire
(non-free;新的版本将是符合GPL), integrit
和
samhain
.
安装 debsums
对检查文件系统的完整性很有帮助, 通过比较每个文件的
md5sum 与对应的debian软件包中的 md5sum. 但当心, 那些文件很容易被修改.
您允许想用 locate
来索引整个文件系统, 如果这样,
您就需要考虑一下其内涵. Debian 的 locate
软件包以 nobody
用户运行, 因此只能索引所有用户都可见的文件.
如果您需要索引整个文件系统(不仅仅是 nobody 用户可见的), 可以用
slocate
替代 locate
. slocate 号称是 GNU 的 locate
的安全改进版, 事实上只是提供了附加的 文件-定位 功能,
用户只能看到他真正可以访问的文件, slocate 软件包以比 locate 更高的 privledges
运行其更新了的进程, 进行文件索引. 这样用户就可以快速的查找其可见的所有文件.
slocate 并不能查看新文件; 并基于用户的 UID 过滤输出.
FIXME: 加入安装后的参考截图.
FIXME: 增加有关软件包不提供所安装程序的 debsums 的备注(不是必须的).
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)
.
FIXME. 需要更多的(Debian相关)内容
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].
这个选项是一把双刃剑. 一方面它保护您的系统免受 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
.
当设置了您需要的内核网络选项后, 那么每次重起时这些参数都会被加载. 下边的例子启用了很多前边提到的选项和其他有用的选项.
FIXME 为 sysctl.conf
提供一个实例配置文件,
而不仅仅是这个脚本(参阅: 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 链接) .
为了获得防火墙支持, 保护本地系统或其他处于其后的系统,
您需要在编译内核将其启用。标准的 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 中配置防火墙的更详细的讨论.
系统可能配置了不止一个接口在不同的网络上提供服务, 因此它们可能绑定到一个指定的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 .....
在最新的内核中, 还可以做如下操作:
根据本文, 将会有许多内容描述如何配置一些服务( sshd 服务, apache, 打印服务...), 使其监听指定的地址, 读者应该考虑到, 这里没有给定修正,修正不会阻止同一(本地)网络内部的访问. [26]
FIXME: 有关 bugtraq 的评论表明有 某种 Linux 方法可以绑定到一个指定的接口.
FIXME: 提交一个 netbas 的错误, 使得 routing fix 成为Debian标准的动作?
当您不再信任您的局域网内(经常会出现这种情况, 因为这才是安全的态度)的其他系统时, 您需要保护自己免受各种各样的 ARP 攻击.
如您所知, ARP 协议用于 IP 地址和 MAC 地址的转换. (更多细节参阅RFC826
).
当您向某个IP地址发送数据包时, arp 将其解析(首先查询本地ARP缓存,
如果此IP在缓存中不存在, 则进行查询广播), 得到其物理地址. 所有的 ARP
攻击都是试图欺骗您的主机, 认为主机 B 的 IP 对应于入侵者的主机的 MAC 地址; 那么,
所有的您发送给对应主机 B 的 IP 的数据包都被发送给入侵者的主机...
这些攻击(Cache poisonning,ARP 欺骗...)允许攻击者嗅探数据传输即使是在交换网上,
很容易的捕获连接, 将任何一个主机从网络上断开... Arp 攻击强度很高,
并且实施简单, 有这么几个工具: arpspoof (在最近的 dsniff
包中),
arpmim
,
arpoison
...
但是, 总有一个解决办法:
arp -s host_name hdwr_addr
对每个您网络中的重要的主机作如此设置, 确保没有人会 创建/修改 这些主机的一个(假的)记录(static 记录不会到期, 也不能修改), 这样 arp 欺骗就可以被忽略.
arpwatch
, karpski
或其它的可以监测可疑的 arp 通讯的 IDS (snort
, prelude
...).
在系统投入使用以前, 您最好生成系统快照. 此快照可用于系统被攻击的情况下(参见 攻陷之后(事件响应), 第 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 为扩展名的文件中).
您也可以复制这些信息,但是应当注意到:
一旦生成了快照完, 您应当确保其被存储于只读介质上. 您也可以存储其备份,
将其置于磁盘上,用于每晚的 cron
检查比较.
SVGAlib 非常受控制台爱好者的喜爱, 比如我. 但是, 过去它已被多次证明是不安全的.
发布的基于 zgv
的 Exploits, 很容易获取root权限.
只要可能尽量避免使用 SVGAlib 程序 .
Securing Debian Manual
v3.2, Mon, 20 Jun 2005 08:01:11 +0000jfs@debian.org
etony@tom.com