这是一个关于中间件安全的系列文章,后期会持续更新:

一、首先,抛出中间件的概念

所谓中间件,就是位于操作系统和应用软件之间的一个软件层,它向各种应用软件提供服务,使不同的应用进程能在屏蔽掉平台差异的情况下,通过网络互相通信。通常,在实际使用中,把一组中间件集成在一起构成一个平台(包括开发平台和运行平台),其中必须要有一个通信中间件完成中间件之间的通信。通过中间件,应用程序可以工作于多平台或OS环境,支持分布计算,提供跨网络、硬件和OS平台的透明性。

中间件(middleware)是一类软件。这类软件作用在操作系统软件与用户应用软件的中间,从而成为所谓的“中间件”。如果把它看成三明治的话,它的上面一层就是应用软件,下面一层就是操作系统、网络和数据库软件

一种新的组合工具,它由三部分组成:柄头、中间连接部件、柄尾。其中柄头和柄尾是多种形式的,但与中间连接部件的衔接部分都是标准的,这样,只要把任意形式的柄头和柄尾与中间连接部件相连,就会形成一种新的工具。有了这种工具,我们可以按需组装,使用和转换起来非常方便。中间件不仅要实现不同软件之间的互连,而且还要实现应用之间的互操作。也就是说,计算机系统的中间件既要为处于自己上层的应用软件提供运行与开发环境,同时也要参与管理计算机和网络通信资源。

中间件的6大特点:

能满足大量应用的需要。

②能运行于多种硬件和多种操作系统平台上。

③支持分布计算。

④提供跨网络、跨硬件和跨操作系统平台的交互式应用和服务。

⑤支持标准协议。

⑥支持标准接口。

假设我们有n个应用,m个操作系统,为了使所有的应用在所有的操作系统上都能工作,就可能需要n×m个接口。而且,每引入一个新的操作系统,就要重新改写n个应用的源代码;每开发一个新的应用,就要考虑实现m个不同的版本,以工作于m个操作系统之上。

中间件使这一切变得简单。开发应用程序时不必再关心底层操作系统的类型,而只需专心于应用的逻辑处理(当然,这只是一种理想状况)。

中间件的引入使原来的网状接口类型变成了沙漏状接口类型,如图所示。接口数目从n×m降到了n+m。当n和m都很小的情况下,这种差异并不明显,但随着n和m不断地增大(正如现实世界正在发生的那样),这种差异将极大地增加开发应用软件的困难,并降低系统整体运行的效率和性能。因此,中间件的出现是分布式系统发展的产物,是软件构架演进的必然 [1]  。

二、下面主要介绍Apache、IIS和Tomcat的安全配置和日志格式;

0x01  Apache

Apache起初由伊利诺伊大学香槟分校的国家超级电脑应用中心(NCSA)开发,此后,Apache Httpd被开放源代码团体的成员不断的发展和加强,从上个世纪90年代开始它的市场占有率就超过了50%。如今虽然它的使用率有些下降但是仍是世界使用排名第一的 Web 服务器软件,它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的 Web服务器端软件之一。Apache自身的安全性是很高的,但是人为的错误设置会导致Apache产生安全问题 。

Apache 服务器安全设置

服务器运行权限 

Linux中默认给予Apache的是一个www-data账户,执行命令:lsof -i:80

或者:ps aux|grep apache|grep -v grep

可以看到第一行是Apache主进程,以root权限运行的,因为Apache的Web端口是80或443,而在Linux中开启小于1024的端口需要root权限,所以主进程必须以root权限运行。第二行起为Apache子进程,其执行用户为www-data,www-data是Ubuntu中运行Web服务的默认用户,权限较低。比如当我们使用一个shell.php去执行添加文件测操作就会由于权限问题而失败

如果是一个高权限用户,可以尝试更改为低权限用户,Apache的运行用户的配置信息可以在/etc/apache2/apache2.conf文件中看到,提示用户和用户组设置在/etc/apache2/envvars文件

然后在到/etc/apache2/envvars文件中设置即可

Windows中Apache安装完成后默认是administrator权限,如果使用此权限运行Web服务一旦攻击者拿下webshell就很容易控制整个服务器。比如在在windows server 2003中使用phpStudy设置测试环境,使用菜刀连接小马,直接就是administrator权限。

可以随意添加账户

那么就应该给Apache降权,或者说设置一个安全的执行账户。首先按以下步骤创建一个普通用户。

然后将Apache的用户组改为Guests,注意要将Apache目录下的日志的可写权限赋给Guests账户。

然后打开Apache服务属性中的登录选项卡,点选此账户,写入刚才添加的用户名和密码。

最后重启服务,这是windows下的Apache权限就设置完毕了,再在菜刀里看下命令执行结果

可以看到由于权限问题已经无法执行高危的系统命令,这样就增加了攻击者的攻击成本。

目录及文件权限

Linux在默认情况下如果当前目录不存在默认文件(比如index.html),Apache会列出当前目录。

其权限设置位置在Apache配置文件httpd.conf中

Options后面的两个参数决定了/var/www可以进行的操作

Indexes:可以在该目录中使用符号连接。

FollowSymLinks:允许目录浏览,当客户仅指定要访问的目录,但没有指定要访问目录下的哪个文件,而且目录下不存在默认文档时,Apache以超文本形式返回目录中的文件和子目录列表(虚拟目录不会出现在目录列表中)。

Indexes决定目录可以被列出,从漏洞角度上讲也就是目录遍历漏洞,操作这个参数即可进行权限控制。修改配置文件如下

再次进行访问时

另外也Linux中可以通过Linux自带的chmod命令进行权限控制

比如使用chmod o-r flag.txt命令将www-data的读权限去掉

在Windows中同样可以使用这两种方法进行权限控制,修改httpd.conf配置文件的方法与Linux下是一样的就不再重复。这里说下windows自带的权限控制,还是以访问flag.txt文件为例,默认情况下

想要设置对其的访问:右键==>属性==>安全(前面已经将Apache添加Guests用户组)

同理可以设置文件或目录的写权限、执行权限等,尤其是一些文件上传目录一定要设置为不可执行,防止webshell的上传。

错误重定向

错误重定向是指通过在Web程序出错令其跳转到指定的显示界面,首先可以通过设置.htaccess文件达到目的,但是windows中正常情况下无法直接创建.xxx的文件,所以要是使用DOS命令,比如

然后在用其他编辑器编辑.htaccess文件即可,比如设置404错误重定向,在.htaccess文件中添加:ErrorDocument 404 /404.html

然后在同目录下创建404.html文件

然后随机访问一个不存在的文件,则会自动跳转到404.html

通过配置httpd.conf文件也可以达到跳转的目的,还是在刚才添加设置目录权限的地方

RewriteEngine On:开启跳转

RewriteRule "tttt\.html$"  "404.html":第一个参数是一个正则,第二个参数使要跳转到的相对地址;也就是说当符合正则时进行跳转。比如对于本条正则当访问tttt.html时会跳转到404.html界面。

Apache日志格式

这里以ubuntu下的Apache日志为例,我的日志路径为/var/log/apache2/,不同的Linux版本可能位置不一样

其中的压缩文件为Apache自动压缩以节省空间,other_vhosts_access.log是虚拟主机日志,重点看下access.log和error.log文件

access.log

日志文件的格式在httpd.conf中有定义

第一行是虚拟主机日志格式,第二个和第三个分别为组合日志格式(Combined Log Format)和通用日志格式(Common Log Format),本系统中由于Combined在Common之前,因此access_log日志按照Combined Log Format方式记录,解释下各个字段的含义,以下面一行为例:

192.168.228.1 - - [22/Sep/2017:05:26:41 -0700] "GET /flag.txt HTTP/1.1" 403 515 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0"

远端主机:192.168.228.1
远端登录名:-
远程用户名:-
访问时间:[22/Sep/2017:05:26:41 -0700]
HTTP请求:GET /flag.txt HTTP/1.1
HTTP状态码:403
发送的字节数:515
Referer:-
User-Agent:"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0"

error.log

httpd.conf中定义了error.log的路径和日志级别,路径和access.log为同一路径,级别是指日志记录的最低级别,如图是指在发生warn及以上事件时会记录。

以下有日志级别的详细分类。

看一下日志的详细内容

可以看到里面有notice、error等级别的消息,那么为什么会用notice级别的信息呢?当错误日志是一个单独分开的正式文件的时候(如本例中就是单独的/var/log/apache2/error.log文件),notice级别的消息总是会被记录下来,而不能被屏蔽。Error.log的一般格式为
[日期和时间]   [错误等级]   错误消息

0x02  IIS

IIS 全称为 Internet Information Service(Internet 信息服务),它的功能是供信息服务,如架设 http、 ftp 服务器等,是WindowsNT内核的系统自带的,不需要下载。

IIS 服务器安全设置

身份验证

身份验证是验证客户端身份的行为,并控制客户端对资源的访问能力。一般情况下,客户端必须提供某些证据,一般称为凭据,来证明其身份。通常,凭据指用户名和密码。IIS有多种身份验证方式,主要有:

  1. 匿名访问

如果启用了匿名访问,访问站点时,不要求提供经过身份验证的用户凭据。当需要让大家公开访问那些没有安全要求的信息时,使用此选项最合适。用户尝试连接您的网站时,IIS 会将该连接分配给 IUSER_ComputerName 帐户,其中 ComputerName 是运行 IIS 的服务器的名称。默认情况下,IUSER_ComputerName 帐户为 Guests 组的成员,密码为空。设置方法如下:

注:如果启用匿名访问,IIS 会始终先使用匿名身份验证来尝试验证用户身份,即使启用其他身份验证方法也是如此,也就是说启用匿名身份验证后其他验证方式也会失效。

2.集成Windows身份验证

以前称为 NTLM 或 Windows NT 质询/响应身份验证,此方法以 Kerberos 票证的形式通过网络向用户发送身份验证信息,并提供较高的安全级别。Windows 集成身份验证使用 Kerberos 版本 5 和 NTLM 身份验证。要使用此方法,客户端必须使用 Microsoft Internet Explorer 2.0 或更高版本。另外,不支持通过 HTTP 代理连接进行 Windows 集成身份验证。如果某个 Intranet(Intranet称为企业内部网,属于内网环境,是一个使用与因特网同样技术的计算机网络,它通常建立在一个企业或组织的内部并为其成员提供信息的共享和交流等服务,可以说Intranet是Internet技术在企业内部的应用)中的用户和 Web 服务器计算机在同一个域中,并且管理员可以确保每个用户都使用 Internet Explorer 2.0 或更高版本,那么对于这个 Intranet,使用此选项是最合适的(NTLM都是身份认证协议)。

简单来说使用这个验证方法在访问网页时需要输入用户名和密码,用户名和密码是windows服务器的账户和密码

在浏览器的声明周期内只需输入一次密码

注:如果选择了多个身份验证选项,IIS 会首先尝试协商最安全的方法,然后它按可用身份验证协议的列表向下逐个试用其他协议,直到找到客户端和服务器都支持的某种共有的身份验证协议。

3. Windows域服务器的摘要式身份验证

摘要式身份验证需要用户 ID 和密码,可提供中等的安全级别,如果要允许从公共网络访问安全信息,则可以使用这种方法。这种方法与基本身份验证提供的功能相同。但是,此方法会将用户凭据作为 MD5 哈希或消息摘要在网络中进行传输,这样就无法根据哈希对原始用户名和密码进行解码。要使用此方法,客户端必须使用 Microsoft Internet Explorer 5.0 或更高版本,Web 客户端和 Web 服务器必须是相同域的成员或者被相同域信任。由于这里并不是一个域的环境,所以次身份验证不好复现。
注:如果启用摘要式身份验证,需要在领域框中键入领域名称。

4. 基本身份验证(以明文形式发送密码)

基本身份验证需要用户 ID 和密码,提供的安全级别较低。用户凭据以明文形式在网络中发送。这种形式提供的安全级别很低,因为几乎所有协议分析程序都能读取密码。但是,它与大多数 Web 客户端兼容。如果允许用户访问的信息没有什么隐私性或不需要保护,使用此选项最为合适。

注:如果启用基本身份验证,需要在“默认域”框中键入要使用的域名,还可以选择在领域框中输入一个值。

5. NET Passport 身份验证

.NET Passport 身份验证提供了单一登录安全性,为用户提供对 Internet 上各种服务的访问权限。如果选择此选项,对 IIS 的请求必须在查询字符串或 Cookie 中包含有效的 .NET Passport 凭据。如果 IIS 不检测 .NET Passport 凭据,请求就会被重定向到 .NET Passport 登录页。由于只有ASP.NET应用程序才能使用此验证方式所以不再演示。
注:如果选择此选项,所有其他身份验证方法都将不可用(显示为灰色)。

权限控制

权限控制可以通过文件权限进行设置,由于IIS账户隶属于Guests账户,可以设置整个Guests账户或只设置IIS账户,对于上传目录一定要禁止执行权限,仅赋予读写权限。

应用程序池

应用程序池是将一个或多个应用程序链接到一个或多个工作进程集合的配置。因为应用程序池中的应用程序与其他应用程序被工作进程边界分隔,所以某个应用程序池中的应用程序不会受到其他应用程序池中应用程序所产生的问题的影响。工作进程隔离模式防止一个应用程序或站点停止了而影响另一个应用程序或站点,大大增强了IIS的可靠性。应用程序池的建立比较简单,打开IIS管理器,只在“应用程序池”上右键选择新建“应用程序池”即可。

新建完成后就可以为不同的网站选择不同的应用程序池。

IIS 日志格式

在IIS管理器找到对应的网站==>右键==>属性,可以看到日志启用选项

点击属性按钮就可以对日志计划和格式进行设置了,也可以点击下拉按钮选择默认的几种的格式

以这样一条日志为例

2017-09-28 03:45:30 W3SVC1 192.168.228.131 GET /test.php - 80 - 192.168.228.1 Mozilla/5.0+(Windows+NT+10.0;+WOW64;+rv:55.0)+Gecko/20100101+Firefox/55.0 200 0 0

在日志格式中的对应关系为

日期:2017-09-28

时间:03:45:30

服务名:W3SVC1

用户名:-

服务器IP:192.168.228.131

服务器端口:80

客户端IP:192.168.228.1

方法:GET

URI资源:/test.php

用户代理:

Mozilla/5.0+(Windows+NT+10.0;+WOW64;+rv:55.0)+Gecko/20100101+Firefox/55.0

协议状态:200

协议子状态:0

Win32状态:0

0x03  Tomcat

Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选, 默认端口8080。

Tomcat 服务器安全设置 

服务器运行权限

Linux中Tomcat的运行权限与Tomcat的启动账户有关,比如以root用户启动

那么获取shell后其权限也直接就是root

当使用普通用户启动的时候也只是普通用户

所以安全起见要是使用一个低权限的普通账户启动Tomcat。Windows权限控制需要进行账户配置,新建一个Tomcat用户,并归属于Guests组

在将账户设置为服务登录账户

再给Tomcat目录设置相应的权限

webapps为Web站点目录,将其中文件上传的文件夹设置为不可执行。然后运行bin文件夹下的service.bat将Tomcat设置为系统服务

然后在服务管理的地方将tomcat账户设置为Tomcat的启动账户,这样Tomcat服务就只拥有Guests用户组的权限了。

服务器后台管理

在Tomcat主页有三个按钮,分别表示进入服务器状态,管理服务器上部署的应用,管理主机界面。

默认情况下是无法进入的,点击其中任何一个按钮都会提示用户名和密码的输入框,但实际上Tomcat默认又没有配置任何用户名密码。

在conf目录下tomcat-users.xml文件中设置管理用户名和密码(默认都是注释掉的)

在其中加入如下设置就可以使用tomcat账户访问了,“manager-gui”拥有访问前两个按钮的权限,“admin-gui”拥有访问前第三个按钮的权限

服务器访问控制

 

  • 隐藏 Tomcat 版本信息

默认情况下Tomcat出错会爆出服务器的版本信息,这本身也是一种信息泄露,所以要尽可能将其隐藏。

进入tomcat的lib目录找到catalina.jar文件,将其解压然后进入org/apache/catalina/util 编辑配置文件ServerInfo.properties,如图所示

将版本信息去除,保存

然后再使用命令

jar uvf catalina.jar org/apache/catalina/util/ServerInfo.properties

将ServerInfo.properties文件压回jar包。

然后Tomcat的版本信息就不会泄露了。

  • 禁止目录列表

为防止Web的目录遍历漏洞要禁止Web上显示目录列表,设置方法在Tomcat的conf文件夹中编辑web.xml文件,找到如下内容,如果标记的位置为true就会出现目录遍历,默认为false。

Tomcat 日志格式

Tomcat的日志文件存放于logs文件夹,里面包含了多种类型的日志,主要分为两类:

一是运行中的日志,它主要记录运行的一些信息,尤其是一些异常错误日志信息。
二是访问日志信息,它记录的访问的时间,IP,访问的资料等相关信息。

以本图为例各个日志的作用如下

localhost.2017-09-29.log:程序异常没有被捕获的时候抛出的地方

catalina.2017-09-29.log:程序的输出,tomcat的运行日志

manager.2017-09-29.log:manager项目专有的

host-manager.2017-09-29.log:manager项目专有的

localhost_access_log.2017-09-29.txt:访问日志记录

Tomcat的运行日志日志服务端程序的运行日志记录,如果以命令行的形式打开Tomcat就可直接看到运行日志的输出。

Tomcat的运行日志有以下7个级别:

SEVERE > WARNING > INFO > CONFIG > FINE > FINER > FINEST

在conf/logging.properties文件中可以设置日志级别

访问日志则是记录浏览器对Web程序的访问过程,其格式可以在/conf/server.xml中配置

以下面这条日志为例,每个字段的含义为

192.168.228.1 - - [29/Sep/2017:11:26:10 +0800] "GET / HTTP/1.1" 200 11418

%h:远程主机名或IP地址:192.168.228.1

%l:远程用户名,始终为“-”

%u:已验证的远程用户,如果没有则为“-”

%t:访问日期和时间:[29/Sep/2017:11:26:10 +0800]

%r:http请求中的第一行:GET / HTTP/1.1

%s:http状态码:200

%b:发送的字节数:11418

中间件安全知识点记录-持续更新相关推荐

  1. 前端(js/css/html)那些小的知识点,持续更新......

    前端(js/css/html)那些小的知识点,持续更新...... 1.行内元素与块级元素有哪些及区别? 块级元素和行内元素的区别是,块级元素会占一行显示,而行内元素可以在一行并排显示.通过样式控制, ...

  2. 达梦数据库操作记录_达梦数据库常用功能及命令记录 -- 持续更新

    达梦数据库常用功能及命令记录 -- 持续更新 达梦数据库常用功能及命令记录 达梦数据库语句的使用总体来说跟 oracle 很接近的, 这篇文章主要是把常用的情况和语句做了记录, 并且后续还会不断的持续 ...

  3. PHP —— 一份前端开发工程师够用的PHP知识点(持续更新)

    PHP -- 一份前端开发工程师够用的PHP知识点(持续更新) <工欲善其事,必先利其器> 本文只是记录本小菜鸡在工作中遇到的知识点,欢迎大家随时补充! 一.初识 PHP 首先,PHP 它 ...

  4. javaSE基础重点知识点总结 持续更新

    javaSE基础重点知识点解析 文章目录 javaSE基础重点知识点解析 前言 1.重载和重写 2.匿名对象 3.可变个数形参的方法 4.MVC设计模式 5.java.lang.Object类 6.自 ...

  5. Ios-视频直播-知识点汇总-持续更新

    最近公司要求做视频直播,之前工作几年,视频一直都是弱项,没怎么接触过,现在正好有机会深入的去了解一下,记录一些遇到的坑和需要用到的东西. ~公司要求,用HLS协议,要求可以播放m3u8格式的,当时一听 ...

  6. 关于js的一些常用小知识点(持续更新)

    关于js的一些常用小知识点 1.获取页面中所有选中的CheckBox复选框的值 2.js获取网页URL中所带的参数 3.js模拟点击button 4.前端传入后台list,后台是不能接收List的,就 ...

  7. [日常] 面试知识点总结(持续更新)

    数据结构和算法:物理结构和逻辑结构1.逻辑结构(集合结构,线性结构,树形结构,图形结构)2.物理结构一般是讲内存,顺序存储结构,链式存储结构浅谈算法中,高斯算法从1加到100,循环的话是100次,高斯 ...

  8. web安全相关知识点(持续更新中)

    WEB安全知识点,最近学习WEB安全做的一些知识点笔记 **1.什么是Whois查询 2.备案信息是什么 3.如何使用Google进行敏感信息查询 4.Burp Suite是一个什么工具 5.如何进行 ...

  9. iOS 知识点整理 (持续更新...)

    整理了些iOS相关的基础问题,每个问题可能会再写些扩展,需要具体了解可以看题目下方的链接 如有错漏,欢迎指出,谢谢 一.Swift 1.给一个数组,要求写一个函数,交换数组中的两个元素(swift可用 ...

最新文章

  1. 语音文件转成文字怎么转
  2. php xss速查表,2020跨站脚本[xss]速查表 xss cheat sheet
  3. stylus 在静态页面上的使用经验
  4. oracle 10g real application clusters introduction (RAC原理)
  5. 数据库编程——JDBC 配置
  6. 浅谈项目开发现状(一)
  7. ssrf漏洞 php,DokuWiki fetch.php SSRF漏洞与tok安全验证绕过分析
  8. acm的STL容器之队列篇 及 UVa 11292 - Dragon of Loowater 小根堆解法(贪心算法)
  9. 是可改写的随机存储器_PPT下载:磁阻随机存取存储器
  10. git的CentOS服务端安装和windows客户端的使用
  11. android用usb无法连接ubuntu13.10(vmware中安装ubuntu) lsusb找不到手机
  12. spring mvc: xml练习
  13. python画散点图-python绘制散点图
  14. access数据库驱动的安装方法
  15. 论开心网和人人网的衰落
  16. php实现条形码生成,thinkPHP框架实现生成条形码的方法示例
  17. android qq音乐歌词怎么实现,歌词翻译利器 QQ音乐Android3.9.5版本全新上线
  18. 微信公众号服务器管理员权限,简析公众号管理员和运营者的区别
  19. 让你的网页文本框增加光晕效果与提示,水印(类似QQ2011)
  20. BootStrap富文本编辑器Summernote

热门文章

  1. dede织梦技巧:教你彻底解决dede按权重排序的问题(转)
  2. CreateCompatibleDC 介绍
  3. 关于网络训练过程中过拟合的一些问题及解决方法
  4. GB9706.1-2007医用电气安全通用要求标准,结合标准条款试验项目及测试设备介绍
  5. Flutter基础知识
  6. (网络速度)电信拉的100M光纤,测试峰值速度只有12M/s
  7. mysql视图的作用(详细)
  8. python实现简单对话机器人_采用python实现简单QQ单用户机器人的方法
  9. 银行数字化转型导师坚鹏:金融数字化转型助力乡村振兴及案例
  10. APP - 1 秒查看QQ空间第 1 张照片,我的青春居然喂了风景照