nginx 安全加固

2023-09-21 16:24:11

Nginx 官方容器的安全加固主要包括以下几个方面:

  1. 最小化容器:尽量只包含运行应用程序所需的最小文件和依赖项。这可以减少攻击面,提高安全性。

  2. 使用非root用户运行容器:默认情况下,Docker 容器以 root 用户身份运行,这可能会带来安全风险。你可以在 Dockerfile 中使用 USER 指令来指定一个非root用户运行容器。

  3. 限制容器的资源使用:你可以使用 Docker 的资源限制功能来限制容器的 CPU、内存等资源使用,防止容器消耗过多的系统资源。

  4. 更新和打补丁:定期更新容器的基础镜像和应用程序,以获取最新的安全更新和补丁。

  5. 使用安全的 Docker 配置:例如,禁用容器的 root 权限,限制容器的网络访问等。

以下是一个加固的 Dockerfile 示例:

# 使用官方的 nginx 镜像作为基础镜像
FROM nginx:latest

# 创建一个新的用户和用户组,用于运行 nginx
RUN groupadd -r nginx && useradd -r -g nginx nginx

# 更改 nginx 的配置文件和内容目录的所有权
RUN chown -R nginx:nginx /etc/nginx /var/cache/nginx

# 切换到新创建的用户
USER nginx

# 指定 nginx 配置文件的路径
CMD ["nginx", "-g", "daemon off;", "-c", "/etc/nginx/nginx.conf"]

这只是一个基本的示例,你可能需要根据你的具体需求进行更多的定制和优化。
6. nginx 隐藏server: nginx信息

在 Nginx 中,你可以通过修改配置文件来隐藏或修改 Server: nginx 响应头。这可以通过在 http、server 或 location 块中添加 server_tokens 指令来实现。

以下是如何在全局范围内禁用 server_tokens 的示例:
http {
server_tokens off;

...

}

这将删除 Server: nginx 响应头中的版本号,但仍然会显示 nginx。如果你想完全删除 Server 响应头,你需要使用第三方模块,如 headers-more-nginx-module。

nginx -V | echo - > test.txt
nginx version: nginx/1.22.1
built by gcc 12.2.1 20220924 (Alpine 12.2.1_git20220924-r4)
built with OpenSSL 3.0.7 1 Nov 2022 (running with OpenSSL 3.0.8 7 Feb 2023)
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-perl_modules_path=/usr/lib/perl5/vendor_perl --user=nginx --group=nginx  --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-Os -fomit-frame-pointer -g' --with-ld-opt=-Wl,--as-needed,-O1,--sort-common

–add-module=…/headers-more-nginx-module-0.33

如果你已经安装了 headers-more-nginx-module,你可以使用 more_set_headers 指令来删除或修改 Server 响应头,如下所示:
http {
more_set_headers ‘Server: My Custom Server’;

...

}
请注意,隐藏或修改 Server 响应头只能提供有限的安全性,因为它不能防止所有类型的攻击。你应该始终保持你的 Nginx 服务器和所有其他软件的更新,以获取最新的安全补丁。

多阶段编译示例:
https://www.coder.work/article/7364368
https://stackoverflow.com/questions/59189311/edit-hide-nginx-server-header-under-alpine-linux
https://gist.github.com/hermanbanken/96f0ff298c162a522ddbba44cad31081

ARG VERSION=alpine
FROM nginx:${VERSION} as builder

ENV MORE_HEADERS_VERSION=0.33
ENV MORE_HEADERS_GITREPO=openresty/headers-more-nginx-module

# Download sources
RUN wget "http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz" -O nginx.tar.gz && \
    wget "https://github.com/${MORE_HEADERS_GITREPO}/archive/v${MORE_HEADERS_VERSION}.tar.gz" -O extra_module.tar.gz

# For latest build deps, see https://github.com/nginxinc/docker-nginx/blob/master/mainline/alpine/Dockerfile
RUN  apk add --no-cache --virtual .build-deps \
    gcc \
    libc-dev \
    make \
    openssl-dev \
    pcre-dev \
    zlib-dev \
    linux-headers \
    libxslt-dev \
    gd-dev \
    geoip-dev \
    perl-dev \
    libedit-dev \
    mercurial \
    bash \
    alpine-sdk \
    findutils

SHELL ["/bin/ash", "-eo", "pipefail", "-c"]

RUN rm -rf /usr/src/nginx /usr/src/extra_module && mkdir -p /usr/src/nginx /usr/src/extra_module && \
    tar -zxC /usr/src/nginx -f nginx.tar.gz && \
    tar -xzC /usr/src/extra_module -f extra_module.tar.gz

WORKDIR /usr/src/nginx/nginx-${NGINX_VERSION}

# Reuse same cli arguments as the nginx:alpine image used to build
RUN CONFARGS=$(nginx -V 2>&1 | sed -n -e 's/^.*arguments: //p') && \
    sh -c "./configure --with-compat $CONFARGS --add-dynamic-module=/usr/src/extra_module/*" && make modules
更多推荐

龙蜥白皮书精选:机密计算平台技术

文/云原生机密计算SIG机密计算是一种依赖于硬件的使用中数据保护技术。芯片厂商通过提供特殊的硬件指令、受保护的加密内存区域等手段,辅以基于硬件的密钥管理和密码学操作,为使用中的数据提供了一个受保护的可信编程环境,通常称之为可信执行环境(TrustedExecutionEnvironment,简称TEE)。利用最底层硬件

【C语言】basename函数

basename()是一个Linux系统编程常用的C语言库函数,包含在头文件<libgen.h>中。basename()函数的作用是从一个路径中提取文件名部分。主要的原型如下:char*basename(char*path);给定一个文件路径,basename会返回指向路径中最后一个'/'后的文件名部分字符串的指针。例

【软考中级】网络工程师:知识产权和标准化

我国标准的级别《中华人民共和国标准化法》将标准划分为4个层次:国家标准行业标准地方标准企业标准除此之外还有国际标准,如:ISO(国际标准化组织)、IEC(国际电工委员会)、ITU(国际电信联盟)。国家标准和行业标准国家标准GB:强制性国家标准GB/T:推荐性国家标准GB/Z:指导性国家标准GSB:国家实物标准行业标准对

误删桌面文件如何恢复?试试这个方法!

“桌面文件误删除怎么找回?今天我同事的电脑突然出现内存不够的提示,之后自动重启,等待启动完毕后发现桌面文件全部消失了,这是怎么回事?如何解决这个问题呢?我原本打算检查系统隐藏文件SystemvolumeInformation是否还在,但却告诉我没有权限查看,然后我按照网络上的教程利用注册表注册再以管理员身份查看,却又告

Java浅谈随笔,你都会了吗?

(一)当面试官问到你对反射的认识和使用时,你可以回答以下内容:反射的认识:反射是Java语言中一种强大的机制,它允许程序在运行时动态地获取和操作类的信息、对象的字段和方法。通过反射,我们可以在运行时检查和修改类的结构,调用对象的方法,甚至可以创建新的对象。反射提供了一种灵活的方式来实现动态的功能和增强代码的复用性。反射

DA5 网站用户没有补全的信息

目录1.题目描述2.输入描述3.输出描述4.题目分析5.通过代码1.题目描述现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):Nowcoder_ID:用户IDLevel:等级Achievement_value:成就值Num_of_exercise:刷题量Gra

Navicat安装使用教程

众所周知,Navicat是一款轻量级的用于MySQL连接和管理的工具,非常好用,使用起来方便快捷,简洁。下面我会简单的讲一下其安装以及使用的方法。并且会附带相关的永久安装教程。简介一般我们在开发过程中是离不开数据库的,Navicat是一款轻量级的用于MySQL连接和管理的工具,非常好用。https://note.you

redis -- 基本介绍 -- 字符串、列表、集合、有序集合、哈希

目录Redis字符串string列表list集合set有序集合sortedset哈希hashRedisRedis(RemoteDictionaryServer)是一个开源的、高性能的、内存中的数据存储系统他可以用作数据库缓存和消息队列等各种场景是目前最热门的NoSQL数据库之一MySQL的磁盘IO读写速度与内存相比非常

直线模组的常用语

在工业生产中,直线模组的叫法有很多种,对于新手小白来说,很容易就会被绕晕,今天我们就来简单说一下直线模组的常用称呼吧!1、直线模组:与直线滑台同义,基本可以相互互换。直线模组一般是指可以完成直线运动和直线定位的传动模块,一般不包括电机驱动和运动控制系统在内,常用的直线模组分为滚珠丝杆型直线模组和同步带传动型直线模组。2

Windows 修改系统默认字体

WindowsRegistryEditorVersion5.00;重装机后电脑屏幕及字体调整.reg.lnk;;显示器分辨率:3840*2160;;自定义缩放:266;;辅助功能-文本大小-110%;;最后ClearType文本调谐器;https://www.cnblogs.com/bolang100/p/854804

数据结构 - 链表

线性表的链式存储结构概念将线性表L=(a0,a1,…,an-1)中各元素分布在存储器的不同存储块,成为结点,通过地址或指针建立元素之间的联系。结点的data域存放数据元素ai,而next域是一个指针,指向ai的直接后继ai+1所在的结点。下图中的首元结点(头结点)A的data不重要,next域指向链表的真正的第一个结点

热文推荐