對Storm的DRPC進行權限控制,
並且設計相應的測試驗證。
1.集羣安裝
2.使用DRPC功能
請參考Storm集羣使用DRPC功能Version1.0.1
預置如下數據:
在Strom集羣上面啓動DRPC進程,
並且提交了DRPC的topology,
方法名稱爲exclamation。
3.開啓DRPC的權限控制
在storm.yaml文件中開啓DRPC的權限控制:
drpc.authorizer: "org.apache.storm.security.auth.authorizer.DRPCSimpleACLAuthorizer"
drpc.authorizer.acl.filename: "drpc-auth-acl.yaml"
drpc.authorizer.acl.strict: true
在conf目錄下新建drpc-auth-acl.yaml文件,
配置內容如下:
drpc.authorizer.acl:
"exclamation":
"client.users":
- "alice"
- "kafka"
"invocation.user": "stormna"
說明,配置用戶kafka和alice可以通過客戶端調用drpc的方法exclamation,
client.users指定的用戶可以執行的操作爲operation:execute,
invocation.user可以執行的操作operation:failRequest,fetchRequest,result,
當drpc.authorizer.acl.strict爲false時,
意爲permissive寬容,
即沒有配置權限控制的方法可以被任意用戶執行,
而在配置文件中指定了控制權限的方法還需要匹配才能執行。
當drpc.authorizer.acl.strict爲ture時,
只有在配置文件中的用戶才能執行,
不在則拒絕,即爲嚴格的白名單。
4.重啓Storm集羣
配置完成後重新啓動storm集羣,包括nimbus,drpc,
登陸Storm UI管理臺可以看到新的配置項已經生效。
5.客戶端驗證
使用DRPCClientTest.java類中對於exclamation的客戶端調用代碼,
具體代碼請參考Storm集羣使用DRPC功能Version1.0.1的第7章節,
打成名稱爲drpctest.jar的jar包,
然後上傳到Linux的storm用戶下面,
執行如下測試命令:
java -jar drpctest.jar hi
未授權用戶會拋出異常:
Exception in thread "main" AuthorizationException(msg:DRPC request 'execute' for 'unknown' user is not authorized)
at org.apache.storm.generated.DistributedRPC$execute_result$execute_resultStandardScheme.read(DistributedRPC.java:1231)
at org.apache.storm.generated.DistributedRPC$execute_result$execute_resultStandardScheme.read(DistributedRPC.java:1200)
at org.apache.storm.generated.DistributedRPC$execute_result.read(DistributedRPC.java:1134)
at org.apache.storm.thrift.TServiceClient.receiveBase(TServiceClient.java:86)
at org.apache.storm.generated.DistributedRPC$Client.recv_execute(DistributedRPC.java:106)
at org.apache.storm.generated.DistributedRPC$Client.execute(DistributedRPC.java:92)
at org.apache.storm.utils.DRPCClient.execute(DRPCClient.java:60)
at test.zte.storm.drpc.DRPCClientTest.main(DRPCClientTest.java:28)
登陸到kafka用戶,
執行同樣的測試命令:
java -jar drpctest.jar hi
正常返回結果:
input:hi, result:hi!
用戶kafka執行成功,而storm執行失敗,
是因爲我們在drpc-auth-acl.yaml給kafka配置了權限,
而沒有給storm用戶權限。