这法子可以提高微服务安全性 网友:牛逼
1.通过设计确保安全
# OWASP
工具和资源
社区与网络
教育培训
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;
} // ...
}
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()
它假设编写代码的人可以想到现在或将来可能发生的每一个潜在弱点
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 = 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);
}
}
2.扫描依赖
Snyk调查:25%的项目未报告安全问题;多数只添加发行说明;只有10%的人报告CVE。
3.随处使用HTTPS
Let’s Encrypt于2016年4月12日启动,该组织宣布自成立以来已总共发行了10亿张证书,并且据估计,Let’s Encrypt使Internet上安全网站的百分比增加了一倍。
server:
ssl:
key-store: classpath:keystore.p12
key-store-password: password
key-store-type: pkcs12
key-alias: tomcat
key-password: password
port: 8443
# 安全的GraphQL API
const clientParam = {uri: '/graphql'};
const myAuth = this.props && this.props.auth;
if (myAuth) {
clientParam.request = async (operation) => {
const token = await myAuth.getAccessToken();
operation.setContext({headers: {authorization: token ? `Bearer ${token}` : ''}});
}
}
const client = new ApolloClient(clientParam);
export function createApollo(httpLink: HttpLink, oktaAuth: OktaAuthService) {
const http = httpLink.create({uri});
const auth = setContext((_, {headers}) => {
return oktaAuth.getAccessToken().then(token => {
return token ? {headers: {Authorization: `Bearer ${token}`}} : {};
});
});
return {link: auth.concat(http), cache: new InMemoryCache()};
}
# 安全的RSocket端点
4.使用身份令牌
授权服务器:多对一还是一对一?
服务可以使用访问令牌与任何其他内部服务进行对话(因为它们都是连接到同一个授权服务器)
有了一个可以查找所有范围和权限定义的地方
开发人员和安全人员更易于管理
交互更快
如果一项服务的令牌遭到破坏,则所有服务都将面临风险
安全边界模糊
# 在JWT上使用PASETO令牌
全面了解PASETO
用Java创建和验证PASETO令牌
5.加密和保护密钥
使用KMS生成主密钥
每次你想要加密数据时,你都要求AWS 为你生成一个新的数据密钥。
然后,你可以使用数据密钥对数据进行加密
然后,Amazon将使用主密钥对你的数据密钥进行加密
然后,你将合并加密的数据密钥和加密的数据以创建加密的消息。该加密的消息是你的最终输出,你就可以将它存储在文件或数据库中。
6.通过交付流水线验证安全性
创建Docker基本镜像的白名单,以在构建时进行检查
确保你正在拉取的基础镜像有加密签名
对推送的镜像的元数据进行签名,以便稍后进行检查
在你的容器中,请使用软件包完整的Linux发行版
使用HTTPS拉取第三方依赖
不允许在Dockerfile中,将敏感的主机路径指定为镜像中的存储卷
针对已知的代码级安全漏洞在代码库上运行静态代码分析
运行自动的依赖检查程序,以确保你使用的是最新,最安全的依赖版本
启动服务,将自动渗透机器人指向正在运行的容器,然后看看会发生什么
7.降低攻击者的速度
8.使用Docker Rootless模式
9.使用基于时间的安全性
10.扫描Docker和Kubernetes配置中的漏洞
优先选择基本镜像
使用USER指令,确保使用了最少特权
签名和验证镜像,以减少MITM攻击
查找,修复开源漏洞
不要将敏感信息泄漏到Docker镜像
使用固定标签实现不变性
使用COPY代替ADD
使用元数据标签,例如maintainer和securitytxt
使用多阶段构建来获取小而安全的镜像
使用像hadolint这样的 linter 检查工具
11.了解云和集群安全性
随处使用TLS
启用具有最低权限的RBAC,禁用ABAC并使用审核日志记录
使用第三方身份验证程序(例如Google,GitHub或Okta)
分布式部署你的etcd群集,并为其提供防火墙
旋转加密密钥(Rotate Encryption Keys)
使用Linux安全功能和受限制的 PodSecurityPolicy
静态分析YAML
以非root用户身份运行容器
使用网络策略(以限制Pod之间的流量)
扫描镜像并运行IDS(入侵检测系统)
运行服务网格
# 总结
通过设计确保安全
扫描依存关系
使用HTTPS
使用访问令牌
加密和保护密钥
使用交付流水线验证安全性
降低攻击者的速度
使用Docker Rootless模式
使用基于时间的安全性
扫描Docker和Kubernetes配置中的漏洞
了解云和集群的安全性