Springboot -- 网络安全漏洞处理

不安全的 HTTP 方法以及 Nginx 屏蔽版本号显示

说明

Web服务器在默认情况下开放了一些不必要的HTTP方法(如OPTIONS,DELETE、PUT、TRACE、MOVE、COPY),增加了受攻击的几率,所以对于我们不需要使用的HTTP方法,要做出尽量限制,避免非法访问的发生。

以 OPTIONS 为例:
其主要用途包括:
1、获取服务器支持的HTTP请求方法;也是黑客经常使用的方法。
2、用来检查服务器的性能。例如:AJAX进行跨域请求时的预检,需要向另外一个域名的资源发送一个HTTP OPTIONS请求头,用以判断实际发送的请求是否安全。

检测方式

  • 随便挑选一个开发接口,例如我们选取一个用 GET 方式请求的接口。
  • 将请求方式修改为 OPTIONS
  • 查看响应结果
    在这里插入图片描述
    以上的响应结果其实暴露出两个问题:
    1、不安全的 HTTP 方法
    2、nginx 不应该显示版本号

不安全的 HTTP 方法 处理代码

修改 Springboot 内置 Tomcat 的配置

@Configuration
public class TomcatConfig {

    @Bean
    public ServletWebServerFactory servletContainer() {

        TomcatServletWebServerFactory tomcatServletContainerFactory = new TomcatServletWebServerFactory();

        tomcatServletContainerFactory.addContextCustomizers(new TomcatContextCustomizer(){
  
           @Override
           public void customize(Context context) {
            SecurityConstraint constraint = new SecurityConstraint();
            SecurityCollection collection = new SecurityCollection();
            //http方法
            collection.addMethod("PUT");
            collection.addMethod("DELETE");
            collection.addMethod("HEAD");
            collection.addMethod("OPTIONS");
            collection.addMethod("TRACE");
            //url匹配表达式 所有路径
            collection.addPattern("/*");
            constraint.addCollection(collection);
            //设置以上HTTP方法在指定路径下需要身份验证约束
            constraint.setAuthConstraint(true);
            context.addConstraint(constraint );

            //设置使用httpOnly
            context.setUseHttpOnly(true);
           }
        });
        return tomcatServletContainerFactory;
    }
}

屏蔽 Nginx 版本号显示

  • 打开 nginx 主配置文件添加属性:
http {
  server_tokens off;
}
server {
  server_tokens off;
}

点击劫持漏洞

说明

查看HTTP响应头信息中的X-Frame-Options,可以指示浏览器是否应该加载一个iframe中的页面。
防止服务器响应头信息中没有X-Frame-Options,从而存在ClickJacking攻击的风险。

什么是ClickJacking

点击劫持(用户界面补救攻击,UI补救供给,UI攻击)是一种恶意技术,他通过诱骗 Web 用户点击与用户认为他们正在点击的内容不同的东西,从而可能泄露机密信息或控制他们的计算机,同时点击看似无害的网页。
点击劫持是一种视觉上的欺骗手段。攻击者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户将在不知情的情况下点击透明的iframe页面。通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上。

检测方式

使用AWVS,我使用的版本是 10.5 ,安装后登录网页 localhost:8183,配置如下:
在这里插入图片描述在这里插入图片描述在这里插入图片描述
查看结果:
显示 X-Frame-Options 响应头丢失
在这里插入图片描述

处理代码

@Component
public class IdentityInterceptor extends HandlerInterceptorAdapter
{

    ......
    
	/**
	 * 在业务处理器处理请求执行完成后,生成视图之前执行的动作 可在modelAndView中加入数据,比如当前时间
	 */
	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception
	{
		//网络安全要求 增加 x-frame-options 响应头 防止ClickJacking攻击
		response.addHeader("x-frame-options","SAMEORIGIN");
	}
	
    ......
    
}

若是服务由Nginx转发,还需要修改Nginx配置

http{
	add_header X-Frame-Options SAMEORIGIN;
}

或者

server{
	add_header X-Frame-Options SAMEORIGIN;
}

XSS跨站脚本攻击

说明

跨站脚本是一种经常出现在web应用程序中的计算机安全漏洞,是由于web应用对用户提交请求参数未做充分的检查过滤,允许用户在提交的数据中加入HTML\JS代码,未加编码地输出到第三方用户浏览器,恶意攻击者可以利用JS、activeX、html语言甚至flash应用的漏洞,发送恶意代码给另一个用户,因为浏览器无法识别脚本是否可信,从而跨站漏洞脚本便运行并让攻击者获取其他用户信息。

取自百度百科的举例:
用户在浏览网站、使用即时通讯软件、甚至在阅读电子邮件时,通常会点击其中的链接。攻击者通过在链接中插入恶意代码,就能够盗取用户信息。攻击者通常会用十六进制(或其他编码方式)将链接编码,以免用户怀疑它的合法性。网站在接收到包含恶意代码的请求之后会产成一个包含恶意代码的页面,而这个页面看起来就像是那个网站应当生成的合法页面一样。许多流行的留言本和论坛程序允许用户发表包含HTML和javascript的帖子。假设用户甲发表了一篇包含恶意脚本的帖子,那么用户乙在浏览这篇帖子时,恶意脚本就会执行,盗取用户乙的session信息。有关攻击方法的详细情况将在下面阐述。

检测方式

在AWS中检测:
在这里插入图片描述

处理代码 (参考网上的代码,主要是对传入的信息进行敏感字符的过滤)

public final class HttpRequestWrapper extends HttpServletRequestWrapper {
 
    private Map<String, String> xssMap;
     
    public HttpRequestWrapper(HttpServletRequest request) {
        super(request);
    }
 
    public HttpRequestWrapper(HttpServletRequest request,
            Map<String, String> xssMap) {
        super(request);
        this.xssMap = xssMap;
    }
 
    @Override
    public String[] getParameterValues(String parameter) {
        String[] values = super.getParameterValues(parameter);
        if (values == null) {
            return null;
        }
        int count = values.length;
        // 遍历每一个参数,检查是否含有
        String[] encodedValues = new String[count];
        for (int i = 0; i < count; i++) {
            encodedValues[i] = cleanXSS(values[i]);
        }
        return encodedValues;
    }
 
    @Override
    public String getParameter(String parameter) {
        String value = super.getParameter(parameter);
        if (value == null) {
            return null;
        }
        return cleanXSS(value);
    }
 
    public String getHeader(String name) {
        String value = super.getHeader(name);
        if (value == null)
            return null;
        return cleanXSS(value);
 
    }
 
    /**
     * 清除恶意的XSS脚本
     * 
     * @param value
     * @return
     */
    private String cleanXSS(String value) {
        Set<String> keySet = xssMap.keySet();
        for(String key : keySet){
            String v = xssMap.get(key);
            value = value.replaceAll(key,v);
        }
        return value;
    }
}

/**
 * 防止 XSS 跨站脚本攻击
 */
@Component
public class XSSFilter implements Filter {

    // XSS处理Map
    private static Map<String,String> xssMap = new LinkedHashMap<String,String>();
     
    public void init(FilterConfig filterConfig) throws ServletException {
        // 含有脚本:script
        xssMap.put("[s|S][c|C][r|R][i|C][p|P][t|T]", "");
        // 含有脚本 javascript
        xssMap.put("[\\\"\\\'][\\s]*[j|J][a|A][v|V][a|A][s|S][c|C][r|R][i|I][p|P][t|T]:(.*)[\\\"\\\']", "\"\"");
        // 含有函数: eval
        xssMap.put("[e|E][v|V][a|A][l|L]\\((.*)\\)", "");
        // 含有符号 <
        xssMap.put("<", "&lt;");
        // 含有符号 >
        xssMap.put(">", "&gt;");
        // 含有符号 (
        xssMap.put("\\(", "(");
        // 含有符号 )
        xssMap.put("\\)", ")");
        // 含有符号 '
        xssMap.put("'", "'");
    }
     
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // 强制类型转换 HttpServletRequest
        HttpServletRequest httpReq = (HttpServletRequest)request;
        // 构造HttpRequestWrapper对象处理XSS
        HttpRequestWrapper httpReqWarp = new HttpRequestWrapper(httpReq,xssMap);
        // 
        chain.doFilter(httpReqWarp, response);
 
    }
 
    public void destroy() {
         
    }
}
<think>好的,我现在需要帮助用户解决在Spring Boot微服务中使用Gateway时如何解决Actuator安全漏洞的问题。首先,我需要回忆一下关于Spring Boot Actuator的安全问题以及Gateway组件的相关知识。 首先,Actuator提供了很多监控和管理端点,比如/health、/info、/env等,但这些端点如果暴露在外,可能会被攻击者利用,获取敏感信息或进行其他攻击。尤其是在微服务架构中,Gateway作为入口,如果配置不当,可能会将Actuator端点暴露出去。 接下来,我应该考虑如何限制对这些端点的访问。常见的方法包括通过安全配置禁用不必要的端点,或者使用Spring Security来保护这些端点。例如,在Spring Security中配置只允许特定角色或IP访问Actuator端点。 另外,修改默认的端点路径也是一个有效的措施,这样可以避免攻击者通过默认路径进行扫描。比如,将management.endpoints.web.base-path设置为一个不易猜测的路径。 还有,升级Spring Boot和相关依赖到最新版本也是一个关键步骤,因为新版本通常修复了已知的安全漏洞。需要检查当前使用的Spring Boot版本是否存在已知的Actuator漏洞,并建议用户升级到安全版本。 此外,在微服务中,可能需要在Gateway层面对路由进行配置,避免将Actuator端点路由到外部。例如,在Gateway的路由配置中排除对Actuator端点的转发,或者设置过滤器来拦截这些请求。 我还需要确保用户正确配置了Actuator的暴露范围,比如使用management.endpoints.web.exposure.include或exclude来限制暴露的端点,只开放必要的监控端点,关闭不需要的。 同时,生产环境中应该禁用敏感端点,比如/env、/trace等,这些可能会泄露配置信息或请求跟踪数据。可以通过配置management.endpoints.web.exposure.exclude来排除这些端点。 最后,可能需要结合使用HTTPS来加密通信,防止数据在传输过程中被窃听,这也是整体安全策略的一部分。 现在需要验证这些方法是否正确。比如,通过Spring Security配置访问权限,是否需要添加依赖,并编写相应的配置类。然后,修改端点路径是否会影响监控系统的访问,需要确保监控工具能够适应新的路径。另外,升级版本时需要注意兼容性问题,是否有不兼容的变更影响现有功能。 可能还需要考虑使用Spring Cloud Gateway的过滤器功能,添加安全相关的过滤器来拦截对Actuator端点的请求,例如检查请求头中的认证信息,或者限制内部访问。 总结一下,解决方案应该包括:安全配置端点暴露、使用Spring Security保护端点、修改默认路径、升级依赖版本、配置Gateway路由和过滤器,以及启用HTTPS等。需要将这些步骤详细列出,并提供具体的配置示例,帮助用户实际操作。 还需要生成相关问题,例如如何配置Spring Security保护Actuator,如何升级Spring Boot版本,或者如何监控微服务的安全性等。</think>### Spring Boot微服务中Gateway的Actuator安全漏洞解决方案 在Spring Boot微服务架构中,Gateway作为入口网关,若未正确配置Actuator端点,可能导致敏感信息泄露或未授权访问。以下是解决Actuator安全漏洞的关键步骤: --- #### **1. 限制Actuator端点暴露** - **禁用不必要的端点** 在`application.yml`中配置仅暴露必要端点(如`health`、`info`): ```yaml management: endpoints: web: exposure: include: health,info exclude: env,beans,trace ``` - **自定义端点路径** 修改默认路径,避免被自动化工具扫描: ```yaml management: endpoints: web: base-path: /internal-monitor ``` --- #### **2. 集成Spring Security保护端点** - **添加依赖** 在Gateway服务的`pom.xml`中引入Spring Security: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> ``` - **配置访问权限** 通过安全配置类限制Actuator端点仅允许内部角色访问: ```java @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/internal-monitor/**").hasRole("INTERNAL") .and() .httpBasic(); } } ``` --- #### **3. 配置Gateway路由过滤** - **排除Actuator路由转发** 在Gateway的路由配置中避免将Actuator请求转发到下游服务: ```yaml spring: cloud: gateway: routes: - id: service-route uri: lb://my-service predicates: - Path=/api/** filters: - StripPrefix=1 ``` - **添加IP白名单过滤器** 仅允许内部网络IP访问Actuator端点[^1]: ```java @Bean public GlobalFilter ipWhitelistFilter() { return (exchange, chain) -> { String clientIp = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress(); if (clientIp.startsWith("192.168.") && exchange.getRequest().getPath().value().startsWith("/internal-monitor")) { return chain.filter(exchange); } return exchange.getResponse().setComplete(); }; } ``` --- #### **4. 升级依赖版本** - **检查已知漏洞** 使用工具如`OWASP Dependency-Check`扫描项目,确认是否存在与Actuator相关的已知漏洞(如CVE-2022-22965)[^2]。 - **升级Spring Boot版本** 将Spring Boot升级至最新稳定版(如3.1.5+),确保安全补丁已生效。 --- #### **5. 启用HTTPS加密通信** 在`application.yml`中配置SSL证书,防止数据窃听: ```yaml server: ssl: enabled: true key-store: classpath:keystore.p12 key-store-password: changeit key-store-type: PKCS12 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mingvvv

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值