Linux 版 (精华区)

发信人: wugang (气定神闲::无欲则刚), 信区: Linux
标  题: Linux服务器装机安全快速指南 
发信站: 哈工大紫丁香 (2001年07月10日20:19:56 星期二), 站内信件

发布者:netbull 阅读次数:153  



本文以redhat6.2为例子讨论Linux服务器安装完成以后,应该马上采取哪些措施来
增强服务器的安全性。对于其他的Linux发布或者版本,这些方法也是适用的。 

一、关闭不必要的服务 

Linux的服务分为两种,一种是由inetd超级服务器来启动的,如:ftp、telnet等;
对于这些服务来说,系统并不总是运行telnetd、ftpd等服务进程,而是由inetd进
程监听这些服务的服务端口,一旦有服务请求到达就启动对应的服务进程(如:
telnetd等)来提供服务。另外一种是独立的服务器,系统一直运行有对应的服务进
程。 

关闭这两种服务的方法是不同的,对于inetd启动的进程: 

inetd超级服务器的配置文件为/etc/inetd.conf,该文件指示了inetd应该监听哪
些服务请求,并在请求时启动对应的服务。因此只要通过编辑/etc/inetd.conf文
件就可以实现关闭不需要的服务,例如希望关闭pop3服务,则在编辑/etc/inetd.
conf文件以前文件中有如下的内容: 

pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d 

要关闭pop3服务则在该行前添加注释符即可: 

#pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d 

通过编辑该文件,实现关闭不需要的服务(例如我的系统我仅仅开放了telnet和
ftp服务)以后,则需要重新启动inetd超级服务器。首先找到inetd的进程号: 

[root@aid /etc]# ps ax|grep inetd 
358 ? S 0:00 inetd 

然后重新启动inetd服务器: 

[root@aid /etc]# kill -HUP 358 

最后因为inetd.conf应该不允许普通用户读写,因此设置其访问权限为600: 

chmod 600 /etc/inetd.conf 

而且该文件应该不被任何用户修改,包括root用户。因此为了防止用户错误的修改
该文件,为该文件添加不可修改位: 

chattr +i /etc/inetd.conf 

对于独立服务器,则需要通过/usr/sbin/ntsysv命令来修改: 

只需要服务前面通过空格键来选择是否在系统启动时启动该服务就可以实现关闭某
个服务器,如:希望系统关闭dhcpd服务,则通过上下键选中该服务器,然后通过
空格键去掉该服务前[ ]内的星号即表示系统启动时不开放该服务。若希望了解某
个服务的具体含义,可以选择该服务以后按F1键来查看该服务的含义。 

设置完毕以后,只有希望打开的服务前的[ ]内才会有星号。然后通过Tab键选择
OK,按空格键。重新启动机器。 

重新启动机器以后,可以通过下面的命令来察看系统打开了哪些服务,来决定是否
已经关闭了不需要的服务,例如我仅仅希望提供telnet服务则: 

[ideal@aid ideal]$ netstat -ln 

Active Internet connections (only servers) 
Proto Recv-Q Send-Q Local Address Foreign Address State 
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN 
raw 0 0 0.0.0.0:1 0.0.0.0:* 7 
raw 0 0 0.0.0.0:6 0.0.0.0:* 7 
Active UNIX domain sockets (only servers) 
Proto RefCnt Flags Type State I-Node Path 


从上面的命令输出可以看到系统仅仅开放了23号端口,也就是telnet服务。 

二、控制使用开放的服务的用户 

在上面提到的/etc/inetd.conf的配置文件中,我们看到pop3服务配置一行的最后
两个字段为: 

/usr/sbin/tcpd ipop3d 

很显然,pop3的服务器程序为ipop3d,那么/usr/sbin/tcpd又是什么含义呢?这是
一个称为Tcp wrapper的安全程序。该程序用来在启动某个服务以前查看两个配置
文件来决定该用户是否允许使用该服务。在/etc目录下,有两个文件:hosts.deny
 hosts.allow。 

通过配置这两个文件,你可以指定哪些客户机允许使用这些服务。配置这两个文件
是通过一种简单的访问控制语言来实现的,访问控制语句的基本格式为: 程序名
列表,主机名/IP地址列表。 

程序名列表指定一个或者多个提供相应服务的程序的名字,名字之间用逗号或者空
格分隔,可以在inetd.conf文件里查看提供相应服务的程序名:如上面的文件示例
中,pop所在行的最后一项就是所需的程序名:ipop3d。 

主机名/IP地址列表指定允许或者禁止使用该服务的一个或者多个主机的标识,主
机名之间用逗号或空格分隔。程序名和主机地址都可以使用通配符,实现方便的指
定多项服务和多个主机。 当服务请求到达服务器时,访问控制软件就按照下列顺
序查询这两个文件,直到遇到一个匹配为止: 

1. 当在/etc/hosts.allow里面有一项与请求服务的主机地址项匹配,那么就允许
该主机获取该服务 
2. 否则,如果在/etc/hosts.deny里面有一项与请求服务的主机地址项匹配,就禁
止该主机使用该项服务 
3. 若均没有匹配,则允许使用该服务。若相应的配置文件不存在,访问控制软件
就认为是一个空文件,所以可以通过删除或者移走配置文件实现对所有主机关闭所
有服务。 

在文件中,空白行或者以#开头的行被忽略,你可以通过在行前加 # 实 现注释功
能。Linux提供了下面灵活的方式指定进程或者主机列表: 

1. 一个以"."起始的域名串,如 .amms.ac.cn 那么www.amms.ac.cn就和这一项匹
配成功 
2. 以.结尾的IP串如 202.37.152. 那么IP地址包括202.37.152.的主机都与这一项
匹配 
3. 格式为n.n.n.n/m.m.m.m表示网络/掩码,如果请求服务的主机的IP地址与掩码
的位与的结果等于n.n.n.n 那么该主机与该项匹配。 
4. ALL表示匹配所有可能性 
5. EXPECT表示除去后面所定义的主机。如:list_1 EXCEPT list_2 表示list_1主
机列表中除去List_2所列 出的主机 
6. LOCAL表示匹配所有主机名中不包含.的主机 

上面的几种方式只是Linux提供的方式中的几种,但是对于我们的一般应用来说是
足够了。我们通过举几个例子来说明这个问题: 

例一:我们只希望允许同一个局域网的机器使用服务器的ftp功能,而禁止互联网
上面的ftp服务请求,本地局域网由 202.39.154. 、202.39.153. 和202.39.152.
 三个网段组成。在hosts.deny文件中,我们定义禁止所有机器请求所有服务: 
ALL:ALL 在hosts.allow文件中,我们定义只允许局域网访问ftp功能: 

in.ftpd: 202.39.154 202.39.153. 202.39.152. 

这样,当非局域网的机器请求ftp服务时,就会被拒绝。而局域网的机器可以使用
ftp服务。 

ALL:ALL 

然后重新启动你的 inetd进程: 

/etc/rc.d/init.d/inet restart 

但是hosts.deny|allow文件只控制/etc/inetd.conf文件中包含的服务的访问这些
服务有/usr/bin/tcpd管 理,监听接入的网络请求,然后与在hosts.allow和
hosts.deny的中的服务比较,然后做出允许或拒绝的决定。 

最后因为hosts.allow|hosts.deny应该不允许普通用户读写,因此设置其访问权限
为600: 

chmod 600 /etc/hosts.* 

并且该文件应该不被任何用户修改,包括root用户。因此为了防止用户错误的修改
该文件,为该文件添加不可修改位: 

chattr +i /etc/hosts.* 

三、"/etc/exports"文件设置 

如果通过NFS把文件共享出来,那么一定要配置"/etc/exports"文件,使得访问限
制尽可能的严。这就是说,不要用通配符,不允许对根目录有写权限,而且尽可能
只给只读权限。编辑exports文件(vi /etc/exports)加入: 

例如: 

/dir/to/export host1.mydomain.com(ro,root_squash) 
/dir/to/export host2.mydomain.com(ro,root_squash) 
"/dir/to/export"是你想共享出来的目录,host.mydomain.com是允许访问这个目
录的计算机。 

代表只读,代表不允许对根目录进行写操作。使这些改变生效,你还要运行 
"/usr/sbin/exportfs -a"命令。 

注意:在服务器上装NFS服务是会有安全隐患的,就我个人而言,不建议你使用
NFS。 

四、禁止使用控制台程序 

一个最简单而且最常用的保证系统安全的方法就是禁止使用所有的控制台程序,如
:shutdown和halt。可以运行下面的命令来实现: 

[root@aid /]# rm -f /etc/security/console.apps/servicename 

这里servicename是你要禁止的控制台程序名。除非你使用xdm,否则不要把
xserver文件删掉,如果这样除了root之外,没有人可以启动X服务器了。(如果使
用xdm启动X服务器,这时root是唯一需要启动X服务器的用户,这才有必要把
xserver文件删掉)。例如: 

[root@deep]# rm -f /etc/security/console.apps/halt 
[root@deep]# rm -f /etc/security/console.apps/poweroff 
[root@deep]# rm -f /etc/security/console.apps/reboot 
[root@deep]# rm -f /etc/security/console.apps/shutdown 
[root@deep]# rm -f /etc/security/console.apps/xserver (如果删除,只有
root可以启动X). 

这些命令就可以禁止所有的控制台程序:halt、poweroff、reboot和shutdown。记
住,只有装了Xwindow,删除xerver文件才会有效果。 

五、"/etc/aliases"文件 

aliases文件可能会造成安全隐患。例如:很多的软件产商都把 "decode"这个别名
放在aliases文件里。这样做的目的是为了方便通过email传送二进制文件。在发送
邮件的时候,用户把二进制文件用"uuencode"转成ASCII文件,然后把结果发给接
收端的"decode"。由这个别名让邮件信息通过"/usr/bin/uuencode"程序把二进制
文件重新转换成ASCII文件。如果允许"decode"出现在aliases文件中,可以想象将
会有什么样的安全隐患。 

把定义"decode"这个别名的行从aliases文件中删除。同样地,每一个会运行程序
的别名都要好好查看一下,很有可能要把它们删除掉。要使改动生效,还必须运行
: 

[root@deep]# /usr/bin/newaliases 

编辑aliases文件(vi /etc/aliases),删除或注释掉下面这些行: 

# Basic system aliases -- these MUST be present. 
MAILER-DAEMON: postmaster 
postmaster: root 
# General redirections for pseudo accounts. 
bin: root 
daemon: root 
#games: root 
#ingres: root 
nobody: root 
#system: root 
#toor: root 

#uucp: root 
# Well-known aliases. 
#manager: root 
#dumper: root 
#operator: root 
# trap decode to catch security attacks 
#decode: root 
# Person who should get roots mail 
#root: marc 


最后记得运行"/usr/bin/newaliases"使改变生效。 

六、使系统对ping没有反应 

防止你的系统对ping请求做出反应,对于网络安全很有好处,因为没人能够ping你
的服务器并得到任何反应。TCP/IP协议本身有很多的弱点,黑客可以利用一些技术
,把传输正常数据包的通道用来偷偷地传送数据。使你的系统对ping请求没有反应
可以把这个危险减到最小。用下面的命令: 

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 

运行完这个命令后,系统对ping就没有反应了。可以把这一行加到"/etc/rc.
d/rc.local"文件中去,这样当系统重新启动的时候,该命令就会自动运行。对
ping命令没有反应,至少可以把绝大多数的黑客排除到系统之外,因为黑客不可能
知道你的服务器在哪里。重新恢复对ping的响应,可以用下面的命令: 

echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all" 

七、不要显示系统提示信息 

如果你不想让远程登录的用户看到系统的提示信息,你可以改变"/etc/inetd.
conf"文件中的telnet设置: 

telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h 

在末尾加上"-h"参数可以让daemon不显示任何系统信息,只显示登录提示。当然,
只有在服务器上装了telnet服务器才有这样做的必要。 


八、"/etc/host.conf"文件 

Linux用解析器(resolver)库把主机名翻译成IP地址。"/etc/host.conf"文件定
义主机名是怎样解析的。"/etc/host.conf"文件中的项告诉解析器库用什么服务,
以什么顺序解析主机名。 

编辑"host.conf"文件(vi /etc/host.conf)加入下面这些行: 

# Lookup names via DNS first then fall back to /etc/hosts. 
order bind,hosts 
# We have machines with multiple IP addresses. 
multi on 
# Check for IP address spoofing. 
nospoof on 

order选项指明的是选择服务的顺序。上面"order bind, hosts"说的是解析器库解
析文件名的时候先查询域名服务器,然后再查看"/etc/hosts"文件。因为性能和安
全上的原因,最好将解析器库的查找顺序设成先查域名服务器(bind)。当然也要
先安装了DNS/BIND软件,否则这样配置根本没有任何作用。 

multi选项决定在"/etc/hosts"文件中出现的主机能不能有多个IP地址(多个网络
界面)。具有多个IP网络界面的主机被称为具有多个网络界面(multiomed),因
为同时有多个IP地址也就意味着这台主机有多个网络界面。例如:网关服务器就有
多个IP地址,必须把这个选项设成ON。 
nospoof选项指明不允许IP伪装。IP伪装是把自己伪装成别的计算机去欺骗其它的
计算机,获得它的信任。这种攻击方法把自己伪装成别的服务器,并且与其它客户
机、服务器和大型数据存储系统建立网络连接或其它类型的网络活动。不管对任何
类型的服务器,这个选项都要设成ON。 


九、防止源路由 

路由和路由协议会导致一些问题。IP源路径路由(IP source routing),也就是
IP包包含到达底目的地址的详细路径信息,是非常危险的,因为根据RFC 1122规定
目的主机必须按原路径返回这样的IP包。如果黑客能够伪造原路径路由的信息包,
那么它就能截取返回的信息包,并且欺骗你的计算机,让它觉得正在和它交换信息
的是可以信任的主机。我强烈建议你禁止IP原路径路由以避免这个安全漏洞。 

用下面的命令在你的服务器上禁止IP原路径路由: 

for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do 
echo 0 > $f 
done 

把上面的命令加到"/etc/rc.d/rc.local"文件中去,你就不用在系统重新启动之后
再把这些命令敲一遍。注意,上面的命令将禁止所有的网络界面(lo、ethN、
pppN,等等)的源路径路由包。 

十、使TCP SYN Cookie保护生效 

"SYN Attack"是一种拒绝服务(DoS)的攻击方式,会消耗掉系统中的所有资源,
迫使服务器重新启动。拒绝服务(这种攻击方式用巨大的信息流来消耗系统的资源
,以至于服务器不能够响应正常的连接请求)是很容易被黑客利用的。在2.1系列
的内核中,"syn cookie"只是一个可选项,并没有使其生效。想要使其生效必须用
下面的命令: 

[root@aid /]# echo 1 > /proc/sys/net/ipv4/tcp_syncookies 

把这个命令加入"/etc/rc.d/rc.local"文件中,等下次系统重新启动的时候就不必
重新敲一遍了。如果打算安装IPCHAINS防火墙,你就没有必要用这个命令,因为它
已经包含在防火墙的脚本文件里了。 

十一、特殊的帐号 

禁止操作系统中不必要的预置帐号(每次升级或安装完都要检查一下)。Linux系
统中就提供这样一些你可能不需要的预置帐号。如果确实不需要这些帐号,就把它
们删掉。系统中有越多的帐号,就越容易受到攻击。 

我们假定你已经在系统中使用shadow口令。如果不是这样,最好在系统中加上
shadow口令的支持,因为这样系统会更安全。如果你是按照上一章介绍的方法安装
服务器,那么在"安全验证配置"这一步就已经选上"Enable Shaow Passwords"这个
选项了。 

在系统中删除一个用户可以用这个命令: 
[root@deep]# userdel username 

在系统中删除一个组可以用这个命令: 
[root@deep]# groupdel username 

第一步 用下面的命令删除一些不必要的用户: 

[root@deep]# userdel adm 
[root@deep]# userdel lp 
[root@deep]# userdel sync 
[root@deep]# userdel shutdown 
[root@deep]# userdel halt 
[root@deep]# userdel news 
[root@deep]# userdel uucp 
[root@deep]# userdel operator 
[root@deep]# userdel games (如果不用X Window服务器,可以删除这个用户) 

[root@deep]# userdel gopher 
[root@deep]# userdel ftp (如果没安装匿名ftp服务器,可以删除这个用户) 


第二步 输入下面的命令删除一些不必要的组: 

[root@deep]# groupdel adm 
[root@deep]# groupdel lp 
[root@deep]# groupdel news 
[root@deep]# groupdel uucp 
[root@deep]# groupdel games (delete this group if you don use X Window 
Server). 
[root@deep]# groupdel dip 
[root@deep]# groupdel pppusers 
[root@deep]# groupdel popusers (delete this group if you don use pop 
server for email). 
[root@deep]# groupdel slipusers 


第三步 

"不允许改变"位可以用来保护文件使其不被意外地删除或重写,也可以防止有些人
创建这个文件的符号连接。删除"/etc/passwd"、"/etc/shadow"、"/etc/group"或
"/etc/gshadow"都是黑客的攻击方法。给口令文件和组文件设置不可改变位,可以
用下面的命令: 

[root@deep]# chattr +i /etc/passwd 
[root@deep]# chattr +i /etc/shadow 
[root@deep]# chattr +i /etc/group 
[root@deep]# chattr +i /etc/gshadow 

注意:如果将来要在口令或组文件中增加或删除用户,就必须先清除这些文件的不
可改变位,否则就不能做任何改变。如果没有清除这些文件的不可改变位,安装那
些会自动在口令文件和组文件中加入新用户的rpm软件包的时候,在安装过程中就
会出现出错的提示。 


十二、防止任何人都可以用su命令成为root 

如果不想任何人都可以用"su"命令成为root或只让某些用户有权使用"su"命令,那
么在"/etc/pam.d/su"文件中加入下面两行。建议尽量限制用户通过"su"命令成为
root。 

第一步 

编辑su文件(vi /etc/pam.d/su)在文件的头部加入下面两行: 

auth sufficient /lib/security/pam_rootok.so debug 
auth required /lib/security/pam_wheel.so group=wheel 

加入这两行之后,"/etc/pam.d/su"文件变为: 

#%PAM-1.0 
auth sufficient /lib/security/pam_rootok.so debug 
auth required /lib/security/pam_wheel.so group=wheel 
auth required /lib/security/pam_pwdb.so shadow nullok 
account required /lib/security/pam_pwdb.so 
password required /lib/security/pam_cracklib.so 
password required /lib/security/pam_pwdb.so shadow use_authtok nullok 
session required /lib/security/pam_pwdb.so 
session optional /lib/security/pam_xauth.so 

这两行的意思是只有"wheel"组的成员才能用su命令成为root。注意,"wheel"组是
系统中用于这个目的的特殊帐号。不能用别的组名。 

第二步 

在"/etc/pam.d/su"配置文件中定义有"wheel"组,现在介绍一下怎样让一些用户可
以用"su"命令成为"root"。下面是一个例子,让admin用户成为"wheel"组的成员,
这样就可以用"su"命令成为"root": 

[root@deep]# usermod -G10 admin 

"G"是表示用户所在的其它组。"10"是"wheel"组的ID值,"admin"是我们加到
"wheel"组的用户。用同样的命令可以让其他的用户可以用su命令成为root。 

十三、 把rpm程序转移到一个安全的地方,并改变默认的访问许可 
一旦在Linux服务器上用rpm命令安装完所有需要的软件,最好把rpm程序转移到一
个安全的地方,如:软盘或其它你认为安全的地方。因为如果有人入侵了你的服务
器,他就不能用rpm命令安装那些有害的软件。当然,如果将来要用rpm安装新的软
件,你就要把rpm程序拷回原来的目录。把rpm程序移到软盘上,用下面的命令: 


[root@deep]# mount /dev/fd0 /mnt/floppy/ 
[root@deep]# mv /bin/rpm /mnt/floppy/ 
[root@deep]# umount /mnt/floppy 

注意:千万不要把rpm程序从系统中卸载掉,否则以后就不能重新安装它,因为安
装rpm程序或其它软件包本身就要用rpm命令。 
还有一点要注意的是,把rpm命令的访问许可从默认的755改成700。这样非root用
户就不能使用rpm命令了。特别是考虑到万一在安装完新软件之后忘了把rpm程序移
到一个安全的地方,这样做就更有必要了。 

改变"/bin/rpm"默认的访问权限,用下面这个命令: 
[root@deep]# chmod 700 /bin/rpm 


十四、登录shell 

为了方便重复输入很长的命令,bash shell可以在"~/.bash_history"文件("~/"
是家目录,每个用户都是不一样的)中存500个曾经输入过的命令。每一个有自己
帐号的用户,在自己的家目录中,都会有".bash_history"文件。可能会有这种情
况,用户在不该输入口令的地方输入了口令,而输入的口令会在".bash_history"
文件中保存下来。而且".bash_history"文件越大这种可能性也越大。 

在"/etc/profile"文件中HISTFILESIZE和HISTSIZE这两行决定了系统中所有用户的
 ".bash_history"文件可以保存多少命令。我建议把"/etc/profile"文件中的
HISTFILESIZE和HISTSIZE都设成一个比较小的值,如:20。 

编辑profile文件(vi /etc/profile),把这些行改成: 

HISTFILESIZE=20 
HISTSIZE=20 

这样每个用户家目录下的".bash_history"就最多只能存20个命令。如果黑客试图
在用户的"~/.bash_history"文件中发现一些口令,他就没有什么机会了。 

十五、改变"/etc/rc.d/init.d/"目录下的脚本文件的访问许可 

改变启动和停止daemon的脚本文件的权限。 

[root@deep]# chmod -R 700 /etc/rc.d/init.d/* 

这样只有root可以读、写和执行这个目录下的脚本。我想一般用户没有什么必要知
道脚本文件的内容。 

注意:如果你安装或升级了一个程序,要用到"/etc/rc.d/init.d/"中system V脚
本,不要忘记再检查一下改变和检查这个脚本文件的许可。 

十六、"/etc/rc.d/rc.local"文件 

在默认情况下,当登录装有Linux系统的计算机时,系统会告诉你Linux发行版的名
字、版本号、内核版本和服务器名称。这泄露了太多的系统信息。最好只显示一个
"Login:"的提示信息。 

第一步 

编辑"/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 
-- 

第二步 

删除"/etc"目录下的"issue.net"和"issue"文件: 

[root@deep]# rm -f /etc/issue 
[root@deep]# rm -f /etc/issue.net 

注意:"/etc/issue.net"文件是用户从网络登录计算机时(例如:telnet、SSH)
,看到的登录提示。同样在"/etc"目录下还有一个"issue"文件,是用户从本地登
录时看到的提示。这两个文件都是文本文件,可以根据需要改变。但是,如果想删
掉这两个文件,必须向上面介绍的那样把"/etc/rc.d/rc.local"脚本中的那些行注
释掉,否则每次重新启动的时候,系统又会重新创建这两个文件。 

 



--
             .                       *            .      .                     
       .              .    自己的世界         .                                 
          ★               ++++++++++            .              *               
              .                              .                                 
       *           ▁▂▃▄▅▆▇█▇▇▆▅▄▃▂▁▂▃▄▅▆▇█▇▇▆▅▄▃  
▁▂▃▄▅▆▇█▇▇▆▅▄▃▂▁▁▂▃▄▅▆▇█▇▇▆▅▄▃▂▂▃▄▅▆▃▂              Go!  天竺  @>>--,--'--- http://Beauty.hit.edu.cn 

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: kiss.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:200.707毫秒