2011-01-07 14 views

答えて

13

直接ではありません。これを行う唯一の方法は、サーバー上に(一時的な)キーを作成する認証方法を用意し、最初の引数がこのキーであり、すべて認証されていないエラーをさらに発生させるようにすべてのメソッドを変更することです。例えば:

exception NotAuthorisedException { 
    1: string errorMessage, 
} 

exception AuthTimeoutException { 
    1: string errorMessage, 
} 

service MyAuthService { 
    string authenticate(1:string user, 2:string pass) 
     throws (1:NotAuthorisedException e), 

    string mymethod(1:string authstring, 2:string otherargs, ...) 
     throws (1:AuthTimeoutException e, ...), 
} 

我々は、このメソッドを使用すると、キーはすべて「てきぱき」維持するために30分のタイムアウトで安全なmemcachedのインスタンスに私たちのキーを保存します。 AuthTimeoutExceptionを受け取ったクライアントは再認証と再試行が予想され、ブルートフォース攻撃を阻止するためのファイアウォールルールがいくつか用意されています。

+0

デフ生成しましたか? – JensG

+2

@ JensGいいえ、暗号化された形式でパスワードを送信し、エンコードされた文字列をサーバー側でチェックしたいと考えています。ワイヤを介して送られた文字列が格納された文字列と正確には一致しないかもしれないが、bcryptアルゴリズムを使ってチェックされても、それでも有効である可能性があるので、Bcryptはこれに適している。 –

+0

この場合、クリアテキストのパスワードは送信されませんが、ハッシュされたパスワードを攻撃者が読み取ることができれば、認証コールを再生してサービスにアクセスすることができます。 – cjungel

1

自動化とアクセス許可のようなタスクは、通常、一般的なRPC /シリアル化の概念よりも(通常は)アプリケーションロジックに関連しているため、Thriftの一部とはみなされません。 Thriftがすぐにサポートしている唯一のものはTSASLTransportです。私はそれを使用する必要性を感じなかったので、私はそれについて多くを言うことができません。

もう1つの選択肢は、残念なことに書面ではC++でしか実装されていないTHeaderTransportを使用することです。したがって、他の言語で使用する予定がある場合は、追加作業をする必要があります。私たちが貢献を受け入れると言うことは言うまでもない。

0

少し遅れた(私は非常に遅く思うが)2,3年前にこのためにスリフトソースコードを修正した。

ちょうどこのために、https://issues.apache.org/jira/browse/THRIFT-4221へのパッチでチケットを提出しました。

これを見てください。基本的には、これを行う "BeforeAction"フックを追加することです。

例Golangあなたは、ワイヤ上をクリアテキストでパスワードを送信している

+  // Called before any other action is called 
+  BeforeAction(serviceName string, actionName string, args map[string]interface{}) (err error) 
+  // Called if an action returned an error 
+  ProcessError(err error) error 
} 

type MyServiceClient struct { 
@@ -391,7 +395,12 @@ func (p *myServiceProcessorMyMethod) Process(seqId int32, iprot, oprot thrift.TP 
     result := MyServiceMyMethodResult{} 
     var retval string 
     var err2 error 
-  if retval, err2 = p.handler.MyMethod(args.AuthString, args.OtherArgs_); err2 != nil { 
+  err2 = p.handler.BeforeAction("MyService", "MyMethod", map[string]interface{}{"AuthString": args.AuthString, "OtherArgs_": args.OtherArgs_}) 
+  if err2 == nil { 
+    retval, err2 = p.handler.MyMethod(args.AuthString, args.OtherArgs_) 
+  } 
+  if err2 != nil { 
+    err2 = p.handler.ProcessError(err2) 
関連する問題