去除 Server 响应头实践

这篇文章我们来解决 AppScan 扫描漏洞中出现的另外一个漏洞"在应用程序中发现不必要的 Http 响应头"。

出现这个漏洞是因为我们返回的响应头出现了 Server 这个请求头:

查阅网上的资料,许多使用到了 server_tokens off; 命令,那我们在配置文件中的 http 块下添加这个命令看看:

更新 nginx 配置,刷新浏览器,我们可以看到 nginx 的版本号被隐藏了:

但是这并不能解决刚才提到的漏洞问题,漏洞的解决需要我们把这个 Server 头去掉,这需要我们使用到一个插件,这个插件可以帮我们设置和清除输入和输出标头 :

GitHub - openresty/headers-more-nginx-module: Set, add, and clear arbitrary output headers in NGINX http servers

在这里我使用 nginx-1.21.4 和 headers-more-nginx-module-0.34 做演示:

通过 ftp 工具将两个包上传到我们的虚拟机或者服务器后,将包解压:

arduino 复制代码
tar -zxvf nginx-1.21.4.tar.gz
tar -zxvf headers-more-nginx-module-0.34.tar.gz

然后我们在构建我们的 nginx 时,使用以下命令:

bash 复制代码
cd nginx-1.21.4
# --prefix 指定 nginx 的安装目录
# --add-module 添加第三方模块
./configure --prefix=/usr/nginx \
     --add-module=/your_path/headers-more-nginx-module
# make 编译
# make install 安装
make & make install

接着我们在 nginx 配置文件中的 http 块中加入 more_clear_headers 'Server'; 指令:

然后我们启动 nginx,响应头里的 Server 头就去掉了:

如果你需要使用 docker 来部署 nginx,可以使用这样如下 dockerfile 构建:

bash 复制代码
# 基础镜像
FROM ubuntu:20.04 AS builder

# 定义版本号
ENV NGINX_VERSION 1.21.4
ENV MODULE_VERSION 0.34

# 更新证书
RUN apt-get update -y && \
    apt-get install -y --reinstall ca-certificates

# 更换为中科大镜像源
RUN echo "deb https://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse" > /etc/apt/sources.list && \
    echo "deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-backports main restricted universe multiversec https://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse" >> /etc/apt/sources.list

# 安装需要的依赖
RUN rm -rf /var/lib/apt/lists/* && \
    rm /var/lib/apt/lists/* -vf && \
    apt-get update -y && \
    apt-get install -y libpcre3-dev && \
    apt-get install -y zlib1g.dev && \
    apt-get install -y build-essential 

# 将本地的 nginx 安装包复制到容器内    
COPY nginx-${NGINX_VERSION}.tar.gz /tmp/nginx-${NGINX_VERSION}.tar.gz

# 将本地的第三方模块安装包复制到容器内
COPY headers-more-nginx-module-${MODULE_VERSION}.tar.gz /tmp/headers-more-nginx-module-${MODULE_VERSION}.tar.gz

RUN cd /tmp && \
    tar -xvzf nginx-${NGINX_VERSION}.tar.gz && \
    tar -xvzf headers-more-nginx-module-${MODULE_VERSION}.tar.gz

# 添加动态模块并重新编译
RUN cd /tmp/nginx-${NGINX_VERSION} && \
    ./configure --with-compat --add-dynamic-module=/tmp/headers-more-nginx-module-${MODULE_VERSION} && \
    make modules

# 定义一个全新的 nginx 容器并把刚才编译的内容复制到新的 nginx 容器内
FROM nginx:1.21.4
COPY --from=builder /tmp/nginx-${NGINX_VERSION}/objs/* /etc/nginx/modules/
COPY --from=builder /usr/local/lib/* /lib/x86_64-linux-gnu/
COPY nginx.conf  /etc/nginx/nginx.conf

首先,我创建一个 Nginx 容器,其中包含 Nginx 压缩包和编译模块的构建工具。然后,第二个阶段是使用预构建的 Nginx 镜像,将编译好的资源从构建器容器复制到预构建的 Nginx 容器中。

如果你的 Linux 是 ARM 架构的,请使用如下 dockerfile:

bash 复制代码
# 基础镜像
FROM arm64v8/ubuntu:20.04 AS builder

# 定义版本号
ENV NGINX_VERSION 1.21.4
ENV MODULE_VERSION 0.34

# 更新证书
RUN apt-get update -y && \
    apt-get install -y --reinstall ca-certificates

# 更换为中科大镜像源
RUN echo "deb https://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse" > /etc/apt/sources.list && \
    echo "deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-backports main restricted universe multiversec https://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse" >> /etc/apt/sources.list

# 安装需要的依赖
RUN rm -rf /var/lib/apt/lists/* && \
    rm /var/lib/apt/lists/* -vf && \
    apt-get update -y && \
    apt-get install -y libpcre3-dev && \
    apt-get install -y zlib1g.dev && \
    apt-get install -y build-essential 

# 将本地的 nginx 安装包复制到容器内    
COPY nginx-${NGINX_VERSION}.tar.gz /tmp/nginx-${NGINX_VERSION}.tar.gz

# 将本地的第三方模块安装包复制到容器内
COPY headers-more-nginx-module-${MODULE_VERSION}.tar.gz /tmp/headers-more-nginx-module-${MODULE_VERSION}.tar.gz

RUN cd /tmp && \
    tar -xvzf nginx-${NGINX_VERSION}.tar.gz && \
    tar -xvzf headers-more-nginx-module-${MODULE_VERSION}.tar.gz

# 添加动态模块并重新编译
RUN cd /tmp/nginx-${NGINX_VERSION} && \
    ./configure --with-compat --add-dynamic-module=/tmp/headers-more-nginx-module-${MODULE_VERSION} && \
    make modules

# 定义一个全新的 nginx 容器并把刚才编译的内容复制到新的 nginx 容器内
FROM arm64v8/nginx:1.21.4
COPY --from=builder /tmp/nginx-${NGINX_VERSION}/objs/* /etc/nginx/modules/
COPY --from=builder /usr/local/lib/* /lib/aarch64-linux-gnu/
COPY nginx.conf  /etc/nginx/nginx.conf

从 NGINX 1.9.11 开始,可以将该模块编译为动态模块,使用 --add-dynamic-module=PATH 选项,你可以在 nginx.conf 中通过 load_module 指令显式加载该模块,使用到的 nginx.conf 内容如下:

dart 复制代码
load_module modules/ngx_http_headers_more_filter_module.so;
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    more_clear_headers 'Server';

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
相关推荐
紫金桥软件5 分钟前
紫金桥组态软件RealSCADA:化工行业数智化转型的安全基石
安全·scada·组态软件·国产工业软件·监控组态软件
BFT白芙堂6 分钟前
基于 Kinova Gen3 机械臂的家庭人机交互安全算法研究
人工智能·深度学习·算法·安全·人机交互·模型训练·具身智能
科普体验馆9 分钟前
【VR安全体验馆】深度测评:优质服务商与推荐厂家全景解析
安全·vr
小陈工2 小时前
Python安全编程实践:常见漏洞与防护措施
运维·开发语言·人工智能·python·安全·django·开源
NGINX开源社区3 小时前
使用 NGINX 作为 AI Proxy
大数据·人工智能·nginx
Chengbei1110 小时前
若依全漏洞复现:从 SQL 注入到 RCE 一站式实战 复现、利用与防御
数据库·sql·安全·web安全·网络安全·系统安全·安全架构
钛态11 小时前
Flutter for OpenHarmony:mockito 单元测试的替身演员,轻松模拟复杂依赖(测试驱动开发必备) 深度解析与鸿蒙适配指南
服务器·驱动开发·安全·flutter·华为·单元测试·harmonyos
小二·12 小时前
威胁情报驱动的安全运营:从IOC到TTPs的深度狩猎实战指南
安全
云安全助手14 小时前
OpenClaw失控风暴:Meta两小时Sev1级事故,AI智能体集体黑化敲响全球安全警钟
人工智能·安全
昨夜见军贴061614 小时前
AI审核守护生命设备安全:IACheck成为呼吸机消毒效果检测报告的智能审核专家
大数据·人工智能·安全