如何隐藏Spring Boot暴露的API实体、Profile数据及敏感端点?
问题解决方案
你当前遇到的是Spring Data REST默认自动暴露所有Repository接口导致的安全风险,对应的解决方案如下:
- 调整Repository暴露策略
在application配置文件中添加如下配置,仅允许显式标注了@RepositoryRestResource的Repository被暴露:
如果完全不需要Spring Data REST的功能,直接删除项目中spring.data.rest.detection-strategy=annotatedspring-boot-starter-data-rest依赖即可从根源解决该问题。 - 禁用/调整Profile和根路径接口
可以直接关闭Profile端点的暴露:
如果需要保留部分Spring Data REST接口,可统一修改所有接口的根路径为内部非公开路径,避免对外暴露:spring.data.rest.profiles.enabled=falsespring.data.rest.base-path=/internal-api/rest - 新增接口权限校验
引入spring-boot-starter-security依赖,给所有接口添加权限校验,默认引入后所有接口都需要登录才可访问,可根据业务需求自定义放行公开接口,其余接口仅允许认证后的用户调用。
Spring Boot需重点关注的默认暴露端点
Spring Data REST相关默认暴露内容
- 所有继承了CrudRepository/JpaRepository的Repository对应的实体增删改查接口,支持分页、排序、关联查询
- 所有实体的元数据Profile端点,路径格式为
/profile/{实体名},返回实体的字段定义、支持的操作等完整元数据 - 服务根路径的接口列表,返回所有已暴露的REST接口的访问链接
Spring Boot Actuator相关默认暴露端点
如果项目引入了spring-boot-starter-actuator依赖,默认会对外暴露/actuator/health和/actuator/info两个低风险端点,若配置了management.endpoints.web.exposure.include=*会暴露所有actuator端点,其中高风险端点包括:
/actuator/env:返回应用所有环境变量、配置参数,包含数据库密码、加密密钥等敏感信息/actuator/beans:返回Spring容器中所有Bean的实例信息/actuator/mappings:返回应用所有接口的路径映射规则/actuator/loggers:支持查看和动态修改应用日志级别/actuator/heapdump:支持下载应用的堆内存快照,可从中提取敏感业务数据/actuator/shutdown:支持远程关闭应用,默认关闭,手动开启后风险极高
生产环境建议遵循最小暴露原则:不需要的功能直接移除对应依赖,必须保留的接口统一添加权限校验,避免自动配置导致的未知接口泄露。
内容的提问来源于stack exchange,提问作者Jason Chan
相关产品推荐
相关产品推荐

