提高微服务安全性的11个方法

为什么选择微服务?如果你正在开发一个大型/复杂的应用,并且你经常需要快速,可靠地升级部署,那么微服架构是一个不错的选择 。
但是如何提高微服务架构的安全性呢?
1.通过设计确保安全设计安全,意味着从一开始就应该将安全性纳入软件设计中 。关于安全,其中最常见的一个威胁就是恶意字符 。
我问我的朋友罗伯·温奇(Rob Winch)他对删除恶意字符的想法 。Rob是Spring Security项目的负责人,被广泛认为是安全专家 。
我认为从一开始就将代码设计为安全是有意义的 。但是,完全删除恶意字符不可能的 。
什么是恶意字符,实际上取决于它所使用的上下文 。只是要找出是否存在其他注入
攻击(即JAVAScript,SQL等),你就可以确保html上下文中没有恶意字符 。需要注意的是,HTML文档的编码也是基于上下文的 。
限制字符也不总是可行的 。在许多情况下,软件认为是恶意的字符,但这在某人的名字中是完全有效的字符 。那应该怎么办?
我觉得,最好在使用字符的上下文中判断,而不是尝试限制字符 。
—罗伯·温奇
 
作为工程师,我们很早就明白了–创建精心设计的软件体系结构的重要性 。软件开发中常见的安全威胁,促使组织在系统架构时要时刻考虑软件的安全性 。系统要能够在受到攻击时,也要有用于执行必要的身份验证,授权,数据加密,数据完整性和可用性的解决方案 。
从InfoQ文章分析中,我们可以看到:OWASP Top 10在过去十年中并没有发生太大变化 。SQL注入仍然是最常见的攻击 。十年来,我们仍在继续重复同样的错误 。— Johnny Xmas
这就是为什么需要将安全预防措施纳入软件架构的原因 。
OWASP开源的Web应用程序安全项目(Open Web Application Security Project,OWASP)是一个非营利性基金会,致力于改善软件的安全性 。他们向开发人员和技术人员提供:

  • 工具和资源
  • 社区与网络
  • 教育培训
我喜欢Dan Bergh Johnsson,Daniel Deogun和Daniel Sawano撰写的《Secure by Design》一书中的示例 。它们展示了如何开发一个基本User实体对象,并且该对象需要在web页面上显示用户名 。
public class User {   private final Long id;   private final String username;   public User(final Long id, final String username) {      this.id = id;      this.username = username;   }   // ...}如果你接受用户名的任何字符串值,则有人可以使用用户名执行XSS攻击 。你可以使用输入校验来解决此问题,如下所示 。
import static com.example.xss.ValidationUtils.validateForXSS;import static org.Apache.commons.lang3.Validate.notNull;public class User {   private final Long id;   private final String username;   public User(final Long id, final String username) {      notNull(id);      notNull(username);      this.id = notNull(id);      this.username = validateForXSS(username);   }}但是,此代码仍然有问题 。
  • 开发人员需要考虑安全漏洞
  • 开发人员必须是安全专家并且知道使用 validateForXSS()
  • 它假设编写代码的人可以想到现在或将来可能发生的每一个潜在弱点
更好的设计是创建一个Username封装所有安全问题的类 。
import static org.apache.commons.lang3.Validate.*;public class Username {   private static final int MINIMUM_LENGTH = 4;   private static final int MAXIMUM_LENGTH = 40;   private static final String VALID_CHARACTERS = "[A-Za-z0-9_-]+";   private final String value;       public Username(final String value) {      notBlank(value);      final String trimmed = value.trim();      inclusiveBetween(MINIMUM_LENGTH,                       MAXIMUM_LENGTH,                       trimmed.length());      matchesPattern(trimmed,                     VALID_CHARACTERS,                     "Allowed characters are: %s", VALID_CHARACTERS);      this.value = https://www.isolves.com/it/cxkf/kj/2020-12-22/trimmed; } public String value() { return value; }}public class User { private final Long id; private final Username username; public User(final Long id, final Username username) { this.id = notNull(id); this.username = notNull(username);}这样,你的设计使开发人员更容易编写安全代码 。


推荐阅读