docker swarm内部的分布式Java应用程序

时间:2018-10-15 19:03:56

标签: java security docker docker-swarm apache-nifi

我的目标是在docker群上的docker容器内运行分布式NIFI集群。我对官方NIFI docker映像进行的配置可以运行集群。

对于群集,我使用单个服务,每个副本是一个单独的NIFI实例。由于这项工作有效,因此我现在想继续进行安全性工作。我首先使用秘密(将信任和密钥库移交)将公开签名的通配符证书应用于Java应用程序。在我看来,这对于大多数分布式Java应用程序而言都是可行的方法。但是现在有了NIFI,我遇到了一个问题,即NIFI本身不支持通配符证书。

我目前正在考虑一种方法,该方法如何以每个容器都有其自己的证书的方式运行集群。我当前的想法是使用NIFI JVM可以信任的自我管理内部CA在容器内运行自我签名证书。由于我不确定100%是否会解决此问题,因此我很感谢提示和想法。
NIFI使用某些端口进行通信,并使用HTTP / S协议发出请求。 NIFI本身在节点/容器上作为Java应用程序运行。

1 个答案:

答案 0 :(得分:1)

Apache NiFi提供了TLS Toolkit,可自动为您完成此过程。它可以运行临时的或长期存在的内部证书颁发机构(CA),该机构会生成内部密钥,并使用它们创建自签名的CA证书并签署传入的证书签名请求(CSR)。每个联机的节点都可以访问CA服务,并在其密钥库和信任库中安装正确配置的证书,并通过一次命令行调用自动为这些文件的位置和密码填充public List<BigDecimal> extractDecimals(final String s, final char fraction, final char grouping) { List<BigDecimal> decimals = new ArrayList<BigDecimal>(); //Remove grouping character for easier regexp extraction StringBuilder noGrouping = new StringBuilder(); int i = 0; while(i >= 0 && i < s.length()) { char c = s.charAt(i); if(c == grouping) { int prev = i-1, next = i+1; boolean isValidGroupingChar = prev >= 0 && Character.isDigit(s.charAt(prev)) && next < s.length() && Character.isDigit(s.charAt(next)); if(!isValidGroupingChar) noGrouping.append(c); i++; } else { noGrouping.append(c); i++; } } //the '.' character has to be escaped in regular expressions String fractionRegex = fraction == POINT ? "\\." : String.valueOf(fraction); Pattern p = Pattern.compile("-?(\\d+" + fractionRegex + "\\d+|\\d+)"); Matcher m = p.matcher(noGrouping); while (m.find()) { String match = m.group().replace(COMMA, POINT); decimals.add(new BigDecimal(match)); } return decimals; } 文件。可以将其配置为在部署时通过Dockerfile,Ruby / Python / shell脚本等运行。

使用共享的秘密令牌值在SPKI上计算HMAC / SHA-256签名,以确保恶意/恶意服务不会获得已颁发的证书。所有证书都将由相同的CA证书签名,并且已经在信任库中进行了填充,因此群集中的每个节点都将信任其他证书。请求的CN也会填充在SAN条目中,并且支持其他SAN条目,因此符合RFC 6125。

如上所述,由于种种原因(some enumerated here),不支持也不建议使用通配符证书,而且还因为使用提供的工具包使更安全地部署唯一证书变得容易。正在进行各种工作(NIFI-5443NIFI-5398),以修改一些内部群集通信以在面对通配符证书时具有弹性,但是目前尚不可用。