Documentation
¶
Overview ¶
Package payload defines the v1 ingest envelope (mirrors api/ingest.v1.schema.json). Facts live only under components.*; per-port firewall posture is listeners[].firewall_rule.
Index ¶
- Constants
- func AgentUtcRFC3339(t time.Time) string
- type ApacheHttpdPosture
- type ApacheListenBinding
- type ApacheVhostsSummary
- type AtBatchPosture
- type AuditCheck
- type AuditRulesFileHash
- type AuditSection
- type AuditdPosture
- type Components
- type ContainerAndCloudNativeLinuxComponent
- type ContainerNativeHostRuntimes
- type ContainerWorkloads
- type CoreSystemAndKernelComponent
- type CronTimersInventory
- type CryptStorageHint
- type CryptographyComponent
- type CupsExposureFingerprint
- type DockerContainerRisk
- type DockerContainerWorkload
- type DockerHostFingerprint
- type DockerOverlayNetworkEncryption
- type DockerPosture
- type DockerPublishedPort
- type DuplicateIDEntry
- type DuplicateUidGid
- type Fail2banPosture
- type FileIntegrityTooling
- type FileSystemAndStorageComponent
- type FilesystemEntry
- type Firewall
- type FirmwareBoot
- type FtpPosture
- type GrubSnapshot
- type HighRiskProcessEntry
- type HighRiskProcessSurface
- type HostBackup
- type HostDisk
- type HostNetwork
- type HostPath
- type HostProcess
- type HostRuntimes
- type HostSSH
- type HostSuid
- type HostTime
- type HostUsersSummary
- type IdentityAccessAndAuthenticationComponent
- type IfaceAddress
- type JournaldPosture
- type KernelModulesBlock
- type KubeletContainerWorkload
- type KubeletNodeFingerprint
- type KubeletPodWorkload
- type LargeVarLogFileEntry
- type LegacyInsecureServices
- type Listener
- type LocalTlsCertFileEntry
- type LocalTlsCertInventory
- type LoggingAndSystemAuditingComponent
- type LogrotateDiskPosture
- type MacDeepPosture
- type MalwareScannerEntry
- type MalwareScannersPosture
- type MongodbPosture
- type MountOptionsAudit
- type MountPathSignals
- type MtaFingerprint
- type MysqlPosture
- type NetworkAndHostFirewallComponent
- type NetworkIface
- type NfsExportEntry
- type NfsExportsFingerprint
- type NginxListenBinding
- type NginxPosture
- type NginxSiteMapSummary
- type OSInfo
- type OtherComponent
- type PackagesUpdates
- type PasswordPolicyFingerprint
- type PathEntry
- type PathPermissionsAudit
- type PostfixPosture
- type PostgresPosture
- type ProcessAccountingPosture
- type ProcessSignals
- type ProcessTopEntry
- type PwqualityKV
- type RedisExposureFingerprint
- type RedisPosture
- type RuntimeEntry
- type SecurityFrameworksAndMalwareDefenseComponent
- type SelinuxApparmorBlock
- type ServiceEntry
- type ServicesBlock
- type SgidItem
- type ShadowAccountSummary
- type SoftwarePackagesAndApplicationsComponent
- type SudoersAudit
- type SuidItem
- type SysctlDriftEntry
- type SysctlKV
- type SysctlLiveBlock
- type SysctlOverlayBlock
- type SyslogDaemonEntry
- type SyslogForwardingPosture
- type SystemdHealth
- type TcpWrappersFingerprint
- type UsbStoragePosture
- type UserSample
- type V1
- type WebDbServersFingerprint
Constants ¶
const ( FirewallRuleFiltered = "filtered" FirewallRuleUnfiltered = "unfiltered" FirewallRuleBlocked = "blocked" FirewallRuleUnknown = "unknown" )
Variables ¶
This section is empty.
Functions ¶
func AgentUtcRFC3339 ¶
Types ¶
type ApacheHttpdPosture ¶ added in v0.5.0
type ApacheHttpdPosture struct {
Detected bool `json:"detected"`
BinPath string `json:"bin_path"`
Version *string `json:"version"`
DistroVersion *string `json:"distro_version,omitempty"`
ServiceState *string `json:"service_state"`
ListenBindings []ApacheListenBinding `json:"listen_bindings"`
ListenBindingDiscrepancies []string `json:"listen_binding_discrepancies"`
SSLModuleLoaded *bool `json:"ssl_module_loaded"`
SSLProtocol *string `json:"ssl_protocol"`
SSLCipherSuite *string `json:"ssl_cipher_suite"`
HstsHeader *string `json:"hsts_header"`
HTTPToHTTPSRedirect *bool `json:"http_to_https_redirect"`
RiskyModulesLoaded []string `json:"risky_modules_loaded"`
ProtectiveModulesMissing []string `json:"protective_modules_missing"`
ServerTokens *string `json:"server_tokens"`
ServerSignature *string `json:"server_signature"`
TraceEnabled *bool `json:"trace_enabled"`
SensitivePathsUnrestricted []string `json:"sensitive_paths_unrestricted"`
IndexesEnabledPaths []string `json:"indexes_enabled_paths"`
FollowSymlinksUnrestrictedPaths []string `json:"follow_symlinks_unrestricted_paths"`
AllowOverrideAllPaths []string `json:"allow_override_all_paths"`
MissingSecurityHeaders []string `json:"missing_security_headers"`
RunUser *string `json:"run_user"`
DocrootWorldWritable *bool `json:"docroot_world_writable"`
IsContainerized *bool `json:"is_containerized"`
OpenForwardProxy *bool `json:"open_forward_proxy"`
CollectorWarnings []string `json:"collector_warnings"`
VhostsSummary *ApacheVhostsSummary `json:"vhosts_summary"`
Error string `json:"error,omitempty"`
}
ApacheHttpdPosture is allowlisted httpd/apache2 security posture (no secrets, no full raw config dump).
type ApacheListenBinding ¶ added in v0.5.0
ApacheListenBinding is one Listen / VirtualHost binding from -S output.
type ApacheVhostsSummary ¶ added in v0.5.0
type ApacheVhostsSummary struct {
VhostCount int `json:"vhost_count"`
ServerNames []string `json:"server_names,omitempty"`
}
ApacheVhostsSummary is vhost count plus capped server names from apache/httpd -S.
type AtBatchPosture ¶ added in v0.3.3
type AtBatchPosture struct {
AtdUnitActive *bool `json:"atd_unit_active,omitempty"`
AtAllowPresent bool `json:"at_allow_present,omitempty"`
AtDenyPresent bool `json:"at_deny_present,omitempty"`
AtAllowModeOctal string `json:"at_allow_mode_octal,omitempty"`
AtDenyModeOctal string `json:"at_deny_mode_octal,omitempty"`
SpoolPathUsed string `json:"spool_path_used,omitempty"`
SpoolDirModeOctal string `json:"spool_dir_mode_octal,omitempty"`
Error string `json:"error,omitempty"`
}
AtBatchPosture summarizes atd and at.allow / at.deny / spool exposure hints.
type AuditCheck ¶
type AuditRulesFileHash ¶ added in v0.3.3
AuditRulesFileHash is a path plus digest of an on-disk rules fragment (bounded read).
type AuditSection ¶
type AuditSection struct {
ID string `json:"id"`
Title string `json:"title"`
Checks []AuditCheck `json:"checks"`
}
type AuditdPosture ¶ added in v0.3.3
type AuditdPosture struct {
UnitActive *bool `json:"unit_active,omitempty"`
RuleLineCount *int `json:"rule_line_count,omitempty"`
RulesDropInFiles []AuditRulesFileHash `json:"rules_drop_in_files,omitempty"`
Error string `json:"error,omitempty"`
}
AuditdPosture summarizes auditd activation and rule inventory (no full rule bodies).
type Components ¶ added in v0.2.0
type Components struct {
CoreSystemAndKernel CoreSystemAndKernelComponent `json:"core_system_and_kernel"`
IdentityAccessAndAuthentication IdentityAccessAndAuthenticationComponent `json:"identity_access_and_authentication"`
FileSystemAndStorage FileSystemAndStorageComponent `json:"file_system_and_storage"`
NetworkAndHostFirewall NetworkAndHostFirewallComponent `json:"network_and_host_firewall"`
SoftwarePackagesAndApplications SoftwarePackagesAndApplicationsComponent `json:"software_packages_and_applications"`
ContainerAndCloudNativeLinux ContainerAndCloudNativeLinuxComponent `json:"container_and_cloud_native_linux"`
LoggingAndSystemAuditing LoggingAndSystemAuditingComponent `json:"logging_and_system_auditing"`
Cryptography CryptographyComponent `json:"cryptography"`
SecurityFrameworksAndMalwareDefense SecurityFrameworksAndMalwareDefenseComponent `json:"security_frameworks_and_malware_defense"`
Other OtherComponent `json:"other"`
}
Components groups inventory by competitor-audited sections (RBAC boundary).
type ContainerAndCloudNativeLinuxComponent ¶ added in v0.2.0
type ContainerAndCloudNativeLinuxComponent struct {
HostRuntimes *ContainerNativeHostRuntimes `json:"host_runtimes,omitempty"`
ContainerWorkloads *ContainerWorkloads `json:"container_workloads,omitempty"`
}
type ContainerNativeHostRuntimes ¶ added in v0.2.0
type ContainerNativeHostRuntimes struct {
Docker *DockerHostFingerprint `json:"docker,omitempty"`
Kubelet *KubeletNodeFingerprint `json:"kubelet,omitempty"`
Error string `json:"error,omitempty"`
}
ContainerNativeHostRuntimes is §6 host_runtimes: Docker daemon and kubelet hints only (no language runtime items).
type ContainerWorkloads ¶ added in v0.22.0
type ContainerWorkloads struct {
// DockerContainers is the list of running Docker containers, capped.
DockerContainers []DockerContainerWorkload `json:"docker_containers"`
// DockerContainersTruncated is true when the host had more running
// containers than the collector's cap.
DockerContainersTruncated bool `json:"docker_containers_truncated"`
// KubeletPods is the list of pods observed on this node via the
// kubelet read-only port or crictl, capped. Empty when neither signal
// is available.
KubeletPods []KubeletPodWorkload `json:"kubelet_pods"`
// KubeletPodsTruncated is true when the node had more pods than the cap.
KubeletPodsTruncated bool `json:"kubelet_pods_truncated"`
// CollectorWarnings surfaces transient issues (CLI missing, parse errors).
CollectorWarnings []string `json:"collector_warnings,omitempty"`
}
ContainerWorkloads is a bounded inventory of running Docker containers and Kubernetes pods on the host. Distinct from DockerPosture (security posture) and ContainerNativeHostRuntimes (daemon/kubelet fingerprints): this block surfaces what workloads are actually running so the report can talk about them as business assets (like apps in #134).
type CoreSystemAndKernelComponent ¶ added in v0.2.0
type CoreSystemAndKernelComponent struct {
OS OSInfo `json:"os"`
HostTime *HostTime `json:"host_time,omitempty"`
HostProcess *HostProcess `json:"host_process,omitempty"`
Grub *GrubSnapshot `json:"grub,omitempty"`
FirmwareBoot *FirmwareBoot `json:"firmware_boot,omitempty"`
SystemdHealth *SystemdHealth `json:"systemd_health,omitempty"`
SysctlLive *SysctlLiveBlock `json:"sysctl_live,omitempty"`
SysctlOverlay *SysctlOverlayBlock `json:"sysctl_overlay,omitempty"`
KernelModules *KernelModulesBlock `json:"kernel_modules,omitempty"`
SelinuxApparmor *SelinuxApparmorBlock `json:"selinux_apparmor,omitempty"`
HighRiskProcess *HighRiskProcessSurface `json:"high_risk_process,omitempty"`
}
type CronTimersInventory ¶ added in v0.2.0
type CronTimersInventory struct {
SystemCrontabLineCount int `json:"system_crontab_line_count"`
SystemCrontabSample []string `json:"system_crontab_sample,omitempty"`
CronDropinFileNamesSample []string `json:"cron_dropin_file_names_sample,omitempty"`
UserCrontabsPresentCount int `json:"user_crontabs_present_count"`
UserCrontabUsersSample []string `json:"user_crontab_users_sample,omitempty"`
UserCrontabLinesSample []string `json:"user_crontab_lines_sample,omitempty"`
CronVarSpoolModeOctal string `json:"cron_var_spool_mode_octal,omitempty"`
SystemdTimersCount int `json:"systemd_timers_count"`
SystemdTimerUnitsSample []string `json:"systemd_timer_units_sample,omitempty"`
Error string `json:"error,omitempty"`
}
CronTimersInventory summarizes cron files, user crontabs, and systemd timers.
type CryptStorageHint ¶ added in v0.2.0
type CryptStorageHint struct {
CrypttabReadable bool `json:"crypttab_readable"`
CrypttabEntryCount int `json:"crypttab_entry_count"`
CrypttabMapperNamesSample []string `json:"crypttab_mapper_names_sample,omitempty"`
LsblkCryptVolumeCount int `json:"lsblk_crypt_volume_count"`
LsblkCryptNamesSample []string `json:"lsblk_crypt_names_sample,omitempty"`
Error string `json:"error,omitempty"`
}
CryptStorageHint summarizes crypttab and lsblk crypt volumes (no keys).
type CryptographyComponent ¶ added in v0.2.0
type CryptographyComponent struct {
LocalTlsCertInventory *LocalTlsCertInventory `json:"local_tls_cert_inventory,omitempty"`
}
CryptographyComponent holds TLS/cert inventory; clock baseline lives under core_system_and_kernel.host_time.
type CupsExposureFingerprint ¶ added in v0.2.0
type CupsExposureFingerprint struct {
UnitActiveState string `json:"unit_active_state,omitempty"`
ListenLinesSample []string `json:"listen_lines_sample,omitempty"`
WebInterfaceLinesSample []string `json:"web_interface_lines_sample,omitempty"`
Error string `json:"error,omitempty"`
}
CupsExposureFingerprint is CUPS unit state and bounded config lines.
type DockerContainerRisk ¶ added in v0.5.0
type DockerContainerRisk struct {
Name string `json:"name"`
ID string `json:"id"`
Privileged *bool `json:"privileged,omitempty"`
PidModeHost *bool `json:"pid_mode_host,omitempty"`
NetworkModeHost *bool `json:"network_mode_host,omitempty"`
CapabilitiesAdded []string `json:"capabilities_added,omitempty"`
CapabilitiesNotDropped *bool `json:"capabilities_not_dropped,omitempty"`
RunsAsRoot *bool `json:"runs_as_root,omitempty"`
WritableRootfs *bool `json:"writable_rootfs,omitempty"`
SensitiveMounts []string `json:"sensitive_mounts,omitempty"`
NoSecurityProfile *bool `json:"no_security_profile,omitempty"`
NoResourceLimits *bool `json:"no_resource_limits,omitempty"`
}
DockerContainerRisk is one running container with at least one security flag (omit clean containers from the list).
type DockerContainerWorkload ¶ added in v0.22.0
type DockerContainerWorkload struct {
Name string `json:"name"`
ContainerID string `json:"container_id"`
Image string `json:"image"`
ImageTag string `json:"image_tag,omitempty"`
ImageDigest string `json:"image_digest,omitempty"`
ImageTagLatest bool `json:"image_tag_is_latest"`
ImageDigestPinned bool `json:"image_digest_pinned"`
State string `json:"state"`
StartedAt string `json:"started_at,omitempty"`
RestartCount int `json:"restart_count"`
User string `json:"user,omitempty"`
EntrypointHint string `json:"entrypoint_hint,omitempty"`
WorkloadHint string `json:"workload_hint,omitempty"`
NetworkMode string `json:"network_mode,omitempty"`
// WorkloadLabels carries only allow-listed compose/kubernetes/OCI labels
// that identify the workload to the operator. Never arbitrary user labels.
WorkloadLabels map[string]string `json:"workload_labels,omitempty"`
// SecretEnvCount is the count of environment variables whose NAME matches
// a secret-like pattern (PASSWORD/SECRET/TOKEN/API_KEY). Values and
// full key names are NEVER shipped; this is a risk signal only.
SecretEnvCount int `json:"secret_env_count"`
HasSecretEnvRisk bool `json:"has_secret_env_risk"`
// IpcModeHost is true when `--ipc=host` was used (cross-container attack
// surface via /dev/shm).
IpcModeHost bool `json:"ipc_mode_host"`
// UtsModeHost is true when `--uts=host` (shares hostname namespace, can
// confuse logging / audit).
UtsModeHost bool `json:"uts_mode_host"`
// NoNewPrivileges is true when “no-new-privileges“ is present in the
// container's SecurityOpt list. Default false when the flag is absent —
// processes inside can escalate via setuid binaries.
NoNewPrivileges bool `json:"no_new_privileges"`
// DevicesExposed are host device paths bind-mounted into the container
// (e.g. `/dev/sda`, `/dev/kvm`). Capped for bounded output.
DevicesExposed []string `json:"devices_exposed,omitempty"`
// TmpfsMounts are target paths backed by tmpfs. A writable tmpfs can
// bypass a read-only rootfs at the target path.
TmpfsMounts []string `json:"tmpfs_mounts,omitempty"`
// LogDriverNone is true when this container's log driver is “none“.
// Daemon default may be overridden per container; if none, no forensics.
LogDriverNone bool `json:"log_driver_none"`
// ImageCreatedAt is the RFC3339 timestamp the image was built. Populated
// from “docker image inspect“ (or the HTTP equivalent) once per unique
// image id, then repeated on every container that runs that image.
ImageCreatedAt string `json:"image_created_at,omitempty"`
// ImageAgeDays is the integer number of days between ImageCreatedAt and
// the agent scan. -1 when unknown.
ImageAgeDays int `json:"image_age_days,omitempty"`
// ImageRegistry is the parsed registry hostname of the image reference
// (“docker.io“ for bare / library images, else the explicit host).
ImageRegistry string `json:"image_registry,omitempty"`
// ImageIsPublicRegistry is true when the image pulls from one of the
// well-known public registries (Docker Hub, ghcr.io, quay.io). Signals
// supply-chain context, not an automatic risk.
ImageIsPublicRegistry bool `json:"image_is_public_registry"`
// UptimeDays is the integer number of days since StartedAt. -1 when
// unknown. Long-running containers drift from their image.
UptimeDays int `json:"uptime_days,omitempty"`
// SuspectedManualCommit is true when the image reference looks like a
// bare digest with no repository/tag — a signal the image was built via
// “docker commit“ rather than a reproducible build pipeline.
SuspectedManualCommit bool `json:"suspected_manual_commit"`
// SuspectedDistroless is true when the image ref or a known OCI label
// hints at a distroless / scratch base. Positive signal — smaller
// attack surface.
SuspectedDistroless bool `json:"suspected_distroless"`
}
DockerContainerWorkload describes one running Docker container, workload-first. No env vars, no command-line flags (may carry secrets) — only image identity, runtime state, whitelisted labels, and workload-risk flags.
type DockerHostFingerprint ¶ added in v0.2.0
type DockerHostFingerprint struct {
DockerCliPath string `json:"docker_cli_path,omitempty"`
DaemonJSONPath string `json:"daemon_json_path,omitempty"`
LiveRestore *bool `json:"live_restore,omitempty"`
Icc *bool `json:"icc,omitempty"`
UserlandProxy *bool `json:"userland_proxy,omitempty"`
TlsInDaemonJSON *bool `json:"tls_in_daemon_json,omitempty"`
TlsVerifyInDaemonJSON *bool `json:"tls_verify_in_daemon_json,omitempty"`
ContainerCount *int `json:"container_count,omitempty"`
RootlessHint string `json:"rootless_hint,omitempty"`
DockerSockPath string `json:"docker_sock_path,omitempty"`
DockerSockModeOctal string `json:"docker_sock_mode_octal,omitempty"`
DockerSockOwnerUID *int `json:"docker_sock_owner_uid,omitempty"`
DockerSockGroupGID *int `json:"docker_sock_group_gid,omitempty"`
Error string `json:"error,omitempty"`
}
DockerHostFingerprint is non-secret Docker daemon posture (CIS-style hints).
type DockerOverlayNetworkEncryption ¶ added in v0.5.0
type DockerOverlayNetworkEncryption struct {
NetworkName string `json:"network_name"`
Encrypted bool `json:"encrypted"`
}
DockerOverlayNetworkEncryption records overlay driver encryption hint for a user-defined network.
type DockerPosture ¶ added in v0.5.0
type DockerPosture struct {
Detected bool `json:"detected"`
DockerCliPath *string `json:"docker_cli_path,omitempty"`
Version *string `json:"version,omitempty"`
DistroVersion *string `json:"distro_version,omitempty"`
APIVersion *string `json:"api_version,omitempty"`
StorageDriver *string `json:"storage_driver,omitempty"`
ContainerCount *int `json:"container_count,omitempty"`
DockerRootDir *string `json:"docker_root_dir,omitempty"`
RootlessMode *bool `json:"rootless_mode,omitempty"`
DockerSockPath *string `json:"docker_sock_path,omitempty"`
DockerSockModeOctal *string `json:"docker_sock_mode_octal,omitempty"`
DockerSockOwnerUID *int `json:"docker_sock_owner_uid,omitempty"`
DockerSockGroupGID *int `json:"docker_sock_group_gid,omitempty"`
DockerSockMountedInContainers []string `json:"docker_sock_mounted_in_containers,omitempty"`
TCPAPIExposed *bool `json:"tcp_api_exposed,omitempty"`
TCPAPIAddress *string `json:"tcp_api_address,omitempty"`
TCPAPITLSEnabled *bool `json:"tcp_api_tls_enabled,omitempty"`
UsernsRemap *string `json:"userns_remap,omitempty"`
NoNewPrivileges *bool `json:"no_new_privileges,omitempty"`
IccEnabled *bool `json:"icc_enabled,omitempty"`
LiveRestore *bool `json:"live_restore,omitempty"`
LogDriver *string `json:"log_driver,omitempty"`
SeccompProfile *string `json:"seccomp_profile,omitempty"`
DefaultUlimits *string `json:"default_ulimits,omitempty"`
ContainerRisks []DockerContainerRisk `json:"container_risks,omitempty"`
ImagesRunningAsLatest []string `json:"images_running_as_latest,omitempty"`
ImagesWithoutHealthcheck []string `json:"images_without_healthcheck,omitempty"`
PublishedPorts []DockerPublishedPort `json:"published_ports,omitempty"`
CustomNetworksEncrypted []DockerOverlayNetworkEncryption `json:"custom_networks_encrypted,omitempty"`
DockerGroupMembers []string `json:"docker_group_members,omitempty"`
DockerDataPermissions *string `json:"docker_data_permissions,omitempty"`
KernelVersion *string `json:"kernel_version,omitempty"`
IsSwarmActive *bool `json:"is_swarm_active,omitempty"`
CollectorWarnings []string `json:"collector_warnings,omitempty"`
Error string `json:"error,omitempty"`
}
DockerPosture is Docker engine security posture from read-only docker CLI and filesystem checks.
type DockerPublishedPort ¶ added in v0.5.0
type DockerPublishedPort struct {
Container string `json:"container"`
ContainerID string `json:"container_id"`
HostIP string `json:"host_ip"`
HostPort string `json:"host_port"`
ContainerPort string `json:"container_port"`
Protocol string `json:"protocol"`
BindAllInterfaces bool `json:"bind_all_interfaces"`
}
DockerPublishedPort is one published port binding from a running container.
type DuplicateIDEntry ¶ added in v0.2.0
DuplicateIDEntry lists a numeric ID shared by more than one account (names capped for audit).
type DuplicateUidGid ¶ added in v0.2.0
type DuplicateUidGid struct {
DuplicateUidCount int `json:"duplicate_uid_count"`
DuplicateGidCount int `json:"duplicate_gid_count"`
DuplicateUids []DuplicateIDEntry `json:"duplicate_uids,omitempty"`
DuplicateGids []DuplicateIDEntry `json:"duplicate_gids,omitempty"`
Error string `json:"error,omitempty"`
}
DuplicateUidGid reports passwd/group collisions (bounded names per ID).
type Fail2banPosture ¶ added in v0.5.0
type Fail2banPosture struct {
Present bool `json:"present"`
UnitActiveState string `json:"unit_active_state,omitempty"`
UnitFileState string `json:"unit_file_state,omitempty"`
Fail2banClientPath string `json:"fail2ban_client_path,omitempty"`
VersionSummary string `json:"version_summary,omitempty"`
ConfigPathsRead []string `json:"config_paths_read,omitempty"`
EnabledJails []string `json:"enabled_jails,omitempty"`
JailSectionCountHint *int `json:"jail_section_count_hint,omitempty"`
DefaultBantime string `json:"default_bantime,omitempty"`
DefaultFindtime string `json:"default_findtime,omitempty"`
DefaultMaxRetry string `json:"default_maxretry,omitempty"`
Error string `json:"error,omitempty"`
}
Fail2banPosture reports fail2ban presence and bounded jail config hints (file-based only).
type FileIntegrityTooling ¶ added in v0.2.0
type FileIntegrityTooling struct {
AideSuspected bool `json:"aide_suspected"`
TripwireSuspected bool `json:"tripwire_suspected"`
EvidencePaths []string `json:"evidence_paths,omitempty"`
SystemdUnitsSample []string `json:"systemd_units_sample,omitempty"`
LatestDbUtcHint string `json:"latest_db_utc_hint,omitempty"`
Error string `json:"error,omitempty"`
}
FileIntegrityTooling detects AIDE/Tripwire-style tooling without uploading databases.
type FileSystemAndStorageComponent ¶ added in v0.2.0
type FileSystemAndStorageComponent struct {
HostDisk *HostDisk `json:"host_disk,omitempty"`
HostPath *HostPath `json:"host_path,omitempty"`
HostSuid *HostSuid `json:"host_suid,omitempty"`
MountOptionsAudit *MountOptionsAudit `json:"mount_options_audit,omitempty"`
PathPermissionsAudit *PathPermissionsAudit `json:"path_permissions_audit,omitempty"`
UsbStoragePosture *UsbStoragePosture `json:"usb_storage_posture,omitempty"`
FileIntegrityTooling *FileIntegrityTooling `json:"file_integrity_tooling,omitempty"`
CryptStorageHint *CryptStorageHint `json:"crypt_storage_hint,omitempty"`
NfsExportsFingerprint *NfsExportsFingerprint `json:"nfs_exports_fingerprint,omitempty"`
}
type FilesystemEntry ¶
type Firewall ¶
type Firewall struct {
Family string `json:"firewall_family"`
// Active is whether this machine is actually filtering traffic right now.
Active bool `json:"active"`
// ConfiguredOn is whether the firewall's own configuration says it should be
// on. Nil when there is nothing to read it from.
//
// Kept apart from Active because they can disagree, and the disagreement is
// the interesting part: ufw writes ENABLED=yes into /etc/ufw/ufw.conf and
// installs its chains as two separate acts, so a machine can carry the flag
// and filter nothing. Its owner believes they have a firewall.
ConfiguredOn *bool `json:"configured_on,omitempty"`
DefaultPolicyIn string `json:"default_policy_in,omitempty"`
DefaultPolicyOut string `json:"default_policy_out,omitempty"`
RuleCount *int `json:"rule_count,omitempty"`
HasEstablishedRelated *bool `json:"has_established_related,omitempty"`
FirewalldDefaultZone string `json:"firewalld_default_zone,omitempty"`
FirewalldZoneTarget string `json:"firewalld_zone_target,omitempty"`
UfwStatusVerboseSample []string `json:"ufw_status_verbose_sample,omitempty"`
BackendRulesetSha256Hex string `json:"backend_ruleset_sha256,omitempty"`
BackendRulesetExcerpt string `json:"backend_ruleset_excerpt,omitempty"`
Error string `json:"error,omitempty"`
}
type FirmwareBoot ¶ added in v0.2.0
type FirmwareBoot struct {
BootMode string `json:"boot_mode"`
EfiSysfsPresent bool `json:"efi_sysfs_present"`
EfibootmgrExitZero bool `json:"efibootmgr_exit_zero,omitempty"`
Error string `json:"error,omitempty"`
}
FirmwareBoot hints UEFI vs BIOS without requiring root.
type FtpPosture ¶ added in v0.28.0
type FtpPosture struct {
Detected bool `json:"detected"`
BinPath string `json:"bin_path"`
Daemon string `json:"daemon"`
Version *string `json:"version"`
DistroVersion *string `json:"distro_version,omitempty"`
ServiceState *string `json:"service_state"`
AnonymousEnabled *bool `json:"anonymous_enabled"`
TlsEnabled *bool `json:"tls_enabled"`
ChrootEnabled *bool `json:"chroot_enabled"`
ListenAddress *string `json:"listen_address"`
ListenPort *string `json:"listen_port"`
PasvMinPort *string `json:"pasv_min_port"`
PasvMaxPort *string `json:"pasv_max_port"`
CollectorWarnings []string `json:"collector_warnings"`
Error string `json:"error,omitempty"`
}
FtpPosture is bounded FTP server security posture (vsftpd, ProFTPD, Pure-FTPd). No credentials, no user lists, no file contents.
type GrubSnapshot ¶ added in v0.2.0
type GrubSnapshot struct {
DefaultGrubPath string `json:"default_grub_path,omitempty"`
GrubCmdlineLinux string `json:"grub_cmdline_linux,omitempty"`
GrubTimeout string `json:"grub_timeout,omitempty"`
PasswordReferencePresent *bool `json:"password_reference_present,omitempty"`
GrubCfgReadablePath string `json:"grub_cfg_readable_path,omitempty"`
Error string `json:"error,omitempty"`
}
GrubSnapshot is parsed /etc/default/grub (and optional readable grub.cfg path); no secret values.
type HighRiskProcessEntry ¶ added in v0.2.0
type HighRiskProcessEntry struct {
Pid int32 `json:"pid"`
User string `json:"user"`
ExePath string `json:"exe_path,omitempty"`
BinaryDeleted bool `json:"binary_deleted"`
CmdlineEmpty bool `json:"cmdline_empty"`
ListenerPorts []int `json:"listener_ports,omitempty"`
Reason string `json:"reason,omitempty"`
}
HighRiskProcessEntry is one bounded process row.
type HighRiskProcessSurface ¶ added in v0.2.0
type HighRiskProcessSurface struct {
Items []HighRiskProcessEntry `json:"items"`
Error string `json:"error,omitempty"`
}
HighRiskProcessSurface samples listeners and root-owned processes with exe/cmdline hints.
type HostBackup ¶
type HostDisk ¶
type HostDisk struct {
Filesystems []FilesystemEntry `json:"filesystems,omitempty"`
Error string `json:"error,omitempty"`
}
type HostNetwork ¶
type HostNetwork struct {
DefaultRouteVia string `json:"default_route_via,omitempty"`
HasPublicIPv4 *bool `json:"has_public_ipv4,omitempty"`
HasPublicIPv6 *bool `json:"has_public_ipv6,omitempty"`
PublicIPCandidates []string `json:"public_ip_candidates,omitempty"` // redacted: IPv4 a.b.x.x / IPv6 h:h:x:x:x:x:x:x
ProbeTargets []string `json:"probe_targets,omitempty"` // real public IPs for API-side WAN probing
Interfaces []NetworkIface `json:"interfaces,omitempty"`
ResolvConfNameservers []string `json:"resolv_conf_nameservers,omitempty"`
ResolvConfSearchDomains []string `json:"resolv_conf_search_domains,omitempty"`
ResolvConfSampleLines []string `json:"resolv_conf_sample_lines,omitempty"`
SystemdResolvedStub *bool `json:"systemd_resolved_stub,omitempty"`
Error string `json:"error,omitempty"`
}
type HostProcess ¶
type HostProcess struct {
Top []ProcessTopEntry `json:"top"`
Signals *ProcessSignals `json:"signals,omitempty"`
Error string `json:"error,omitempty"`
}
type HostRuntimes ¶
type HostRuntimes struct {
Items []RuntimeEntry `json:"items"`
Docker *DockerHostFingerprint `json:"docker,omitempty"`
Kubelet *KubeletNodeFingerprint `json:"kubelet,omitempty"`
Error string `json:"error,omitempty"`
}
type HostSSH ¶
type HostSSH struct {
PermitRootLogin string `json:"permit_root_login,omitempty"`
PasswordAuthentication string `json:"password_authentication,omitempty"`
ChallengeResponseAuth string `json:"challenge_response_auth,omitempty"`
KexAlgorithmsSample []string `json:"kex_algorithms_sample,omitempty"`
CiphersSample []string `json:"ciphers_sample,omitempty"`
ListenAddresses []string `json:"listen_addresses,omitempty"`
MaxAuthTries *int `json:"max_auth_tries,omitempty"`
ClientAliveIntervalSeconds *int `json:"client_alive_interval_seconds,omitempty"`
ClientAliveCountMax *int `json:"client_alive_count_max,omitempty"`
AllowUsersPresent *bool `json:"allow_users_present,omitempty"`
DenyUsersPresent *bool `json:"deny_users_present,omitempty"`
Subsystem string `json:"subsystem,omitempty"`
UsePAM string `json:"use_pam,omitempty"`
X11Forwarding string `json:"x11_forwarding,omitempty"`
Error string `json:"error,omitempty"`
}
type HostTime ¶
type HostTime struct {
UtcNow string `json:"utc_now"`
RtcInSync *bool `json:"rtc_in_sync,omitempty"`
NtpActive *bool `json:"ntp_active,omitempty"`
TimesyncDaemon string `json:"timesync_daemon,omitempty"`
OffsetMs *float64 `json:"offset_ms,omitempty"`
SkewVsServerSeconds *int `json:"skew_vs_server_seconds,omitempty"`
}
type HostUsersSummary ¶
type IdentityAccessAndAuthenticationComponent ¶ added in v0.2.0
type IdentityAccessAndAuthenticationComponent struct {
HostUsersSummary *HostUsersSummary `json:"host_users_summary,omitempty"`
HostSSH *HostSSH `json:"host_ssh,omitempty"`
ShadowAccountSummary *ShadowAccountSummary `json:"shadow_account_summary,omitempty"`
DuplicateUidGid *DuplicateUidGid `json:"duplicate_uid_gid,omitempty"`
PasswordPolicyFingerprint *PasswordPolicyFingerprint `json:"password_policy_fingerprint,omitempty"`
SudoersAudit *SudoersAudit `json:"sudoers_audit,omitempty"`
}
type IfaceAddress ¶
type JournaldPosture ¶ added in v0.3.3
type JournaldPosture struct {
UnitActive *bool `json:"unit_active,omitempty"`
ConfigPathsRead []string `json:"config_paths_read,omitempty"`
Storage string `json:"storage,omitempty"`
ForwardToSyslog *bool `json:"forward_to_syslog,omitempty"`
ForwardToWall *bool `json:"forward_to_wall,omitempty"`
ForwardToConsole *bool `json:"forward_to_console,omitempty"`
Compress *bool `json:"compress,omitempty"`
Seal *bool `json:"seal,omitempty"`
SystemMaxUse string `json:"system_max_use,omitempty"`
RuntimeMaxUse string `json:"runtime_max_use,omitempty"`
MaxRetentionSec string `json:"max_retention_sec,omitempty"`
JournalctlDiskUsageSummary string `json:"journalctl_disk_usage_summary,omitempty"`
Error string `json:"error,omitempty"`
}
JournaldPosture summarizes systemd-journald config hints (no journal contents).
type KernelModulesBlock ¶ added in v0.2.0
type KernelModulesBlock struct {
Names []string `json:"names"`
DenylistMatches []string `json:"denylist_matches,omitempty"`
Error string `json:"error,omitempty"`
}
KernelModulesBlock lists loaded modules (capped) with optional denylist hits.
type KubeletContainerWorkload ¶ added in v0.22.0
type KubeletContainerWorkload struct {
Name string `json:"name"`
Image string `json:"image"`
ImageTag string `json:"image_tag,omitempty"`
ImageDigest string `json:"image_digest,omitempty"`
ImageTagLatest bool `json:"image_tag_is_latest"`
ImageDigestPinned bool `json:"image_digest_pinned"`
RestartCount int `json:"restart_count"`
State string `json:"state,omitempty"`
}
KubeletContainerWorkload is a single container inside a pod.
type KubeletNodeFingerprint ¶ added in v0.2.0
type KubeletNodeFingerprint struct {
KubeletBinaryPath string `json:"kubelet_binary_path,omitempty"`
ConfigSourcePaths []string `json:"config_source_paths,omitempty"`
ReadOnlyPort *int `json:"read_only_port,omitempty"`
ProtectKernelDefaults *bool `json:"protect_kernel_defaults,omitempty"`
AnonymousAuthEnabled *bool `json:"anonymous_auth_enabled,omitempty"`
DropInExecSampleLines []string `json:"drop_in_exec_sample_lines,omitempty"`
Error string `json:"error,omitempty"`
}
KubeletNodeFingerprint captures bounded kubelet config hints when the node runs Kubernetes.
type KubeletPodWorkload ¶ added in v0.22.0
type KubeletPodWorkload struct {
Name string `json:"name"`
Namespace string `json:"namespace"`
Phase string `json:"phase,omitempty"`
CreatedAt string `json:"created_at,omitempty"`
Containers []KubeletContainerWorkload `json:"containers"`
}
KubeletPodWorkload describes one pod observed via kubelet / crictl on this node.
type LargeVarLogFileEntry ¶ added in v0.3.3
type LargeVarLogFileEntry struct {
RelPath string `json:"rel_path"`
SizeBytes int64 `json:"size_bytes"`
}
LargeVarLogFileEntry is a file under /var/log at or above the agent size threshold with no matching logrotate stanza path (heuristic).
type LegacyInsecureServices ¶ added in v0.2.0
type LegacyInsecureServices struct {
TelnetSuspected bool `json:"telnet_suspected"`
RshSuspected bool `json:"rsh_suspected"`
RloginSuspected bool `json:"rlogin_suspected"`
RexecSuspected bool `json:"rexec_suspected"`
VsftpdSuspected bool `json:"vsftpd_suspected"`
ProftpdSuspected bool `json:"proftpd_suspected"`
InetdConfPresent bool `json:"inetd_conf_present"`
InetdConfNonCommentLines int `json:"inetd_conf_non_comment_lines"`
SystemdUnitNamesSample []string `json:"systemd_unit_names_sample,omitempty"`
Error string `json:"error,omitempty"`
}
LegacyInsecureServices reports presence-only hints for legacy network services.
type Listener ¶
type Listener struct {
Port int `json:"port"`
Bind string `json:"bind"`
Process string `json:"process"`
ListenPid int32 `json:"listen_pid,omitempty"`
SystemdUnit string `json:"systemd_unit,omitempty"`
SystemdUnitMissing bool `json:"systemd_unit_missing,omitempty"`
BindScope string `json:"bind_scope,omitempty"`
ExposureRisk string `json:"exposure_risk,omitempty"`
FirewallRule string `json:"firewall_rule,omitempty"`
LanFirewallRule string `json:"lan_firewall_rule,omitempty"`
WanFirewallRule string `json:"wan_firewall_rule,omitempty"`
WanProbeOpen *bool `json:"wan_probe_open,omitempty"`
}
type LocalTlsCertFileEntry ¶ added in v0.4.0
type LocalTlsCertFileEntry struct {
Path string `json:"path"`
NotAfter string `json:"not_after"`
ExpiresWithin30Days *bool `json:"expires_within_30_days,omitempty"`
UsesSha1Signature *bool `json:"uses_sha1_signature,omitempty"`
}
LocalTlsCertFileEntry describes one certificate (first PEM block per file, typically the leaf).
type LocalTlsCertInventory ¶ added in v0.4.0
type LocalTlsCertInventory struct {
Items []LocalTlsCertFileEntry `json:"items,omitempty"`
Sha1SignatureCertCount int `json:"sha1_signature_cert_count,omitempty"`
FilesScanned int `json:"files_scanned,omitempty"`
Error string `json:"error,omitempty"`
}
LocalTlsCertInventory is a bounded scan of PEM leaf material from known paths (NotAfter and signature algorithm hints only).
type LoggingAndSystemAuditingComponent ¶ added in v0.2.0
type LoggingAndSystemAuditingComponent struct {
AuditSections []AuditSection `json:"audit_sections,omitempty"`
SyslogForwarding *SyslogForwardingPosture `json:"syslog_forwarding,omitempty"`
Journald *JournaldPosture `json:"journald,omitempty"`
Auditd *AuditdPosture `json:"auditd,omitempty"`
LogrotateDisk *LogrotateDiskPosture `json:"logrotate_disk,omitempty"`
AtBatch *AtBatchPosture `json:"at_batch,omitempty"`
ProcessAccounting *ProcessAccountingPosture `json:"process_accounting,omitempty"`
}
type LogrotateDiskPosture ¶ added in v0.3.3
type LogrotateDiskPosture struct {
MainConfPresent bool `json:"main_conf_present,omitempty"`
MainConfIncludeLinesSample []string `json:"main_conf_include_lines_sample,omitempty"`
VarLogStanzaHint bool `json:"var_log_stanza_hint,omitempty"`
VarLogUsagePath string `json:"var_log_usage_path,omitempty"`
VarLogMountUsedPct *int `json:"var_log_mount_used_pct,omitempty"`
LogPartitionUsageHigh *bool `json:"log_partition_usage_high,omitempty"`
LargeVarLogFiles []LargeVarLogFileEntry `json:"large_var_log_files,omitempty"`
LargeVarLogWithoutRotationHintCount *int `json:"large_var_log_without_rotation_hint_count,omitempty"`
Error string `json:"error,omitempty"`
}
LogrotateDiskPosture summarizes logrotate configuration and /var/log mount usage (gopsutil disk.Usage).
type MacDeepPosture ¶ added in v0.5.0
type MacDeepPosture struct {
SelinuxPsZLineSampleCap *int `json:"selinux_ps_z_line_sample_cap,omitempty"`
SelinuxPsZUnconfinedLikeCount *int `json:"selinux_ps_z_unconfined_like_count,omitempty"`
SelinuxSemanagePermissiveSample []string `json:"selinux_semanage_permissive_sample,omitempty"`
ApparmorProfilesEnforceCount *int `json:"apparmor_profiles_enforce_count,omitempty"`
ApparmorProfilesComplainCount *int `json:"apparmor_profiles_complain_count,omitempty"`
Error string `json:"error,omitempty"`
}
MacDeepPosture extends §1 MAC summary when SELinux is enforcing and AppArmor tools exist.
type MalwareScannerEntry ¶ added in v0.5.0
type MalwareScannerEntry struct {
ID string `json:"id"`
Detected bool `json:"detected"`
VersionSummary string `json:"version_summary,omitempty"`
LastUpdateHint string `json:"last_update_hint,omitempty"`
UnitActiveState string `json:"unit_active_state,omitempty"`
UnitFile string `json:"unit_file,omitempty"`
}
MalwareScannerEntry is one detected scanner or commercial agent unit (no scan execution).
type MalwareScannersPosture ¶ added in v0.5.0
type MalwareScannersPosture struct {
Scanners []MalwareScannerEntry `json:"scanners,omitempty"`
Error string `json:"error,omitempty"`
}
MalwareScannersPosture reports scanner presence, version strings, and coarse freshness hints only.
type MongodbPosture ¶ added in v0.28.0
type MongodbPosture struct {
Detected bool `json:"detected"`
BinPath string `json:"bin_path"`
Version *string `json:"version"`
DistroVersion *string `json:"distro_version,omitempty"`
ServiceState *string `json:"service_state"`
BindIp *string `json:"bind_ip"`
Port *int `json:"port"`
TlsMode *string `json:"tls_mode"`
AuthEnabled *bool `json:"auth_enabled"`
KeyFilePresent *bool `json:"key_file_present"`
JournalEnabled *bool `json:"journal_enabled"`
CollectorWarnings []string `json:"collector_warnings"`
Error string `json:"error,omitempty"`
}
MongodbPosture is bounded MongoDB server security posture. No database contents, user lists, or credentials.
type MountOptionsAudit ¶ added in v0.2.0
type MountOptionsAudit struct {
Paths []MountPathSignals `json:"paths,omitempty"`
Error string `json:"error,omitempty"`
}
MountOptionsAudit compares fstab and live mount options for standard hardening paths.
type MountPathSignals ¶ added in v0.2.0
type MountPathSignals struct {
Mountpoint string `json:"mountpoint"`
InFstab bool `json:"in_fstab"`
FstabOptions string `json:"fstab_options,omitempty"`
LiveMountOptions string `json:"live_mount_options,omitempty"`
Nodev bool `json:"nodev"`
Nosuid bool `json:"nosuid"`
Noexec bool `json:"noexec"`
}
MountPathSignals reports nodev/nosuid/noexec from live mounts (preferred) or fstab.
type MtaFingerprint ¶ added in v0.2.0
type MtaFingerprint struct {
DetectedMta string `json:"detected_mta,omitempty"`
PostfixInetInterfaces string `json:"postfix_inet_interfaces,omitempty"`
PostfixMynetworksStyle string `json:"postfix_mynetworks_style,omitempty"`
PostfixSmtpdRecipientRestrictionsPresent *bool `json:"postfix_smtpd_recipient_restrictions_present,omitempty"`
EximConfigPath string `json:"exim_config_path,omitempty"`
EximRelayDomainsHintSample []string `json:"exim_relay_domains_hint_sample,omitempty"`
SendmailCfPathPresent *bool `json:"sendmail_cf_path_present,omitempty"`
SendmailLinesSample []string `json:"sendmail_lines_sample,omitempty"`
Error string `json:"error,omitempty"`
}
MtaFingerprint is MTA presence and bounded relay/bind hints (no queue contents).
type MysqlPosture ¶ added in v0.5.0
type MysqlPosture struct {
Detected bool `json:"detected"`
Engine string `json:"engine"`
Version *string `json:"version"`
DistroVersion *string `json:"distro_version,omitempty"`
BinPath string `json:"bin_path"`
ServiceState *string `json:"service_state"`
BindAddress *string `json:"bind_address"`
Port *int `json:"port"`
SkipNetworking *bool `json:"skip_networking"`
SocketPath *string `json:"socket_path"`
RuntimeListenCheck *string `json:"runtime_listen_check"`
DefaultAuthPlugin *string `json:"default_auth_plugin"`
AuthSocketOrUnix *bool `json:"auth_socket_or_unix"`
SecureAuth *string `json:"secure_auth"`
PasswordPolicyPlugin *bool `json:"password_policy_plugin"`
SslCa *string `json:"ssl_ca"`
SslCert *string `json:"ssl_cert"`
SslKey *string `json:"ssl_key"`
TlsConfigured *bool `json:"tls_configured"`
RequireSecureTransport *string `json:"require_secure_transport"`
TlsVersion *string `json:"tls_version"`
LocalInfile *string `json:"local_infile"`
SecureFilePriv *string `json:"secure_file_priv"`
SymbolicLinks *string `json:"symbolic_links"`
LogRaw *string `json:"log_raw"`
GeneralLog *string `json:"general_log"`
SkipGrantTables *bool `json:"skip_grant_tables"`
RunUser *string `json:"run_user"`
Datadir *string `json:"datadir"`
DatadirPermissions *string `json:"datadir_permissions"`
ConfigFilePermissions *string `json:"config_file_permissions"`
MyCnfPasswordsExposed *bool `json:"my_cnf_passwords_exposed"`
ErrorLogPermissions *string `json:"error_log_permissions"`
IsContainerized *bool `json:"is_containerized"`
InnodbEncryptTables *string `json:"innodb_encrypt_tables"`
DefaultTableEncryption *string `json:"default_table_encryption"`
KeyringPlugin *bool `json:"keyring_plugin"`
CollectorWarnings []string `json:"collector_warnings"`
LimitedWithoutSQLAccess []string `json:"limited_without_sql_access"`
Error string `json:"error,omitempty"`
}
MysqlPosture is MySQL/MariaDB security posture from binary, bounded cnf parse (includes !include/!includedir), proc, and ss (no SQL).
type NetworkAndHostFirewallComponent ¶ added in v0.2.0
type NetworkAndHostFirewallComponent struct {
Listeners []Listener `json:"listeners"`
HostNetwork *HostNetwork `json:"host_network,omitempty"`
Firewall *Firewall `json:"firewall,omitempty"`
TcpWrappersFingerprint *TcpWrappersFingerprint `json:"tcp_wrappers_fingerprint,omitempty"`
LegacyInsecureServices *LegacyInsecureServices `json:"legacy_insecure_services,omitempty"`
}
type NetworkIface ¶
type NfsExportEntry ¶ added in v0.2.0
type NfsExportEntry struct {
Index int `json:"index"`
PathHash string `json:"path_hash"`
CombinedOptionsFingerprint string `json:"combined_options_fingerprint"`
HasNoRootSquash bool `json:"has_no_root_squash"`
HasRootSquash bool `json:"has_root_squash"`
SecModeHint string `json:"sec_mode_hint,omitempty"`
}
NfsExportEntry is one export line fingerprint (path hashed).
type NfsExportsFingerprint ¶ added in v0.2.0
type NfsExportsFingerprint struct {
ExportsReadable bool `json:"exports_readable"`
Entries []NfsExportEntry `json:"entries,omitempty"`
Error string `json:"error,omitempty"`
}
NfsExportsFingerprint summarizes /etc/exports with hashed paths (no raw export paths).
type NginxListenBinding ¶ added in v0.5.0
type NginxListenBinding struct {
Bind string `json:"bind"`
Port int `json:"port"`
SSL bool `json:"ssl,omitempty"`
}
NginxListenBinding is one listen directive (address, port, TLS-related listen flag).
type NginxPosture ¶ added in v0.5.0
type NginxPosture struct {
Detected bool `json:"detected"`
BinPath string `json:"bin_path,omitempty"`
Version *string `json:"version,omitempty"`
DistroVersion *string `json:"distro_version,omitempty"`
ServiceState *string `json:"service_state,omitempty"` // running | stopped | not_installed
SiteMapSummary *NginxSiteMapSummary `json:"site_map_summary,omitempty"`
ListenBindings []NginxListenBinding `json:"listen_bindings,omitempty"`
// ListenBindingDiscrepancies compares config listens to same-scan TCP listeners (nginx/openresty process) when available.
ListenBindingDiscrepancies []string `json:"listen_binding_discrepancies,omitempty"`
// ModulesSample is security-relevant nginx -V flags (broad); RiskyModulesCompiled is the high-risk subset only.
ModulesSample []string `json:"modules_sample,omitempty"`
RiskyModulesCompiled []string `json:"risky_modules_compiled,omitempty"`
TlsLegacyProtocolsPresent *bool `json:"tls_legacy_protocols_present,omitempty"`
SslConfigured *bool `json:"ssl_configured,omitempty"`
SslProtocols *string `json:"ssl_protocols,omitempty"`
SslCiphers *string `json:"ssl_ciphers,omitempty"`
SslCiphersWeakPatterns *bool `json:"ssl_ciphers_weak_patterns,omitempty"`
SslPreferServerCiphers *string `json:"ssl_prefer_server_ciphers,omitempty"`
HstsHeader *string `json:"hsts_header,omitempty"`
HttpToHttpsRedirect *bool `json:"http_to_https_redirect,omitempty"`
SslStapling *bool `json:"ssl_stapling,omitempty"`
SslSessionTicketsSummary *string `json:"ssl_session_tickets_summary,omitempty"`
ServerTokens *string `json:"server_tokens,omitempty"`
StubStatusUnrestricted *bool `json:"stub_status_unrestricted,omitempty"`
ServerHeaderHidden *bool `json:"server_header_hidden,omitempty"`
ErrorPageCustom *bool `json:"error_page_custom,omitempty"`
MissingSecurityHeaders []string `json:"missing_security_headers,omitempty"`
LocationsDroppingParentHeaders []string `json:"locations_dropping_parent_headers,omitempty"`
AutoindexEnabledPaths []string `json:"autoindex_enabled_paths,omitempty"`
SensitivePathsUnrestricted []string `json:"sensitive_paths_unrestricted,omitempty"`
LimitReqConfigured *bool `json:"limit_req_configured,omitempty"`
ClientMaxBodySize *string `json:"client_max_body_size,omitempty"`
ProxyPassOrUpstreamSeen *bool `json:"proxy_pass_or_upstream_seen,omitempty"`
ProxyHeadersForwarded *bool `json:"proxy_headers_forwarded,omitempty"`
ProxyHostHeader *bool `json:"proxy_host_header,omitempty"`
UpstreamPlaintext *bool `json:"upstream_plaintext,omitempty"`
ProxyInterceptErrors *bool `json:"proxy_intercept_errors,omitempty"`
RunUser *string `json:"run_user,omitempty"`
RunUserWorkersNonRoot *bool `json:"run_user_workers_non_root,omitempty"`
ConfigFilePermissions *string `json:"config_file_permissions,omitempty"`
DocrootWorldWritable *bool `json:"docroot_world_writable,omitempty"`
IsContainerized *bool `json:"is_containerized,omitempty"`
CollectorWarnings []string `json:"collector_warnings,omitempty"`
Error string `json:"error,omitempty"`
}
NginxPosture is allowlisted nginx security posture from -v/-V/-T (no raw secrets).
type NginxSiteMapSummary ¶ added in v0.5.0
type NginxSiteMapSummary struct {
ServerBlockCount int `json:"server_block_count"`
ServerNames []string `json:"server_names,omitempty"`
}
NginxSiteMapSummary counts server blocks and caps server_name tokens from parsed -T output.
type OSInfo ¶
type OSInfo struct {
Pretty string `json:"pretty"`
Kernel string `json:"kernel"`
KernelArch string `json:"kernel_arch,omitempty"`
DistroID string `json:"distro_id,omitempty"`
DistroName string `json:"distro_name,omitempty"`
DistroVersionID string `json:"distro_version_id,omitempty"`
// True when agent detects Ubuntu Pro ESM or Debian ELTS-style apt; API uses this for ESM/ELTS posture.
DistroPaidExtendedSecurityActive *bool `json:"distro_paid_extended_security_active,omitempty"`
OSReleaseID string `json:"os_release_id,omitempty"`
OSReleaseVersionID string `json:"os_release_version_id,omitempty"`
OSReleaseVersion string `json:"os_release_version,omitempty"`
OSReleaseName string `json:"os_release_name,omitempty"`
Platform string `json:"platform,omitempty"`
PlatformFamily string `json:"platform_family,omitempty"`
PlatformVersion string `json:"platform_version,omitempty"`
}
type OtherComponent ¶ added in v0.2.0
type OtherComponent struct{}
OtherComponent is reserved; send {} until extensions are defined.
type PackagesUpdates ¶
type PackagesUpdates struct {
Manager string `json:"manager,omitempty"`
LastPackageIndexRefreshUTC string `json:"last_package_index_refresh_utc,omitempty"`
InstalledPackageCount int `json:"installed_package_count"`
PendingUpdatesCount int `json:"pending_updates_count"`
SecurityUpdatesCount int `json:"security_updates_count"`
SecurityUpdatesSample []string `json:"security_updates_sample,omitempty"`
Error string `json:"error,omitempty"`
}
type PasswordPolicyFingerprint ¶ added in v0.2.0
type PasswordPolicyFingerprint struct {
PwqualityKeys []PwqualityKV `json:"pwquality_keys,omitempty"`
PamPasswordRequisiteLines []string `json:"pam_password_requisite_lines,omitempty"`
Error string `json:"error,omitempty"`
}
PasswordPolicyFingerprint reads pwquality.conf and PAM password stack lines (no secrets).
type PathPermissionsAudit ¶ added in v0.2.0
type PathPermissionsAudit struct {
TmpStickyBitPresent *bool `json:"tmp_sticky_bit_present,omitempty"`
WorldWritableDirsSample []string `json:"world_writable_dirs_sample,omitempty"`
SgidItemsSample []SgidItem `json:"sgid_items_sample,omitempty"`
UnownedFilesSample []string `json:"unowned_files_sample,omitempty"`
Error string `json:"error,omitempty"`
}
PathPermissionsAudit extends path posture: sticky /tmp, WW dirs, SGID, unowned samples.
type PostfixPosture ¶ added in v0.5.0
type PostfixPosture struct {
Detected bool `json:"detected"`
BinPath string `json:"bin_path"`
Version *string `json:"version"`
DistroVersion *string `json:"distro_version,omitempty"`
ServiceState *string `json:"service_state"`
ListenAddresses *string `json:"listen_addresses"`
ListenProtocols *string `json:"listen_protocols"`
Mynetworks *string `json:"mynetworks"`
SmtpdRelayRestrictions *string `json:"smtpd_relay_restrictions"`
RelayDomains *string `json:"relay_domains"`
SmtpdRecipientRestrictions *string `json:"smtpd_recipient_restrictions"`
SmtpdTlsSecurityLevel *string `json:"smtpd_tls_security_level"`
SmtpTlsSecurityLevel *string `json:"smtp_tls_security_level"`
SmtpdTlsProtocols *string `json:"smtpd_tls_protocols"`
SmtpdTlsMandatoryCiphers *string `json:"smtpd_tls_mandatory_ciphers"`
TlsPreemptCipherlist *bool `json:"tls_preempt_cipherlist"`
SmtpdSaslAuthEnable *bool `json:"smtpd_sasl_auth_enable"`
SmtpdSaslSecurityOptions *string `json:"smtpd_sasl_security_options"`
SmtpdTlsAuthOnly *bool `json:"smtpd_tls_auth_only"`
SubmissionPortEnabled *bool `json:"submission_port_enabled"`
SmtpdSenderRestrictions *string `json:"smtpd_sender_restrictions"`
SmtpdHeloRequired *bool `json:"smtpd_helo_required"`
SmtpdHeloRestrictions *string `json:"smtpd_helo_restrictions"`
SmtpdSenderLoginMaps *string `json:"smtpd_sender_login_maps"`
SmtpdBanner *string `json:"smtpd_banner"`
ShowqServiceExposed *bool `json:"showq_service_exposed"`
SmtpdClientConnectionRateLimit *string `json:"smtpd_client_connection_rate_limit"`
SmtpdClientMessageRateLimit *string `json:"smtpd_client_message_rate_limit"`
SmtpdErrorSleepTime *string `json:"smtpd_error_sleep_time"`
SmtpdHardErrorLimit *string `json:"smtpd_hard_error_limit"`
MessageSizeLimit *string `json:"message_size_limit"`
RunUser *string `json:"run_user"`
ChrootRatioSummary *string `json:"chroot_ratio_summary"`
IsContainerized *bool `json:"is_containerized"`
CollectorWarnings []string `json:"collector_warnings"`
Error string `json:"error,omitempty"`
}
PostfixPosture is allowlisted postconf + bounded master.cf security posture (no postconf -n dump, no queue or mail content).
type PostgresPosture ¶ added in v0.5.0
type PostgresPosture struct {
Detected bool `json:"detected"`
Version *string `json:"version,omitempty"`
DistroVersion *string `json:"distro_version,omitempty"`
BinPath string `json:"bin_path,omitempty"`
ServiceState *string `json:"service_state,omitempty"`
ListenAddresses *string `json:"listen_addresses,omitempty"`
Port *int `json:"port,omitempty"`
ListenImpliesAllAddresses *bool `json:"listen_implies_all_addresses,omitempty"`
PortListenerDiscrepancies []string `json:"port_listener_discrepancies,omitempty"`
ConfigFilePath *string `json:"config_file_path,omitempty"`
PgHbaFilePath *string `json:"pg_hba_file_path,omitempty"`
TrustRules []string `json:"trust_rules,omitempty"`
PasswordCleartextRules []string `json:"password_cleartext_rules,omitempty"`
Md5RulesCount *int `json:"md5_rules_count,omitempty"`
ScramSha256RulesCount *int `json:"scram_sha_256_rules_count,omitempty"`
WideOpenRules []string `json:"wide_open_rules,omitempty"`
HostnosslRulesCount *int `json:"hostnossl_rules_count,omitempty"`
HostRuleCount *int `json:"host_rule_count,omitempty"`
HostsslRuleCount *int `json:"hostssl_rule_count,omitempty"`
LocalRuleCount *int `json:"local_rule_count,omitempty"`
RejectMethodCount *int `json:"reject_method_count,omitempty"`
PeerOrIdentMethodCount *int `json:"peer_or_ident_method_count,omitempty"`
RuleOrderRisk *bool `json:"rule_order_risk,omitempty"`
HbaLinesScanned *int `json:"hba_lines_scanned,omitempty"`
Ssl *string `json:"ssl,omitempty"`
SslCertFile *string `json:"ssl_cert_file,omitempty"`
SslKeyFile *string `json:"ssl_key_file,omitempty"`
SslMinProtocolVersion *string `json:"ssl_min_protocol_version,omitempty"`
SslCiphers *string `json:"ssl_ciphers,omitempty"`
SslCiphersWeakPatterns *bool `json:"ssl_ciphers_weak_patterns,omitempty"`
SslKeyPermissions *string `json:"ssl_key_permissions,omitempty"`
SslMinProtocolWeakOrUnset *bool `json:"ssl_min_protocol_weak_or_unset,omitempty"`
LogConnections *string `json:"log_connections,omitempty"`
LogDisconnections *string `json:"log_disconnections,omitempty"`
LogStatement *string `json:"log_statement,omitempty"`
PasswordEncryption *string `json:"password_encryption,omitempty"`
PreloadAuditTrailPresent *bool `json:"preload_audit_trail_present,omitempty"`
PasswordEncryptionWeakMd5 *bool `json:"password_encryption_weak_md5,omitempty"`
MaxConnections *int `json:"max_connections,omitempty"`
SuperuserReservedConnections *int `json:"superuser_reserved_connections,omitempty"`
TcpKeepalivesIdle *string `json:"tcp_keepalives_idle,omitempty"`
StatementTimeout *string `json:"statement_timeout,omitempty"`
IdleInTransactionSessionTimeout *string `json:"idle_in_transaction_session_timeout,omitempty"`
RunUser *string `json:"run_user,omitempty"`
DataDirectory *string `json:"data_directory,omitempty"`
DatadirPermissions *string `json:"datadir_permissions,omitempty"`
PgHbaPermissions *string `json:"pg_hba_permissions,omitempty"`
ConfigFilePermissions *string `json:"config_file_permissions,omitempty"`
IsContainerized *bool `json:"is_containerized,omitempty"`
CollectorWarnings []string `json:"collector_warnings,omitempty"`
LimitedWithoutSQLAccess []string `json:"limited_without_sql_access,omitempty"`
Error string `json:"error,omitempty"`
}
PostgresPosture is PostgreSQL security posture without SQL (merged postgresql.conf, pg_hba rules, process/fs checks).
type ProcessAccountingPosture ¶ added in v0.3.3
type ProcessAccountingPosture struct {
SadcOnPath bool `json:"sadc_on_path,omitempty"`
SysstatCronHint bool `json:"sysstat_cron_hint,omitempty"`
LdSoPreloadFilePresent bool `json:"ld_so_preload_file_present,omitempty"`
LdSoPreloadPath string `json:"ld_so_preload_path,omitempty"`
Error string `json:"error,omitempty"`
}
ProcessAccountingPosture summarizes sysstat/sadc scheduling and ld.so.preload presence (stat only; no preload content).
type ProcessSignals ¶
type ProcessTopEntry ¶
type PwqualityKV ¶ added in v0.2.0
PwqualityKV is one non-secret pwquality.conf assignment.
type RedisExposureFingerprint ¶ added in v0.2.0
type RedisExposureFingerprint struct {
UnitActiveState string `json:"unit_active_state,omitempty"`
ConfigPathUsed string `json:"config_path_used,omitempty"`
Bind string `json:"bind,omitempty"`
Port *int `json:"port,omitempty"`
ProtectedMode string `json:"protected_mode,omitempty"`
RequirepassPresent *bool `json:"requirepass_present,omitempty"`
Error string `json:"error,omitempty"`
}
RedisExposureFingerprint is non-secret redis.conf exposure hints plus unit state.
type RedisPosture ¶ added in v0.28.0
type RedisPosture struct {
Detected bool `json:"detected"`
BinPath string `json:"bin_path"`
Version *string `json:"version"`
DistroVersion *string `json:"distro_version,omitempty"`
ServiceState *string `json:"service_state"`
Bind *string `json:"bind"`
Port *int `json:"port"`
ProtectedMode *bool `json:"protected_mode"`
RequirepassPresent *bool `json:"requirepass_present"`
TlsEnabled *bool `json:"tls_enabled"`
CollectorWarnings []string `json:"collector_warnings"`
Error string `json:"error,omitempty"`
}
RedisPosture is bounded Redis server security posture. No keyspace data, no ACL contents, no credential values.
type RuntimeEntry ¶
type SecurityFrameworksAndMalwareDefenseComponent ¶ added in v0.2.0
type SecurityFrameworksAndMalwareDefenseComponent struct {
MacDeepPosture *MacDeepPosture `json:"mac_deep_posture,omitempty"`
MalwareScannersPosture *MalwareScannersPosture `json:"malware_scanners_posture,omitempty"`
Fail2banPosture *Fail2banPosture `json:"fail2ban_posture,omitempty"`
}
SecurityFrameworksAndMalwareDefenseComponent holds MAC deep posture, malware-scanner hints, and fail2ban inventory.
type SelinuxApparmorBlock ¶ added in v0.2.0
type SelinuxApparmorBlock struct {
SelinuxMode string `json:"selinux_mode,omitempty"`
ApparmorSummary string `json:"apparmor_summary,omitempty"`
Error string `json:"error,omitempty"`
}
SelinuxApparmorBlock reports MAC posture (no policy dump).
type ServiceEntry ¶
type ServicesBlock ¶
type ServicesBlock struct {
Items []ServiceEntry `json:"items"`
Error string `json:"error,omitempty"`
}
type SgidItem ¶ added in v0.2.0
type SgidItem struct {
Path string `json:"path"`
Owner string `json:"owner"`
Mode string `json:"mode"`
}
SgidItem is a bounded setgid file entry (same shape idea as SuidItem).
type ShadowAccountSummary ¶ added in v0.2.0
type ShadowAccountSummary struct {
ShadowReadable bool `json:"shadow_readable"`
AccountsLockedCount *int `json:"accounts_locked_count,omitempty"`
AccountsNoLoginPasswordCount *int `json:"accounts_no_login_password_count,omitempty"`
AccountsPasswordExpiredHintCount *int `json:"accounts_password_expired_hint_count,omitempty"`
AccountsNeverLoggedInHintCount *int `json:"accounts_never_logged_in_hint_count,omitempty"`
Error string `json:"error,omitempty"`
}
ShadowAccountSummary is non-secret metadata from /etc/shadow (no hash material). The counts are pointers so that "I could not look" is absent rather than zero. Measured on docker/debian-13: as an unprivileged user this reported accounts_locked_count = 0 when the real answer was 25, and a reader cannot tell that apart from a server with no locked accounts.
type SoftwarePackagesAndApplicationsComponent ¶ added in v0.2.0
type SoftwarePackagesAndApplicationsComponent struct {
Services ServicesBlock `json:"services"`
PackagesUpdates *PackagesUpdates `json:"packages_updates,omitempty"`
HostBackup *HostBackup `json:"host_backup,omitempty"`
HostRuntimes *HostRuntimes `json:"host_runtimes,omitempty"`
WebDbServersFingerprint *WebDbServersFingerprint `json:"web_db_servers_fingerprint,omitempty"`
RedisExposureFingerprint *RedisExposureFingerprint `json:"redis_exposure_fingerprint,omitempty"`
CronTimersInventory *CronTimersInventory `json:"cron_timers_inventory,omitempty"`
CupsExposureFingerprint *CupsExposureFingerprint `json:"cups_exposure_fingerprint,omitempty"`
MtaFingerprint *MtaFingerprint `json:"mta_fingerprint,omitempty"`
ApacheHttpdPosture *ApacheHttpdPosture `json:"apache_httpd_posture,omitempty"`
NginxPosture *NginxPosture `json:"nginx_posture,omitempty"`
PostfixPosture *PostfixPosture `json:"postfix_posture,omitempty"`
FtpPosture *FtpPosture `json:"ftp_posture,omitempty"`
RedisPosture *RedisPosture `json:"redis_posture,omitempty"`
MongodbPosture *MongodbPosture `json:"mongodb_posture,omitempty"`
MysqlPosture *MysqlPosture `json:"mysql_posture,omitempty"`
PostgresPosture *PostgresPosture `json:"postgres_posture,omitempty"`
DockerPosture *DockerPosture `json:"docker_posture,omitempty"`
}
type SudoersAudit ¶ added in v0.2.0
type SudoersAudit struct {
FilesScanned []string `json:"files_scanned,omitempty"`
NopasswdMentionCount int `json:"nopasswd_mention_count"`
AllAllPatternCount int `json:"all_all_pattern_count"`
WildcardRiskLineCount int `json:"wildcard_risk_line_count"`
IncludedirCount int `json:"includedir_count"`
DefaultsRequirettyPresent bool `json:"defaults_requiretty_present"`
DefaultsUsePtyPresent bool `json:"defaults_use_pty_present"`
DefaultsVisiblepwInvertedPresent bool `json:"defaults_visiblepw_inverted_present"`
Error string `json:"error,omitempty"`
}
SudoersAudit is structural sudoers signal without transmitting full rule bodies. When Error is set, MarshalJSON emits only "error" (no zero-valued counters or flags).
func (SudoersAudit) MarshalJSON ¶ added in v0.2.0
func (s SudoersAudit) MarshalJSON() ([]byte, error)
type SysctlDriftEntry ¶ added in v0.2.0
type SysctlDriftEntry struct {
Key string `json:"key"`
FileValue string `json:"file_value,omitempty"`
LiveValue string `json:"live_value,omitempty"`
}
SysctlDriftEntry compares file-based sysctl vs live kernel.
type SysctlLiveBlock ¶ added in v0.2.0
type SysctlLiveBlock struct {
Items []SysctlKV `json:"items"`
Error string `json:"error,omitempty"`
}
SysctlLiveBlock is a bounded CIS/STIG-style allowlist read from /proc/sys.
type SysctlOverlayBlock ¶ added in v0.2.0
type SysctlOverlayBlock struct {
ParsedFiles []string `json:"parsed_files,omitempty"`
Drift []SysctlDriftEntry `json:"drift,omitempty"`
Error string `json:"error,omitempty"`
}
SysctlOverlayBlock parses sysctl.conf / sysctl.d and detects drift vs live.
type SyslogDaemonEntry ¶ added in v0.3.3
type SyslogDaemonEntry struct {
Implementation string `json:"implementation"`
UnitName string `json:"unit_name,omitempty"`
UnitActive *bool `json:"unit_active,omitempty"`
ConfigPathsRead []string `json:"config_paths_read,omitempty"`
RemoteLogHosts []string `json:"remote_log_hosts,omitempty"`
ForwardingRuleSampleLines []string `json:"forwarding_rule_sample_lines,omitempty"`
}
SyslogDaemonEntry is one syslog implementation detected on the host.
type SyslogForwardingPosture ¶ added in v0.3.3
type SyslogForwardingPosture struct {
Daemons []SyslogDaemonEntry `json:"daemons,omitempty"`
Error string `json:"error,omitempty"`
}
SyslogForwardingPosture summarizes syslog daemons and remote forwarding hints (hostnames only).
type SystemdHealth ¶ added in v0.2.0
type SystemdHealth struct {
SystemdPresent bool `json:"systemd_present"`
DefaultTarget string `json:"default_target,omitempty"`
IsSystemRunning string `json:"is_system_running,omitempty"`
FailedUnitsCount *int `json:"failed_units_count,omitempty"`
LegacyRunlevel string `json:"legacy_runlevel,omitempty"`
Error string `json:"error,omitempty"`
}
SystemdHealth is get-default / is-system-running / failed units (bounded).
type TcpWrappersFingerprint ¶ added in v0.2.0
type TcpWrappersFingerprint struct {
HostsAllowPresent bool `json:"hosts_allow_present"`
HostsDenyPresent bool `json:"hosts_deny_present"`
HostsAllowLineCount int `json:"hosts_allow_line_count"`
HostsDenyLineCount int `json:"hosts_deny_line_count"`
HostsAllowSampleLines []string `json:"hosts_allow_sample_lines,omitempty"`
HostsDenySampleLines []string `json:"hosts_deny_sample_lines,omitempty"`
Error string `json:"error,omitempty"`
}
TcpWrappersFingerprint summarizes hosts.allow / hosts.deny without deep semantics.
type UsbStoragePosture ¶ added in v0.2.0
type UsbStoragePosture struct {
UsbStorageLoaded bool `json:"usb_storage_loaded"`
BlacklistUsbStorageLinePresent bool `json:"blacklist_usb_storage_line_present"`
ModprobeFragmentLinesSample []string `json:"modprobe_fragment_lines_sample,omitempty"`
Error string `json:"error,omitempty"`
}
UsbStoragePosture reports usb_storage module and modprobe blacklist hints.
type UserSample ¶
UserSample is intentionally free of login names and home paths (PII); uid/gid/shell only.
type V1 ¶
type V1 struct {
SchemaVersion int `json:"schema_version"`
MachineUUID string `json:"machine_uuid"`
ScanSeq int `json:"scan_seq"`
Hostname string `json:"hostname,omitempty"`
Fqdn string `json:"fqdn,omitempty"`
AgentVersion string `json:"agent_version,omitempty"`
// ActionsPossible is which fixes this machine could actually carry out.
//
// The plan is built in the cloud from this report, which says what is wrong
// with the server but not what the server can do about it. Without this, an
// Ubuntu 14.04 host was offered an SSH fix needing systemd it does not have —
// approved, sent, and refused only on arrival.
//
// omitempty on purpose: an older agent sends nothing, and the cloud has to
// read that as "this agent does not say" rather than "this machine can do
// nothing at all".
ActionsPossible []string `json:"actions_possible,omitempty"`
Components Components `json:"components"`
}
V1 is the only supported ingest shape for schema_version == 1.
AgentVersion is the binary's semantic version (set at link time via -ldflags). The API persists it on the Scan row so the backend can gate behavior on agent age — issue #137 backward-compatibility hook for schema quirks that appear between releases.
type WebDbServersFingerprint ¶ added in v0.2.0
type WebDbServersFingerprint struct {
NginxServerTokens string `json:"nginx_server_tokens,omitempty"`
NginxConfigPathUsed string `json:"nginx_config_path_used,omitempty"`
ApacheServerTokens string `json:"apache_server_tokens,omitempty"`
ApacheServerSignature string `json:"apache_server_signature,omitempty"`
ApacheConfigPathUsed string `json:"apache_config_path_used,omitempty"`
MysqlBindAddress string `json:"mysql_bind_address,omitempty"`
MysqlConfigPathUsed string `json:"mysql_config_path_used,omitempty"`
PostgresqlListenAddresses string `json:"postgresql_listen_addresses,omitempty"`
PostgresqlSsl string `json:"postgresql_ssl,omitempty"`
PostgresqlConfigPathUsed string `json:"postgresql_config_path_used,omitempty"`
Error string `json:"error,omitempty"`
}
WebDbServersFingerprint captures bounded web/DB server config hints (no secrets).