Aplicación de ejemplo para la exportación de datos de auditoría
Esta aplicación de ejemplo es una SchedulerThing de ThingWorx que utiliza la extensión de protocolo de transferencia de ficheros SSH (SFTP) de la sección Tools de ThingWorx Marketplace para insertar los registros de auditoría exportados a un servidor SFTP remoto. La SchedulerThing se puede configurar para que se ejecute a la hora y frecuencia más adecuadas para el entorno. La SchedulerThing mantiene una propiedad denominada lastExportDate, que se actualiza cada vez que una exportación se ejecuta correctamente.
El subsistema de auditoría de ThingWorx gestiona la exportación de entradas de auditoría, tal como se muestra en la siguiente figura y se describe a continuación:
Los datos de auditoría que genera la plataforma persisten en la base de datos de ThingWorx. Estos datos se pueden consultar y filtrar por categoría y rango de fechas de auditoría. La cantidad de datos del almacén en línea se limita a la hora de conservación configurada para el parámetro DaysOnline del subsistema de auditoría.
Los datos de auditoría en línea se archivan periódicamente, en función de la frecuencia especificada para la cosa AuditArchiveScheduler. Los datos de auditoría se depuran periódicamente, en función de la frecuencia especificada para la cosa PurgeAuditScheduler. La frecuencia por defecto de ambas operaciones es cada 24 horas.
Al exportar registros de auditoría con esta aplicación de ejemplo, en el servicio ExportAuditData se incluye una llamada para archivar los datos de auditoría en línea actuales. Esta llamada garantiza que los datos de auditoría exportados no tendrán ninguna brecha para las entradas de auditoría generadas, pero aún no archivadas.
Instalación y configuración de la extensión
Para instalar y configurar la extensión SFTP, siga estos pasos:
1. Descargue la extensión "Protocolo de transferencia de ficheros SSH" y el manual de usuario de la extensión desde ThingWorx Marketplace.
2. Siga las instrucciones del documento ThingWorx SFTP Extension User Guide para instalar la extensión.
3. En ThingWorx Composer, cree una nueva cosa de SFTP y seleccione el objeto SFTPRepositoryTemplate que se ha importado con la extensión. En la página Configuración de la cosa SFTP, configure la ubicación del servidor remoto y las credenciales que desee. Consulte el manual del usuario de la extensión si necesita más detalles.
4. En Composer, cree una nueva cosa que utilice la plantilla de cosa del programador. Continúe en la siguiente sección para configurar este programador.
Configuración del programador del exportador de auditoría de SFTP
Configure el nuevo programador como se indica a continuación:
1. En la página Información general, configure las siguientes propiedades:
Nombre: SFTPAuditExporter
Plantilla de cosa: programador
2. En la página Propiedades, añada las siguientes propiedades:
Propiedad
BaseType
Plantilla de cosa
HasDefaultValue
Persistent
lastExportDate
DATETIME
N/D
Seleccionado, el valor por defecto es 1/1/1970 00:00:00
Seleccionado
targetRepository
THINGNAME
FileRepository
N/D
Seleccionado
sftpThing
THINGNAME
SftpRepositoryTemplate
N/D
Seleccionado
sftpDirectory
STRING
N/D
Seleccionado, el valor por defecto es *.*
Seleccionado
3. En la página Suscripciones, añada la siguiente información de suscripción y el código:
Origen: deje este campo en blanco.
Evento : permite especificar ScheduledEvent.
Activado : seleccione esta casilla de verificación.
Script: permite añadir el código del bloque de código que se muestra a continuación.
Este es el script que se copiará en el campo Script:

// Sample script for a scheduleThing that will periodically call the ExportAuditData service on the
// AuditSubsystem to capture audit records prior to those records aging off the system.
// These then are transferred to an external SFTP server using the SFTP Thingworx Extension.

logger.info("Audit export starting");

// Property validation checks
if (me.sftpThing == undefined) {
throw "sftpThing property not set. Cannot continue.";
}
if (me.targetRepository == undefined) {
throw "targetRepository property not set. Cannot continue.";
}
if (me.sftpDirectory == undefined || me.sftpDirectory == null || me.sftpDirectory == "") {
// set a default value if not setup previously.
me.sftpDirectory = ".";
}

var exportEndTime = new Date();
var uploadDirFormatted = dateFormat(exportEndTime, "yyyy-MM"); // store in directories by month

var exportParams = {
startDate: me.lastExportDate, // Start after the last successsful export
endDate: exportEndTime, // Use the end time recorded above
targetRepositoryName: me.targetRepository, // destination repository from the scheduler's properties

// Set the targetPath to custom folder for exporting. The files will be deleted from this folder on
// completion of the export.
targetPath: "scheduledExport",

// Add the current date to the targetFileName
// The targetFileName must be unique. The ExportAuditData service will not overwrite an existing file.
targetFileName: "AuditArchive-" + dateFormat(exportEndTime, "yyyy-MM-dd-HHmm"),

// The locale for the exported audit messages. If undefined, the system default is used
locale: undefined
};

try {

Subsystems["AuditSubsystem"].ExportAuditData(exportParams);

// The export to the target repository now needs to be transferred to an external location.
// This example uses the SFTP Extension to transfer to a remote SFTP server.
// The location and credentials for the SFTP server are configured on the SFTP Thing.

// Check to make sure the destination directory exists as the SFTP server will not auto create it.
var checkDirParams = {
path: me.sftpDirectory
};
var findDirObj = {
name: uploadDirFormatted
};
if (Things[me.sftpThing].ListDirectories(checkDirParams).Find(findDirObj) == undefined) {
var createDirParams = {
path: me.sftpDirectory + "/" + uploadDirFormatted
};
Things[me.sftpThing].CreateFolder(createDirParams);
}

var uploadParams = {
FileRepository: me.targetRepository,
RepoFilePath: exportParams.targetPath + "/" + exportParams.targetFileName + ".zip",
RemoteFilePath: me.sftpDirectory + "/" + uploadDirFormatted + "/" + exportParams.targetFileName + ".zip"
};
Things[me.sftpThing].UploadFile(uploadParams);

// Upon successfully storing the export file, update the start time
// breadcrumb to the time the export was started.
me.lastExportDate = exportEndTime;

} catch (err) {
logger.error("Failed to export the auditing records: " + err);
} finally {
// Delete the temporary export file from the local repository
var deleteFileParams = {
path: exportParams.targetPath + "/" + exportParams.targetFileName + ".zip"
};
Things[me.targetRepository].DeleteFile(deleteFileParams);
}
logger.info("Audit export completed");
Configuración
El objeto SFTPAuditExporter tiene las siguientes propiedades de configuración, que deben definirse antes de su uso:
targetRepository: permite especificar la cosa FileRepository de ThingWorx que se utilizará como una ubicación temporal para las entradas de auditoría exportadas. Cuando se exportan entradas de auditoría, esta aplicación las organiza localmente antes de enviarlas al servidor SFTP configurado. Una vez completada la transferencia, se quita el fichero local.
sftpThing: permite especificar la cosa de SFTP que se ha creado en el paso 3 de la sección de instalación anterior.
sftpDirectory: permite especificar el directorio padre del servidor SFTP remoto en el que se almacenarán los ficheros de entrada de auditoría. Suponiendo que el servidor remoto tiene un directorio por defecto para cada usuario, el valor por defecto, *.*, especifica que se debe utilizar el directorio por defecto. Si el usuario lo desea, este valor se puede cambiar.
Además, en la página Configuración de este programador, se puede elegir la hora de programación para ajustar el momento en que se debe realizar la exportación. Por defecto, la programación se ejecuta cada día a media noche.
Notas operativas
Cuando se guardan las entradas de auditoría en el servidor SFTP remoto, los ficheros guardados se denominarán AuditArchive-<año>-<mes>-<día>-<hora><minuto>.zip, donde la hora indica el momento en que se ha creado el fichero de archivo. En cada fichero ZIP se incluye un solo fichero con formato JSON con los registros de auditoría localizados. Los ficheros de archivo se organizan en subdirectorios por mes, con la convención de asignación de nombres <año>-<mes>. Por ejemplo, 2019-08.
Para cambiar la configuración regional que se utiliza para las entradas de auditoría, edite el script del programador y defina el campo locale en la definición exportParams.
* 
Por defecto, la configuración del tiempo de espera de un script en ThingWorx Platform es de 30 segundos. Si un script tarda más tiempo en ejecutarse, la plataforma termina la ejecución. Un administrador de ThingWorx puede configurar el tiempo de espera del script en la sección de configuración básica del fichero de configuración platform-settings.json. Consulte también Detalles de la configuración de platform-settings.json.