IPRO - PC Magazine Romania, 2002
Comunitatea experţilor şi a cititorilor PC Magazine
- Internet PRO
XMLRPC, o cale
de a ieşi din izolare
Un raport despre experienţele câştigate cu RSA SecureID şi XMLRPC
Florian Lindauer
O componentă importantă a fiecărui serviciu internet o reprezintă partea de
autentificare a utilizatorilor. Într-un mediu în care cerinţele de securitate
sunt foarte ridicate, modelul uzual "login + parolă" nu mai poate satisface
aceste cerinţe, chiar dacă transmisia datelor se face folosind SSL (Secure Socket
Layer). Cu ajutorul protocolului SSL datele de autentificare a utilizatorului
sunt transmise codificat, ele putând fi totuşi spionate. O primă soluţie ar
fi parolele de unică folosinţă. Ele sunt valabile doar pentru o singură utilizare,
după folosire nemaifiind de nici un ajutor pentru potenţialii agresori. Dacă
parolele de unică folosinţă sunt emise câteva secunde înainte de utilizarea
lor, atunci riscul de a fi spionate sau folosite împotriva voinţei posesorului
poate fi exclus. O soluţie matură pentru rezolvarea problemelor de genul celor
discutate mai sus o constituie produsul SecurID (vezi caseta) al Companiei RSA
(http://www.rsasecurity.com/).
Firma SecureNet (http://www.secure-net.de)
a folosit această tehnologie în proiectul MCdialog.net (http://www.mcdialog.net).
RSA SecurID
Soluţia "SecurId" se bazează pe două lucruri distincte: un token hardware
(de genul unei cărţi de credit - să îl numim SecurId - card sau pe scurt
card) şi un secret (o parolă şi/sau un număr de pin). Cardul dispune
de un display care afişează o parte integrantă din parolă în forma unui
cod (alfa)numeric ce se schimbă din minut în minut. Utilizatorul foloseşte
acest cod precum şi pin-ul pe care numai el îl ştie. Numai cine are
atât pin-ul cât şi codul parolei se poate autentifica: spionarea numărului
de pin nu foloseşte celui care nu deţine şi cardul de generare a codului
parolei. Astfel, SecurID generează neîncetat parole de unică folosinţă
care sunt valide doar un timp limitat. Modul de generare a parolei nu
poate fi descifrat pe baza parolelor generate anterior.
Diferit de modul de lucru al RSA (generarea unei Public-Key)
este faptul că numai modulul hardware (cardul) şi serverul deţin Secret-Key,
deci această cheie este protejată în totalitate. Totodată şi codul generat
pentru parolă va avea o lungime mult mai mică în comparaţie cu lungimea
unei chei de genul Public-Key. Atâta timp cât serverul este protejat,
nu există nici un risc pentru aflarea Secret-Key. Din aceste motive
această tehnologie este apreciată în cercurile de specialitate ca fiind
foarte sigură.
|
Pentru
autentificarea utilizatorilor cu SecurID trebuie instalat un server special
- RSA ACE/Server, care verifică permanent pin-ul transmis şi codul parolei.
În momentul implementării proiectului MCdialog.net nu există un API Java pentru
acest server iar API-ul C era disponibil numai sub Solaris, neaplicabil însă
pe o platforma Linux. Între timp se poate ca lucrurile să se fi schimbat, dar
poziţia iniţială este adesea regăsită şi în celelalte cazuri: cine doreşte să
folosească serviciul este restricţionat de platforma, limbajul de programare
şi/sau protocolul de comunicare.
În
cazul nostru am folosit serviciul "Autentificarea SecurID" pentru cerinţele
unei aplicaţii Servlet Java. Dincolo de funcţiile specifice administrării utilizatorilor,
va fi folosit numai serviciul cu semnătura "boolean is_valid" (codul parolei
pentru a face disponibil codul pin). Acest serviciu trebuie să fie disponibil
pentru adresare direct din aplicaţia Java. Aici intră în scenă XMLRPC.
XMLRPC
(http://www.xmlrpc.com/)
reprezintă un protocol standard de comunicare pentru folosirea la distanţă a
diverselor servicii web. Pentru acest protocol există implementări pe toate
platformele şi pentru aproape toate limbajele de programare, inclusiv limbaje
larg răspândite ca Java sau C(++). Exemplul următor prezintă o secvenţă de cod
de bază pentru realizarea autentificării serverului cu o interfaţă XMLRPC în
C, precum şi descrierea folosirii sale în Java.
Serverul
Serverul SecurID ACE rulează pe o platformă Solaris care este conectată prin
reţea cu un server web sub Linux. Pe Solaris este disponibil API-ul C ce poate
furniza funcţionalitatea dorită pentru serverul RSA. Pe Linux se creează un
mic program server (daemon), care în caz contrar ar rula pe Solaris, şi care
poate fi adresat prin intermediul interfeţei XMLRPC.
Exemplu:
static xmlrpc_value *
checkLogin (xmlrpc_env *env, xmlrpc_value *param_array, void *user_data)
{
xmlrpc_int32 status=0;
char *login,*pin,*passcode;
// get input parameters
xmlrpc_parse_value(env, param_array, "(ssss)", &login, &pin, &passcode);
if (env->fault_occurred) return NULL;
// validity check against RSA ACE Server
status=checkPasscode(login, passcode, pin);
// send result
return xmlrpc_build_value(env, "{s:i}", "status", status);
}
int main (int argc, char **argv)
{
// Prepare request handling
xmlrpc_server_abyss_init(XMLRPC_SERVER_ABYSS_NO_FLAGS, "conf/abyss.conf");
// Add all the xmlrpc-methods we provide
xmlrpc_server_abyss_add_method_w_doc(
"securid.checkLogin", &checkLogin, NULL, "i:sss",
"Check validity of login, pin and passcode at the current time");
// Process requests
xmlrpc_server_abyss_run();
}
Clientul
Folosirea serviciului cu Java devine simplă. Este nevoie de unul din numeroşii
clienţi XMLRPC Java pentru apelarea funcţiilor disponibile. Mai jos este prezentat
fragmentul de cod.
public int checkSecurId(String user, String passcode, String pin)
throws SomeSecurityException
{
try
{ XmlRpcClient server = new XmlRpcClient(XMLRPC_RSAACE_URL);
6 Helma XMLRPC-Implementierung für Java: xmlrpc.helma.org
Vector params = new Vector();
params.addElement(user);
params.addElement(pin);
params.addElement(passcode);
Hashtable xresult=(Hashtable)server.execute("securid.checkLogin", params);
result=((Integer)xresult.get("status")).intValue();
return result;
}
catch(Exception e)
{ log.debug("SecurID-xmlrpc: Exception: "+e.getMessage());
throw new SomeSecurityException("system-failure: authentication");
}
}
Pentru apelarea metodei, Clientul generează un obiect Request (codat XML) care
cuprinde metoda şi parametrii doriţi şi care este transportat de protocolul
HTTP.
<?xml version="1.0"?>
<methodCall>
<methodName>securid.checkLogin</methodName>
<params><param><value><string>somelogin</string></value></param>
<param><value><string>1234</string></value></param>
<param><value><string>987654</string></value></param>
</params>
</methodCall>
Răspunsul Serverului conţine parametrii rezultaţi - în cazul eşecului autentificării
avem status 1=Login invalid
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params><param><value><struct><member>
<name> status </name>
<value><i4> 1 </i4></value></member>
</struct></value></param></params>
</methodResponse>
Concluzii
XMLRPC este o tehnologie flexibilă, larg răspândită, puternică şi în acelaşi
timp simplu de integrat şi folosit chiar în proiecte mari, în care părţi ale
acestora rulează distribuit în reţeaua proprie sau în internet. Din acest motiv
această tehnică este de recomandat pentru împachetarea micilor servicii oferite
de diverse firme în scopul de a le face disponibile acolo unde este nevoie de
ele. Este de sperat, dar şi de aşteptat, ca în viitorul apropiat tot mai multe
companii să îşi înzestreze produsele software cu interfeţe către XMLRPC sau
către tehnologii echivalente, de exemplu SOAP, tocmai în scopul unei intercomunicări
necomplicate între diferitele componente software necesare în viaţa de zi cu
zi a afacerilor moderne.
Referinţe
- "Java and XML", Brett McLaughlin, O'Reilly, USA, June 2000
- MCDialog.Net - http://www.mcdialog.net
- RSA Security Inc. - http://www.rsasecurity.com/
- XML-RPC Home Page - http://www.xmlrpc.org
- XML-RPC for C and C++ -
http://xmlrpc-c.sourceforge.net.
[Traducere şi adaptare Liviu
Marinescu, SecureNet S.R.L. ]
|