RedFlag网络安全.docx
《RedFlag网络安全.docx》由会员分享,可在线阅读,更多相关《RedFlag网络安全.docx(50页珍藏版)》请在冰豆网上搜索。
RedFlag网络安全
RedFlag网络安全
安全性是网络服务器可靠运行的基础。
随着通信技术和Internet的广泛应用,服务器被攻击的情况可能经常发生,来自网络上的安全威胁是Linux服务器安全问题的主要来源。
本章介绍如何在RedFlagAsianuxServer3构建的服务器平台上,利用系统提供的安全工具,达到有效保护系统安全、减少成功入侵数量、检测和追踪入侵日志、降低危害程度并快速从攻击中恢复的策略。
有关物理和文件系统安全的知识请参考第6章系统安全。
1.1Xinetd
1.1.1简介
xinetd提供了访问控制,改进的日志功能和资源管理,是RedFlagAsianuxServer3系统中的Internet标准超级守护进程。
Inetd被称作超级服务器,用来实现对主机网络连接的控制。
当一个请求到达由Inetd管理的服务端口,Inetd将该请求转发给名为tcpd的程序。
tcpd根据配置文件/etc/hosts.allow和/etc/hosts.deny来判断是否允许服务响应该请求。
如果请求被允许则相应的服务器程序(如:
telnetd)将被启动。
这个机制也被称作tcp_wrapper。
xinetd(eXtendedInterNETservicesdaemon)提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。
它具有以下特色:
Ø支持对tcp、udp、RPC服务(但是当前对RPC的支持不够稳定,可以启动protmap与xinetd共存来解决这个问题)。
Ø基于时间段的访问控制。
Ø功能完备的log功能,即可以记录连接成功也可以记录连接失败的行为。
Ø能有效的防止DoS攻击(DenialofServices)。
Ø能限制同时运行的同一类型的服务器数目。
Ø能限制启动的所有服务器数目。
Ø能限制log文件大小。
Ø将某个服务绑定在特定的系统接口上,从而能实现只允许私有网络访问某项服务。
Ø能实现作为其他系统的代理。
如果和IP伪装结合,可以实现对内部私有网络的访问。
1.1.2Xinetd的配置
Xinetd的配置文件是/etc/xinetd.conf与/etc目录下的一个名为xinetd.d的网络连接配置文件目录。
配置文件中的语法和/etc/inetd.conf完全不同且不兼容。
它本质上是/etc/inetd.conf和/etc/hosts.allow,/etc/hosts.deny功能的组合。
以下所示为/etc/xinetd.d目录下的文件
其中每个文件代表一种网络服务器程序,文件中一般具有下列形式。
serviceservice-name
{
……
…….
}
其中service是必需的关键字,每一项都定义了由service-name定义的服务。
例如下面给出的是文件/etc/xinetd.d/telnet的内容;
Service-name是任意的,但通常是标准网络服务名,也可以增加其他非标准的服务,只要它们能通过网络请求激活,包括localhost自身发出的网络请求。
操作符可以是=,+=,或-=。
所有属性都可以使用=,其作用是分配一个或多个值,某些属性可以使用+=或-=形式,其作用分别是将该值增加到某个现存的值表中,或将其从现存值表中删除。
Ø可使用的属性
Socket_type
使用的TCP/IPsocket类型,值可能为stream(TCP),dgram(UDP),raw和seqpacket(可靠的有序数据报)。
protocol
指定该服务使用的协议,其值必须是在/etc/protocols中定义的。
如果不指定,使用该项服务的缺省协议。
Server
要激活的进程,必须指定完整路径。
Server_args
指定传送给该进程的参数,但是不包括服务程序名。
Port
定义该项服务相关的端口号。
如果该服务在/etc/services中列出,它们必须匹配。
Wait
这个属性有两个可能的值。
如果是yes,那么xinetd会启动新的进程并停止处理该项服务的请求直到该进程终止。
这是个单线程服务。
如果是no,那xinetd会为每个请求启动的一个进程,而不管先前启动的进程的状态。
这是个多线程服务。
User
设置服务进程的UID。
若xinetd的有效UID不是0,该属性无效。
Group
设置进程的GID。
若xinetd的有效UID不是0,这个属性无效。
Nice
指定进程的优先级。
Id
该属性被用来唯一地指定一项服务。
因为有些服务的区别仅仅在于使用不同的协议,因此需要使用该属性加以区别。
默认情况下服务id和服务名相同。
如echo同时支持dgram和streama服务。
设置id=echo_dgram和id=echo_streams来分别唯一标识两个服务。
Type可以是下列一个或多个值:
RPC(对RPC服务),INTERNAL(由xinetd自身提供的服务,如echo),UNLISTED(没有列在标准系统文件如/etc/rpc或/etc/service中的服务)。
Access_time
设置服务可用时的时间间隔。
格式是hh:
mm_hh:
mm;如08:
00-18:
00意味着从8A.M到6P.M.可使用这项服务。
Banner
无论该连接是否被允许,当建立连接时就将该文件显示给客户机。
Flags
可以是以下一个或多个选项的任意组合:
REUSE:
设置TCP/IPsocket可重用。
也就是在该服务socket中设置SO_REUSEADDR标志。
当中断时重新启动xinetd。
INTERCEPT:
截获数据报进行访问检查,以确定它是来自于允许进行连接的位置。
NORETRY:
如果fork失败,不重试。
IDONLY:
只有在远程端识别远程用户时才接受该连接(也就是远程系统必须运行ident服务器),该标记只适用于面向连接的服务。
若没有使用USERID记录选项则该标记无效log_on_success和/或log_on_failure属性设置USERID值以使该值生效。
仅用于多线程的流服务。
NAMEINARGS:
允许server_args属性中的第一个参数是进程的完全合格路径,以允许使用TCP_Wrappers。
NODELAY:
若服务为tcp服务,并且NODELAY标记被设置,则TCP_NODELAY标记将被设置。
若服务不是tcp服务则该标记无效。
Rpc_version
指定RPC版本号或服务号。
版本号可以是一个单值或者一个范围中。
rpc_number
如果RPC程序号不在/etc/rpc中,就指定它。
Env
用空格分开的VAR=VALUE表,其中VAR是一个shell环境变量且VALUE是其设置值。
这些值以及xinetd的环境都在激活时传送给服务程序。
这个属性支持=和+=操作符。
Passenv
用空格分开的xinetd环境中的环境变量表,该表在激活时传递给服务程序。
设置no就不传送任何变量。
该属性支持所有操作符。
Only_from
用空格分开的允许访问服务的客户机表。
例如:
only_from=172.16.84.2。
如果不为该属性指定一个值,就拒绝访问这项服务。
该属性支持所有操作符。
No_access
用空格分开的拒绝访问服务的客户机表。
例如:
no_access=172.16.84.3。
该属性支持所有操作符。
Instances
接受一个大于或等于1的整数或UNLIMITED。
设置可同时运行的最大进程数。
UNLIMITED意味着xinetd对该数没有限制。
Log_type
指定服务log记录方式,可以为:
SYSLOGfacility[level]:
设置该工具为daemon,auth,user或loca10-7。
设置level是可选的,可以的level值为emerg,alert,crit,err,warning,notice,info,debug,默认值为info;
file[soft[hard]]:
指定file用于记录log,而不是syslog。
限度soft和hard用KB指定(可选)。
一旦达到soft限,xinetd就登记一条消息。
一旦达到hard限,xinetd停止登记使用该文件的所有服务。
如果不指定hard限,它成为soft加1%,但缺省时不超过20MB.缺省soft限是5MB;
Redirect
该属性语法为redirect=Ipaddressport。
它把TCP服务重定向到另一个系统。
如果使用该属性,就忽略server属性。
Bind
把一项服务绑定到一个特定端口。
语法是bind=Ipaddress。
这样有多个接口(物理的或逻辑的)的主机允许某个接口但不是其他接口上的特定服务(或端口)。
Log_on_success
指定成功时登记的信息。
可能值是:
ID:
进程的PID。
如果一个新进程没被分叉,PID设置为0。
HOST:
客户机主机IP地址。
USERID:
通过RFC1413高用捕获客户机用户的UID。
只可用于多线程流服务。
EXIT:
登记进程终止和状态。
DURATION:
登记会话持续期。
缺省时不登记任何信息。
该属性支持所有操作符
Log_on_failure
指定失败时登记的信息。
总是登记表明错误性质的消息。
可能值是ATTEMPT:
记录一次失败的尝试。
所有其他值隐含为这个值。
ATTEMPT:
记录一次失败的尝试。
所有其他值隐含为这个值。
HOST:
客户机主机IP地址。
USERID:
通过RFC1413调用捕获客户机用户的UID。
只可用于多线程流服务RECORD:
记录附加的客户机信息如本地用户,远程用户和终端的类型。
缺省时不登记任何信息。
该属性支持所有操作符。
RECORD:
记录附加的客户机信息如本地用户,远程用户和终端的类型。
缺省时不登记任何信息。
该属性支持所有操作符。
Disabled
只可用于defaults项,指定被关闭的服务列表,是用空格分开的不可用服务列表来表示的。
它和在/etc/xinetd.conf文件中注释掉该服务项有相同的效果。
Ø使配置生效
完成对相关网络服务程序配置文件的修改后,可以使用如下命令重新启动xinetd守护进程使配置生效。
/etc/rc.d/init.d/xinetdrestart
1.2可插入验证模块(PAM)
使用身份验证的方法来验证用户身份从而为用户分配对系统访问权限的程序(即确定用户的身份)。
PAM使用一个可插入式的、模块化的结构。
它为系统管理员设置用户身份验证政策提供了很大的灵活性。
在多数情况下,一个支持PAM的应用程序使用默认的PAM配置文件就可满足一般的要求。
但在某些情况下,还需要对PAM配置文件进行特殊的配置。
因为如果对PAM进行了错误的配置就可能会导致系统的安全性被破坏,所以在对这些文件进行配置前必须对其结构有一定的了解。
1.2.1PAM的优越性
PAM提供了以下优越性:
∙可以被多种应用程序使用的常用用户身份验证系统。
∙为系统管理员和应用程序开发者在进行用户身份验证处理时提供了极大的灵活性。
∙提供了一个详细的用户接口,使开发者们不需要再开发自己的用户身份验证系统。
1.2.2PAM配置文件
/etc/pam.d/目录中包括所有支持PAM应用程序的PAM配置文件。
以前的PAM版本使用/etc/pam.conf文件,但现在这个文件已经过时,只在/etc/pam.d/目录不存在时才被使用。
1.2.2.1PAM服务文件
每个支持PAM的应用程序或服务都在/etc/pam.d/目录中有一个相应的文件。
而该目录中的每个文件的名称都与其所控制访问的服务名称相同。
支持PAM的应用程序需要定义它们的服务名并在/etc/pam.d/目录中安装它们自己的PAM配置文件。
例如,login程序定义了它的服务名为login并安装/etc/pam.d/loginPAM配置文件。
1.2.3PAM配置文件的格式
每个PAM配置文件都包括一组有以下格式的命令:
<模块接口><控制标识><模块名称><模块参数>
这些选项将在以下一节中陆续介绍。
1.2.3.1模块接口(ModuleInterface)
当前有四类可用的PAM模块接口。
每类接口分别代表了用户身份验证的不同方面:
∙auth—这个模块接口用作验证。
例如,它需要一个密码并验证密码是否正确。
带有此接口的模块也可以设置许可证,如组群成员或Kerberos令牌。
∙account—这个模块接口用来验证所允许的访问。
例如,检查一个用户帐号是否已经过期;或一个用户是否允许在一天的某个特定的时间进行登录。
∙password—这个模块接口用来改变用户的密码。
∙session—这个模块接口用来配置并管理用户会话。
带有这个接口的模块也可以进行允许访问所需的额外任务,如挂载用户的主目录,使用户的邮箱有效。
一个单独的模块可以包括一个或多个模块接口。
例如,pam_unix.so包括了所有四个模块接口。
在一个PAM配置文件中,模块接口是第一个定义的项。
一般的配置文件都会有与以下形式类似的行:
authrequiredpam_unix.so
它告诉PAM使用pam_unix.so模块的auth接口。
1.2.3.2模块接口堆积
模块界面命令可以堆积(stacked)或在一个上面堆放另一个,这样多个模块可以一起使用来实现一个目的。
那么模块排列的顺序对用户身份验证的过程就非常重要。
系统管理员要求先有特定的条件存在才允许用户进行身份验证,堆积命令可以使这个过程更容易。
例如,reboot命令通常使用一组堆积模块,请看下面的PAM配置文件:
authrequiredpam_nologin.so
authrequiredpam_securetty.so
authrequiredpam_env.so
authsufficientpam_rhosts_auth.so
authrequiredpam_stack.soservice=system-auth
在允许某人使用rlogin以前,PAM会验证/etc/nologin是否存在,如不存在,PAM会确认该用户不想以root身份去登录远程访问网络连接,而且所有的环境变量将被装载。
然后,如果一个rhosts验证被成功执行,那么就允许连接。
如果rhosts验证失败,那么就要执行标准的密码认证过程。
1.2.3.3控制标志(ControlFlag)
所有的PAM模块在调用后都会产生一个成功或失败的结果。
控制标志会指示PAM根据其结果下一步应如何做。
模块可以以特定的顺序进行堆积排列,控制标志决定一个特定模块对用户验证成功或失败的整个过程的重要性。
有四个预先定义好的控制标志:
∙required—要使验证过程继续,这个模块的结果必须是成功。
如果这一步的测试失败,用户不会马上被通知,而在所有模块的测试都完成后才会被通知。
∙requisite—要使验证可以继续进行,这个模块的结果必须是成功。
然而,如果这一步测试失败,用户会被马上通知,而通知的信息中包括了第一个失败了的required或requisite模块测试。
∙sufficient—如果模块验证失败,其结果就不会被理会。
但是,如果一个标识为sufficient的模块成功,并且前面没有任何标识为required的模块验证失败,那么用户就可以通过验证使用这个服务,无需其它任何验证结果。
∙optional—模块结果不被理会。
标识为optional的模块只有在这个界面中没有引用其它模块时,才成为验证成功所必须的条件。
required模块调用顺序并不重要。
只有控制标志为sufficient和requisite的模块的调用顺序才变得重要。
PAM现在可使用一个更新的、可以进行更准确控制的控制标志语法。
PAM的帮助文件在/usr/share/doc/pam-/目录下,其中的是用户系统上的PAM的版本号,在此有崭新的语法描述。
1.2.3.4模块名
模块名称提供了包含特定的模块接口的PAM可插入的模块的名字。
在较老版本的服务器产品中,PAM配置文件包括模块的完全路径。
但是,自从使用了multilib系统(它就把64位的PAM模块存储在/lib64/security/中了),目录名就可以省略,应用程序会连接到适当的libpam版本,它可以定位这个模块的正确版本。
1.2.3.5模块参数
在为一些模块进行验证时,PAM使用参数来把信息传递给一个可插入模块。
例如,pam_userdb.so模块使用存储在一个BerkeleyDB文件中的信息来验证用户。
BerkeleyDB是一个开源的数据库系统,内置于许多应用程序中。
这个模块使用一个db参数,从而使BerkeleyDB知道请求的服务使用的是哪个数据库。
以下是在一个PAM配置中一个典型的pam_userdb.so行。
authrequiredpam_userdb.sodb=
是到BerkeleyDB数据库文件的完全路径。
无效的参数通常会被忽略,它不会影响到PAM模块验证的结果。
但在一些模块中,无效的参数可能会导致模块验证的失败。
多数模块都会把错误写入/var/log/secure文件。
1.2.4创建PAM模块
用户可以随时为支持PAM的应用程序创建或添加新的PAM模块。
例如,程序开发人员可以创建一个一次性密码的产生方法,并编写一个PAM模块来支持它。
支持PAM的应用程序可以马上使用这个新模块而不用重新进行编译。
这可让程序开发人员和系统管理员在不需要重新编译的情况下,为不同的应用程序测试各种用户身份验证方法。
编写模块的文档包括在/usr/share/doc/pam-/目录中。
其中,是用户系统上的PAM版本号。
1.2.5采用防火墙的优势
防火墙能提高主机与子网的安全性,红旗Linux防火墙体系的主要优点包括:
Ø保证对主机和应用安全访问;
Ø保证多种客户机和服务器的安全性;
Ø保护关键部门不受来自内部、外部的攻击,为通过Internet与远程访问的雇员、客户、供应商提供安全通道。
1.2.6防火墙安全控制基本原则
安全策略是防火墙的灵魂和基础。
在建立防火墙之前要在安全现状、风险评估和商业需求的基础上提出一个完备的总体安全策略,这是配制防火墙的关键。
防火墙在安全控制方面有两个基本准则:
Ø准许访问除明确拒绝以外的全部访问——所有未被禁止的都允许访问
Ø拒绝访问除明确准许的全部访问——所有未被允许的都禁止访问
可以看出,后一逻辑限制性大,前一逻辑比较宽松。
1.2.7防火墙基本类型
防火墙的类型包括很多种,但大体上可以分为两类:
一类基于packetfilter(包过滤型),另一类是基于proxyservice(代理服务)。
它们的区别在于基于packetfilter的Firewall通常直接转发报文,它对用户完全透明,速度较快。
而基于proxy的Firewall则不是这样,它通过proxyservice建立连接,可以有较强的身份验证和注册功能。
Ø包过滤防火墙
包过滤(Packetfil