分散型システムのセキュリティは、関与しているコンポーネントの多様性和规模によって複雑な課題となります。複数のサービスが潜在的に非安全なネットワークで交流し、非認可のアクセスやデータ泄露のリスクは顕著に増大します。この記事では、オープンソースのプロジェクトを使用して、分散型システムのセキュリティを実践的に确保する方法を探索します。このプロジェクトは、認証、認可、および安全通信などの一般的なセキュリティ問題を解決するために、いくつかのセキュリティ機構と技術を統合する方法を示しています。
分散型システムのセキュリティの課題について理解
分散型システムには、複数のサービスやマイクロサービスがネットワーク上で安全に通信する必要があります。このアーキテクチャにおいて、次のような主要なセキュリティ課題があります。
- 安全通信: サービス間で送信されるデータが暗号化され、盗聴や改ざんされないようにする
- 認証: ユーザーやサービスの身元を確認し、非認可のアクセスを防ぐ
- 認可: 認証されたユーザーやサービスが何を行うことが許可されているか、役割と权限に基づいて制御する
- ポリシー実装: サービス間やユーザーとの交流に適用される细粒度のアクセス制御とポリシーを実装する
- 証明書管理: データを暗号化し、サービス間で信頼を築くためのデジタル証明書の管理
このオープンソースプロジェクトは、いくつかの統合された技術と解決策を使用して、これらの課題に取り組んでいます。
プロジェクトのセットアップと設定
プロジェクトは、shellスクリプトとDockerを使用した安全な環境の設定に始まります。セットアップには、デジタル証明書の供給と必要なサービスの開始が含まれ、すべてのコンポーネントが安全なコミュニケーションに備わっていることを保証します。
環境を設定する手順
1. 証明書の供給
プロジェクトは、shellスクリプト(provisioning.sh
)を使用して、証明機関(CA)を模拟し、サービスに必要な証明書を生成します。
./provisioning.sh
2. サービスの起動
Docker Composeを使用して、プロジェクトで定義されたすべてのサービスを起動します。これにより、安全な操作に備えて正しく設定されていることを保証します。
docker-compose up
3. サービス間のコミュニケーションのテスト
サービス間の通信を証明書とJWTトークンを使用して検証するために、test_services.sh
スクリプトが提供されています。このスクリプトは、異なるサービスが割り当てられた証明書を使用して安全に交流する方法を示しています。
分散システムでの安全保障の課題
このプロジェクトは、前述の主要な安全保障の課題に対応するために、いくつかの关键技术を統合しています。各課題がどのように解決されているかについては以下の通りです:
1. 相互TLS(mTLS)を使用した安全な通信
課題
分散システムでは、サービス間で安全な通信を行う必要があります。これにより未承認のアクセスとデータ漏洩を防止します。
解決策
このプロジェクトでは、相互TLS(mTLS)を使用してサービス間の通信を保護しています。mTLSは、クライアントとサーバーがそれぞれの証明書を使用して互いに認証することで、通信を保護します。この相互認証は、未承認のサービスが legitimate servicesとのコミュニケーションを行うことを防止します。
実装
NginxはmTLSを処理するためのリバースプロキシとして設定されています。安全な接続を確立するためには、クライアントとサーバーの証明書が必要であり、サービス間で送信されるデータが機密性を保ち、改ざんされないようにする役割を果たします。
2. Keycloakを使用した認証
チャレンジ
正しいユーザーやサービスの認証は、非授权のアクセスを防ぐために非常に重要です。
解決策
プロジェクトでは、オープンソースのIDとアクセス管理ソリューションであるKeycloakを利用して認証を管理しています。Keycloakは、OpenID Connectやクライアント証明書など複数の認証方法をサポートしており、ユーザーとサービスの両方の認証に適しています。
- ユーザー認証:
OpenID Connectを使用してユーザーの認証を行います。Keycloakは、ログイン、トークンの発行、コールバックの処理を含むユーザー認証流程を処理するクライアント(appTest-login-client
)を構成しています。 - サービス認証:
サービス間の認証には、Keycloakのクライアント(client_credentials-test
)を使用し、クライアント証明書のグラントタイプを設定しています。この方法は、ユーザーの介入なしにサービスを認証するのに最適です。
認証流程の例
- ユーザーはログインページに移動します。
- ログインに成功する後、Keycloakは認可コードを持った callback ページにユーザーをリダイレクトします。
- この認可コードは、JWT トークンと交換され、その後のリクエストに使用されます。
nginx/njs
ディレクトリのauthn.js
ファイルは、このプロセスの詳細な実装を提供します。
クライアント証明書を使用したサービス認証の例
curl -X POST "http://localhost:9000/realms/tenantA/protocol/openid-connect/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=client_credentials-test" \
-d "client_secret=your-client-secret-here"
3. Open Policy Agent (OPA)とJWTを使用したユーザー認証
課題
認証されたユーザーとサービスがアクセスできるリソースに対する细粒度のアクセスコントロールを実装します。
解決策
プロジェクトでは、Open Policy Agent (OPA)とJWTトークンの組み合わせを使用して認可ポリシーを適用します。プロジェクトは、JWTの検証に3つの異なるストラテジーを示して、強い安全性を確保することを示しています。
- Keycloakから証明書の取得: トークンの検証用に Keycloakから証明書を動的に取得します。
- x5t (指紋)を使用する: トークン内嵌套された指紋を使用して、ローカルの信頼ストアから公開鍵を取得します。
- 内蔵証明書検証:内蔵の証明書を使用してトークンを検証し、証明書が信頼できる証明機関(CA)に照らし合わさることを保証します。
これらの戦略の詳細な実装については、nginx/njs/token.js ファイルを参照してください。
4. OPAを使用したポリシー適用
課題
サービスとユーザーに対する動的で柔軟なアクセスコントロールポリシーの実装
解決策
OPAは、詳細なアクセスコントロールポリシーを適用するために使用されます。ポリシーは宣言的な言語(Rego)で書かれ、opa/ディレクトリに格納されます。これらのポリシーは、サービスが通信できる条件や、ユーザーがリソースにアクセスできる条件を決定します。これにより、アクセスコントロールがシステム内で一貫して適用されます。
5. 証明書管理
課題
サービス用のデジタル証明書を管理し、信頼と通信の安全性を確立する。
解決策:
このプロジェクトには強力な証明書管理システムが含まれています。シェルスクリプト(provisioning.sh
)を使用して、証明機関(CA)をシミュレートし、各サービス用の証明書を生成することで、証明書管理を簡素化し、すべてのサービスが安全通信に必要なクレデンシャルを持つことを保証します。
また、nginxの再起動を不要に、サービス証明書の更新を行うためのエンドポイントを追加しました。
curl --insecure https://localhost/certs --cert certificates/gen/serviceA/client.crt --key certificates/gen/serviceA/client.key -F cert=@certificates/gen/serviceA/client.crt -F key=@certificates/gen/serviceA/client.key
結論
安全な分散型システムを構築するためには、安全通信、認証、認可、ポリシーの実行、証明書管理など様々な安全的な面に注意を払う必要があります。このオープンソースのプロジェクトは、これらの挑戦を効果的に解決するために複数の安全管理機構を統合する Comprehensive exampleを提供しています。
このプロジェクトで示された設定と配置に従って、開発者はMutual TLS、Keycloak、Open Policy Agent、Nginxを活用して強固な安全管理構築を行うことができます。これらの技術を組み合わせることで、分散型システムに対する様々な脅威に対する強力な保護を提供し、データ保護と安全なアクセスコントロールを確保する強力な基盤を構築することができます。
Source:
https://dzone.com/articles/designing-a-secure-architecture-for-distributed-systems