...

マルチユーザー環境におけるRedis ACLの安全な導入

をセットした。 Redis ACL マルチユーザー環境において、コマンド、キープレフィックス、およびPub/Subチャンネルを厳密に分離するために、これらを意図的に導入しています。これにより、私は セキュリティ サーバー側で、不正アクセスを最小限に抑え、役割を明確に管理できるようにする。.

中心点

  • 分離 ユーザーごとのコマンド、キー、チャネルの数
  • サーバーサイドの アプリでは「論理」より「管理」が優先される
  • 名前空間 クライアントごとのキープレフィックス
  • ACLファイル 保守性とバージョン管理のために
  • 監査 ACL LIST および ACL USERS を使用して

マルチユーザー環境におけるACLの基礎

アプリケーション、チーム、またはクライアントごとに個別のユーザーを作成し、その権限を厳格に次のように定義します。 ACL-ルール。これにより、単一のグローバルパスワードですべてのアクセスが可能になることや、誤ってデータが上書きされることを防いでいます。 権限はコマンド、キーパターン、チャネルごとに分離しており、各アカウントには必要な権限のみを付与し、それ以上の権限は与えないようにしています。このサーバー側での分離により、アプリケーションの負荷が軽減され、 透明性 セキュリティモデルにおいて。特に共有インスタンスでは、この方法により、誰がどの名前空間でどの操作を実行できるかを把握しておくことができます。.

権限モデル:コマンド、キー、チャネルを明確に分離する

私は権限をきめ細かく付与しています。例えば、次のようなカテゴリごとに @read そして @write を追加し、設定や管理コマンドを含む @dangerous などのリスクの高いグループを削除します。 キー空間については、app1:*、app2:*、tenant_a:* といった一意のプレフィックスを使用し、読み取りおよび書き込みアクセスが明確なネームスペースに限定されるようにしています。これにより、例えばジョブは SET や GET を使用できますが、自身のプレフィックスの下でのみ動作するようになります。 さらに、Pub/Subチャネルを制限し、イベントが所定のストリーム内でのみ流れるようにしています。その結果、追跡可能な 分離 役割、データルーム、およびコミュニケーション経路の間で。.

Pub/Sub を確実に制限する

Pub/Sub については、アプリケーションが実際に必要とするチャンネルのみを許可し、それ以外は徹底的にブロックしています ACL-ルールを実装しています。これにより、サービスが外部のイベントを受信したり、予期しない購読者にメッセージを配信したりすることを防いでいます。 特にイベントアーキテクチャにおいては、この制御により、データ漏洩や他のサービスへの影響といったリスクを低減できます。ユーザーごとに許可されたチャネルを文書化することで、オンボーディングや監査を明確に行えるようにしています。これにより、システム環境が拡大しても、 コントロール データフローについて。.

実務におけるユーザーおよびルールの管理

新しいユーザーはACL SETUSERで作成し、強固なパスワードを設定した上で、そのサービスに必要なコマンドのみを有効にします。例えば、 +@read また、リスクの高いコマンドをブロックしつつ「+@write」を実行します。許可されるキー範囲は適切なパターンで定義し、チャネルも同様に規制しています。全体像を把握するためにACL USERSを使用し、ACL LISTでアクティブなルールを素早く確認できるようにしています。 変更内容は、設定とファイルの同期を保つために、ACL LOADおよびACL SAVEを使用して読み込みまたは保存しています。このようにして、 管理 簡潔で、分かりやすく、再現性がある。.

ACL/認証コマンド 目的
ACL SETUSER ユーザーの作成・変更 ACL SETUSER app1 on >安全なパスワード +@read +@write -@dangerous ~app1:*
ACLリスト ルールを表示 ACLリスト
ACLユーザー ユーザー一覧を表示する ACLユーザー
ACL ロード/セーブ ACLファイルの読み込み/保存 ACL SAVE; ACL LOAD
AUTH サーバーへのログイン AUTH app1 安全なパスワード

設定:ACLファイルか、redis.confか?

簡単な設定は直接 redis.conf, 、ただし、ユーザーやロールが複数ある場合は、個別のACLファイルを使用するようにしています。このファイルにはバージョン管理を施し、変更内容をきちんと記録した上で、更新を管理された手順で適用しています。このようにして、アプリケーションパラメータとセキュリティロジックを分離することで、エラーの原因を減らしています。 並行して、ネットワークレベルでインスタンスのセキュリティを強化しています。例えば、 開いているポートを保護する そして、不必要な攻撃の的となる要素を取り除きます。これらを総合すると、それが セキュリティ また、運用を簡素化します。.

名前空間とクライアントの分離

キーのプレフィックスは、テナントIDやアプリケーション名が明確に識別できるように設計しています。例えば、 tenantA:app1:session:{id}。これにより、各当事者のデータを明確に区別できる「フェンス」を設け、ACLルールによってさらに保護しています。 移行パスについては、一貫性のある命名規則を採用しており、これによりブルーグリーン方式やカナリア方式によるロールアウトが容易になります。バックアップや復元においても、関連するデータ範囲のみを扱うため、明確な構造が役立ちます。この命名規則とACLルールの組み合わせにより、 クライアント きちんと分別されています。.

日常におけるマイクロサービスとチームの役割

サービスごとに1つのユーザーアカウントを設定し、そのアカウントは自身のデータルームのみを読み書きできるようにし、他者のプレフィックスや管理機能へのアクセス権は一切与えないようにしています。開発者アカウントには制限付きの読み取りまたは書き込み権限を定義し、管理アカウントについては権限を厳格に制限するとともに、すべての操作をログに記録しています。 バッチジョブには、処理に必要なコマンド(読み取り、書き込み、TTLの変更など)のみを付与し、管理コマンドは一切付与しません。また、外部システムとの連携については、設定ミスが原因で問題が発生しないよう、実行時間を制限したり、テスト環境に限定したりしています。 生産的-データを取り扱う。このようにして、セキュリティを緩めることなく、責任の所在を明確に割り振っています。.

ACLの制限と分離レベル

私はACLを正しく評価しています。ACLはアクセスを制御しますが、隔離は行いません リソース CPU、RAM、I/Oなど、プロセスレベルでのリソースです。そのため、厳格なコンプライアンス要件が求められるシナリオでは、専用インスタンス、分離されたクラスター、あるいは専用のノードの導入を検討します。 ACLによる論理的な分離は、不正アクセスを減らすことができますが、同じサーバーリソースを共有することになります。機密性の高いワークロードについては、ネットワークセグメント、コンテナ、またはVMの境界などを通じて、さらなる分離を計画します。このようにして、アクセス制御と技術的な 遮蔽 より高い安全レベルを実現するために。.

運用:監査、ローテーション、およびログ記録

ACL LIST を使用して定期的に権限を確認し、変更スケジュールを記録しておくことで、監査の際に有効な設定を迅速に検証できるようにしています。パスワードは決まった間隔でローテーションさせ、ログインイベントや異常なパターンを注意深くログに記録しています。 インシデントが発生した場合は、直ちに関係するユーザーをロックし、更新されたルールを適用して、重要なパスを自動でテストします。CI/CDには、設定内の禁止コマンドやプレフィックスの欠落を警告するチェックを組み込んでいます。この 手続き 時間を節約し、稼働中のダウンタイムを最小限に抑えます。.

アーキテクチャの選択:共有か専用か

複数の顧客が1つのインスタンスを共有するか、それとも個別のサーバーを用意するか、どちらが適切かを検討している。というのも、どちらの場合も独自の リスク メリットとデメリットがあります。Sharedはコストを抑えられますが、厳格なACL、整理されたネームスペース、そして綿密なモニタリングが求められます。Dedicatedは相互影響を軽減しますが、ハードウェアや保守にかかるコストが高くなります。パフォーマンスやセキュリティに関する問題については、次のような比較を参考にしています。 共有と専用 に近づき、負荷テストで測定します。最終的には、データへのアクセス状況やコンプライアンス要件、および 予算.

クラスターかスタンドアロンか――ACLにはどちらが適しているか?

私はスタンドアロンインスタンスとクラスタの両方でACLを使用していますが、すべてのノードにわたってルールが統一されるよう注意を払っています。クラスタでは、プレフィックスや権限が適切に機能し続けるよう、キーがスロットにどのように分散されているかを確認しています。高可用性環境では、フェイルオーバーによって 破損 権限チェーン内で生成され、ACLファイルはすべての場所で同一である。レプリカの切り替えやアップグレードによってギャップが生じないよう、移行パスを事前にテストしている。アーキテクチャを検討する際は、次のような比較を参考にしてほしい。 クラスター対スタンドアロン 方向性を定め、その後、それに応じてACL戦略を展開する。.

計画とブートストラップ:確実なスタート

まずはクリーンなBootstrapから始めます。組み込みの「default」ユーザーには広範な権限を与えません。このユーザーを完全に無効化するか、あるいはデフォルトですべてのコマンド、キー、チャネルへのアクセス権を剥奪します。これにより、ユーザー分離を行わずに誤って作業してしまうことを防ぎます。 運用タスクについては、管理レベルでの多要素認証(例:バスティオンホスト/TLSクライアント証明書)と厳格なACLを適用した、個別の管理者アカウントを意図的に定義しています。.

# ACLファイルでの安全な起動
user default off
user admin on >強力な管理者パスワード +@admin -@dangerous allkeys allchannels

強力なパスワードはサーバー側で生成しているため、ログやシェル履歴に残ることはありません。迅速かつ安全なトークンを生成するために、サーバー上のジェネレーターを使用し、定期的に更新しています。 最新のクライアントに対しては、HELLOプロトコルを用いたユーザー名/パスワードによるワンステップ認証を優先しています。これにより、プロトコルのバージョンが明示的に指定され、エッジケースを回避できます。.

キーACLおよびチャネルACLのパターンと落とし穴

キーパターンについては、許可リストのみを使用しています。まず、 resetkeys そして、より細かく範囲を限定するために、例えば ~tenantA:* や ~tenantA:app1:* といった ~-パターンを選択的に追加します。重要なのは、プレフィックスの重複です: あるユーザーが ~tenantA:* を持ち、tenantA:archiv:* のような領域を閲覧できないようにしたい場合、機密性の高いサブセットには独自のプレフィックス(例:tenantA:priv:*)を割り当て、それらを単純に公開しないように名前空間を設計します。 チャンネルについても同様のルールが適用されます。私は resetchannels また、&tenantA:* および、Keyspace 通知に必要なチャネル(存在する場合)のみを許可する。.

# キーとチャネルの厳格な管理
ACL SETUSER tenantA:app1 on >Pass +@read +@write -@dangerous \
  resetkeys ~tenantA:app1:* \
  resetchannels &tenantA:app1:* 

RENAME、MIGRATE、DUMP/RESTORE などのコマンドは、プレフィックスの境界を越えて書き込みを行う可能性があることに留意してください。このようなコマンドは、本番環境のサービスアカウントでは使用が制限されています。 ハッシュフィールド、リスト要素、またはソートセットのメンバーは、個別のキーではありません。ACLはデータ構造内部ではなく、キーレベルで適用されます。そのため、これらの構造をカバーするには、適切なキープレフィックス設計があれば十分です。.

コマンドのカテゴリを意図的に制御する

本当に必要なものだけを有効にします。一般的なCRUDワークロードの場合、多くの場合、+@readと+@writeで十分です。リスクの高いカテゴリについては、原則としてロックします: @admin そして @dangerous これらはアプリケーションユーザーにとってはタブーです。スクリプト機能(EVAL、FUNCTION)については、マルチテナント環境では可能な限り完全に除外しています。Pub/Subサービスについては、キーへの書き込みコマンドが自動的に許可されないよう、権限を分離しています。 実際には、最小限の設定から開始し、必要に応じてカテゴリ全体を開放するのではなく、個別のコマンド(+COMMAND)をピンポイントで許可するようにしています。.

ローテーションとダウンタイムゼロの変更

ダウンタイムなしでパスワードのローテーションを計画しています。Redisでは、ユーザーごとに複数のアクティブなパスワードを設定できます。手順は簡単です。まず新しいパスワードを追加で設定し、次にクライアントの設定を変更し、その後、古いパスワードを resetpass 削除する。この同じ原則を、権限の段階的な変更にも適用している。不確かな点がある場合は、本番環境のアカウントを変更する前に、DRYランやテストユーザーを使って一時的に設定を確認している。.

# ローテーション手順
ACL SETUSER app1 >新パスワード # 新パスワードを追加設定
# クライアントを切り替え中...
ACL SETUSER app1 resetpass >新パスワード # 旧パスワードを削除、新パスワードは維持

テスト、デバッグ、監査の知識を深める

変更内容は本番環境に反映する前にテストを行っています。ドライラン(シミュレーション)を行い、ユーザーが特定のキーやチャンネルに対してコマンドを実行する権限があるかどうかを、実際に実行することなく確認しています。 不正アクセスやルール違反については、専用のACLログで追跡し、適切な保存期間を設定するとともに、中央のログインフラストラクチャへのルーティングを設定しています。透明性を確保するため、カテゴリリストを活用して、各カテゴリにどのようなコマンドが含まれているかを把握しています。.

# 権限のシミュレーション
ACL DRYRUN app1 GET otherprefix:key
# 現在のユーザーIDを確認する
ACL WHOAMI
# 失敗したアクセス試行を確認・リセットする
ACL LOG
ACL LOG RESET
# カテゴリごとのコマンドを表示する
ACL CAT @write

監査に備えて、ACL LIST/USERSに加え、バージョン管理システム内のACLファイルのスナップショットも用意しています。変更にはすべてチケット/変更依頼が発行され、レビュー必須のマージプロセスを経ます。これにより、誰が、いつ、どのような権限を拡張または制限したかをいつでも追跡することができます。.

スクリプト、関数、および安全な実行

Luaスクリプトやサーバーサイド関数は強力ですが、その利用範囲を広めすぎると、隔離環境からの脱出経路となり得ます。 私は共有環境では、デフォルトでEVAL/EVALSHAおよび関数管理を無効にし、明確に区切られた管理者コンテキストでのみ許可するようにしています。 スクリプトの実行が必要な場合は、スクリプトが許可されたキープレフィックスのみにアクセスしているかどうかを厳密に確認します。ACLはスクリプトからの呼び出し時にも適用されるため、これにより、他者の領域へ間接的にアクセスしてしまうリスクを低減できます。.

ACLのレプリケーション、高可用性、および一貫性

レプリケーション環境では、アプリケーションユーザーとレプリケーションユーザーを分離しています。レプリケーション用に専用の技術アカウントを設定し、そのアカウントにはSYNC/PSYNC/REPLCONFなどのコマンド実行に必要な権限のみを付与しています。 ACLファイルは、すべてのノードで同期を保っています。手動で管理する場合は構成管理ツールを使用し、管理対象のクラスターでは、そこに用意されたメカニズムを利用します。変更後は、ルールを一元的に保存し、フェイルオーバーによって権限の不整合が生じないように、新しいノードへ管理された手順で適用します。.

また、クラスタ環境では、キープレフィックスがスロットの境界に対して適切に配置されているかどうかも確認しています。これはACLの問題というよりは、負荷を均等に分散させ、権限に関する説明を簡素化するための設計上のポイントと言えます(「1つのプレフィックス、1つのデータ領域、多数のスロット」)。 フェイルオーバーの際には、切り替えが透過的に行われるよう、レプリケーションユーザーと管理者アカウントがすでにターゲットノード上で利用可能な状態になっていることを確認しています。.

クライアントの切り替え、移行、およびバックアップ

プレフィックスやテナントIDの名称変更を行う際は、事前にACLへの影響を算定しています。テナントが「tenantA:」から「tenantA2:」へ移行する場合、一時的に両方の形式を許可し、明確な移行期間を設けるようにしています。 移行ジョブ自体については、必要なプレフィックスのみ読み書きできる、厳格に制限されたユーザーを使用するように注意しています。バックアップに関しては、ACLファイルはRDB/AOFとは別にあるため、構成の一部として別途バックアップするようにしています。 部分的な復元においては、正確なプレフィックスが役立ちます。これにより、関連するキー領域のみを的を絞って抽出できるからです。.

クライアント統合とセキュアなプロトコル

クライアント側では、グローバルな「requirepass」を無効にするのではなく、一貫してユーザー名とパスワードを使用しています。最新のクライアントに対しては、プロトコルバージョンと認証を1つのステップでネゴシエートするために、HELLOハンドシェイクを採用しています。 本番環境では、認証情報やデータ経路を保護するためにTLS暗号化を採用しています。また、クライアントがログにユーザー名を平文で記録しないこと、あるいはログが適切にマスキングされていることを確認しています。.

# の例:ワンステップ認証
HELLO 3 AUTH app1 安全なパスワード

CI/CDの自動化と構成テンプレート

私はACLをコードとしてモデル化しています。ロールとユーザーはテンプレートから生成され、環境ごとに変数(プレフィックス、チャネル、カテゴリ)をそのテンプレートに設定しています。パイプラインでは検証処理が実行されます。リンターが、@dangerous/@adminコマンドが含まれていないかを確認し、テストでは代表的なキーに対してDRYRUNを実行します。また、スモークテスト用コンテナが隔離されたRedisインスタンスに対して短時間起動し、AUTH、GET/SET、およびPub/Subのエンドツーエンド検証を行います。 すべてのチェックが「グリーン」になって初めて変更がロールアウトされ、ロールバック時には以前のACLファイルが即座に利用可能になります。.

操作上の細かい点:表示と整理

日常業務において、ちょっとした工夫が大きな効果をもたらします。ACL WHOAMI を使えば、クライアントが実際にどのアカウントで動作しているかを素早く確認できます。これは、特に複雑なツールチェーンにおいて非常に役立ちます。「ゾンビ」アカウントは定期的に整理しています。無効化されたサービスはユーザーを失います(「off」)、 パスワードは削除され(「resetpass」)、キーおよびチャネルの権限も消去されます(「resetkeys」、「resetchannels」)。ユーザー名については命名規則(例:team_service_env)を厳守しており、これにより監査やインシデント対応が迅速化されます。.

簡単にまとめると

私は次のことを計画している。 ACL 最初から、サービスごとにユーザーを作成し、そのユーザーのコマンド、キープレフィックス、チャネルを厳格に制限しています。保守しやすい構成を実現するため、別のACLファイルを使用し、変更を管理された方法で適用し、各手順を文書化しています。 明確なプレフィックスを持つネームスペースはテナントを保護し、監査、鍵のローテーション、およびログ記録によって運用を確実に維持します。機密性の高いシナリオでは、アクセス制御と技術的な分離が連携するよう、アーキテクチャ上の分離も追加で考慮しています。これにより、共有されているRedisインスタンスは管理しやすいものとなり、, セーフ 多くのユーザー層を対象としたプラットフォーム。.

現在の記事

サーバー環境におけるRedisのアクセス制御を抽象的かつフォトリアリスティックに表現したもの
セキュリティ

マルチユーザー環境におけるRedis ACLの安全な導入

マルチユーザー環境向けのRedis ACLは、明確なユーザー権限、キーに関するルール、およびアクセス制御を通じて、Redisのセキュリティを強化します。.

最新鋭のデータセンターに設置された、MariaDBデータベースサーバーが稼働中のサーバーラック
データベース

アップデート後のMariaDBのパフォーマンス低下を防ぐ

mariadb update 実行後の MariaDB のパフォーマンス低下を回避し、的確なデータベースチューニングによって安定かつ高速なデータベースを確保する方法をご紹介します。.