bdc2504635
CD - Develop / build-and-deploy (push) Failing after 52s
Adds automated daily IOC ingestion from three external threat feeds:
- AlienVault OTX: subscribed pulses + ATM-keyword searches (requires API key)
- MalwareBazaar (abuse.ch): ATM-tagged malware samples, no key required
- ThreatFox (abuse.ch): ATM malware family IOCs, no key required
Backend:
- IocFeedRun entity + V6 Flyway migration (ioc_feed_run table)
- OtxFeedClient / MalwareBazaarFeedClient / ThreatFoxFeedClient
- IocFeedService: upsert dedup + @Scheduled daily 03:00 refresh
- IocFeedController: GET /status, GET /runs, POST /refresh, POST /refresh/{feed}
- ThreatIoc.IocSource enum extended: OTX, MALWARE_BAZAAR, THREAT_FOX
Frontend:
- IocFeeds.svelte: feed status cards, run history table, manual refresh
- App.svelte: IOC Feeds nav item (📡), version string removed from sidebar
- api.ts: getFeedStatus, getFeedRuns, refreshAllFeeds, refreshFeed
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
66 lines
1.5 KiB
Java
66 lines
1.5 KiB
Java
package com.hiveops.aria.entity;
|
|
|
|
import jakarta.persistence.*;
|
|
import lombok.*;
|
|
|
|
import java.time.Instant;
|
|
|
|
@Entity
|
|
@Table(name = "threat_ioc")
|
|
@Getter
|
|
@Setter
|
|
@NoArgsConstructor
|
|
@AllArgsConstructor
|
|
@Builder
|
|
public class ThreatIoc {
|
|
|
|
@Id
|
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
private Long id;
|
|
|
|
@Enumerated(EnumType.STRING)
|
|
@Column(name = "ioc_type", nullable = false, columnDefinition = "ioc_type")
|
|
private IocType iocType;
|
|
|
|
@Column(nullable = false)
|
|
private String value;
|
|
|
|
private String description;
|
|
|
|
@Enumerated(EnumType.STRING)
|
|
@Column(nullable = false, columnDefinition = "ioc_source")
|
|
@Builder.Default
|
|
private IocSource source = IocSource.FBI_FLASH;
|
|
|
|
@Column(name = "source_ref")
|
|
private String sourceRef;
|
|
|
|
@Enumerated(EnumType.STRING)
|
|
@Column(nullable = false, columnDefinition = "confidence_level")
|
|
@Builder.Default
|
|
private ConfidenceLevel confidence = ConfidenceLevel.HIGH;
|
|
|
|
@Column(name = "added_at", nullable = false)
|
|
@Builder.Default
|
|
private Instant addedAt = Instant.now();
|
|
|
|
@Column(name = "expires_at")
|
|
private Instant expiresAt;
|
|
|
|
@Column(nullable = false)
|
|
@Builder.Default
|
|
private Boolean active = true;
|
|
|
|
public enum IocType {
|
|
FILENAME, MD5, REGISTRY_KEY, DIRECTORY, SERVICE_NAME, IP, FILE_PATH
|
|
}
|
|
|
|
public enum IocSource {
|
|
FBI_FLASH, FS_ISAC, MANUAL, OTX, MALWARE_BAZAAR, THREAT_FOX
|
|
}
|
|
|
|
public enum ConfidenceLevel {
|
|
HIGH, MEDIUM, LOW
|
|
}
|
|
}
|