サイトのAPI図鑑B版
掲載情報が正確でない可能性があります。
セキュリティ・コンプライアンス

ゼロトラストAPIセキュリティの実践ガイド【マイクロサービス・mTLS・サービスメッシュ】

ゼロトラストセキュリティモデルをAPIアーキテクチャに適用する方法(mTLS・サービスメッシュ・OPA・Istio)と、マイクロサービス間通信のセキュリティ強化について解説します。

#ゼロトラスト#mTLS#Istio#マイクロサービス

ゼロトラストセキュリティとは

従来の境界防御モデルは「社内ネットワーク内は安全」という前提に立っています。しかし現代のマイクロサービス・クラウド環境では内部ネットワークも信頼できない場合があります。ゼロトラストは全ての通信・アクセスを常に検証するアーキテクチャです。

ゼロトラスト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で認可ロジックを一元管理することで、コードを変更せずにポリシーを更新できる柔軟なセキュリティ体制を構築できます。

よくある質問

Q.ゼロトラストとはどのような考え方ですか?

「信頼しない、常に検証する(Never Trust, Always Verify)」を基本原則とするセキュリティモデルです。社内ネットワーク・既認証済みユーザーも含めて全てのアクセスを継続的に検証します。VPNへの過信を排除し、全通信を暗号化・認証・認可する考え方です。

Q.mTLS(相互TLS認証)はどのような場面で使いますか?

mTLSはサーバー間・マイクロサービス間通信の相互認証に使います。通常のTLSはクライアントがサーバーを検証しますが、mTLSではサーバーもクライアントの証明書を検証します。金融・医療・決済系のAPIで広く採用されています。

Q.OPA(Open Policy Agent)はどのような場合に使いますか?

OPAはポリシー(認可ルール)をコードとして管理するポリシーエンジンです。複数のマイクロサービスにまたがる複雑な認可ロジックを一元管理したい場合や、ポリシーをアプリケーションコードから分離したい場合に有効です。

関連記事