Seguridad en Servicios Web
Dede la versión 2.3 todos los servicios web generados con la herramienta requieren que la conexión este encriptada y que se identifique al cliente que se está comunicando.
Servicio Públicos
Para desactivar esta medida de seguridad dentro de las opciones del
servicio se debe enviar seguro => false
, dejando el servicio web
publico a cualquier proceso que pueda conectarse con el servidor
via http. Por ejemplo
<?php
class mi_servicio_publico extends toba_servicio_web
{
function get_opciones()
{
return array(
'seguro' => false
);
}
function op__algo()
{
.....
?>
Configuración
- Instalar binarios de OpenSSL
- Generar la Clave Privada y Certificado Público tanto para el
proyecto cliente como para el que brinda el servicio. Copiar el path
generado porque va a ser utilizado como input de los otros comandos:
toba servicios_web generar_cert -p cliente toba servicios_web generar_cert -p servidor
- En el cliente: Importar el certificado del servidor para este
consumo de servicio especifico:
toba servicios_web cli_configurar -p cliente -s mi_cliente -c CERT_SERVIDOR
- En el servidor: Importar el certificado del cliente con un ID especifico de cliente:
toba servicios_web serv_configurar -p servidor -s mi_servicio -h dependencia=humanidades -c CERT_CLIENTE
A partir de la versión 2.4+ de toba, se cuenta con dos operaciones
visuales en el proyecto toba_usuarios
que configuran exactamente los
mismos archivos y permiten probar la configuración enviando una
operación generica 'eco' desde el cliente hacia el servidor (ambos deben
tener esta versión minima de toba para que funcione la prueba)
ID de cliente
Es un arreglo asociativo que permite al servidor identificar unívocamente a cada cliente. El servidor lo puede utilizar sólo como control de acceso (solo tal y tal ID pueden acceder a mi servicio) o también utilizarlo para hacer algun filtrado de datos o control mas granular (ej. afectar una consulta SQL o directamente negar el acceso a ciertas operaciones a clientes específicos)
Durante la configuración se lo especifica campo1=valor1,campo2=valor2
y en ejecución la operación puede obtenerlo de la siguiente manera:
<?php
....
function op__eco(toba_servicio_web_mensaje $mensaje)
{
$id_cliente = $this->get_id_cliente();
if ($id_cliente['campo1'] == 'valor1') {
...
?>
Comandos y archivos de configuracion
generar_cert
Utilizando el binario OpenSSL y el archivo de configuración ubicado en
instalacion/openssl.ini
genera dos archivos en la carpeta
instalacion/i__instancia/p__proyecto
:
privada.key
: Clave privada de la instalación puntual de este proyecto, es muy importante que sólo sea accesible por este proyecto y nunca se compartapublica.crt
: Certificado publico, este archivo es el que se va a compartir con los demás sistemas
Es recomendable ajustar la configruación del archivo
instalacion/openssl.ini
para incluir los detalles particulares de cada
organización
cli_configurar
Toma el certificado público del servidor como parámetro y lo almacena en
la carpeta
instalacion/i__instancia/p__proyecto/servicios_cli/mi_servicio
. En esa
misma carpeta genera un archivo cliente.ini
conteniendo las rutas de
este archivo mas la ruta de la clave/certificado de este proyecto
[certificado]
clave_cliente = ../../privada.key
cert_cliente = ../../publica.crt
cert_servidor = ./cert_servidor.crt
El comando también acepta recibir la URL del servidor como parámetro, tambien se almacena en este archivo
serv_configurar
Toma el certificado público del cliente como parámetro y lo almacena en
la carpeta
instalacion/i__instancia/p__proyecto/servicios_serv/mi_servicio
. En
esa misma carpeta genera un archivo servicio.ini
conteniendo las rutas
de este archivo mas la ruta de la clave/certificado de este proyecto El
comando tambien requiere que se especifique algun ID del cliente que
tambien se almacena en el archivo .ini junto a un fingerprint (sha1) del
certificado para facilitar su matcheo:
[certificado]
clave_servidor = ../../privada.key
cert_servidor = ../../publica.crt
[dependencia=agronomia]
archivo = ./dependencia_agronomia.crt
fingerprint = 381939b1236551ff89a7201908c517703386e941
Funcionamiento
Al utilizar la libreria WSF-PHP, Toba provee la implementación de la especificación WS-Security de SOAP. De esta forma permite opcionalmente encripta' todos los mensajes enviados y recibidos, garantizando así la seguridad en la capa de transporte. A su vez cada mensaje es firmado por el que emite y se valida la firma en el receptor.
El cliente mantiene:
- Su clave privada (para firmar la ida y descifrar la vuelta)
- Su certificado publico (que se envia como parte del mensaje)
- Certificado publico del servidor (para comprobar la validez de la firma en la respuesta)
El servidor conoce:
- Su clave privada (para descifrar la ida y firmar la vuelta)
- Su certificado publico (que se otorga a los clientes durante el setup)
- Mantiene una mapeo de IDs con certificados de los clientes, esto es lo unico puntual por fuera de WS-Security que implementa toba
Proceso:
- El cliente firma (utilizando su clave) y encripta (utilizando el cert del servidor) el mensaje utilizando WS-Security, nada extra. Se envia su certificado publico entre los headers SOAP
- El servidor, usando la libreria, desencripta y valida la firma del cliente
- Luego se toma el certificado y se lo coteja contra el mapeo, recuperando el ID del cliente
- La libreria toma la respuesta, encripta, firma y envia