RabbitMQユーザーと権限の管理:コマンドラインガイド

`rabbitmqctl`コマンドをマスターして、RabbitMQで堅牢なユーザーと権限管理を実現しましょう。この包括的なガイドでは、新しいユーザーの作成、タグを使用した管理者またはアプリケーションロールの割り当て、詳細な仮想ホスト権限(読み取り/書き込み/設定)の設定、アクセスの安全な取り消しまで、コマンドラインによる管理を確実に行うための手順を段階的に説明します。

RabbitMQユーザーと権限の管理:コマンドラインガイド

RabbitMQの権限は、ほぼ正しく設定するのは簡単です。ユーザーが存在してもパブリッシュできないことがあります。managementタグを持っていても、アプリケーションのvhostにアクセスできないユーザーもいます。広範な正規表現により、サービスが本来消費のみを行うべきキューを誤って作成してしまう可能性があります。ほとんどの権限の問題は、ユーザー、タグ、vhost権限という3つの異なる概念を混同することから発生します。

このガイドでは、一般的なユーザー管理ワークフロー(ユーザーの作成、タグの割り当て、vhost権限の設定、アクセスの確認、パスワードのローテーション、アクセスのクリーンな削除)にrabbitmqctlを使用します。

前提条件

始める前に、以下のものを用意してください。

  1. RabbitMQサーバーがインストールされていること: ブローカーが実行中である必要があります。
  2. rabbitmqctlへのアクセス: ノードまたはクラスターへの管理アクセス権が必要です。コマンドは通常、RabbitMQノード上で実行されますが、環境が設定されていればリモートCLIの使用も可能です。
  3. 正しいvhost名: 権限は仮想ホストごとにスコープされます。//prodprodは互換性がありません。

rabbitmqctlによるユーザーの管理

rabbitmqctlツールは、すべてのユーザー関連操作にuser_*ファミリーのコマンドを使用します。RabbitMQのユーザーはオペレーティングシステムのユーザーとは異なることを理解することが重要です。

1. 既存ユーザーの一覧表示

現在ブローカーにアクセスできるユーザーを確認するには、list_usersコマンドを使用します。

rabbitmqctl list_users

出力例:

Listing users ...
user: guest   tags: [administrator]
user: app_prod tags: [policymaker]

2. 新しいユーザーの作成

新しいサービスアカウントや管理者を設定する場合、ユーザーを作成し、初期パスワードを割り当てる必要があります。

api_userという名前のユーザーを初期パスワードで作成するには:

rabbitmqctl add_user api_user 'replace-with-a-long-random-password'
```\n
本番環境のパスワードをシェル履歴に残さないようにしてください。自動化システムでは、シークレットマネージャーと、使用しているプラットフォームが既に使用しているプロビジョニングメカニズムを優先してください。

### 3. ユーザータグ(ロール)の変更

ユーザータグは、特定の管理機能を付与する定義済みロールを定義します。最も一般的なタグは、`administrator`、`policymaker`、`management`です。

* **`administrator`**: ユーザー、権限、vhost、ポリシー、クラスター全体の設定を管理できます。
* **`policymaker`**: ユーザーがアクセス権を持つvhostのポリシーとパラメーターを管理できます。
* **`management`**: 管理UI/APIにログインできますが、ユーザーが使用できるリソースはvhost権限によって制御されます。
* **`monitoring`**: 管理情報を表示できます。監視アカウントに便利です。

#### 現在のタグの表示

現在のロールを確認するには、`list_user_tags`を使用します:

```bash
rabbitmqctl list_user_tags api_user

タグの設定

api_usermanagementタグを割り当てるには:

rabbitmqctl set_user_tags api_user management

set_user_tagsは、ユーザーのタグリストを指定したタグに完全に置き換えます。管理者タグとポリシーメーカータグの両方を付与するには、同じコマンドに両方を含めます:

rabbitmqctl set_user_tags api_user administrator policymaker

タグの削除

ユーザーからすべてのタグを削除するには:

rabbitmqctl set_user_tags api_user

一部のRabbitMQバージョンでは、clear_user_tagsも提供されています。スクリプト化する前に、インストールされているバージョンでrabbitmqctl help clear_user_tagsを確認してください。

4. ユーザーパスワードの変更

資格情報をローテーションする必要がある場合は、change_passwordコマンドを使用します:

rabbitmqctl change_password api_user newsecurepass123

5. ユーザーの削除

ユーザーを完全に削除し、関連するすべてのアクセスを取り消すには:

rabbitmqctl delete_user api_user

警告: 本番環境では、セキュリティ上の理由からguestユーザーを削除することが一般的に推奨されますが、その前に新しい管理ユーザーを作成する必要があります。

仮想ホスト権限の管理

RabbitMQの権限は、仮想ホスト(vhost)ごとに定義されます。vhostは、キュー、交換機、バインディングの名前空間として機能します。デフォルトでは、RabbitMQには/という名前のルートvhostがあります。

1. Vhostの一覧表示

まず、利用可能なvhostを特定します:

rabbitmqctl list_vhosts

2. VHost上のユーザーに権限を設定する

set_permissionsコマンドは、アプリケーションのセキュリティにとって最も重要です。特定のvhost内でリソースを設定、読み取り、または書き込む権利をユーザーに付与します。

構文: rabbitmqctl set_permissions -p <vhost> <user> <configure> <write> <read>

権限の値は正規表現です。.*はすべてのリソース名を意味します。^$はリソース名がないことを意味します。

例: 特定のVHostへのフルアクセスを許可する

app_prod/prod_vhostのみへのフルCRUD(設定、読み取り、書き込み)アクセスを許可する場合:

rabbitmqctl set_permissions -p /prod_vhost app_prod "^.*" "^.*" "^.*"
権限 意味 一般的な用途
設定 正規表現に一致するキュー、交換機、バインディングを作成、削除、または変更します。 独自のトポロジーを宣言するデプロイヤーまたはアプリ。
書き込み 一致する交換機にパブリッシュします。 プロデューサー。
読み取り 一致するキューから消費します。 コンシューマー。

例: ユーザーを公開のみに制限する

ファイアホースプロデューサーによく見られるパターンは、書き込みのみに制限することです:

# ユーザー 'publisher' は /analytics_vhost で書き込みはできるが、設定やメッセージの読み取りはできない
rabbitmqctl set_permissions -p /analytics_vhost publisher "^$" "^events\\." "^$"

この例では、名前がevents.で始まる交換機へのパブリッシュを許可します。ユーザーがトポロジーを設定したり、メッセージを消費したりすることは許可しません。

例: コンシューマーの制限

# worker. で始まるキューから読み取ることはできるが、パブリッシュや設定はできない
rabbitmqctl set_permissions -p /jobs worker_consumer "^$" "^$" "^worker\\."

正規表現による権限は強力ですが、範囲が広くなりすぎるのも簡単です。キューが同じvhost内でprod.orders.createdstaging.orders.createdという名前の場合、.*orders.*のような正規表現は意図した以上に多くのものをカバーする可能性があります。複雑な正規表現の境界よりも、vhostを分離する方が通常はクリーンです。

3. 権限のクリア

特定のvhost上のユーザーのすべての権限を完全に削除するには、clear_permissionsを使用します:

rabbitmqctl clear_permissions -p /prod_vhost app_prod

4. ユーザー権限の一覧表示

vhost上で付与された権限を確認するには:

rabbitmqctl list_permissions -p /prod_vhost

あるユーザーにvhost全体で割り当てられているすべての権限を表示するには:

rabbitmqctl list_user_permissions app_prod

ユーザー管理のベストプラクティス

  • 最小権限の原則を使用する: プロデューサーは通常書き込み権限、コンシューマーは通常読み取り権限を必要とし、トポロジーの所有者だけが設定権限を必要とします。
  • 専用のvhostを使用する: すべてを正規表現で解決しようとする代わりに、vhostを使用して環境とテナントを分離します。
  • guestを意図的に処理する: デフォルトのguestユーザーはデフォルトでlocalhostに制限されています。多くの運用チームは、実際の管理者アカウントを作成した後、それを削除します。
  • 望ましい状態をスクリプト化する: ユーザー、vhost、権限の設定をデプロイメント自動化に組み込んで、再構築されたブローカーがメモリに依存しないようにします。
  • 変更後に確認する: 本番環境での変更後は、list_userslist_permissionslist_user_permissionsを実行します。

実用的なアプリケーション設定は、多くの場合次のようになります:

rabbitmqctl add_vhost /orders
rabbitmqctl add_user orders_publisher 'replace-with-secret'
rabbitmqctl add_user orders_worker 'replace-with-secret'

rabbitmqctl set_permissions -p /orders orders_publisher "^$" "^orders\\." "^$"
rabbitmqctl set_permissions -p /orders orders_worker "^$" "^$" "^orders\\."

rabbitmqctl list_user_permissions orders_publisher
rabbitmqctl list_user_permissions orders_worker

これにより、パブリッシュとコンシュームの資格情報が分離されます。ワーカーのパスワードが漏洩しても、新しいメッセージをパブリッシュできません。パブリッシャーのパスワードが漏洩しても、キューをドレインできません。この分離はシンプルですが、最も有用なRabbitMQセキュリティ習慣の1つです。