1. 安装和升级
尽量选用最新的 Linux 发行版本,安装前拔掉网线,断开物理连接,
安装时建议用 custom 自定义方式安装软件包,数量以少为好,
一般来说服务器没有必要安装 X-windows,
在 lilo/grub 引导器中加入口令限制,防止能够物理接触的恶意用户
因为 Linux 安装光盘的 rescue 模式可以跳过这个限制,所以还要给bios加上密码或服务器机箱上锁
/var, /home, /usr, /root 等目录用独立的物理分区,防止垃圾数据和日志填满硬盘而导致 D.o.S 攻击.

root 账号给予强壮的口令.

安装完毕立即用 up2date 或 apt 升级系统软件,有时升级内核也是必要的,因为内核出现问题同样会给攻击者提供机会
Apt 是 Debian GNU Linux 下的一个强大的包管理工具,也可用于其他版本的 Linux.

2. 账号
如果系统中的用户比较多,可以编辑 /etc/login.defs,更改密码策略

删除系统中不必要帐户和组,
[root@ayazero /]# userdel -r username

如果不开匿名 ftp 则可以把 ftp 账号也删了

最安全的方式是本地维护,可惜不太现实,但还是需要限制 root 的远程访问,管理员可以用普通账户远程登录,
然后 su 到 root,我们可以把使用 su 的用户加到 wheel 组来提高安全性

在 /etc/pam.d/su 文件的头部加入下面两行:
auth sufficient /lib/security/pam_rootok.so debug
auth required /lib/security/pam_wheel.so group=wheel

然后把可以执行 su 的用户放入 wheel 组
[root@ayazero /]# usermod -G10 admin

编辑 /etc/securetty,注释掉所有允许 root 远程登录的控制台,然后禁止使用所有的控制台程序,
[root@ayazero /]# rm -f /etc/security/console.apps/servicename

登录采用加密的 ssh,如果管理员只从固定的终端登陆,还应限制合法 ssh 客户端的范围
防止嗅探及中间人攻击

将命令历史纪录归为零,尽可能的隐藏你做过的事情
[root@ayazero /]# unset HISTFILESIZE

3. 服务
最少服务原则,凡是不需要的服务一律注释掉
在 /etc/inetd.conf 中不需要的服务前加 "#",较高版本中已经没有 inetd 而换成了 Xinetd;
取消开机自动运行服务,把 /etc/rc.d/rc3.d 下不需要运行的服务第一个字母大写改称小写,
或者由 setup 命令启动的 GUI 界面中的 service 更改

如果你希望简单一点,可以使用 /etc/host.allow,/etc/host.deny 这两个文件,
但是本文计划用 iptables 防火墙,所以不在此详述.

4. 文件系统权限
找出系统中所有含 "s" 位的程序,把不必要得 "s" 位去掉,或者把根本不用的直接删除
[root@ayazero /]# find / -type f ( -perm -04000 -o -perm -02000 ) -exec ls -lg {}
[root@ayazero /]# chmod a-s filename

防止用户滥用及提升权限的可能性

把重要文件加上不可改变属性
[root@ayazero /]# chattr +i /etc/passwd
[root@ayazero /]# chattr +i /etc/shadow
[root@ayazero /]# chattr +i /etc/gshadow
[root@ayazero /]# chattr +i /etc/group
[root@ayazero /]# chattr +i /etc/inetd.conf
[root@ayazero /]# chattr +i /etc/httpd.conf
...............................
具体视需要而定,我怀疑现在的入侵者都知道这个命令,
有些 exploit 溢出后往 inetd.conf 写一条语句绑定 shell 在一个端口监听,
此时这条命令就起了作用,浅薄的入侵者会以为溢出不成功.

找出系统中没有属主的文件:
[root@ayazero /]# find / -nouser -o -nogroup

找出任何人都有写权限的文件和目录:
[root@ayazero /]# find / -type f ( -perm -2 -o -perm -20 ) -exec ls -lg {}
[root@ayazero /]# find / -type d ( -perm -2 -o -perm -20 ) -exec ls -ldg {}

防止入侵者向其中写入木马语句(诸如一个shell的拷贝)或继承属主权限而非法访问

找出并加固那些历来被入侵者利用的文件,比如 .rhosts

编辑 /etc/security/limits.conf,加入或改变如下行:
* hard core 0
* hard rss 5000
* hard nproc 20

5. Banner 伪装
入侵者通常通过操作系统,服务及应用程序版本来攻击,
漏洞列表和攻击程序也是按此来分类,所以我们有必要作点手脚来加大入侵的难度

更改 /etc/issue,因为 reboot 后重新加载,所以编辑 /ect/rc.d/rc.local
# This will overwrite /etc/issue at every boot. So, make any changes you
# want to make to /etc/issue here or you will lose them when you reboot.
#echo "" > /etc/issue
#echo "$R" >> /etc/issue
#echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue
#
#cp -f /etc/issue /etc/issue.net
#echo >> /etc/issue
把以上行前的 "#" 去掉

Apache 不回显版本:
apache 的配置文件,找到 ServerTokens 和 ServerSignature 两个 directive,修改默认属性:
#ServerTokens Full
ServerTokens Prod <----------
#ServerSignature On
ServerSignature Off &lt;----------

修改 uname
拿出 uname.c 的源码,找到如下行
print_element (PRINT_SYSNAME, name.sysname);//操作系统名如 linux
print_element (PRINT_NODENAME, name.nodename);//主机名
print_element (PRINT_RELEASE, name.release);//发行版本,如:2.4.20-18
print_element (PRINT_VERSION, name.version);//
print_element (PRINT_MACHINE, name.machine);//机器类型,如i686
print_element (PRINT_PROCESSOR, processor);//处理器类型

可以修改为
print_element (PRINT_SYSNAME,"HP-UX");
.......
编译后替换 /bin/uname

其他服务及程序的修改可以查看其配置文件或者源码
不要改太多,否则会给系统管理带来×××烦。

6. Iptales 防火墙规则
假设我们的服务器 server1 运行 apache,sshd (sshd 可以不运行在标准端口,配置文件中能修改)
eth0 网卡接 Internet,eth1 连接 LAN,管理员在家中拨号登陆到 server2 (其私用网络 IP 为 192.168.0.12),再登陆 server1
[roor@ayazero root]# iptables -A INPUT -i eth1 -s 192.168.0.12 -p tcp --dport 22 -j ACCEPT
为防止 IP spoofing 的可能,还可以绑定 server2 的网卡地址:
sh-2.05b# iptables -A INPUT -i eth1 -s 192.168.0.12 --mac-source 01:68:4B:91:CC:B7 -p tcp --dport 22 -j ACCEPT
不过好像也很少有入侵者能够做到这种地步,而且没什么利用的价值

[root@ayazero root]# iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
[root@ayazero root]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@ayazero root]# iptables -A INPUT -j DROP

对攻击有所了解的人都知道“端口重定向+反向管道”的美妙结合来穿越防火墙的例子吧
这种技巧已经运用太广,而危害很大
为了对抗这种难以防御的攻击,我们必须以牺牲一定的易用性为代价
[root@ayazero root]# iptables -A OUTPUT -o eth0 -p tcp --syn -j DROP
以上规则将阻止由内而外的 TCP 主动连接
另外,用 tftp 或其他客户端反向攫取文件的攻击行为也很普遍,
由于 tftp 以及其他一些工具依赖 UDP,所以现在要把它彻底抹煞掉
[root@ayazero root]# iptables -A OUTPUT -o eth0 -p udp -j DROP
PS: 在更新系统和调试网络时需要把这两条规则临时去掉
因为入侵的本质就是通过文本或图形界面在标准或非标准端口得到目标操作系统的 shell,
所以,这不仅能阻止反向管道本身,还能免疫很多入侵技巧
不过对一般的系统管理员而言,这太苛刻了!

iptables 的一些攻击对策
Syn-flood protection:
[root@ayazero foo]# iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

Furtive port scanner:
[root@ayazero foo]# iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT

Ping of death:
[root@ayazero foo]# iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

此外,iptables 还能配置出让一些扫描行为比如 nmap 失效的规则,应当注意:
防火墙不是万能的,当一个攻击者足够疯狂时,不要指望你的防火墙能抵挡得住 DDoS 的洪水。
关于 iptables 得更多细节,请参阅 Rusty Russell 的 Packet Filtering HOWTO

7. 完整性校验
tripwire 是一个比较有名的工具,它能帮你判断出一些重要系统文件是否被修改过
现在的 Linux 发行版中一般都带有他的开源版本,在默认的校验对象配置文件中加入一些敏感文件就可以使用

RPM MD5 校验
[root@ayazero rpm]# rpm -V
用 "man rpm" 查看命令帮助,"-V" 参数用于 MD5 校验,
注意要把 rpm 校验产生的二进制数据文件作一个硬备份,以防止其本身被修改

8. 自行扫描
普通的安全加固基本上是做完了,现在让我们来对自己做的系统做一个风险评估,
推荐使用 nessus latest version [homepage:http://www.nessus.org]
(既然从头到尾用的都是开源的东西,这里也继续节约成本,呵呵)
也许你觉得自己的系统没有问题了,但有时 nessus 还是能报告出一些问题,
比如一个第三方的 webmail 有某些安全缺陷,
如果没有问题最好,有问题我们再回去修补

9. 高级技巧
以上的措施已经足以让大多数入侵者望而却步,接下来的部分给那些对安全极度敏感的偏执狂
缓冲区溢出对策中有: stackgurad,stackshield,formatguard,heapguard,pointguard 等编译技术,
但他们需要重新编译源码,不仅麻烦而且会使系统性能有所下降.
所以这里打算用防止缓冲区溢出的内核补丁.

比较熟知的是 PaX 内核补丁,它主要通过数据区 [heap/bss/stack] 不可执行代码来防御直接覆盖返回地址后跳转到数据区执行 shellcode 的一些exploit
现在那些关于如何绕过补丁的高级 exploit 技巧已经很不神秘,但是书写那样的攻击程序通常要满足一定的条件,
即使那样的程序被写出来,函数,文件指针被成功覆盖,可能在这个系统上还是无法把那“溢出成果”传递给攻击者--仍然没有办法得到 shell 或是建立一个连接

lids
Linux 上的入侵检测和防护系统,内核补丁,通过一个比 root 更大的 ring0 权限来提供增强的访问控制,
甚至连 root 都不能改变,已有现成资料,不在此讨论。

lids 和缓冲区溢出补丁可能不兼容,欢迎知道真相的朋友告诉我

10. 日志策略
主要就是创建对入侵相关的重要日志的硬拷贝,不至于应急响应的时候连最后的黑匣子都没有
可以把他们重定向到打印机,管理员邮件,独立的日志服务器及其热备份

11. Snort 入侵检测系统
对入侵响应和安全日志要求较高的系统有此必要;
对于一般的系统而言,如果管理员根本不会去看一大堆日志,
那么它白白占用系统资源就如同鸡肋一样

12. 最后的建议
关心 bugtraq 上的漏洞列表
订阅厂商的安全公告
勤打补丁
站在攻击者的角度去思考如何防御

小结
对攻击的思考:
假设有一个技术高超的入侵者,拥有自行挖掘系统底层漏洞的能力,
他发现了 apache 的一个漏洞,并书写了 remote exploit,
这个漏洞暂时还没有出现在 bugtraq 上,处于“未知”状态,
如果入侵者试图攻击我们的系统,
他必须能挖掘一个 apache 并且是 root 级的远程溢出,
&lt;1>在 shellcode 中植入代码杀死 httpd 进程,并且把 sh 绑定在 80 端口
<2>在 80 端口复用
<3>让 shellcode 执行 iptables -F OUTPUT/INPUT,前提是他猜到有这么回事
以上均需要溢出后是 root 权限,并且是能绕过 PaX 的高级 exploit,另外 apach e杀掉后会自动重启
如果想攻击 sshd,因为 iptables 将丢弃所有来自外网访问 sshd 的包,所以即使有远程溢出 (当然别忘了 PaX),此路不通
其他的方法,如果脚本攻击可以获得允许远程登录 ssh 用户的明文口令,或是利用脚本缺陷直接添加系统账号,
这不仅需要系统 root 权限,而且 /etc/passwd 已经被 chattr 过,
满足以上条件,并且攻破 server2,就有希望得到 shell
但提升权限的机会不大!普通脚本攻击在此无效,当然如果该系统并不运行 CGI 的话,此路更是不通
诚然入侵者很可能在 http 上破坏你的脚本,不过第三方的 web 安全加固暂不在本文讨论之列
以上条件对大多数入侵者足够苛刻,可以说几乎不可能实现.
但是我们为此也牺牲了不少,并且这些措施依赖一定的环境而实现
安全性和易用性,需要读者站在自己的角度寻找他们的平衡点。