美文网首页安全收集
中间件安全配置

中间件安全配置

作者: Franchen | 来源:发表于2019-07-22 10:25 被阅读0次

    原文链接:http://wyb0.com/posts/middleware-security-configuration/
    转载链接:https://www.jianshu.com/p/80b4059af5c2 reber
    补充参考:https://www.cnblogs.com/511mr/articles/2253958.html 百分百

    为什么要隐藏中间件类型和版本?

    泄露中间件类型和版本可能存在风险。特别是在某版本的中间件有bug的情况下会比较危险,所以我们一般把这些信息屏蔽,不给客户端用户知道。


    目录

    • Apache
    • Nginx
    • Tomcat
    • JBoss

    Apache

    • 隐藏版本号
    $ vim /etc/apache2/conf-available/security.conf
    ServerTokens Prod # 控制Server头仅返回Server:Apache
    ServerSignature Off # 控制网站页脚不显示服务器签名信息
    
    • 隐藏中间件类型(修改源码,然后重新编译)
    # 方式一:在server/core.c:2784 添加:
    ap_add_version_component(pconf, "jufukeji");
    return;
    
    # 方式二:修改include目录下的ap_release.h文件
    #define AP_SERVER_BASEVENDOR "MyServer"
    #define AP_SERVER_BASEPROJECT "MyServer"
    #define AP_SERVER_BASEPRODUCT "MyServer"
    
    #define AP_SERVER_MAJORVERSION_NUMBER 1
    #define AP_SERVER_MINORVERSION_NUMBER 0
    #define AP_SERVER_PATCHLEVEL_NUMBER   0
    #define AP_SERVER_DEVBUILD_BOOLEAN    0
    
    • 检查服务器运行权限
    $ ps aux|grep apache|grep -v grep
    $ sudo lsof -i:80
    COMMAND    PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    apache2   1377     root    4u  IPv6  12596      0t0  TCP *:http (LISTEN)
    apache2  21121 www-data    4u  IPv6  12596      0t0  TCP *:http (LISTEN)
    apache2  21122 www-data    4u  IPv6  12596      0t0  TCP *:http (LISTEN)
    apache2  21123 www-data    4u  IPv6  12596      0t0  TCP *:http (LISTEN)
    apache2  21124 www-data    4u  IPv6  12596      0t0  TCP *:http (LISTEN)
    apache2  21125 www-data    4u  IPv6  12596      0t0  TCP *:http (LISTEN)
    apache2  24800 www-data    4u  IPv6  12596      0t0  TCP *:http (LISTEN)
    apache2 127488 www-data    4u  IPv6  12596      0t0  TCP *:http (LISTEN)
    

    第一行是Apache主进程,以root权限运行的,因为Apache的Web端口是80或443,而在Ubuntu(Linux)中开启小于1024的端口需要root权限,所以主进程必须以root权限运行。
    第二行起为Apache子进程,其执行用户为www-data,www-data是Ubuntu中运行Web服务的默认用户,权限较低。

    Windows中Apache安装完成后默认是administrator权限,所以需要降权,创建一个用户Apache,用户组为Guests,然后将Apache目录下的日志的可写权限赋给Guests账户。

    • 防止目录遍历
    修改配置文件,vim /etc/apache2/apache2.conf,将
    Options Indexes FollowSymLinks 
    改为(即去掉Indexes,或在字母前加-):
    Options FollowSymLinks
    
    • 设置错误重定向
    # 可以通过设置.htaccess文件达到目的,比如:
    ErrorDocument 404 /404.html
    
    # 开启跳转,符合正则就跳转:
    RewriteEngine On
    RewriteRule "test\.html$"  "404.html" # 例如匹配到test.html结尾的就跳转
    
    • 禁止执行脚本运行
    # 禁止执行脚本
    $ vim /etc/apache2/apache2.conf
    <Directory /var/www/html/upload/>
        php_flag engine off    # 禁止执行php
    </Directory>
    
    • 优化Apache日志格式
    vim /etc/apache2/apache2.conf
    
    # 修改access.log格式
    LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
    LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %O" common
    LogFormat "%{Referer}i -> %U" referer
    LogFormat "%{User-agent}i" agent
    
    #第一行是虚拟主机日志格式
    #第二行是组合日志格式(Combined Log Format)
    #第三行是通用日志格式(Common Log Format)
    
    # access.log日志输出示例
    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
    路径一般为:/var/log/apache2/error.log,notice级别的消息总是会被记录下来,而不能被屏蔽。
    日志格式:[日期和时间] [错误等级] 错误消息
    

    Nginx

    • 隐藏版本号
    $ vim /usr/local/nginx/conf/nginx.conf
    http {
        ...
        server_tokens off;  # 隐藏版本号
    
    
    • 隐藏中间件类型(修改源码重新编译)
    $ vim src/http/ngx_http_header_filter_module.c # 修改第48-49 行
    static char ngx_http_server_string[] = "Server: MyServer" CRLF;
    static char ngx_http_server_full_string[] = "Server: MyServer" CRLF;
    
    $ vim nginx-1.9.9/src/core/nginx.h # 可修改版本号及类型
    #define nginx_version      7007007
    #define NGINX_VERSION      "7.7.7"
    #define NGINX_VER          "MyServer/"NGINX_VERSION
    
    $ vim /usr/local/nginx/conf/fastcgi.conf # 修改第17行
    fastcgi_param  SERVER_SOFTWARE    MyServer/$nginx_version;
    
    • 防止钓鱼和XSS
    $ vim /usr/local/nginx/conf/nginx.conf
        server {
            listen       80;
            server_name  localhost;
    
            add_header X-Frame-Options SAMEORIGIN; #在头部添加X-Frame-Options防止被Frame
            add_header X-XSS-Protection "1; mode=block"; #防御XSS
    
    DENY:浏览器拒绝当前页面加载任何Frame页面
    SAMEORIGIN:frame页面的地址只能为同源域名下的页面
    ALLOW-FROM:origin为允许frame加载的页面地址
    
    
    • CRLF注入
    案例一:
    location /sectest {
      return 302 https://$host$uri; #应将$uri或者$document_uri改为$request_uri
    }
    
    案例二:
    location / {
        rewrite ^ https://$host/$uri;
    }
    
    案例三:
    server {
        listen 80 default;
    
        location ~ /v1/((?<action>[^.]*)\.json)?$ {
            add_header X-Action $action;
            return 200 "OK";
        }
    }
    
    
    • 修复alias导致的任意文件读取
    location /files { # 把/files改为/files/即可修复
      alias /home/;
    }
    
    当访问http://joychou.me/files/x.txt,即访问服务器上的/home/x.txt文件
    当访问http://joychou.me/files../etc/passwd时就读取了passwd文件了
    
    • 反向代理中的SSRF
    反向代理语法:proxy_pass http://ip:port/uri/;
    当ip可控时那么反向代理的机器会对该ip发起http请求,即可造成SSRF。
    这种场景多出现在云WAF、CDN、高防DDOS等网络产品。
    
    • add_header重定义
    如果location区块有add_header,那么以location为准。
    如果location没有add_header,则继承Http和server块的add_header内容。
    

    Tomcat

    • 隐藏版本信息
    # 方法一:
    cd /opt/tomcat/lib
    # 解压catalina.jar包,生成META-INF和org文件夹
    jar -xvf catalina.jar
    # 编辑配置文件,去掉版本信息
    vim org/apache/catalina/util/ServerInfo.properties
    # 将修改后的文件压回jar包
    jar uvf catalina.jar org/apache/catalina/util/ServerInfo.properties
    # 返回重新安装
    cd ../bin/
    ./startup.sh
    
    # 方法二:
    # 修改:java/org/apache/coyote/http11/Constants.java:56
    ByteChunk.convertToBytes("Server: MyServer" + CRLF);
    # 修改:java/org/apache/coyote/ajp/Constants.java:236
    ByteChunk.convertToBytes("Server: MyServer" + CRLF);
    # 重新编译
    
    • 检查服务器运行权限

    Linux中Tomcat的运行权限与Tomcat的启动账户有关,比如以root用户启动,那获取的webshell就也是root权限

    Windows权限控制需要进行账户配置,新建一个Tomcat用户,并归属于Guests组,再将账户设置为服务登录账户

    webapps为Web站点目录,将其中文件上传的文件夹设置为不可执行。

    • 服务器后台管理
    # 更改默认登录用户和密码
    $ vim /usr/local/tomcat/conf/tomcat-users.xml
      <role rolename="manager-gui"/>
      <user username="YouGuess" password="You#Dont@Know!2333" roles="manager-gui"/>
    
    • 禁止列目录
    vim /opt/tomcat/conf/web.xml #设置为false即可,默认就是false
      <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
      </init-param>
    
    • 服务日志
    $ ll /opt/tomcat/logs
    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:访问日志记录
    
    日志有以下7个级别:
    SEVERE > WARNING > INFO > CONFIG > FINE > FINER > FINEST 
    
    $ vim conf/logging.properties #修改日志级别
    1catalina.org.apache.juli.AsyncFileHandler.level = FINE
    
    

    JBoss

    • 隐藏中间件类型和版本
    # 修改:server/default/deploy/jbossweb-tomcat55.sar/conf/web.xml
    <!-- ================== Common filter Configuration ==================== -->
    <filter>
    <filter-name>CommonHeadersFilter</filter-name>
    <filter-class>org.jboss.web.tomcat.filters.ReplyHeaderFilter</filter-class>
    <init-param>
    <param-name>X-Powered-By</param-name>
    
    # 修改下面这句为自定义显示,如:MyServer
    <param-value>Servlet 2.4; JBoss-4.0.4.GA (build: CVSTag=JBoss_4_0_4_GA date=200605151000)/Tomcat-5.5</param-value>
    
    </init-param>
    </filter>
    
    <filter-mapping>
    <filter-name>CommonHeadersFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping> 
    

    相关文章

      网友评论

        本文标题:中间件安全配置

        本文链接:https://www.haomeiwen.com/subject/ojqilctx.html