CN-544 feat: 实体详情增加dns筛选(部分)

This commit is contained in:
chenjinsong
2022-05-11 17:50:40 +08:00
parent b3f6b5c7ea
commit 1077ea09b0
12 changed files with 205 additions and 7741 deletions

View File

@@ -1,8 +1,8 @@
@font-face {
font-family: "cn-icon"; /* Project id 2614877 */
src: url('iconfont.woff2?t=1649728125883') format('woff2'),
url('iconfont.woff?t=1649728125883') format('woff'),
url('iconfont.ttf?t=1649728125883') format('truetype');
src: url('iconfont.woff2?t=1652249170229') format('woff2'),
url('iconfont.woff?t=1652249170229') format('woff'),
url('iconfont.ttf?t=1652249170229') format('truetype');
}
.cn-icon {
@@ -13,6 +13,22 @@
-moz-osx-font-smoothing: grayscale;
}
.cn-icon-org:before {
content: "\e770";
}
.cn-icon-role:before {
content: "\e771";
}
.cn-icon-os:before {
content: "\e772";
}
.cn-icon-software:before {
content: "\e773";
}
.cn-icon-report:before {
content: "\e76f";
}

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -34,14 +34,14 @@
<template #default="scope" :column="item">
<span v-if="item.prop === 'dataRange'">
<template v-if="scope.row.startTime && scope.row.endTime">
{{dateFormatByAppearance(scope.row.startTime)}}-{{dateFormatByAppearance(scope.row.endTime)}}
{{dateFormatByAppearance(scope.row.startTime)}}<span style="padding: 0 5px">-</span>{{dateFormatByAppearance(scope.row.endTime)}}
</template>
</span>
<span v-else-if="item.prop === 'type'">
{{scope.row.reportTemp.name}}
</span>
<span v-else-if="item.prop === 'state'">
{{getJobStatus(scope.row.state)}}
{{getJobStatus(scope.row)}}
</span>
<span v-else>{{scope.row[item.prop]}}</span>
</template>
@@ -56,18 +56,24 @@
</template>
<template #default="scope">
<div class="table-operation-items" v-if="scope.row.state === 1">
<div class="table-operation-item--down" @click="tableOperation(['download', scope.row, 1])">
<div class="table-operation-item--no-border" @click="tableOperation(['download', scope.row, 1])">
<loading :loading="loadingTableId === scope.row.id"></loading>
<svg class="icon" aria-hidden="true" :class="{'table-operation-all-loading': loadingTableId}">
<use xlink:href="#cn-icon-download2"></use>
</svg>
</div>
<div class="table-operation-item--preview" @click="tableOperation(['preview', scope.row])">
<div class="table-operation-item--no-border" @click="tableOperation(['preview', scope.row])">
<loading :loading="loadingPreviewId === scope.row.id"></loading>
<svg class="icon" aria-hidden="true" :class="{'table-operation-all-loading': loadingPreviewId}">
<use xlink:href="#cn-icon-preview"></use>
</svg>
</div>
<div class="table-operation-item--no-border" @click="tableOperation(['rerun', scope.row])">
<loading :loading="loadingPreviewId === scope.row.id"></loading>
<svg class="icon2" aria-hidden="true" :class="{'table-operation-all-loading': loadingPreviewId}">
<use xlink:href="#cn-icon-refresh"></use>
</svg>
</div>
</div>
</template>
</el-table-column>
@@ -101,11 +107,11 @@ export default {
prop: 'name',
show: true,
sortable: 'custom'
}, {
}, /* {
label: this.$t('config.chart.remark'),
prop: 'remark',
show: true
}, {
}, */{
label: this.$t('overall.type'),
prop: 'type',
show: true,
@@ -115,6 +121,10 @@ export default {
prop: 'dataRange',
show: true,
minWidth: 110
}, {
label: this.$t('overall.completionTime'),
prop: 'finishTime',
show: true
}, {
label: this.$t('overall.status'),
prop: 'state',
@@ -135,11 +145,11 @@ export default {
}
},
methods: {
getJobStatus (state) {
if (state === 0) {
return this.$t('overall.inProgress')
} else if (state === 1) {
getJobStatus (report) {
if (report.state === 1 && report.upload === 1) {
return this.$t('overall.completed')
} else {
return this.$t('overall.inProgress')
}
},
selectionChange (objs) {

View File

@@ -77,65 +77,6 @@ export const echartsFontSize = {
labelThirdFontSize: 14// >=2560
}
export const entityFilterType = {
ip: [
{
column: 'country_distinct_count',
labelI18nCode: 'overall.country',
icon: 'cn-icon cn-icon-country'
},
{
column: 'province_distinct_count',
labelI18nCode: 'overall.province',
icon: 'cn-icon cn-icon-position'
},
{
column: 'city_distinct_count',
labelI18nCode: 'overall.city',
icon: 'cn-icon cn-icon-city'
},
{
column: 'asn_distinct_count',
labelI18nCode: 'entities.asn',
icon: 'cn-icon cn-icon-cloud'
}
],
domain: [
{
column: 'categoryGroupDistinctCount',
labelI18nCode: 'entities.domainDetail.categoryGroup',
icon: 'cn-icon cn-icon-category'
},
{
column: 'categoryDistinctCount',
labelI18nCode: 'entities.category',
icon: 'cn-icon cn-icon-sub-category'
},
{
column: 'categoryGroupDistinctCount',
labelI18nCode: 'entities.reputationLevel',
icon: 'cn-icon cn-icon-credit'
}
],
app: [
{
column: 'categoryDistinctCount',
labelI18nCode: 'entities.category',
icon: 'cn-icon cn-icon-category'
},
{
column: 'subcategoryDistinctCount',
labelI18nCode: 'entities.subcategory',
icon: 'cn-icon cn-icon-sub-category'
},
{
column: 'riskDistinctCount',
labelI18nCode: 'entities.risk',
icon: 'cn-icon cn-icon-risk'
}
]
}
export const unitTypes = {
time: 'time',
number: 'number',

View File

@@ -4,7 +4,7 @@
<div class="explorer-search__input">
<advanced-search
ref="search"
:column-list="columnList"
:column-list="columnList[pageType]"
:operator-list="operatorList"
:connection-list="connectionList"
:full-text="false"
@@ -22,50 +22,79 @@
<script>
import AdvancedSearch from '@/components/advancedSearch/Index'
import { humpToLine } from '@/utils/tools'
import {columnType} from "@/components/advancedSearch/meta/meta";
import SqlParser from "@/components/advancedSearch/meta/sql-parser";
export default {
name: 'DetectionSearch',
props: {
pageType: String
},
components: {
AdvancedSearch
},
data () {
return {
columnList: [
{
name: 'event_severity',
type: 'string',
label: 'Event severity'
},
{
name: 'security_type',
type: 'string',
label: 'Security type'
},
{
name: 'event_type',
type: 'string',
label: 'Event type'
},
{
name: 'victim_ip',
type: 'string',
label: 'Victim IP'
},
{
name: 'victim_location_country',
type: 'string',
label: 'Victim location'
},
{
name: 'offender_ip',
type: 'string',
label: 'Offender IP'
},
{
name: 'offender_location_country',
type: 'string',
label: 'Offender location'
}
],
columnList: {
securityEvent: [
{
name: 'event_severity',
type: 'string',
label: 'Event severity'
},
{
name: 'security_type',
type: 'string',
label: 'Security type'
},
{
name: 'victim_ip',
type: 'string',
label: 'Victim IP'
},
{
name: 'victim_location_country',
type: 'string',
label: 'Victim location'
},
{
name: 'offender_ip',
type: 'string',
label: 'Offender IP'
},
{
name: 'offender_location_country',
type: 'string',
label: 'Offender location'
}
],
performanceEvent: [
{
name: 'event_severity',
type: 'string',
label: 'Event severity'
},
{
name: 'event_type',
type: 'string',
label: 'Event type'
},
{
name: 'app_name',
type: 'string',
label: 'APP name'
},
{
name: 'domain',
type: 'string',
label: 'Domain'
},
{
name: 'server_ip',
type: 'string',
label: 'IP'
}
]
},
operatorList: ['=', '!=', '>', '<', '>=', '<=', 'IN', 'NOT IN', 'LIKE', 'NOT LIKE'],
connectionList: [
{
@@ -81,7 +110,18 @@ export default {
},
methods: {
search (metaList, formatSql) {
this.$emit('search', metaList, formatSql)
let sql = formatSql
// 全文搜索处理
if (metaList && this.$_.isArray(metaList)) {
const hasFullText = metaList.some(meta => {
return meta.column && meta.column.type === columnType.fullText
})
if (hasFullText) {
const parser = new SqlParser(metaList, this.columnList[this.pageType])
sql = parser.parseMetaToSql(metaList, true)
}
}
this.$emit('search', metaList, sql)
},
changeParams (params) { // params: { column: columnName, oldValue: [...], newValue: [...] }
// 向下传递时需要再转换一次param格式为[{column, operator, value}, ...]

View File

@@ -10,6 +10,7 @@
<!-- 搜索组件 -->
<detection-search
ref="search"
:page-type="pageType"
@search="search"
></detection-search>
<!-- 内容区 -->
@@ -230,7 +231,9 @@ export default {
isStatisticsSeverityNoData: false,
isStatisticsCategoryNoData: false,
isStatisticsActiveAttackNoData: false,
loading: false
loading: false,
oldActiveEntitySearchValue: ''
}
},
methods: {
@@ -462,7 +465,7 @@ export default {
data.sort(reverseSortBy('count'))
data = data.slice(0, 5)
option.series[0].data = data.map(d => {
return [d.count, d.name]
return [d.count, d.name, d.entityType]
}).reverse()
detectionChart.setOption(option)
extensionEchartY(detectionChart)// y轴标签过长时鼠标悬浮显示所有内容
@@ -470,7 +473,41 @@ export default {
const vm = this
detectionChart.off('click')
detectionChart.on('click', e => {
vm.filterData.performanceEvent[0].value = vm.triggerFilterDataValue(vm.filterData.performanceEvent[0].value, e.data[1])
const entityType = e.data[2]
let column = ''
if (entityType) {
switch (entityType) {
case 'app': {
column = 'app_name'
break
}
case 'domain': {
column = 'domain'
break
}
case 'ip': {
column = 'server_ip'
break
}
default: {
break
}
}
if (column) {
// 点击的name和上次的name一致则清空该项条件
if (vm.oldActiveEntitySearchValue === e.data[1]) {
vm.$refs.search.changeParams({ column: column, oldValue: [vm.oldActiveEntitySearchValue], newValue: [] })
vm.$nextTick(() => {
vm.oldActiveEntitySearchValue = ''
})
} else {
vm.$refs.search.changeParams({ column: column, oldValue: vm.oldActiveEntitySearchValue ? [vm.oldActiveEntitySearchValue] : [], newValue: [e.data[1]] })
vm.$nextTick(() => {
vm.oldActiveEntitySearchValue = e.data[1]
})
}
}
}
})
}
}).catch(error => {

View File

@@ -149,7 +149,7 @@ import DateTimeRange from '@/components/common/TimeRange/DateTimeRange'
import TimeRefresh from '@/components/common/TimeRange/TimeRefresh'
import EntityFilter from '@/views/entityExplorer/EntityFilter'
import EntityList from '@/views/entityExplorer/entityList/EntityList'
import { entityType, entityFilterType, defaultPageSize, riskLevelMapping } from '@/utils/constants'
import { entityType, defaultPageSize, riskLevelMapping } from '@/utils/constants'
import { get } from '@/utils/http'
import { api } from '@/utils/api'
import { getNowTime, getSecond } from '@/utils/date-util'
@@ -202,28 +202,28 @@ export default {
label: this.$t('overall.country'),
column: 'countryDistinctCount',
topColumn: 'ip_location_country', // top弹框查询字段
icon: entityFilterType.ip[0].icon,
icon: 'cn-icon cn-icon-country',
value: 0
},
{
label: this.$t('overall.province'),
column: 'provinceDistinctCount',
topColumn: 'ip_location_province', // top弹框查询字段
icon: entityFilterType.ip[1].icon,
icon: 'cn-icon cn-icon-position',
value: 0
},
{
label: this.$t('overall.city'),
column: 'cityDistinctCount',
topColumn: 'ip_location_city', // top弹框查询字段
icon: entityFilterType.ip[2].icon,
icon: 'cn-icon cn-icon-city',
value: 0
},
{
label: this.$t('entities.asn'),
column: 'asnDistinctCount',
topColumn: 'ip_asn', // top弹框查询字段
icon: entityFilterType.ip[3].icon,
icon: 'cn-icon cn-icon-cloud',
value: 0
}
]
@@ -237,21 +237,21 @@ export default {
label: this.$t('entities.category'),
column: 'categoryDistinctCount',
topColumn: 'app_category', // top弹框查询字段
icon: entityFilterType.app[0].icon,
icon: 'cn-icon cn-icon-category',
value: 0
},
{
label: this.$t('entities.subcategory'),
column: 'subcategoryDistinctCount',
topColumn: 'app_subcategory', // top弹框查询字段
icon: entityFilterType.app[1].icon,
icon: 'cn-icon cn-icon-sub-category',
value: 0
},
{
label: this.$t('entities.risk'),
column: 'riskDistinctCount',
topColumn: 'app_risk', // top弹框查询字段
icon: entityFilterType.app[2].icon,
icon: 'cn-icon cn-icon-risk',
value: 0
}
]
@@ -265,21 +265,56 @@ export default {
label: this.$t('entities.domainDetail.categoryGroup'),
column: 'categoryGroupDistinctCount',
topColumn: 'domain_category_group', // top弹框查询字段
icon: entityFilterType.domain[0].icon,
icon: 'cn-icon cn-icon-category',
value: 0
},
{
label: this.$t('entities.category'),
column: 'categoryDistinctCount',
topColumn: 'domain_category', // top弹框查询字段
icon: entityFilterType.domain[1].icon,
icon: 'cn-icon cn-icon-sub-category',
value: 0
},
{
label: this.$t('entities.reputationLevel'),
column: 'reputationLevelDistinctCount',
topColumn: 'domain_reputation_level', // top弹框查询字段
icon: entityFilterType.domain[2].icon,
icon: 'cn-icon cn-icon-credit',
value: 0
}
]
},
{
type: 'dns',
title: 'DNS',
totalCount: 0,
data: [
{
label: this.$t('overall.dnsServerInfo.role'),
column: 'dnsServerRoleCount',
topColumn: 'dns_server_role',
icon: 'cn-icon cn-icon-role',
value: 0
},
{
label: this.$t('dns.managementOrganization'),
column: 'dnsServerOrgCount',
topColumn: 'dns_server_org',
icon: 'cn-icon cn-icon-org',
value: 0
},
{
label: this.$t('overall.dnsServerInfo.software'),
column: 'dnsServerSoftwareCount',
topColumn: 'dns_server_software',
icon: 'cn-icon cn-icon-software',
value: 0
},
{
label: this.$t('overall.dnsServerInfo.system'),
column: 'dnsServerOsCount',
topColumn: 'dns_server_os',
icon: 'cn-icon cn-icon-os',
value: 0
}
]