NATS安全机制
2026/1/15大约 3 分钟
NATS安全机制
安全概述
NATS 提供多层安全机制,包括认证、授权和加密传输。
认证方式
1. 用户名密码认证
最简单的认证方式。
服务器配置:
# nats-server.conf
authorization {
users = [
{ user: admin, password: admin123 }
{ user: client, password: client123 }
]
}客户端连接:
nc, err := nats.Connect("nats://localhost:4222",
nats.UserInfo("admin", "admin123"),
)2. Token 认证
使用单一 Token 进行认证。
服务器配置:
authorization {
token: "s3cr3t-t0k3n"
}客户端连接:
nc, err := nats.Connect("nats://localhost:4222",
nats.Token("s3cr3t-t0k3n"),
)3. NKey 认证
基于 Ed25519 公钥加密的认证方式,更安全。
生成 NKey:
# 安装 nk 工具
go install github.com/nats-io/nkeys/nk@latest
# 生成用户 NKey
nk -gen user -pubout
# 输出示例
SUACSSL3UAHUDXKFSNVUZRF5UHPMWZ6BFDTJ7M6USDXIEDNPPQYYYCU3VY # 私钥(Seed)
UAHJZB2XQCVQGXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQX # 公钥服务器配置:
authorization {
users = [
{ nkey: UAHJZB2XQCVQGXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQX }
]
}客户端连接:
opt, _ := nats.NkeyOptionFromSeed("path/to/user.nk")
nc, err := nats.Connect("nats://localhost:4222", opt)4. JWT 认证
最灵活的认证方式,支持账户隔离和细粒度权限控制。
# 安装 nsc 工具
go install github.com/nats-io/nsc/v2@latest
# 创建操作员
nsc add operator MyOperator
# 创建账户
nsc add account MyAccount
# 创建用户
nsc add user MyUser
# 生成凭证文件
nsc generate creds -a MyAccount -n MyUser > user.creds客户端连接:
nc, err := nats.Connect("nats://localhost:4222",
nats.UserCredentials("user.creds"),
)授权配置
发布/订阅权限
authorization {
users = [
{
user: publisher
password: pub123
permissions: {
publish: ["events.*", "logs.>"]
subscribe: ["_INBOX.>"]
}
}
{
user: subscriber
password: sub123
permissions: {
publish: ["_INBOX.>"]
subscribe: ["events.*", "logs.>"]
}
}
{
user: admin
password: admin123
permissions: {
publish: ">"
subscribe: ">"
}
}
]
}权限拒绝
authorization {
users = [
{
user: limited
password: limited123
permissions: {
publish: {
allow: ["public.>"]
deny: ["public.admin.>"]
}
subscribe: {
allow: [">"]
deny: ["private.>", "admin.>"]
}
}
}
]
}响应权限
允许用户响应请求:
authorization {
users = [
{
user: service
password: svc123
permissions: {
subscribe: ["service.requests"]
publish: "_INBOX.>"
allow_responses: true
}
}
]
}TLS 加密
生成证书
# 生成 CA 证书
openssl genrsa -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -out ca-cert.pem
# 生成服务器证书
openssl genrsa -out server-key.pem 4096
openssl req -new -key server-key.pem -out server.csr
openssl x509 -req -days 365 -in server.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
# 生成客户端证书
openssl genrsa -out client-key.pem 4096
openssl req -new -key client-key.pem -out client.csr
openssl x509 -req -days 365 -in client.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem服务器 TLS 配置
# 启用 TLS
tls {
cert_file: "/etc/nats/certs/server-cert.pem"
key_file: "/etc/nats/certs/server-key.pem"
ca_file: "/etc/nats/certs/ca-cert.pem"
# 要求客户端证书
verify: true
# 超时设置
timeout: 2
}客户端 TLS 连接
// 使用 TLS 连接
nc, err := nats.Connect("tls://localhost:4222",
nats.RootCAs("ca-cert.pem"),
nats.ClientCert("client-cert.pem", "client-key.pem"),
)账户隔离
使用账户实现多租户隔离。
accounts {
TENANT_A: {
users: [
{ user: user_a, password: pass_a }
]
jetstream: enabled
}
TENANT_B: {
users: [
{ user: user_b, password: pass_b }
]
jetstream: enabled
}
}账户间消息导出/导入
accounts {
SHARED: {
users: [{ user: shared, password: shared123 }]
exports: [
{ stream: "events.>" }
{ service: "api.>" }
]
}
CONSUMER: {
users: [{ user: consumer, password: consumer123 }]
imports: [
{ stream: { account: SHARED, subject: "events.>" } }
{ service: { account: SHARED, subject: "api.>" } }
]
}
}安全最佳实践
1. 生产环境配置
# 生产环境安全配置
listen: 0.0.0.0:4222
http_port: 8222
# 启用 TLS
tls {
cert_file: "/etc/nats/certs/server-cert.pem"
key_file: "/etc/nats/certs/server-key.pem"
ca_file: "/etc/nats/certs/ca-cert.pem"
verify: true
}
# 使用 NKey 认证
authorization {
users = [
{ nkey: UAHJZB2XQCVQGXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQX }
]
}
# 限制连接
max_connections: 10000
max_payload: 1048576
# 禁用不安全的监控端点
http: "127.0.0.1:8222"2. 安全检查清单
| 检查项 | 说明 |
|---|---|
| 启用 TLS | 加密所有通信 |
| 使用强认证 | NKey 或 JWT |
| 最小权限原则 | 只授予必要的权限 |
| 账户隔离 | 多租户场景使用账户 |
| 监控端点保护 | 限制监控端点访问 |
| 定期轮换凭证 | 定期更新密钥和证书 |
小结
NATS 提供了完善的安全机制,包括多种认证方式、细粒度授权和 TLS 加密。生产环境建议使用 NKey 或 JWT 认证,并启用 TLS 加密。
面试题预览
常见面试题
- NATS 支持哪些认证方式?各有什么特点?
- 如何实现 NATS 的多租户隔离?
- NKey 认证相比用户名密码有什么优势?
