Edit node configuration

This commit is contained in:
Pablo 2019-01-25 11:21:23 +01:00
parent 5bba4dd07f
commit d23718289c
9 changed files with 486 additions and 382 deletions

View File

@ -19,14 +19,12 @@ export class ConfigurationController {
* @param {*} errorHandler
* @param {*} apiReq
* @param {*} appState
* @param {*} wazuhConfig
*/
constructor($scope, $location, errorHandler, apiReq, appState, wazuhConfig) {
constructor($scope, $location, errorHandler, apiReq, appState) {
this.$scope = $scope;
this.errorHandler = errorHandler;
this.apiReq = apiReq;
this.appState = appState;
this.wazuhConfig = wazuhConfig;
this.$location = $location;
this.$scope.load = false;
this.$scope.isArray = Array.isArray;
@ -36,20 +34,12 @@ export class ConfigurationController {
this.$scope.configurationSubTab = '';
this.$scope.integrations = {};
this.$scope.selectedItem = 0;
this.$scope.selectedNode = false;
this.$scope.nodes = [];
this.$scope.editingFile = false;
this.$scope.fetchedXML = false;
}
/**
* When controller loads
*/
$onInit() {
this.init();
const configuration = this.wazuhConfig.getConfig();
this.$scope.adminMode = !!(configuration || {}).admin;
this.$scope.getXML = () => this.configurationHandler.getXML(this.$scope);
this.$scope.getJSON = () => this.configurationHandler.getJSON(this.$scope);
this.$scope.isString = item => typeof item === 'string';
@ -83,60 +73,6 @@ export class ConfigurationController {
);
};
/**
* Edit node configuration
*/
const fetchFile = async () => {
try {
const data = await this.apiReq.request(
'GET',
`/cluster/${this.$scope.selectedNode}/configuration`,
{}
);
const json = ((data || {}).data || {}).data || false;
if (!json) {
throw new Error('Could not fetch configuration file');
}
const xml = this.configurationHandler.json2xml(json);
return xml;
} catch (error) {
return Promise.reject(error);
}
};
this.$scope.closeEditingFile = () => {
this.$scope.editingFile = false;
}
this.$scope.editConf = async () => {
this.$scope.editingFile = true;
try {
this.$scope.fetchedXML = await fetchFile();
this.$scope.$broadcast('fetchedFile', { data: this.$scope.fetchedXML });
} catch (error) {
this.$scope.fetchedXML = null;
this.errorHandler.handle(error, 'Fetch file error');
}
if (!this.$scope.$$phase) this.$scope.$digest();
};
this.$scope.saveConfiguration = async () => {
try{
this.$scope.editingFile = false;
this.$scope.$broadcast('saveXmlFile', { node: this.$scope.selectedNode});
}catch( error ) {
this.$scope.fetchedXML = null;
this.errorHandler.handle(error, 'Save file error');
}
}
this.$scope.xmlIsValid = valid => {
this.$scope.xmlHasErrors = valid;
if (!this.$scope.$$phase) this.$scope.$digest();
};
/**
* Navigate to woodle
*/
@ -200,27 +136,5 @@ export class ConfigurationController {
this.$scope.$on('$routeChangeStart', () =>
this.appState.removeSessionStorageItem('configSubTab')
);
}
async init() {
try {
this.$scope.clusterStatus = await this.apiReq.request('GET', '/cluster/status', {});
if (
this.$scope.clusterStatus &&
this.$scope.clusterStatus.data.data.enabled === 'yes' &&
this.$scope.clusterStatus.data.data.running === 'yes'
) {
const nodes = await this.apiReq.request('GET', '/cluster/nodes', {});
this.$scope.nodes = nodes.data.data.items.reverse();
const masterNode = nodes.data.data.items.filter(
item => item.type === 'master'
)[0];
this.$scope.selectedNode = masterNode.name;
}
} catch (error) {
this.errorHandler.handle(error, 'Error getting cluster status');
}
if (!this.$scope.$$phase) this.$scope.$digest();
}
}
}

View File

@ -0,0 +1,133 @@
/*
* Wazuh app - Management configuration controller
* Copyright (C) 2015-2019 Wazuh, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Find more information about this on the LICENSE file.
*/
import { ConfigurationHandler } from '../../utils/config-handler';
export class EditionController {
/**
* Constructor
* @param {*} $scope
* @param {*} $location
* @param {*} errorHandler
* @param {*} apiReq
* @param {*} appState
* @param {*} wazuhConfig
*/
constructor($scope, $location, errorHandler, apiReq, appState, wazuhConfig) {
this.$scope = $scope;
this.errorHandler = errorHandler;
this.apiReq = apiReq;
this.appState = appState;
this.wazuhConfig = wazuhConfig;
this.$location = $location;
this.$scope.load = false;
this.configurationHandler = new ConfigurationHandler(apiReq, errorHandler);
this.$scope.selectedNode = false;
this.$scope.nodes = [];
this.$scope.editingFile = false;
this.$scope.fetchedXML = false;
}
/**
* When controller loads
*/
$onInit() {
this.init();
const configuration = this.wazuhConfig.getConfig();
this.$scope.adminMode = !!(configuration || {}).admin;
/**
* Edit node configuration
*/
const fetchFile = async () => {
try {
const data = await this.apiReq.request(
'GET',
`/cluster/${this.$scope.selectedNode}/configuration`,
{}
);
const json = ((data || {}).data || {}).data || false;
if (!json) {
throw new Error('Could not fetch configuration file');
}
const xml = this.configurationHandler.json2xml(json);
return xml;
} catch (error) {
return Promise.reject(error);
}
};
this.$scope.closeEditingFile = () => {
this.$scope.editingFile = false;
}
this.$scope.editConf = async () => {
this.$scope.editingFile = true;
try {
this.$scope.fetchedXML = await fetchFile();
this.$scope.$broadcast('fetchedFile', { data: this.$scope.fetchedXML });
} catch (error) {
this.$scope.fetchedXML = null;
this.errorHandler.handle(error, 'Fetch file error');
}
if (!this.$scope.$$phase) this.$scope.$digest();
};
this.$scope.saveConfiguration = async () => {
try{
this.$scope.editingFile = false;
this.$scope.$broadcast('saveXmlFile', { node: this.$scope.selectedNode});
}catch( error ) {
this.$scope.fetchedXML = null;
this.errorHandler.handle(error, 'Save file error');
}
}
this.$scope.xmlIsValid = valid => {
this.$scope.xmlHasErrors = valid;
if (!this.$scope.$$phase) this.$scope.$digest();
};
this.$scope.edit = (node) => {
this.$scope.selectedNode = node.name;
return this.$scope.editConf();
};
//listeners
this.$scope.$on('wazuhShowNode', (event, parameters) => {
return this.$scope.edit(parameters.node);
});
}
async init() {
try {
this.$scope.clusterStatus = await this.apiReq.request('GET', '/cluster/status', {});
if (
this.$scope.clusterStatus &&
this.$scope.clusterStatus.data.data.enabled === 'yes' &&
this.$scope.clusterStatus.data.data.running === 'yes'
) {
const nodes = await this.apiReq.request('GET', '/cluster/nodes', {});
this.$scope.nodes = nodes.data.data.items.reverse();
const masterNode = nodes.data.data.items.filter(
item => item.type === 'master'
)[0];
this.$scope.selectedNode = masterNode.name;
}
} catch (error) {
this.errorHandler.handle(error, 'Error getting cluster status');
}
if (!this.$scope.$$phase) this.$scope.$digest();
}
}

View File

@ -19,6 +19,7 @@ import { ManagementController } from './management';
import { RulesController } from './rules';
import { StatusController } from './status';
import { ClusterController } from './monitoring';
import { EditionController } from './edition';
const app = uiModules.get('app/wazuh', []);
@ -30,4 +31,5 @@ app
.controller('managerLogController', LogsController)
.controller('rulesController', RulesController)
.controller('managerStatusController', StatusController)
.controller('clusterController', ClusterController);
.controller('clusterController', ClusterController)
.controller('editionController', EditionController);

View File

@ -48,6 +48,8 @@ export function clickAction(
$location.path('/agents');
} else if (instance.path === '/agents/groups') {
$scope.$emit('wazuhShowGroup', { group: item });
} else if (instance.path === '/cluster/nodes') {
$scope.$emit('wazuhShowNode', { node: item });
} else if (
new RegExp(/^\/agents\/groups\/[a-zA-Z0-9_\-.]*\/files$/).test(
instance.path

View File

@ -1,300 +1,266 @@
<div flex="auto" layout="column" ng-if="configurationTab === 'welcome'">
<!-- Headline -->
<div layout="column" layout-padding>
<div ng-show="agent && agent.id !== '000'">
<span class="font-size-18"> <i class="fa fa-fw fa-cog" aria-hidden="true"></i> Configuration</span>
<span ng-if="isSynchronized" class="wz-agent-status-indicator small teal">SYNCHRONIZED</span>
<span ng-if="!isSynchronized" class="wz-agent-status-indicator small red">NOT SYNCHRONIZED</span>
</div>
<span class="font-size-18" ng-show="!agent || agent.id === '000'">
<i class="fa fa-fw fa-cog" aria-hidden="true"></i> Configuration
</span>
<div ng-show="selectedNode" ng-if="adminMode" layout="row" layout-padding style="position: absolute;right: calc(0% + 228px);margin-top: -10px;">
<div layout="column" layout-align="center" class="height-40 wz-select-input">
<select class="kuiSelect wz-border-none cursor-pointer max-height-35" id="categoryBox" ng-model="selectedNode"
ng-change="changeNode(selectedNode)" aria-label="Select node">
<option ng-repeat="node in nodes" value="{{node.name}}">{{node.name}} ({{node.type}})</option>
</select>
</div>
<div layout="column" layout-align="center" class="wz-padding-top-0 wz-margin-right-15">
<button type='button' class='height-40 btn btn-primary'
ng-click='editConf()'>Edit {{selectedNode}} configuration
</button>
<!-- Headline -->
<div layout="column" layout-padding>
<div ng-show="agent && agent.id !== '000'">
<span class="font-size-18"> <i class="fa fa-fw fa-cog" aria-hidden="true"></i> Configuration</span>
<span ng-if="isSynchronized" class="wz-agent-status-indicator small teal">SYNCHRONIZED</span>
<span ng-if="!isSynchronized" class="wz-agent-status-indicator small red">NOT SYNCHRONIZED</span>
</div>
<span class="font-size-18" ng-show="!agent || agent.id === '000'">
<i class="fa fa-fw fa-cog" aria-hidden="true"></i> Configuration</span>
</div>
</div>
<!-- End headline -->
<!-- End headline -->
<!-- Configuration section cards and right sidenav -->
<div flex="auto" layout="row">
<!-- This section has the configuration cards -->
<div flex layout="column">
<!-- Main configurations card -->
<md-card class="wz-md-card">
<md-card-content>
<span class="font-size-16">Main configurations</span>
<md-divider class="wz-margin-top-10"></md-divider>
<md-list layout="row" layout-wrap>
<!-- Manager sections -->
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="!agent || agent.id === '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('global-configuration', [{component:'analysis',configuration:'global'},{component:'request',configuration:'remote'},{component:'com',configuration:'logging'}])">Global configuration</h3>
<p>Global and remote settings</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="!agent || agent.id === '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('cluster', [{component:'com',configuration:'cluster'}])">Cluster</h3>
<p>Master node configuration</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="!agent || agent.id === '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('registration-service', [{component:'auth',configuration:'auth'}])">Registration service</h3>
<p>Automatic agent registration service</p>
</div>
</md-list-item>
<!-- <md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('ruleset')">Ruleset</h3>
<p>Current rules, decoders and CDB lists loaded in the cluster</p>
</div>
</md-list-item> -->
<!-- End manager sections -->
<!-- Agent sections -->
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="agent && agent.id !== '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('global-configuration', [{component:'com',configuration:'logging'}])">Global configuration</h3>
<p>Logging settings that apply to the agent</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="agent && agent.id !== '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('client', [{component:'agent',configuration:'client'}])">Communication</h3>
<p>Settings related to the connection with the manager</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="agent && agent.id !== '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('client-buffer', [{component:'agent',configuration:'buffer'}])">Anti-flooding settings</h3>
<p>Agent bucket parameters to avoid event flooding</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="agent && agent.id !== '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('alerts',[{component:'agent',configuration:'labels'}])">Labels</h3>
<p>User-defined information about the agent included in alerts</p>
</div>
</md-list-item>
<!-- End agent sections -->
</md-list>
</md-card-content>
</md-card>
<!-- End main configurations card -->
<!-- Alerts and output management card -->
<md-card class="wz-md-card" ng-if="!agent || agent.id === '000'">
<md-card-content>
<span class="font-size-16" ng-if="!agent || agent.id === '000'">Alerts and output management</span>
<md-divider class="wz-margin-top-10"></md-divider>
<md-list layout="row" layout-wrap>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="!agent || agent.id === '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('alerts',[{component:'analysis',configuration:'alerts'},{component:'analysis',configuration:'labels'},{component:'mail',configuration:'alerts'},{component:'monitor',configuration:'reports'}, {component:'csyslog',configuration:'csyslog'}])">Alerts</h3>
<p>Settings related to the alerts and their format</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="!agent || agent.id === '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('integrations',[{component:'integrator',configuration:'integration'}])">Integrations</h3>
<p>Slack, VirusTotal and PagerDuty integrations with external APIs</p>
</div>
</md-list-item>
<!-- <md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('database-output')">Database output</h3>
<p>MySQL and PostgreSQL database output configuration</p>
</div>
</md-list-item> -->
</md-list>
</md-card-content>
</md-card>
<!-- End alerts and output management card -->
<!-- Auditing and policy monitoring card -->
<md-card class="wz-md-card">
<md-card-content>
<span class="font-size-16">Auditing and policy monitoring</span>
<md-divider class="wz-margin-top-10"></md-divider>
<md-list layout="row" layout-wrap>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('policy-monitoring', [{component:'syscheck',configuration:'rootcheck'}])">Policy monitoring</h3>
<p>Configuration to ensure compliance with security policies, standards and hardening guides</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchWodle('open-scap')">OpenSCAP</h3>
<p>Configuration assessment and automation of compliance monitoring using SCAP checks</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchWodle('cis-cat')">CIS-CAT</h3>
<p>Configuration assessment using CIS scanner and SCAP checks</p>
</div>
</md-list-item>
</md-list>
</md-card-content>
</md-card>
<!-- End auditing and policy monitoring card -->
<!-- System, threats and incident response card -->
<md-card class="wz-md-card">
<md-card-content>
<span class="font-size-16">System threats and incident response</span>
<md-divider class="wz-margin-top-10"></md-divider>
<md-list layout="row" layout-wrap>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="!agent || agent.id === '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchWodle('vulnerability-detector')">Vulnerabilities</h3>
<p>Discover what applications are affected by well-known vulnerabilities</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchWodle('osquery')">Osquery</h3>
<p>Expose an operating system as a high-performance relational database</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchWodle('syscollector')">Inventory data</h3>
<p>Gather relevant information about system OS, hardware, networking and packages</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="!agent || agent.id === '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('active-response',[{component:'analysis',configuration:'command'},{component:'analysis',configuration:'active_response'}])">Active response</h3>
<p>Active threat addressing by inmmediate response</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="agent && agent.id !== '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('active-response',[{component:'com',configuration:'active-response'}])">Active response</h3>
<p>Active threat addressing by inmmediate response</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchWodle('command')">Commands</h3>
<p>Configuration options of the Command wodle</p>
</div>
</md-list-item>
</md-list>
</md-card-content>
</md-card>
<!-- End system, threats and incident response card -->
<!-- Log data analysis card -->
<md-card class="wz-md-card">
<md-card-content>
<span class="font-size-16">Log data analysis</span>
<md-divider class="wz-margin-top-10"></md-divider>
<md-list layout="row" layout-wrap>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('log-collection',[{component:'logcollector',configuration:'localfile'},{component:'logcollector',configuration:'socket'}])">Log collection</h3>
<p>Log analysis from text files, Windows events or syslog outputs</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('integrity-monitoring',[{component:'syscheck',configuration:'syscheck'}])">Integrity monitoring</h3>
<p>Identify changes in content, permissions, ownership, and attributes of files</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="!agent || agent.id === '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('agentless',[{component:'agentless',configuration:'agentless'}])">Agentless</h3>
<p>Run integrity checks on devices such as routers, firewalls and switches</p>
</div>
</md-list-item>
</md-list>
</md-card-content>
</md-card>
<!-- End log data analysis card -->
<!-- Cloud security monitoring card -->
<md-card class="wz-md-card" ng-if="!agent || agent.id === '000'">
<md-card-content>
<span class="font-size-16">Cloud security monitoring</span>
<md-divider class="wz-margin-top-10"></md-divider>
<md-list layout="row" layout-wrap>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchWodle('aws-s3')">Amazon S3</h3>
<p>Security events related to Amazon AWS services, collected directly via AWS API</p>
</div>
</md-list-item>
</md-list>
</md-card-content>
</md-card>
<!-- End cloud security monitoring card -->
<!-- Configuration section cards and right sidenav -->
<div flex="auto" layout="row">
<!-- XML editor for node configuration -->
<div flex layout="column" ng-show="editingFile">
<div layout="row" class="md-padding">
<span ng-click='closeEditingFile()' class='btn btn-info'>Cancel</span>
<button ng-disabled='xmlHasErrors' ng-click='saveConfiguration()' class='btn btn-primary pull-right wz-margin-left-8'>
<span ng-show='!xmlHasErrors'><i aria-hidden='true' class='fa fa-fw fa-save'></i>Save file</span>
<span ng-show='xmlHasErrors' class='btn-danger'><i aria-hidden='true' class='fa fa-fw fa-exclamation-triangle'></i>
XML format error</span>
</button>
</div>
<div class="md-padding md-padding-top-10" ng-if="fetchedXML">
<wz-xml-file-editor file-name='ossec.conf' data="fetchedXML" target-name="selectedNode"
valid-fn='xmlIsValid(valid)'>
</wz-xml-file-editor>
</div>
<!-- End configuration cards section -->
<!-- This section is the right sidenav content -->
<md-sidenav
class="md-sidenav-right"
md-is-locked-open="true">
<md-list>
<md-subheader>More info about this section</md-subheader>
<md-list-item target="_blank" class="wz-text-link" ng-href="https://documentation.wazuh.com/current/user-manual/manager/index.html">Wazuh administration documentation</md-list-item>
<md-list-item target="_blank" class="wz-text-link" ng-href="https://documentation.wazuh.com/current/user-manual/capabilities/index.html">Wazuh capabilities documentation</md-list-item>
<md-list-item target="_blank" class="wz-text-link" ng-href="https://documentation.wazuh.com/current/user-manual/reference/ossec-conf/index.html">Local configuration reference</md-list-item>
</md-list>
</md-sidenav>
<!-- End right sidenav section -->
</div>
<!-- This section has the configuration cards -->
<div ng-if="!editingFile" flex layout="column">
<!-- Main configurations card -->
<md-card class="wz-md-card">
<md-card-content>
<span class="font-size-16">Main configurations</span>
<md-divider class="wz-margin-top-10"></md-divider>
<md-list layout="row" layout-wrap>
<!-- Manager sections -->
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="!agent || agent.id === '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('global-configuration', [{component:'analysis',configuration:'global'},{component:'request',configuration:'remote'},{component:'com',configuration:'logging'}])">Global configuration</h3>
<p>Global and remote settings</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="!agent || agent.id === '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('cluster', [{component:'com',configuration:'cluster'}])">Cluster</h3>
<p>Master node configuration</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="!agent || agent.id === '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('registration-service', [{component:'auth',configuration:'auth'}])">Registration service</h3>
<p>Automatic agent registration service</p>
</div>
</md-list-item>
<!-- <md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('ruleset')">Ruleset</h3>
<p>Current rules, decoders and CDB lists loaded in the cluster</p>
</div>
</md-list-item> -->
<!-- End manager sections -->
<!-- Agent sections -->
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="agent && agent.id !== '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('global-configuration', [{component:'com',configuration:'logging'}])">Global configuration</h3>
<p>Logging settings that apply to the agent</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="agent && agent.id !== '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('client', [{component:'agent',configuration:'client'}])">Communication</h3>
<p>Settings related to the connection with the manager</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="agent && agent.id !== '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('client-buffer', [{component:'agent',configuration:'buffer'}])">Anti-flooding settings</h3>
<p>Agent bucket parameters to avoid event flooding</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="agent && agent.id !== '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('alerts',[{component:'agent',configuration:'labels'}])">Labels</h3>
<p>User-defined information about the agent included in alerts</p>
</div>
</md-list-item>
<!-- End agent sections -->
</md-list>
</md-card-content>
</md-card>
<!-- End main configurations card -->
<!-- Alerts and output management card -->
<md-card class="wz-md-card" ng-if="!agent || agent.id === '000'">
<md-card-content>
<span class="font-size-16" ng-if="!agent || agent.id === '000'">Alerts and output management</span>
<md-divider class="wz-margin-top-10"></md-divider>
<md-list layout="row" layout-wrap>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="!agent || agent.id === '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('alerts',[{component:'analysis',configuration:'alerts'},{component:'analysis',configuration:'labels'},{component:'mail',configuration:'alerts'},{component:'monitor',configuration:'reports'}, {component:'csyslog',configuration:'csyslog'}])">Alerts</h3>
<p>Settings related to the alerts and their format</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="!agent || agent.id === '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('integrations',[{component:'integrator',configuration:'integration'}])">Integrations</h3>
<p>Slack, VirusTotal and PagerDuty integrations with external APIs</p>
</div>
</md-list-item>
<!-- <md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('database-output')">Database output</h3>
<p>MySQL and PostgreSQL database output configuration</p>
</div>
</md-list-item> -->
</md-list>
</md-card-content>
</md-card>
<!-- End alerts and output management card -->
<!-- Auditing and policy monitoring card -->
<md-card class="wz-md-card">
<md-card-content>
<span class="font-size-16">Auditing and policy monitoring</span>
<md-divider class="wz-margin-top-10"></md-divider>
<md-list layout="row" layout-wrap>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('policy-monitoring', [{component:'syscheck',configuration:'rootcheck'}])">Policy monitoring</h3>
<p>Configuration to ensure compliance with security policies, standards and hardening guides</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchWodle('open-scap')">OpenSCAP</h3>
<p>Configuration assessment and automation of compliance monitoring using SCAP checks</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchWodle('cis-cat')">CIS-CAT</h3>
<p>Configuration assessment using CIS scanner and SCAP checks</p>
</div>
</md-list-item>
</md-list>
</md-card-content>
</md-card>
<!-- End auditing and policy monitoring card -->
<!-- System, threats and incident response card -->
<md-card class="wz-md-card">
<md-card-content>
<span class="font-size-16">System threats and incident response</span>
<md-divider class="wz-margin-top-10"></md-divider>
<md-list layout="row" layout-wrap>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="!agent || agent.id === '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchWodle('vulnerability-detector')">Vulnerabilities</h3>
<p>Discover what applications are affected by well-known vulnerabilities</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchWodle('osquery')">Osquery</h3>
<p>Expose an operating system as a high-performance relational database</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchWodle('syscollector')">Inventory data</h3>
<p>Gather relevant information about system OS, hardware, networking and packages</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="!agent || agent.id === '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('active-response',[{component:'analysis',configuration:'command'},{component:'analysis',configuration:'active_response'}])">Active response</h3>
<p>Active threat addressing by inmmediate response</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="agent && agent.id !== '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('active-response',[{component:'com',configuration:'active-response'}])">Active response</h3>
<p>Active threat addressing by inmmediate response</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchWodle('command')">Commands</h3>
<p>Configuration options of the Command wodle</p>
</div>
</md-list-item>
</md-list>
</md-card-content>
</md-card>
<!-- End system, threats and incident response card -->
<!-- Log data analysis card -->
<md-card class="wz-md-card">
<md-card-content>
<span class="font-size-16">Log data analysis</span>
<md-divider class="wz-margin-top-10"></md-divider>
<md-list layout="row" layout-wrap>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('log-collection',[{component:'logcollector',configuration:'localfile'},{component:'logcollector',configuration:'socket'}])">Log collection</h3>
<p>Log analysis from text files, Windows events or syslog outputs</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('integrity-monitoring',[{component:'syscheck',configuration:'syscheck'}])">Integrity monitoring</h3>
<p>Identify changes in content, permissions, ownership, and attributes of files</p>
</div>
</md-list-item>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line" ng-if="!agent || agent.id === '000'">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchConfigTab('agentless',[{component:'agentless',configuration:'agentless'}])">Agentless</h3>
<p>Run integrity checks on devices such as routers, firewalls and switches</p>
</div>
</md-list-item>
</md-list>
</md-card-content>
</md-card>
<!-- End log data analysis card -->
<!-- Cloud security monitoring card -->
<md-card class="wz-md-card" ng-if="!agent || agent.id === '000'">
<md-card-content>
<span class="font-size-16">Cloud security monitoring</span>
<md-divider class="wz-margin-top-10"></md-divider>
<md-list layout="row" layout-wrap>
<md-list-item flex="100" flex-gt-md="50" flex-gt-lg="33" class="md-2-line">
<div class="md-list-item-text">
<h3 class="wz-text-link" ng-click="switchWodle('aws-s3')">Amazon S3</h3>
<p>Security events related to Amazon AWS services, collected directly via AWS API</p>
</div>
</md-list-item>
</md-list>
</md-card-content>
</md-card>
<!-- End cloud security monitoring card -->
</div>
<!-- End configuration cards section -->
<!-- This section is the right sidenav content -->
<md-sidenav
class="md-sidenav-right"
md-is-locked-open="true">
<md-list>
<md-subheader>More info about this section</md-subheader>
<md-list-item target="_blank" class="wz-text-link" ng-href="https://documentation.wazuh.com/current/user-manual/manager/index.html">Wazuh administration documentation</md-list-item>
<md-list-item target="_blank" class="wz-text-link" ng-href="https://documentation.wazuh.com/current/user-manual/capabilities/index.html">Wazuh capabilities documentation</md-list-item>
<md-list-item target="_blank" class="wz-text-link" ng-href="https://documentation.wazuh.com/current/user-manual/reference/ossec-conf/index.html">Local configuration reference</md-list-item>
</md-list>
</md-sidenav>
<!-- End right sidenav section -->
</div>
<!-- End configuration section cards and right sidenav -->
</div>
<!-- End configuration section cards and right sidenav -->
</div>

View File

@ -0,0 +1,80 @@
<div flex="auto" layout="column" ng-controller="editionController" ng-if="mctrl.tab === 'edition'">
<!-- Loading ring -->
<div class='uil-ring-css' ng-show="load">
<div></div>
</div>
<!-- Headline -->
<div ng-show="!load" layout="column" layout-padding>
<div layout="row">
<span class="font-size-18">
<i class="fa fa-fw fa-edit" aria-hidden="true"></i> Node configuration</span>
</div>
<div layout="row">
<span class="md-subheader">Edit master/worker node configuration</span>
</div>
<div ng-show="selectedNode" ng-if="adminMode" layout="row" layout-padding style="position: absolute;right: calc(0% + 228px);margin-top: -10px;">
<div layout="column" layout-align="center" class="height-40 wz-select-input">
<select class="kuiSelect wz-border-none cursor-pointer max-height-35" id="categoryBox" ng-model="selectedNode"
ng-change="changeNode(selectedNode)" aria-label="Select node">
<option ng-repeat="node in nodes" value="{{node.name}}">{{node.name}} ({{node.type}})</option>
</select>
</div>
<div layout="column" layout-align="center" class="wz-padding-top-0 wz-margin-right-15">
<button type='button' class='height-40 btn btn-primary'
ng-click='editConf()'>Edit {{selectedNode}} configuration
</button>
</div>
</div>
</div>
<!-- End headline -->
<!-- Configuration section cards and right sidenav -->
<div flex="auto" class="wz-padding-top-50" layout="row">
<!-- XML editor for node configuration -->
<div flex layout="column" ng-show="editingFile">
<div layout="row" class="md-padding">
<span ng-click='closeEditingFile()' class='btn btn-info'>Cancel</span>
<button ng-disabled='xmlHasErrors' ng-click='saveConfiguration()' class='btn btn-primary pull-right wz-margin-left-8'>
<span ng-show='!xmlHasErrors'><i aria-hidden='true' class='fa fa-fw fa-save'></i>Save file</span>
<span ng-show='xmlHasErrors' class='btn-danger'><i aria-hidden='true' class='fa fa-fw fa-exclamation-triangle'></i>
XML format error</span>
</button>
</div>
<div class="md-padding md-padding-top-10" ng-if="fetchedXML">
<wz-xml-file-editor file-name='ossec.conf' data="fetchedXML" target-name="selectedNode" valid-fn='xmlIsValid(valid)'>
</wz-xml-file-editor>
</div>
</div>
<div flex layout="column" class="md-padding" ng-show="!editingFile">
<wz-table flex extra-limit="true" path="'/cluster/nodes'" keys="['name','type','ip','version']" allow-click="true"
row-sizes="[14,12,10]">
</wz-table>
</div>
<!-- This section is the right sidenav content -->
<md-sidenav class="md-sidenav-right" md-is-locked-open="true">
<md-list>
<md-subheader>More info about this section</md-subheader>
<md-list-item target="_blank" class="wz-text-link" ng-href="https://documentation.wazuh.com/current/user-manual/manager/index.html">Wazuh
administration documentation</md-list-item>
<md-list-item target="_blank" class="wz-text-link" ng-href="https://documentation.wazuh.com/current/user-manual/capabilities/index.html">Wazuh
capabilities documentation</md-list-item>
<md-list-item target="_blank" class="wz-text-link" ng-href="https://documentation.wazuh.com/current/user-manual/reference/ossec-conf/index.html">Local
configuration reference</md-list-item>
</md-list>
</md-sidenav>
<!-- End right sidenav section -->
</div>
<!-- End configuration section cards and right sidenav -->
</div>

View File

@ -6,5 +6,6 @@ include ./monitoring/monitoring.pug
include ./logs.html
include ./reporting.html
include ./groups/groups.html
include ./edition.html
include ./ruleset/ruleset.pug
include ../footer.foot

View File

@ -30,6 +30,11 @@
title="'Configuration'" switch-tab="mctrl.switchTab('configuration')" current-tab="'configuration'"
description="'Check your Wazuh cluster configuration.'"
></wz-welcome-card>
<wz-welcome-card
class="euiFlexItem" logo="'icons/app_devtools.svg'"
title="'Edition'" switch-tab="mctrl.switchTab('edition')" current-tab="'edition'"
description="'Edit master/worker node configuration.'"
></wz-welcome-card>
</div>
</div>
</div>

View File

@ -57,5 +57,6 @@ export const TabNames = {
'aws-s3': 'Amazon S3',
command: 'Wazuh commands',
client: 'Client configuration',
edition: 'Edit node configuration',
'client-buffer': 'Anti-flooding settings'
};