Class: LogStruct::Log::Security

Inherits:
T::Struct
  • Object
show all
Extended by:
T::Sig
Includes:
AddRequestFields, Interfaces::AdditionalDataField, Interfaces::CommonFields, Interfaces::MessageField, Interfaces::RequestFields, MergeAdditionalDataFields, SerializeCommon
Defined in:
lib/log_struct/log/security.rb

Overview

Security log entry for structured logging of security-related events

Constant Summary collapse

SecurityEvent =
T.type_alias {
  T.any(
    Event::IPSpoof,
    Event::CSRFViolation,
    Event::BlockedHost
  )
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from MergeAdditionalDataFields

#merge_additional_data_fields

Methods included from SerializeCommon

#as_json, #serialize_common

Methods included from AddRequestFields

#add_request_fields

Constructor Details

#initialize(source: T.let(Source::Security, Source::Security), event:, timestamp:, level: T.let(Level::Error, Level), message: nil, blocked_host: nil, blocked_hosts: nil, client_ip: nil, x_forwarded_for: nil, additional_data: {}, path: nil, http_method: nil, source_ip: nil, user_agent: nil, referer: nil, request_id: nil) ⇒ void

Parameters:

  • source (Source::Security) (defaults to: T.let(Source::Security, Source::Security))

    Common fields

  • event (SecurityEvent)
  • timestamp (Time)
  • level (Level) (defaults to: T.let(Level::Error, Level))
  • message (String, nil) (defaults to: nil)

    Security-specific fields

  • blocked_host (String, nil) (defaults to: nil)
  • blocked_hosts (Array<String>, nil) (defaults to: nil)
  • client_ip (String, nil) (defaults to: nil)
  • x_forwarded_for (String, nil) (defaults to: nil)
  • additional_data (Hash{Symbol => T.untyped}) (defaults to: {})

    Additional data (merged into hash)

  • path (String, nil) (defaults to: nil)

    Common request fields

  • http_method (String, nil) (defaults to: nil)
  • source_ip (String, nil) (defaults to: nil)
  • user_agent (String, nil) (defaults to: nil)
  • referer (String, nil) (defaults to: nil)
  • request_id (String, nil) (defaults to: nil)


# File ''

const :source, Source::Security, default: T.let(Source::Security, Source::Security)
const :event, SecurityEvent
const :timestamp, Time, factory: -> { Time.now }
const :level, Level, default: T.let(Level::Error, Level)
const :message, T.nilable(String), default: nil
const :blocked_host, T.nilable(String), default: nil
const :blocked_hosts, T.nilable(T::Array[String]), default: nil
const :client_ip, T.nilable(String), default: nil
const :x_forwarded_for, T.nilable(String), default: nil
const :additional_data, T::Hash[Symbol, T.untyped], default: {}
const :path, T.nilable(String), default: nil
const :http_method, T.nilable(String), default: nil, name: "method"
const :source_ip, T.nilable(String), default: nil
const :user_agent, T.nilable(String), default: nil
const :referer, T.nilable(String), default: nil
const :request_id, T.nilable(String), default: nil

Instance Attribute Details

#additional_dataHash{Symbol => T.untyped} (readonly)

Additional data (merged into hash)

Returns:

  • (Hash{Symbol => T.untyped})


# File ''

const :additional_data, T::Hash[Symbol, T.untyped], default: {}

#blocked_hostString? (readonly)

Returns the value of prop blocked_host.

Returns:

  • (String, nil)


# File ''

const :blocked_host, T.nilable(String), default: nil

#blocked_hostsArray<String>? (readonly)

Returns the value of prop blocked_hosts.

Returns:

  • (Array<String>, nil)


# File ''

const :blocked_hosts, T.nilable(T::Array[String]), default: nil

#client_ipString? (readonly)

Returns the value of prop client_ip.

Returns:

  • (String, nil)


# File ''

const :client_ip, T.nilable(String), default: nil

#eventSecurityEvent (readonly)

Returns the value of prop event.

Returns:



# File ''

const :event, SecurityEvent

#http_methodString? (readonly)

Returns the value of prop http_method.

Returns:

  • (String, nil)


# File ''

const :http_method, T.nilable(String), default: nil, name: "method"

#levelLevel (readonly)

Returns the value of prop level.

Returns:



# File ''

const :level, Level, default: T.let(Level::Error, Level)

#messageString? (readonly)

Security-specific fields

Returns:

  • (String, nil)


# File ''

const :message, T.nilable(String), default: nil

#pathString? (readonly)

Common request fields

Returns:

  • (String, nil)


# File ''

const :path, T.nilable(String), default: nil

#refererString? (readonly)

Returns the value of prop referer.

Returns:

  • (String, nil)


# File ''

const :referer, T.nilable(String), default: nil

#request_idString? (readonly)

Returns the value of prop request_id.

Returns:

  • (String, nil)


# File ''

const :request_id, T.nilable(String), default: nil

#sourceSource::Security (readonly)

Common fields

Returns:



# File ''

const :source, Source::Security, default: T.let(Source::Security, Source::Security)

#source_ipString? (readonly)

Returns the value of prop source_ip.

Returns:

  • (String, nil)


# File ''

const :source_ip, T.nilable(String), default: nil

#timestampTime (readonly)

Returns the value of prop timestamp.

Returns:

  • (Time)


# File ''

const :timestamp, Time, factory: -> { Time.now }

#user_agentString? (readonly)

Returns the value of prop user_agent.

Returns:

  • (String, nil)


# File ''

const :user_agent, T.nilable(String), default: nil

#x_forwarded_forString? (readonly)

Returns the value of prop x_forwarded_for.

Returns:

  • (String, nil)


# File ''

const :x_forwarded_for, T.nilable(String), default: nil

Instance Method Details

#serialize(strict = true) ⇒ Hash{Symbol => T.untyped}

Convert the log entry to a hash for serialization

Parameters:

  • strict (Boolean) (defaults to: true)

Returns:

  • (Hash{Symbol => T.untyped})


64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/log_struct/log/security.rb', line 64

def serialize(strict = true)
  hash = serialize_common(strict)
  add_request_fields(hash)
  merge_additional_data_fields(hash)

  # Add security-specific fields
  hash[LOG_KEYS.fetch(:message)] = message if message
  hash[LOG_KEYS.fetch(:blocked_host)] = blocked_host if blocked_host
  hash[LOG_KEYS.fetch(:blocked_hosts)] = blocked_hosts if blocked_hosts
  hash[LOG_KEYS.fetch(:client_ip)] = client_ip if client_ip
  hash[LOG_KEYS.fetch(:x_forwarded_for)] = x_forwarded_for if x_forwarded_for

  hash
end