本书讲述了linux安全的方方面面,并且以一问一答的方式介绍,思路清晰。文中提供了很
多有益的安全提示,是Linux系统维护人员的必备参考书。通过本书,你能了解到linux安
全的整体概念,从系统安全到应用安全,从单机安全到网络安全。但安全问题是一个不断变
化不断更新的过程而不是一个解决方案,所以本书只是提到当时为人所发现的安全问题的介
绍,新出现的安全问题可参考该书网站的更新和网上的安全警告。
第一章 linux安全问题概述
粘着位(Sticky bit)
如果用户对目录有写权限,则可以删除其中的文件和子目录,即使该用户不是这些文件的所
有者,而且也没有读或写许可。粘着位出现执行许可的位置上,用t表示,设置了该位后,
其它用户就不以删除不属于他的文件和目录。但是该目录下的目录不继承该权限,要再设置
才可使用。
# chmod 1770 xxx
文件属性
chattr命令修改
lsattr命令列出文件属性
文件属性定义
A 不要更新atime文件,当在笔记本电脑或NFS上限制磁盘I/0流量时,很有用,除2.0
系列外,这一属性不被其它内核支持。
a 文件仅能以追加方式打开,只有root才能设置这个属性。
c 文件保存在磁盘时,内核将自动压缩该文件。
d 文件标记,使其不能被转储。
i 文件不能被修改,删除或重命名,不能创建任何指向它的链接,并不能写入任何数据。
s 删除文件时,相应的磁盘存储块清零。
S 修改文件时,对其写入进行同步。
u 删除文件时,保存其内容。
Ulimit命令
设置限制 可以把命令加到profile文件里,也可以在/etc/security/limits.conf文件中定义
限制。
命令参数
-a 显示所有限制
-c core文件大小的上限
-d 进程数据段大小的上限
-f shell所能创建的文件大小的上限
-m 驻留内存大小的上限
-s 堆栈大小的上限
-t 每秒可占用的CPU时间上限
-p 管道大小
-n 打开文件数的上限
-u 进程数的上限
-v 虚拟内存的上限
除可用Ulimit命令设置外,也可以在/etc/security/limits.conf文件中定义限制。
domino type item value
domino是以符号@开头的用户名或组名,*表示所有用户,type设置为hard or soft。item指
定想限制的资源。如cpu,core nproc or maxlogins
。value是相应的限制值。
信号
# kill -TERM XXXX 终止信号
# kill -HUP HTTPD 重读配置信号
特权端口
root用户是可绑定端口小于1024的惟一用户。可以信任来自于远程机器端口小于1024的连
接。
第二章 预防措施与从入侵中恢复
系统安全
简单的FIND命令
# find / \(-perm -02000 -o -perm -4000 \) -ls 可以找出系统中所有的setuserid and setgroupid
程序。
在最严格的情况下,可以去掉除/bin/su外所有已安装程序的setXid位。
系统安全扫描工具 cops tiger Nabou
扫描检测器
黑客入侵系统前所做的第一件事就是从网络上扫描系统,扫描检测器能及时获知,是一个良
好的入侵检测系统(IDS)
Klaxon Courtney Scanlogd PortSentry
加固系统
Bastille项目创建了一组模块来加固新近发布的REDHAT。在安装完系统后可运行该补丁,
在什么时候都可运行,不必要一定是刚安装完系统。
加固的方法是:1、下载源代码到/root目录并解包。以root身份动行InteractiveBastille.pl脚
本。在回答完问题后,程序将做出相应改动。配置完成后,该工具把其保存在BackEnd.pl
中,如果希望加固同样配置的服务器,将它复制到新服务器并运行AutomatedBastille.pl即可。
Openwall Linux补丁
它是一个内核补丁。要这些补丁起作用,用户必须重新编译和安装新的打上补丁的内核。在
某些情况下,这些内核补丁和标准linux不完全兼容,因此在决定使用前必须确信理解其含
义。
LIDS
它包括内核级的端口扫描检测程序和安全警告程序。是内核补丁(现在适用于2.2.X和2.4.X,
但以后将不再支持2.2)和系统管理工具。其特性包括:
1、高级文件保护,甚至root也不能发现和处置受LIDS保护的文件。
2、进程保护,内核拒绝向受保护的进程发送信号(例如SIGKILL),进程也可以被完全隐
藏起来,在/proc下不会存在任何痕迹。
3、更好的访问控制,更有效地使用与特权相关的权能,包括禁止root更改这些权能。
4、内置式端口扫描检测,内置于内核的扫描程序能够检测到Nmap,SATAN等工具的绝大
部分扫描。
要安装LIDS,必须下载最新的linux内核正式版和LIDS源代码。使用LIDS给内核打上补丁,
然后重新编译内核。
日志文件分析
syslogd消信可标记为特定的功能和级别,在/etc/syslog.conf文件中可以根据这两个选项来设
置消信的去向。
syslogd功能 描述
auth 安全性/验证消息(负面)
authpriv 安全性/验证消息
cron cron and at
daemon 其它系统守护进程(sshd,xinetd,pppd等)
kern 内核消息
lpr 行打印系统
mail 邮件子系统(sendmail,postfix,qmail等)
news Usenet新闻消息
syslog 内部syslog消息
user 一般用户级消息
uucp UUCP子系统
local0-local7 自定义的级别
日志级别 描述
emerg 系统已不可用
alert 必须马上采取行动
crit 危急
err 错误
warning 警告
notice 普通但重要的情形
info 通知消息
debug 调试消息
syslog.conf每一行的配置格式为
facility.loglevel logtarget,所有字段用tab隔开
例子:
daemon.notice /var/log/daemon.log 把程序发送过来的功能为daemon,优先级为notice
或更高级别的所有日志消息记录到/var/log/daemon.log文件中,可以使用*号表示匹配所有功
能或日志级别。
目标 描述
/path/to/filename 将消息附加到所指定文件的文件尾,这是最常用的情形。
@loghost 写到loghost机器上的syslog服务器。可方便把日志发来多台机器上,
|/path/to/named_pipe 写到指定的命名管道(便于用外部程序过滤消息)。
user1,user2 写到所列用户。
* 写到所有登录用户。
/dev/console 写到已命名的终端。
日志文件许可
应设置日志只为root所有和写入,同时能够被log组(或你所希望的组)读取,而其他用户
没有任何权限。一个用户在输入用户名的地方使用了口令,在登录失败时,将会把用户名(在
此例中为口令,因为用户失误)记录到日志中。然后创建一个属于log组的虚构用户,并让
所有日志检查程序以该用户而不是root运行。日志检查程序不应当以root用户运行。
可以通过日志分析软件开监控日志,如logcheck,swatch和logsurfer。但最好的工具还是管理
员自已写的脚本。
文件系统完整性检查
修改文件系统是黑客在侵入系统之后经常要做的一件事情,下面列出了经常被修改的一些文
件:
类型 例子
服务器配置文件 /etc/inetd.conf,/etc/ftpaccess
网络配置文件 /etc/host.conf,/etc/sysconfig/network
系统配置文件 /etc/ld.so.conf,/etc/nsswitch.conf
crontab /etc/cron.daily/*,/var/spool/cron/root
setuserid程序 /bin/su,/bin/ping,usr/bin/chfn,/sbin/dump
setgroupid程序 /sbin/netreport,/usr/bin/lpr,/usr/bin/write,/usr/bin/man
如果知道机器何时被入侵,就可以判断修改时,并了解哪些东西被修改了,例如想知道在9
月17日发生的侵入事件中被修改的所有文件,可以执行如下命令:
# touch 09170000 /tmp/comparison
# find / \( -newer /tmp/comparison -o -cnewer /tmp/comparison \) -ls
但记住,检查文件时间所给出的统计结果是不可靠的,touch命令可以更改任何文件的修改
时间(mtime)和访问时间(atime).
校验和
校验和是一个使用数学算法生成的字符串,可以用来判断两个文件是否相同,即使在一个文
件中只改动了一位,它们的校验和也会不同。通常
用md5sum命令。
# md5sum xxx
文件许可
通过检查文件许可,用户可以知道修改发生的时间,并判断其行为是合法,意外还是恶意的,
同时确定其对系统的影响。
生成校验和与许可数据库
在黑客入侵系统前生成文件的校验和,下面是一个快捷的perl脚本,能够使用户生成自已
的文件许可和校验和数据库(文本)。
#!/usr/bin/perl
use MD5;
require 'find.pl';
$md5 = new MD5;
@dirs = @ARGV;
for $dir ( @dirs ) { find($dir);}
sub wanted { push @files,$name;}
for $name ( sort @files ) {
($uid,$gid) = (stat $name)[4,5];
$stat = sprintf "%0o",(stat _)[2];
unless ( -f $name ) {
printf "$stat\t$uid $gid\t\t\t\t\t\t$name\n";
next;
}
$md5->reset();
open FILE,$name or print(STDERR "Can't open file $name\n"),next;
$md5->addfile(FILE);
close FILE;
$checksum = $md5->hexdigest();
printf "$stat\t$uid $gid $checksum\t$name\n";
}
生成的数据库尽量不要放在本机上,要放在其它机器上或一次写多次读(CDR)的机器上。
现有的文件完整性工具 Tripwire AIDE Nabou
如何知道系统何时被黑
发现系统被入侵的方法:
1、主页变化
2、磁盘空间的急剧减少 用df工具查看磁盘使用情况
3、频繁地使用网络 使用netstat -na 或lsof输出,检查存在什么连接
4、来自其它管理员的联系 当你的机器被用于攻击其它机器时
5、混杂模式的网络接口 如果黑客想嗅探系统中可用的网络服务,会把网络接口设置
为混杂模式(捕获所有的包)。请检查 ifconfig -a输出的promisc以确定接
口模式。
6、抹去/截断的日志文件 检查syslog
7、被破坏的utmp/wtmp
8、系统中存在的新用户 黑客通常使用与现存的用户名相近的名称以减少被发现的
机会,例如与lp近似的lpr或uucp1等。或者
黑客方言中的名字,如t00r and own3d.
9、正在运行的陌生程序
10、不能解释的CPU使用情况
11、本地用户的远程帐号被破解
12、“看起来古怪”的事情
被入侵后应采取的措施
制止损害
1、 关闭所有网络接口,使黑客对系统丧失了交互行为的能力,但那些正在运行的进程仍然
2、 会继续运行。
3、 将系统切换到单用户模式,关闭所有正式的root进程和所有用户进程,任何剩下的进程
4、 可能就来自于黑客。
3、使用未被损害的linux启动盘重启系统。以只读模式加载系统,检查系统,以查看黑客
所动的手脚。
4、进行严重损害的控制。
破坏估计
以只读模式挂上所有分区,并记录所发现的任何事情。
1、找到可疑的文件和目录 口令文件,黑客工具和任何你没有放置在系统中的目录。这
些目录在你重启前可能是不可见的。
2、定位新的setuserid程序 任何新的setXid程序(尤其是属于root的)都极有可疑。
3、检查时间戳 检查黑客入侵之后发生变化的文件。
4、阅读日志文件 检查所有日志文件。
5、验证校验和 比较黑客入侵前后的校验和数据库。
6、验证所安装的软件包 确认正确的版本,黑客可以把软件降级,以让系统使用不安
全的版本。
7、手工验证配置文件 快速浏览,以确定变化,如web以root用户运行,或在
/etc/inetd.conf中出现了额外的服务器。
8、备份文件
9、特殊工具 有很多工具可以帮助检查系统,最新的是组件是coroners toolkit。
10、通知权威机构。
在线恢复
在确定了黑客行为后,有两个选择,1、堵上漏洞并对系统被篡改部份启用备份;2、重新安
装系统。最安全的方法是完全重新安装系统。
仅仅堵上发现的漏洞并继续运行通常要快得多,但是,你可能并不能确定黑客在系统中所做
的所有事情。黑客可留下在几个月后才发作的时间炸弹,也可能修改了系统二进制代码,使
其运行不稳定。因此,我们建议的把黑客从系统中清除出去的最好方法如下:
1、对重要文件进行备份。
2、完全格式化所有驱动器,(这也是对系统进行任何改变的最佳时间,例如添加硬盘或改变
分区大小,要充分利用停工期的有利条件)
3、从头安装linux版本,并且只包含那此必需的东西。
4、对已安装的软件包进行完全升级。
5、生成校验和并将之保存在安全的地方。
6、对配置文件进行必要的手工修改。不要仅仅从备份中复制这些文件,它们可能已经被改
变。
7、从备份中复制必要的文件。
8、重新检查从备份中安装的文件,确认其没有被破坏的迹像。
9、使用另一种方法计算文件系统的校验和。
10、第一次启用网络。
对于实际或觉察到的攻击,常用的对策是取消发动攻击的机器与本机通信的能力。具体做法
有如下几种:
1、使用tcp封装器,拒绝来自黑客ip的连接。
2、使用iptables规则,退回/拒绝来自该ip地址的包。
3、创建拒绝路由表以使本机不能和相应的ip地址通信,此时,仍然可以收到来自源地址的
包,但不能响应,从而破坏相互间的通信。
4、在防火墙上创建类似的拒绝访问列表。
第三章 对机器和网络踩点
在线搜索
新闻组/邮件列表搜索
internet上有很多新闻组/邮件列表或论坛,是向知识渊博的人请教问题的好地方,但也可能
在完全无意识下泄露了系统信息。比如公司的网络拓扑结构,安全配置情况,电话号码,管
理员名字,个人信息等。
对策:
对所发贴子要再三审读,删除任何有可能被黑客利用的信息。或使用与系统不相关的帐号发
送邮件,比如申请的免费邮箱。
whois数据库
ping扫射
ping扫射是指ping指定网络中的所有ip,如果机器正在监听ip地址,就会回应ping。从而
就知道它处于活动状态。有黑客通过这种方法列出所有正在运行的机器,然后决定攻击目标。
有两种不同的ping主机方法:ICMP ping and echo ping。可以用一些工具加速ping。其中两
个最有意义:Fping and Nmap
ICMP ping方法:源机器向目的机器发送icmp echo request.如果目标机器正在运行,则会响
应icmp echo reply。
# ping -c 3 target
echo ping方法:以udp or tcp包连接到目标机器的回显端口(端口7),如果机器在运行状态,
该端口直接回显发送过来的信息。
# telnet target.example.com echo
Fping是一个直接了当的ping工具,可以在命令行列出需要ping的机器,也可以用文件方
式
# Fping -a < machinelist
如果要扫描整个网络(192.168.10.X),必须提供IP列表,在命令行用perl语句可以容量实
现。
# perl -e 'for (1..254) {print "192.168.10.$_\n"}' |fping -a -q 2>/dev/null
Nmap是一种多用途的扫描工具,内置了ping扫描功能。
# nmap -sP 192.168.10.0/24
ping扫射对策
通过配置机器(iptables等)来拒绝进入的echo request包和出去的echo reply包。从而避免
响应icmp echo request。关闭本机回显服务。在/etc/inetd.conf中注释掉以下两行
echo stream tcp nowait root internal
echo dgram udp wait root internal
再重启inetd。
dns问题
在linux上,最好的dns服务器是bind,它有几个版本,如果你是先锋派,bind9.x是最佳选择,
4.x是最稳定版本,8.x则是一个不错的过滤,大部分站点都是用这个版本。请保持bind的
版本是最新,最为它的安全漏洞较多,而且一旦发现漏洞,就会很被黑客利用。
尽量不要在配置文件中包含hinfo and txt信息。
区域传送
一般情况下,为了保证dns总是可以,每个域中,都有一个主dns机器,而其它都是次级dns,
每当dns区域发生变化时,次级dns机器就从主机器复制全部内容。系统成为次级dns的方
法是在named.conf中添加如下内容:
zone "expample.com" {
type slave;
file "slave/expample.com";
masters {xxx.xxx.xxx.xxx};
};
但是黑客也可以攫取区域文件(如果没有采取措施),下例给出使用host命令列出整个域中
所有NS,A和PTR记录的方法。
# host -t ns example.com
# host -l example.com
对策:
配置主名字服务器时,使之不允许除次级服务器外机器的区域传送。在全局默认选项中设置
如下:
option {
....
allow-transfer {xxx.xxx.xxx.xxx};
...
}
警告:必须确保在主和从服务器上都禁止区域传送,因为从服务器也能接受区域传送请求。
任何未经授权的区域传送都会被syslog记录下来。
反解析是指从ip到域名的过程。可以用host命令实现。如果大量使用真实的主机名,会给
黑客知道机器的功能。所以最好在PTR记录中使用一般的反解析名如:
xxx-xxx-xxx-xxx.example.com.
端口扫描
黑客会运行一个或多个端口扫描工具来了解目标系统提供的服务。工具主要有
netcat,strobe,nmap(best)。玩转nmap可以学到很多东西。包括自已的系统,也包括网络方面。
网络漏洞扫描程序
iss,satan,Nessus
加密文件系统
CFS,TCFS,BestCrypt,PPDD,Encrypted
第四章 社交工程、特洛伊木马和其他黑客伎俩
第五章 物理攻击
物理攻击小结
1、不要把口令或访问ID记在别人可以看到的地方。
2、不要把电话本,组织结构图,备忘录,内部手册,会议安排或内部安全策略遗忘在容量
被阅读或偷窃的地方。
3、在丢弃打印文档,电子介质或客户数据时必须谨慎从事,把敏感材料标记为“敏感”,在
处理前粉碎敏感的文件和手册。抹去电子介质中的数据,并且把所有的垃圾箱放置在照明状
况良好的保护区域。
4、在标记网络设施时必须谨慎。将这些信息记录在清楚的网络图中,并将其锁起来。
5、 使用好的屏幕保护程序,确保带有口令,并且在运行时隐藏屏幕内容。将延迟时间设置
6、 为合理值---在合理时间后就运行它。
6、必须离开系统时,锁定屏幕。
7、 使用便携机时,必须尽可能在所有时间都将其带在身边。对窃贼的那些把它从你身过分
8、 开的诡计保持警惕。对进入工作场所的每个便携机贴上标签,在带离时对其进行安全检查。
8、避免使用双重启动系统,linux的安全性取决于机器中安装的安全性最差的系统。
9、在启动加载时程序中设置保护口令,防止可能获得root权限的非法重启方式。
10、设置BIOS口令,以防止其被修改。
11,将所有敏感系统放在加锁的房间,以防止破坏。
12、使用好的加密文件系统可以防止那些获得系统权限的人看到机密数据。这应当作为安全防卫的底线。