问题描述
在公司可能会遇见,自己搭建的一套环境,有可能是业务服务,也有可能是外部组件(有可能是公司没有专门维护这套组件的团队,也有可能是不能用,不好用等情况),比如:HDFS、HBase、Yarn、Spark、Mysql等等。
可能不是默认端口,只要扫描到任意端口在监听,通过一些get请求就能获取到隐私数据,可能就会被认为是高危端口。
我遇见的就是HDFS、Yarn的端口被扫描出来了(不是默认端口),理由就是直接通过url就可以访问页面。
解决办法
方法一(推荐)
直接通过防火墙禁止外部ip访问(当然可以允许集群中的其他机器访问)
优点:这种处理办法是最简单的,无需修改配置、代码,如果熟悉的话,几分钟就搞定了
缺点:这样办公网络就无法访问页面了,比如yarn的页面,这样我们开发、处理问题的成本就会很高。
注意:最好别留钩子,比如我禁用了大部分的ip,但是不禁用办公网络发出去的ip,这样确实有可能躲避安全部的扫描,但有违反公司规定的风险,慎重。
方法二
利用中间件自身的加密功能,比如mysql、es、redis等,都是可以设置密码的,无非是复杂一点,所以最好是能够在开发、系统搭建的时候就设置好密码。
优点:是一种非常安全的手段,页面访问之前需要进行权限认证,而且可以本地就可以调试代码(远程连接中间件)
缺点:如果是一开始并没有设置密码,比如es,那后面不光要为es增加密码,而且使用这个es的应用都需要增加账号和密码配置,需要修改代码,成本很高。最重要的是有些组件可能并没有提供账号密码登录,比如:HDFS、Yarn,这些组件好像官方并没有提供登录的功能。
方法三(极力推荐)
一开始想的是利用nginx相关的组件来做登录,但是后面发现还需要依赖一些httpd的底层组价,因为服务器是没法联网的,处理起来比较麻烦,所以就决定先用java能不能简单的搭建一个反向代理。
通过简单的测试,发现SpringSecurity+smiley-http-proxy-servlet就可以无需开发代码实现一个需要登录的反向代理服务器
使用方法
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.mitre.dsmiley.httpproxy</groupId>
<artifactId>smiley-http-proxy-servlet</artifactId>
<version>1.12</version>
</dependency>
@Configuration
public class ProxyServletConfiguration {
@Value("${proxy.url}")
private String url;
@Value("${proxy.target_url}")
private String targetUrl;
@Bean
public ServletRegistrationBean servletRegistrationBean() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new ProxyServlet(), url);
servletRegistrationBean.setName("hello");
servletRegistrationBean.addInitParameter("targetUri", targetUrl);
servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, String.valueOf(true));
return servletRegistrationBean;
}
}
server.port=8080
spring.security.user.name=dong
spring.security.user.password=dong
server.servlet.session.timeout=10s
proxy.url=/*
proxy.target_url=https://www.baidu.com
因为都是成熟的组件,所以仅仅需要一些配置,就可以完成一个需要登录的反向代理服务器
这下可以放心的使用那些web页面了
优点:非常通用,任何服务都可以进行反向代理,成本低
缺点:需要额外占用一个端口、一些内存来做反向代理(如果用nginx也差不多);如果代码中有直接使用这些端口的代码,那就无法进行本地调试
文章讨论了在公司环境中如何处理可能暴露隐私数据的自建服务或组件端口。提出了三种解决方案:通过防火墙限制外部访问,使用中间件的加密功能,以及建立基于SpringSecurity的反向代理服务器。推荐使用SpringSecurity和smiley-http-proxy-servlet来创建一个需要登录的反向代理,以平衡安全性和便利性。
517

被折叠的 条评论
为什么被折叠?



