ty9919 发表于 2018-11-23 12:01:12

开源 Apache 服务器安全防护技术精要及实战


[*]  简单而强大的基于文件的配置:该服务器没有为管理员提供图形用户界面,提供了三个简单但是功能异常强大的配置文件。用户可以根据需要用这三个文件随心所欲地完成自己希望的Apache配置。
[*]  支持通用网关接口(CGI):采用mod_cgi模块支持CGI。Apache支持CGI/1.1标准,并且提供了一些扩充。
[*]  支持虚拟主机:是首批既支持IP虚拟主机又支持命名虚拟主机的Web服务器之一。
[*]  支持HTTP认证:支持基于Web的基本认证。它还有望支持基于消息摘要的认证。
[*]  内部集成Perl:Perl是CGI脚本编程的事实标准。Apache对Perl提供了良好的支持,通过使用其mod_perl模块,还可以将Perl的脚本装入内存。
[*]  集成代理服务器:用户还可以选择Apache作为代理服务器。
[*]  支持SSL:由于版本法和美国法律在进出口方面的限制,Apache本身不支持SSL。但是用户可以通过安装Apache的补丁程序集合(Apache-SSL)使得Apache支持SSL。
[*]  支持HTTPCookie:通过支持Cookie,可以对用户浏览Web站点进行跟踪。


[*]  使用HTTP协议进行的拒绝服务***:***者会通过某些手段使服务器拒绝对HTIP应答。这样会使Apache对系统资源(CPU时间和内存)需求巨增,造成Apache系统变慢甚至完全瘫痪,从而引起HTTP服务的中断或者合法用户的合法请求得不到及时地响应;
[*]  缓冲区溢出***:由于Apache源代码完全开放,***者就可以利用程序编写的一些缺陷,使程序偏离正常流程。程序使用静态分配的内存保存请求数据,***者就可以发送一个超长请求使缓冲区溢出,从而导致缓冲区溢出***;
[*]  被***者获得root权限,威胁系统安全:由于Apache服务器一般以root权限运行,***者通过它获得root权限,进而控制整个Apache系统;
[*]  Apache服务器与客户端通信安全:如果采用明文传输,则服务器与客户端的敏感通信信息将有可能被***或者不法用户获取;
[*]  由于Apache配置文件设置不当引起的安全问题:恶意者可以随意下载或修改删除系统文件。这主要涉及到对访问者的内容和权限的限制。

[*]
  要应对上述这些安全威胁,要从Apache服务器端配置、运行环境、通信链路安全保障、安全模块使用、日志管理等各方面、全方位的进行保障,下面将进行分门别类的详细介绍。
图2.操作情况下使用安全设定后的对比
http://blog.51cto.com/daspr/%5C

[*]  mkjailenv:用于创建chroot“监牢”目录,并且从真实文件系统中拷贝基本的软件环境。
[*]  addjailsw:用于从真实文件系统中拷贝二进制可执行文件及其相关的其它文件(包括库文件、辅助性文件和设备文件)到该“监牢”中。
[*]  addjailuser:创建新的chroot“监牢”用户。
  采用jail创建监牢的步骤如下所示;
  (1)首先需要停止目前运行的httpd服务,然后建立chroot目录,命令如下所示。该命令将chroot目录建立在路径/root/chroot/httpd下:
# service httpd stop  # mkjailenv /root/chroot/httpd
  kjailenv
  A component of Jail (version 1.9 for linux)
  http://www.gsyc.inf.uc3m.es/~assman/jail/
  Juan M. Casillas Makingchrootedenvironmentinto/root/chroot/httpdDoingpreinstall()Doingspecial_devices()Doinggen_template_password()Doingpostinstall()Done.@gsyc.inf.uc3m.es>
  (2)为“监牢”添加httpd程序,命令如下:
# ./addjailsw/root/chroot/httpd/ -P /usr/sbin/httpd  

  addjailsw
  A component of Jail (version 1.9 for linux)
  http://www.gsyc.inf.uc3m.es/~assman/jail/
  Juan M. Casillas Guessing/usr/sbin/httpdargs(0)Warning:can\\'tcreate/proc/mountsfromthe/procfilesystemDone.@gsyc.inf.uc3m.es>
  在上述过程中,用户不需要在意那些警告信息,因为jail会调用ldd检查httpd用到的库文件。而几乎所有基于共享库的二进制可执行文件都需要上述的几个库文件。
  (3)然后,将httpd的相关文件拷贝到“监牢”的相关目录中,命令如下所示:
# mkdir -p /root/chroot/httpd/etc  # cp – a /etc/httpd /root/chroot/httpd/etc/
  
。。。。。。
  添加后的目录结构如下所示:
# ll  
总计 56
  drwxr-xr-x 2 root root 4096 03-23 13:44 dev
  drwxr-xr-x 3 root root 4096 03-23 13:46 etc
  drwxr-xr-x 2 root root 4096 03-23 13:46 lib
  drwxr-xr-x 2 root root 4096 03-23 13:46 selinux
  drwsrwxrwx 2 root root 4096 03-23 13:46 tmp
  drwxr-xr-x 4 root root 4096 03-23 13:46 usr
  drwxr-xr-x 3 root root 4096 03-23 13:46 var
  (4)重新启动httpd,并使用ps命令检查httpd进程,发现该进程已经运行在监牢中,如下所示:
# ps -aux | grep httpd  Warning: bad syntax, perhaps a bogus \\\'-\\\'? See /usr/share/doc/procps-3.2.7/FAQ
  root      35460.60.3   38281712 pts/2   S    13:57   0:00 /usr/sbin/nss_pcache off
  /etc/httpd/alias
  root      3550 14.23.649388 17788 ?       Rsl13:57   0:00 /root/chroot/httpd/httpd
  apache    35590.21.4493886888 ?       S    13:57   0:00 /root/chroot/httpd/httpd
  apache    35600.21.4493886888 ?       S    13:57   0:00 /root/chroot/httpd/httpd
  apache    35610.21.4493886888 ?       S    13:57   0:00 /root/chroot/httpd/httpd
  apache    35620.21.4493886888 ?       S    13:57   0:00 /root/chroot/httpd/httpd
  apache    35630.21.4493886888 ?       S    13:57   0:00 /root/chroot/httpd/httpd
  apache    35640.21.4493886888 ?       S    13:57   0:00 /root/chroot/httpd/httpd
  apache    35650.21.4493886888 ?       S    13:57   0:00 /root/chroot/httpd/httpd
  apache    35660.21.4493886888 ?       S    13:57   0:00 /root/chroot/httpd/httpd
  root      35680.00.1   4124   668 pts/2   R+   13:57   0:00 grep httpd

[*]  mod_access模块能够根据访问者的IP地址(或域名,主机名等)来控制对Apache服务器的访问,称之为基于主机的访问控制。
[*]  mod_auth模块用来控制用户和组的认证授权(Authentication)。用户名和口令存于纯文本文件中。
[*]  mod_auth_db和mod_auth_dbm模块则分别将用户信息(如名称、组属和口令等)存于Berkeley-DB及DBM型的小型数据库中,便于管理及提高应用效率。
[*]  mod_auth_digest模块则采用MD5数字签名的方式来进行用户的认证,但它相应的需要客户端的支持。
[*]  mod_auth_anon模块的功能和mod_auth的功能类似,只是它允许匿名登录,将用户输入的E-mail地址作为口令。
[*]  mod_ssl被Apache用于支持安全套接字层协议,提供Internet上安全交易服务,如电子商务中的一项安全措施。通过对通信字节流的加密来防止敏感信息的泄漏。但是,Apache的这种支持是建立在对Apache的API扩展来实现的,相当于一个外部模块,通过与第三方程序(如openssl)的结合提供安全的网上交易支持。
  为了能够使用模块功能,模块通常以DSO(DynamicSharedObject)的方式构建,用户应该在httpd.conf文件中使用LoadModule指令,使得能够在使用前获得模块的功能。如下为主配置文件中各个模块的情况,开启安全模块非常简单,即去掉在各安全模块所在行前的“#”符号即可,如下所示:
LoadModule auth_basic_module modules/mod_auth_basic.so  LoadModule auth_digest_module modules/mod_auth_digest.so
  LoadModule authn_file_module modules/mod_authn_file.so
  LoadModule authn_alias_module modules/mod_authn_alias.so
  
。。。。。。
  只有将上述安全模块进行开启后,Apache才能实现相应的访问控制和通信加密功能。

[*]  AuthName:用于定义受保护区域的名称。
[*]  AuthType:用于指定使用的认证方式,包括上面所述的Basic和Digest两种方式。
[*]  AuthGroupFile:用于指定认证组文件的位置。
[*]  AuthUserFile:用户指定认证口令文件的位置。
  使用上述的认证指令配置认证之后,需要为Apache服务器的访问对象,也就是指定的用户和组进行相应的授权,以便于他们对Apache服务器提供的目录和文件进行访问。为用户和组进行授权需要使用Require指令,它主要可以使用如下三种方式进行授权:

[*]  allow,deny:缺省禁止所有客户机的访问,且Allow语句在Deny语句之前被匹配。如果某条件既匹配Deny语句又匹配Allow语句,则Deny语句会起作用(因为Deny语句覆盖了Allow语句)。
[*]  deny,allow:缺省允许所有客户机的访问,且Deny语句在Allow语句之前被匹配。如果某条件既匹配Deny语句又匹配Allow语句,则Allow语句会起作用(因为Allow语句覆盖了Deny语句)。
  (2)allow指令:指明允许访问的地址或地址序列。如allowfromall指令表明允许所有IP来的访问请求。
  (3)deny指令:指明禁止访问的地址或地址序列。如denyfromall指令表明禁止所有IP来的访问请求。
  应用实例
  下面举几个简单的例子对上述order、allow和deny命令的使用进行示范。
  (1)在下面的例子中,admin.org域中所有主机都允许访问网站,而其他非该域中的任何主机访问都被拒绝,因为Deny在前,Allow在后,Allow语句覆盖了Deny语句:
Order Deny,Allow  Deny from all
  Allow from admin.org
  (2)下面例子中,admin.org域中所有主机,除了db.admin.org子域包含的主机被拒绝访问以外,都允许访问。而所有不在admin.org域中的主机都不允许访问,因为缺省状态是拒绝对服务器的访问(Allow在前,Deny在后,Deny语句覆盖了Allow语句):
Order Allow,Deny  Allow from admin.org
  Deny from db.admin.org
  使用主配置文件配置用户认证及授权
  在本例子中,用户可以在Apache的主配置文件httpd.conf中加入以下语句建立对目录/var/www/html/rhel5访问的用户认证和授权机制:
AllowOverrideNoneAuthTypeBasicAuthName\\"rhel5\\"AuthUserFile/etc/httpd/passwd_authRequireuserrhel5testuser  在上述例子中,使用了如下指令:
回页首保证Apache服务通信安全
Apache中SSL原理
  在SSL通信中,首先采用非对称加密交换信息,使得服务器获得浏览器端提供的对称加密的密钥,然后利用该密钥进行通信过程中信息的加密和解密。为了保证消息在传递过程中没有被篡改,可以加密Hash编码来确保信息的完整性。服务器数字证书主要颁发给Web站点或其他需要安全鉴别的服务器,证明服务器的身份信息,同样客户端数字证书用于证明客户端的身份。
  使用公用密钥的方式可以保证数据传输没有问题,但如果浏览器客户访问的站点被假冒,这也是一个严重的安全问题。这个问题不属于加密本身,而是要保证密钥本身的正确性问题。要保证所获得的其他站点公用密钥为其正确的密钥,而非假冒站点的密钥,就必须通过一个认证机制,能对站点的密钥进行认证。当然即使没有经过认证,仍然可以保证信息传输安全,只是客户不能确信访问的服务器没有被假冒。如果不是为了提供电子商务等方面对安全性要求很高的服务,一般不需要如此严格的考虑
  。
  下面给出使用SSL进行通信的过程(参见图4):
  (1)客户端向服务器端发起对话,协商传送加密算法。例如:对称加密算法有DES、RC5,密钥交换算法有RSA和DH,摘要算法有MD5和SHA。
  (2)服务器向客户端发送服务器数字证书。比如:使用DES-RSA-MD5这对组合进行通信。客户端可以验证服务器的身份,决定是否需要建立通信。
  (3)客户端向服务器传送本次对话的密钥。在检查服务器的数字证书是否正确,通过CA机构颁发的证书验证了服务器证书的真实有效性之后,客户端生成利用服务器的公钥加密的本次对话的密钥发送给服务器。
  (4)服务器用自己的私钥解密获取本次通信的密钥。
  (5)双方的通信正式开始。
图4.SSL通信流程示意
http://blog.51cto.com/daspr/%5C

[*]  #apachectlstart:启动apache。
[*]  #apachectlstartssl:启动apachessl。
[*]  #apachectlstop:停止apache。
[*]  #apachectlrestart:重新启动apache。
[*]  #apachectlstatus:显示apache的状态。
[*]  #apachectlconfigtest:测试httpd.conf配置是否正确。
[*]  #/usr/local/sbin/apachectlstartssl
  此时使用start参数为仅仅启动普通Apache的httpd守护进程,而不启动其SSL能力,而startssl才能启动Apache的SSL能力。如果之前Apache的守护进程正在运行,便需要使用stop参数先停止服务器运行。
为OpenSSL产生证书
  在采用OpenSSL进行Apache通信加密前,需要先产生与加密相关的认证凭证(也就是证书),如下步骤所示:
# openssl genrsa -out apache.key 1024  Generating RSA private key, 1024 bit long modulus
  ..........................................++++++
  .....................++++++
  e is 65537 (0x10001)
  

  # openssl req -new -key apache.key -out apache.csr
  You are about to be asked to enter information that will be incorporated
  into your certificate request.
  What you are about to enter is what is called a Distinguished Name or a DN.
  There are quite a few fields but you can leave some blank
  For some fields there will be a default value,
  If you enter \\\'.\\\', the field will be left blank.
  -----
  Country Name (2 letter code) :CN
  State or Province Name (full name) :China
  Locality Name (eg, city) :Beijing
  Organization Name (eg, company) :CSO
  Organizational Unit Name (eg, section) []:CSO
  Common Name (eg, your name or your server\\\'s hostname) []:localhost
  Email Address []:CSO@ittf.org.cn
  

  Please enter the following \\\'extra\\\' attributes
  to be sent with your certificate request
  A challenge password []:apacheserver
  An optional company name []:apacheserver
  

  # openssl x509 -req -days 365 -in apache.csr -signkey apache.key -out apache.crt
  Signature ok
  subject=/C=CN/ST=China/L=Beijing/O=CSO/OU=CSO/CN=localhost/emailAddress=CSO@ittf.org.cn
  Getting Private key
  经过上述步骤后,将会产生三个文件apache.csr,apache.key和apache.crt,然后把这三个文件拷贝到/etc/httpd/conf/ca目录下即可。
  然后,就可以启动Mozilla、IE或其他支持SSL的浏览器,输入URL为:https://ssl_server/来查看服务器是否有相应,https使用的缺省端口为443,如果一切正常,服务器将会返回给客户端证书,由客户端进行验证并且判断,是否接受该证书并进行下一步的通信过程。
  下面以Linux下的MozillaFirefox浏览器为例,来简要说明使用Apache+SSL服务器的过程。首先,图5给出了查看和验证该证书的相关提示;最后,图6则给出了证书验证成功后,采用SSL进行保密传输的具体界面示意:
图5.验证证书示意
http://blog.51cto.com/daspr/%5C

[*]  错误日志
[*]  访问日志
[*]  传输日志
[*]  Cookie日志
  其中比较常见的是访问日志(access_log)和错误日志(error_log),其中传输日志和cookie日志被Apache2.0以上的版本丢弃,所以本文不讨论这两种日志。当然,如果使用SSL服务的话,还可能存在ssl_access_log、ssl_error_log和ssl_request_log三种日志文件。
  另外,值得注意的是:上述几种日志文件如果长度过大,还可能生成注入access_log.1,error_log.2等的额外文件,其格式与含义与上述几种文件相同,只不过系统自动为其进行命名而已。
日志相关的配置指令
  Apache中提供如下4条与日志相关的配置指令:

[*]  运行于debug模式的程序产生的消息
  另外,在Apache中,将访问日志分为如下4类:
页: [1]
查看完整版本: 开源 Apache 服务器安全防护技术精要及实战