Differenze tra le versioni di "AdminGuide:RestAPI"

Da Kalliope Wiki.
Jump to navigation Jump to search
Riga 20: Riga 20:
* '''Username''': lo username dell'utente (es. admin)
* '''Username''': lo username dell'utente (es. admin)
* '''Domain''': il dominio del tenant di appartenza dell'utente. Nel caso di sistemi mono-tenant, il dominio predefinito è "default"
* '''Domain''': il dominio del tenant di appartenza dell'utente. Nel caso di sistemi mono-tenant, il dominio predefinito è "default"
* '''Nonce''': una stringa casuale generata dal client, di lunghezza almeno pari a 8 caratteri. Ad ogni richiesta è necessario rigenerare un nuovo nonce, in quanto il sistema tiene traccia di tutti quelli utilizzati in precedenza, per un periodo pari al tempo di validità del nonce, che è pari a 5 minuti. Dopo 5 minuti è possibile riutilizzare un nonce utilizzato in precedenza; la protezione da attacchi basati su replica è in questo caso garantita dal timestamp di creazione del nonce
* '''Nonce''': una stringa casuale esadecimale generata dal client , di lunghezza almeno pari a 8 caratteri. Ad ogni richiesta è necessario rigenerare un nuovo nonce, in quanto il sistema tiene traccia di tutti quelli utilizzati in precedenza, per un periodo pari al tempo di validità del nonce, che è pari a 5 minuti. Dopo 5 minuti è possibile riutilizzare un nonce utilizzato in precedenza; la protezione da attacchi basati su replica è in questo caso garantita dal timestamp di creazione del nonce
* '''Created''': indica il timestamp di creazione del nonce; se l'ora di ricezione della richiesta differisce dall'ora impostata sul KalliopePBX per più di 5 minuti, la richiesta viene considerata invalida e rifiutata. Questo garantisce che il riuso di un X-authenticate header con lo stesso nonce non sia possibile né entro i 5 minuti del tempo di vita di un nonce (per la protezione da replica implementata) né oltre tale tempo di vita. Il formato della stringa del timestamp (riportato al timezone UTC) è "YYYY-MM-DDThh:mm:ssZ".  
* '''Created''': indica il timestamp di creazione del nonce; se l'ora di ricezione della richiesta differisce dall'ora impostata sul KalliopePBX per più di 5 minuti, la richiesta viene considerata invalida e rifiutata. Questo garantisce che il riuso di un X-authenticate header con lo stesso nonce non sia possibile né entro i 5 minuti del tempo di vita di un nonce (per la protezione da replica implementata) né oltre tale tempo di vita. Il formato della stringa del timestamp (riportato al timezone UTC) è "YYYY-MM-DDThh:mm:ssZ".  


Il campo '''Digest''' è un hash dei dati sopra descritti e della password dell'utente, e si calcola applicando la funzione di hash '''sha256''' alla concatenazione delle stringhe '''Nonce''', '''digestPassword''', '''Username''', '''Domain''' e ''' Created'''. Dato che sul KalliopePBX le password utente non sono salvate in chiaro ma sotto forma di hash non reversibile, per la generazione del Digest è necessario utilizzare l'hash della password con la stessa procedura utilizzata nel PBX (indicata come '''digestPassword''') e non la password in chiaro.  
Il campo '''Digest''' è un hash dei dati sopra descritti e della password dell'utente, e si calcola applicando la funzione di hash '''sha256''' alla concatenazione delle stringhe '''Nonce''', '''digestPassword''', '''Username''', '''Domain''' e ''' Created''' (concatenazione delle stringhe senza delimitatori):
 
  Digest = sha256(Nonce + digestPassword + Username + Domain + Created)
 
Dato che sul KalliopePBX le password utente non sono salvate in chiaro ma sotto forma di hash non reversibile, per la generazione del Digest è necessario utilizzare l'hash della password con la stessa procedura utilizzata nel PBX (indicata come '''digestPassword''') e non la password in chiaro.  


La procedura di calcolo della digestPassword richiede, oltre alla password dell'utente, una ulteriore stringa denominata '''salt''', univoca per tenant. Il salt può essere ottenuto dal KalliopePBX mediante una API REST apposita, invocabile in modo anonimo (senza autenticazione).
La procedura di calcolo della digestPassword richiede, oltre alla password dell'utente, una ulteriore stringa denominata '''salt''', univoca per tenant. Il salt può essere ottenuto dal KalliopePBX mediante una API REST apposita, invocabile in modo anonimo (senza autenticazione).
Riga 37: Riga 41:
Come esempio, con i dati seguenti:
Come esempio, con i dati seguenti:


  Nonce: bfb79078ff44c35714af28b7412a702b
  digestPassword: dd7b0be7fa37d6cbaf0b842bf7532f229cb79ab8d54d509c2aa7eea27a53cd5e
   Username: admin
   Username: admin
   Domain: default
   Domain: default
  Nonce: bfb79078ff44c35714af28b7412a702b
   Created: 2016-04-29T15:48:26Z
   Created: 2016-04-29T15:48:26Z
   digestPassword: dd7b0be7fa37d6cbaf0b842bf7532f229cb79ab8d54d509c2aa7eea27a53cd5e
    
si ottiene:
 
  Digest = sha256(bfb79078ff44c35714af28b7412a702bdd7b0be7fa37d6cbaf0b842bf7532f229cb79ab8d54d509c2aa7eea27a53cd5eadmindefault2016-04-29T15:48:26Z)


si ottiene il Digest (codificato in base64) '''+PJg7Tb3v98XnL6iJVv+v5hwhYjdzQ2tIWxvJB2cE40='''. La stringa completa risultante da inserire all'interno dell'header X-authenticate è quindi quella indicata all'inizio del paragrafo e riportata di seguito:
che codificato in base64 vale '''+PJg7Tb3v98XnL6iJVv+v5hwhYjdzQ2tIWxvJB2cE40='''. La stringa completa risultante da inserire all'interno dell'header X-authenticate è quindi quella indicata all'inizio del paragrafo e riportata di seguito:


   X-authenticate: RestApiUsernameToken Username=”admin”, Domain=”default”, Digest=”+PJg7Tb3v98XnL6iJVv+v5hwhYjdzQ2tIWxvJB2cE40=”, Nonce=”bfb79078ff44c35714af28b7412a702b”, Created=”2016-04-29T15:48:26Z”
   X-authenticate: RestApiUsernameToken Username=”admin”, Domain=”default”, Digest=”+PJg7Tb3v98XnL6iJVv+v5hwhYjdzQ2tIWxvJB2cE40=”, Nonce=”bfb79078ff44c35714af28b7412a702b”, Created=”2016-04-29T15:48:26Z”

Versione delle 08:41, 2 feb 2017

Descrizione generale

KalliopePBX offre un set di API REST che possono essere invocate da sistemi esterni per compiere azioni di tipo dispositivo (es. creazione di un interno, generazione di un backup e download, ecc.) o di consultazione (download del registro chiamate, ecc.).

L'accesso alle API può avvenire tramite HTTP o HTTPS, previa autenticazione, secondo il meccanismo descritto di seguito.

Meccanismo di autenticazione

Il meccanismo di autenticazione delle API REST utilizza le stesse credenziali utente valide per l'accesso web. In particolare, ogni richiesta deve contenere un HTTP header custom, monouso, il cui nome è X-authenticate. La procedura di autenticazione è one-way, ossia non richiede l'invio di un challenge da parte del server, ma tutte le informazioni necessarie all'autenticazione sono generate esclusivamente lato client.

La proprietà di uso singolo dell'header di autenticazione previene gli attacchi per duplicazione, garantendo che la conoscenza dell'header X-authenticate di una certa richiesta non permetta di effettuarne un'altra illecita.

Costruzione dell'X-authenticate header

L'header è composto da una serie di dati in chiaro ed un digest costruito utilizzando tali dati, unitamente alla password dell'utente che effettua la richiesta. Di seguito un esempio di un X-authenticate header completo:

 X-authenticate: RestApiUsernameToken Username=”admin”, Domain=”default”, Digest=”+PJg7Tb3v98XnL6iJVv+v5hwhYjdzQ2tIWxvJB2cE40=”, Nonce=”bfb79078ff44c35714af28b7412a702b”, Created=”2016-04-29T15:48:26Z”

I dati che sono utilizzati (e trasmessi nella richiesta) nella costruzione dell'header sono:

  • Username: lo username dell'utente (es. admin)
  • Domain: il dominio del tenant di appartenza dell'utente. Nel caso di sistemi mono-tenant, il dominio predefinito è "default"
  • Nonce: una stringa casuale esadecimale generata dal client , di lunghezza almeno pari a 8 caratteri. Ad ogni richiesta è necessario rigenerare un nuovo nonce, in quanto il sistema tiene traccia di tutti quelli utilizzati in precedenza, per un periodo pari al tempo di validità del nonce, che è pari a 5 minuti. Dopo 5 minuti è possibile riutilizzare un nonce utilizzato in precedenza; la protezione da attacchi basati su replica è in questo caso garantita dal timestamp di creazione del nonce
  • Created: indica il timestamp di creazione del nonce; se l'ora di ricezione della richiesta differisce dall'ora impostata sul KalliopePBX per più di 5 minuti, la richiesta viene considerata invalida e rifiutata. Questo garantisce che il riuso di un X-authenticate header con lo stesso nonce non sia possibile né entro i 5 minuti del tempo di vita di un nonce (per la protezione da replica implementata) né oltre tale tempo di vita. Il formato della stringa del timestamp (riportato al timezone UTC) è "YYYY-MM-DDThh:mm:ssZ".

Il campo Digest è un hash dei dati sopra descritti e della password dell'utente, e si calcola applicando la funzione di hash sha256 alla concatenazione delle stringhe Nonce, digestPassword, Username, Domain e Created (concatenazione delle stringhe senza delimitatori):

 Digest = sha256(Nonce + digestPassword + Username + Domain + Created)

Dato che sul KalliopePBX le password utente non sono salvate in chiaro ma sotto forma di hash non reversibile, per la generazione del Digest è necessario utilizzare l'hash della password con la stessa procedura utilizzata nel PBX (indicata come digestPassword) e non la password in chiaro.

La procedura di calcolo della digestPassword richiede, oltre alla password dell'utente, una ulteriore stringa denominata salt, univoca per tenant. Il salt può essere ottenuto dal KalliopePBX mediante una API REST apposita, invocabile in modo anonimo (senza autenticazione).

La formula di calcolo della digestPassword è (i caratteri { e } fanno parte della stringa di cui si esegue lo sha256 e devono essere inseriti):

 digestPassword = sha256(password{<salt>})

Ad esempio, supponendo che la password dell'utente sia "admin" e il salt sia uguale a "b5a8fdcf2f8d5acdad33c4a072a97d7a", la digestPassword risultante è:

 digestPassword = sha256(admin{b5a8fdcf2f8d5acdad33c4a072a97d7a}) = dd7b0be7fa37d6cbaf0b842bf7532f229cb79ab8d54d509c2aa7eea27a53cd5e

Come esempio, con i dati seguenti:

 Nonce: bfb79078ff44c35714af28b7412a702b
 digestPassword: dd7b0be7fa37d6cbaf0b842bf7532f229cb79ab8d54d509c2aa7eea27a53cd5e
 Username: admin
 Domain: default
 Created: 2016-04-29T15:48:26Z
 

si ottiene:

 Digest = sha256(bfb79078ff44c35714af28b7412a702bdd7b0be7fa37d6cbaf0b842bf7532f229cb79ab8d54d509c2aa7eea27a53cd5eadmindefault2016-04-29T15:48:26Z) 

che codificato in base64 vale +PJg7Tb3v98XnL6iJVv+v5hwhYjdzQ2tIWxvJB2cE40=. La stringa completa risultante da inserire all'interno dell'header X-authenticate è quindi quella indicata all'inizio del paragrafo e riportata di seguito:

 X-authenticate: RestApiUsernameToken Username=”admin”, Domain=”default”, Digest=”+PJg7Tb3v98XnL6iJVv+v5hwhYjdzQ2tIWxvJB2cE40=”, Nonce=”bfb79078ff44c35714af28b7412a702b”, Created=”2016-04-29T15:48:26Z”

Elenco API

Family Method URL Description
Tenant Management
(no auth.)
GET /rest/salt/{tenantDomain} Returns the salt for the tenant specified by its domain
GET /rest/salt/pbxAdmin Returns the salt for pbxadmin user (avail. with Multi-Tenant license)
CDR GET/POST /rest/cdr/{format}/{years}/{months}/{days} Gets the CDR in the specified format for the specified time range
GET/POST /rest/cdr/{format}/{years}/{months}
GET/POST /rest/cdr/{format}/{years}
GET/POST /rest/cdr/{format}