ゼロトラストセキュリティとは
従来の境界防御モデルは「社内ネットワーク内は安全」という前提に立っています。しかし現代のマイクロサービス・クラウド環境では内部ネットワークも信頼できない場合があります。ゼロトラストは全ての通信・アクセスを常に検証するアーキテクチャです。
ゼロトラストAPIの主要コンポーネント
- ID検証:全ての通信主体(ユーザー・サービス)のアイデンティティを検証
- 最小権限:必要最小限の権限のみ付与
- 常時検証:認証済みの接続も継続して検証
- 全通信の暗号化:内部通信を含む全通信をmTLSで暗号化
- マイクロセグメンテーション:サービス間の通信を厳格に制御
mTLS(相互TLS認証)の設定
// Node.jsでのmTLSサーバー設定
import https from 'https';
import fs from 'fs';
const server = https.createServer({
key: fs.readFileSync('./certs/server.key'),
cert: fs.readFileSync('./certs/server.crt'),
ca: fs.readFileSync('./certs/ca.crt'), // 信頼するCA証明書
requestCert: true, // クライアント証明書を要求
rejectUnauthorized: true // 検証失敗時に拒否
}, app);
// クライアント証明書の情報をリクエストから取得
app.use((req, res, next) => {
const cert = req.socket.getPeerCertificate();
if (!cert || !req.socket.authorized) {
return res.status(401).json({ error: 'Client certificate required' });
}
req.clientCert = cert;
req.serviceId = cert.subject.CN; // サービス識別子
next();
});
IstioによるサービスメッシュのmTLS設定
# Istioで全サービス間通信をmTLS必須に設定
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: production
spec:
mtls:
mode: STRICT # mTLS必須
---
# サービス間認可ポリシー
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: orders-api-policy
namespace: production
spec:
selector:
matchLabels:
app: orders-api
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/production/sa/frontend-service"]
to:
- operation:
methods: ["GET", "POST"]
paths: ["/api/orders/*"]
OPA(Open Policy Agent)による認可の外部化
# Regoポリシーの例(ロールベースアクセス制御)
package authz
default allow = false
# 管理者は全操作が許可
allow {
input.user.role == "admin"
}
# 一般ユーザーは自分のリソースのみアクセス可
allow {
input.user.role == "user"
input.resource.owner_id == input.user.id
input.action == "read"
}
# 課金停止ユーザーは書き込み不可
deny {
input.user.subscription_status == "suspended"
input.action == "write"
}
// OPAへの認可チェック
const checkAuthorization = async (user, action, resource) => {
const response = await fetch('http://opa:8181/v1/data/authz/allow', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
input: { user, action, resource }
})
});
const { result } = await response.json();
return result === true;
};
継続的な認証(Continuous Validation)
JWTトークンは有効期限内であっても、ユーザーの状態変化(アカウント停止・パスワード変更・不審なアクセス検知)に応じて無効化する仕組みが必要です。Redis・Blacklistによるトークン無効化か、短い有効期限(15分)と頻繁なリフレッシュを組み合わせます。
まとめ
ゼロトラストAPIセキュリティはマイクロサービス・クラウドネイティブ環境での必須のセキュリティアーキテクチャです。IstioのサービスメッシュでmTLSと細かい認可ポリシーを実装し、OPAで認可ロジックを一元管理することで、コードを変更せずにポリシーを更新できる柔軟なセキュリティ体制を構築できます。