2011-01-07 19 views

Odpowiedz

13

Nie bezpośrednio. Jedynym sposobem, aby to zrobić, jest posiadanie metody uwierzytelniania, która tworzy (tymczasowy) klucz na serwerze, a następnie zmienia wszystkie metody tak, aby pierwszy argument był tym kluczem i wszystkie dodatkowo podnoszą nieuwierzytelniony błąd. Na przykład:

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, ...), 
} 

Używamy tej metody i zapisać klucze do zabezpieczonej memcached przykład z timeout 30min klucze do utrzymać wszystko „żwawy”. Klienci, którzy otrzymają numer AuthTimeoutException, mają ponownie wykonać autoryzację i ponowić próbę, a my mamy pewne reguły zapory, aby powstrzymać ataki typu brute force.

+0

Wysyłasz haseł w postaci zwykłego tekstu na drucie? – JensG

+2

@JensG Nie, chcesz wysłać hasło w zaszyfrowanym formacie i sprawdzić, czy zakodowany ciąg po stronie serwera. Bcrypt jest na to dobry, ponieważ ciąg wysyłany przez przewód może nie pasować dokładnie do zapisanego ciągu, ale gdy jest zaznaczony przy użyciu algorytmu bcrypt, może nadal być sprawdzany. –

+0

W takim przypadku nie będziesz wysyłać czystych haseł tekstowych, ale jeśli atakujący będzie mógł odczytać zakodowane hasło, będzie mógł odtworzyć połączenie uwierzytelniające i uzyskać dostęp do twoich usług. – cjungel

1

Zadania, takie jak autoryzacja i uprawnienia, nie są traktowane jako część środków zaradczych, głównie dlatego, że są one (zwykle) bardziej związane z logiką aplikacji niż z ogólną koncepcją RPC/serializacji. Jedyną rzeczą, którą Thrift wspiera teraz po wyjęciu z pudełka, jest TSASLTransport. Nie mogę powiedzieć wiele na ten temat sam, po prostu dlatego, że nigdy nie czułem potrzeby korzystania z niego.

Inną opcją może być użycie THeaderTransport, która niestety w momencie pisania jest realizowana tylko z C++. Dlatego jeśli planujesz używać go w innym języku, możesz zainwestować dodatkowe prace. Nie trzeba dodawać, że przyjmujemy składki ...

0

Trochę późno (chyba bardzo późno), ale kilka lat temu zmodyfikowałem kod źródłowy Thrift.

Właśnie przesłano zgłoszenie z poprawką do https://issues.apache.org/jira/browse/THRIFT-4221.

Spójrz na to. Zasadniczo propozycja polega na dodaniu haka "BeforeAction", który dokładnie to robi.

Przykład Golang generowane diff

+  // 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) 
Powiązane problemy