アクセス制御
1. アクセス制御機能の概要
アクセス制御 (ACL) は、主に RocketMQ のトピックリソースレベルで高度なアクセス制御機能を提供します。 RocketMQ アクセス制御を使用する場合、ユーザーはユーザー名とパスワードのパラメータをクライアントに挿入して署名を実現でき、サーバーはアクセス制御パラメータを通じてさまざまなリソースの権限管理と検証を実装できます。
ACL制御は、クラスタアクセス制御のセキュリティを強化する一方で、デプロイプロセスと運用管理の複雑さを増大させます。 通常、ネットワーク環境が安全ではなく、ビジネスデータが機密性が高く、複数の部門やテナントが混在するシナリオでのみ使用することをお勧めします。 本番クラスタ自体がプライベートクラスタであり、外部の部門やテナントからアクセスされない場合は、オフにすることができます。
2. アクセス制御の定義と属性値
2.1 権限定義
RocketMQトピックリソースへのアクセス制御の定義は、主に次の表に示すように、次の4つのカテゴリに分類されます。
権限 | 定義 |
---|---|
拒否 | 拒否 |
ANY | PUBまたはSUB権限 |
PUB | 送信権限 |
SUB | 購読権限 |
2.2 権限定義の主要属性
フィールド | 値 | 定義 |
---|---|---|
globalWhiteRemoteAddresses | *;192.168.*.*;192.168.0.1 | グローバルIPホワイトリスト |
accessKey | 文字列 | アクセスキー |
secretKey | 文字列 | シークレットキー |
whiteRemoteAddress | *;192.168.*.*;192.168.0.1 | ユーザーIPホワイトリスト |
admin | true;false | 管理者アカウントかどうか |
defaultTopicPerm | DENY;PUB;SUB;PUB|SUB | デフォルトのトピック権限 |
defaultGroupPerm | DENY;PUB;SUB;PUB|SUB | デフォルトのコンシューマーグループ権限 |
topicPerms | topic=権限 | 各トピックの権限 |
groupPerms | group=権限 | 各コンシューマーグループの権限 |
詳細は、**distribution/conf/plain_acl.yml** 設定ファイルを参照してください。
3. アクセス制御をサポートするクラスタのデプロイ
上記のように **distribution/conf/plain_acl.yml** 設定ファイルで権限属性を定義した後、**aclEnable** スイッチ変数をオンにすることで、RocketMQクラスタのACL機能をオンにすることができます。 ブローカーでACL機能を有効にするためのプロパティ設定ファイルの内容は次のとおりです。
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
storePathRootDir=/data/rocketmq/rootdir-a-m
storePathCommitLog=/data/rocketmq/commitlog-a-m
autoCreateSubscriptionGroup=true
## if acl is open,the flag will be true
aclEnable=true
listenPort=10911
brokerIP1=XX.XX.XX.XX1
namesrvAddr=XX.XX.XX.XX:9876
4. アクセス制御のメインプロセス
ACLのメインプロセスは2つの部分に分かれており、主に権限解析と権限検証が含まれます。
4.1 権限解析
ブローカーは、クライアントのRequestCommandリクエストを解析し、認証が必要な属性フィールドを取得します。主に以下が含まれます。
- AccessKey: ユーザー名と同様に、ユーザサブジェクトを指し、権限データに対応します。
- 署名: クライアントがSecretKeyで署名を取得した文字列。サーバーはSecretKeyで検証します。
4.2 権限検証
ブローカー側の権限検証ロジックは、主に次の手順に分かれています。
- グローバルIPホワイトリストにヒットするかどうかを確認します。ヒットする場合は、検証に合格したと見なされます。そうでない場合は、2に進みます。
- ユーザーIPホワイトリストにヒットするかどうかを確認します。ヒットする場合は、検証に合格したと見なされます。そうでない場合は、3に進みます。
- 署名を検証します。検証に失敗した場合は、例外をスローします。合格した場合は、4に進みます。
- ユーザーリクエストに必要な権限を、ユーザーが所有する権限と照合して検証します。失敗した場合は、例外をスローします。
ユーザーに必要な権限の検証では、次の内容に注意する必要があります。
- UPDATE_AND_CREATE_TOPICなどの特別なリクエストは、管理者アカウントのみが操作できます。
- 特定のリソースについて、明示的な設定権限がある場合は、設定された権限が使用されます。明示的な設定権限がない場合は、デフォルトの権限が使用されます。
5. 変更されたアクセス制御定義のホットリロード
RocketMQのアクセス制御ストレージのデフォルトの実装は、yml設定ファイルに基づいています。ユーザーは、Brokerサービスノードを再起動することなく、アクセス制御定義のプロパティを動的に変更できます。
6. アクセス制御の使用制限
- 高可用性デプロイ(マスター/スレーブアーキテクチャ)とともにACLを有効にする場合は、Brokerマスターノードのdistribution/conf/plain_acl.yml設定ファイルにグローバルホワイトリスト情報を設定する必要があります。つまり、マスターノードのplain_acl.yml設定ファイルでスレーブノードのIPアドレスをグローバルホワイトリストに設定する必要があります。
- 高可用性デプロイ(マルチレプリカDledgerアーキテクチャ)とともにACLを有効にする場合は、ノードがダウンしたときにDledgerグループ内でプライマリノードが自動的に選択されるため、Dledgerグループ内のすべてのBrokerノードのplain_acl.yml設定ファイルでホワイトリストをすべてのBrokerノードのIPアドレスに設定する必要があります。
7. ACL mqadmin設定管理コマンド
7.1 ACL設定ファイルの「account」属性の値を更新する
このコマンドの例は次のとおりです。
$ sh mqadmin updateAclConfig -n 192.168.1.2:9876 -b 192.168.12.134:10911 -a RocketMQ -s 1234567809123 -t topicA=DENY,topicD=SUB -g groupD=DENY,groupB=SUB
説明:存在しない場合は、ACL Config YAML設定ファイルに作成されます。 存在する場合は、対応する「accounts」属性を更新します。 指定されたクラスタ名が指定されている場合、コマンドはクラスタ内の各ブローカーノードで実行されます。 そうでない場合、コマンドは単一のブローカーノードで実行されます。
パラメータ | 値 | 定義 |
---|---|---|
n | 例:192.168.1.2:9876 | NameSrvアドレス(必須) |
c | 例:DefaultCluster | クラスタ名を指定する(ブローカーアドレスのいずれかを選択) |
b | 例:192.168.12.134:10911 | ブローカーアドレスを指定する(クラスタ名のいずれかを選択) |
a | 例:RocketMQ | アクセスキー値(必須) |
s | 例:1234567809123 | シークレットキー値(オプション) |
m | 例:true | 管理者アカウントかどうか(オプション) |
w | 例:192.168.0.* | whiteRemoteAddress、ユーザーIPホワイトリスト(オプション) |
i | 例:DENY;PUB;SUB;PUB|SUB | defaultTopicPerm、デフォルトのトピック権限(オプション) |
u | 例:DENY;PUB;SUB;PUB|SUB | defaultGroupPerm、デフォルトのコンシューマーグループ権限(オプション) |
t | 例:topicA=DENY,topicD=SUB | topicPerms、各トピックの権限(オプション) |
g | 例:groupD=DENY,groupB=SUB | groupPerms、各コンシューマーグループの権限(オプション) |
7.2 ACL設定ファイルの対応する「account」を削除する
このコマンドの例は次のとおりです。
$ sh mqadmin deleteAccessConfig -n 192.168.1.2:9876 -c DefaultCluster -a RocketMQ
説明:指定されたクラスタ名が指定されている場合、コマンドはクラスタ内の各ブローカーノードで実行されます。 そうでない場合、コマンドは単一のブローカーノードで実行されます。 パラメータ「a」はアクセスキーの値であり、一意のアカウントIDを識別するために使用されるため、コマンドパラメータでアカウントIDを指定できます。
パラメータ | 値 | 定義 |
---|---|---|
n | 例:192.168.1.2:9876 | NameSrvアドレス(必須) |
c | 例:DefaultCluster | クラスタ名を指定する(ブローカーアドレスのいずれかを選択) |
b | 例:192.168.12.134:10911 | ブローカーアドレスを指定する(クラスタ名のいずれかを選択) |
a | 例:RocketMQ | アクセスキー値(必須) |
7.3 ACL設定ファイルのグローバルホワイトリストを更新する
このコマンドの例は次のとおりです。
sh mqadmin updateGlobalWhiteAddr -n 192.168.1.2:9876 -b 192.168.12.134:10911 -g 10.10.154.1,10.10.154.2
説明:指定されたクラスタ名が指定されている場合、コマンドはクラスタ内の各ブローカーノードで実行されます。 そうでない場合、コマンドは単一のブローカーノードで実行されます。 パラメータ「g」はグローバルIPホワイトリストの値であり、ACL設定ファイルの「globalWhiteRemoteAddresses」フィールド属性値を更新するために使用されます。
パラメータ | 値 | 定義 |
---|---|---|
n | 例:192.168.1.2:9876 | NameSrvアドレス(必須) |
c | 例:DefaultCluster | クラスタ名を指定する(ブローカーアドレスのいずれかを選択) |
b | 例:192.168.12.134:10911 | ブローカーアドレスを指定する(クラスタ名のいずれかを選択) |
g | 例:10.10.154.1,10.10.154.2 | グローバルIPホワイトリスト(必須) |
7.4 クラスタBrokerのACL設定ファイルのバージョン情報を照会する
このコマンドの例は次のとおりです。
sh mqadmin clusterAclConfigVersion -n 192.168.1.2:9876 -c DefaultCluster
説明:指定されたクラスタ名が指定されている場合、コマンドはクラスタ内の各ブローカーノードで実行されます。 そうでない場合、コマンドは単一のブローカーノードで実行されます。
パラメータ | 値 | 定義 |
---|---|---|
n | 例:192.168.1.2:9876 | NameSrvアドレス(必須) |
c | 例:DefaultCluster | クラスタ名を指定する(ブローカーアドレスのいずれかを選択) |
b | 例:192.168.12.134:10911 | ブローカーアドレスを指定する(クラスタ名のいずれかを選択) |
7.5 クラスタBrokerのACL設定ファイルの内容全体を照会する
このコマンドの例は次のとおりです。
sh mqadmin getAccessConfigSubCommand -n 192.168.1.2:9876 -c DefaultCluster
説明:指定されたクラスタ名が指定されている場合、コマンドはクラスタ内の各ブローカーノードで実行されます。 そうでない場合、コマンドは単一のブローカーノードで実行されます。
パラメータ | 値 | 定義 |
---|---|---|
n | 例:192.168.1.2:9876 | NameSrvアドレス(必須) |
c | 例:DefaultCluster | クラスタ名を指定する(ブローカーアドレスのいずれかを選択) |
b | 例:192.168.12.134:10911 | ブローカーアドレスを指定する(クラスタ名のいずれかを選択) |
重要なお知らせ: ACL 認証を有効にした後に、Master/Slave および Dledger モードで Broker のデータ同期が異常となる問題が、コミュニティ版の[4.5.1]バージョンで修正されました。具体的な PR リンクはこちらです: https://github.com/apache/rocketmq/pull/1149