Testing stuff for mailgen

This commit is contained in:
Johan Björklund 2024-11-21 10:28:40 +01:00
parent fc2b180843
commit 585e276ab4
Signed by: bjorklund
GPG key ID: 5E8401339C7F5037
23 changed files with 1886 additions and 176 deletions

View file

@ -0,0 +1,29 @@
import json
def create_notifications(context):
# Read the substitutions from a file and add it to the context.
# The Context is an Object which is available in all Mailgen-Scripts
# and passed from script to script.
js = {}
with open('/etc/intelmq/mailgen/formats/variables.json', 'r') as j:
js = json.load(j)
substitution_variables = js.get("substitutions")
## Determine the kind of Aggregation.
aggregation = context.directive.aggregate_identifier
asn_or_cidr = "" # Can also be a CC
if "source.asn" in aggregation:
asn_or_cidr += "about AS %s" % aggregation["source.asn"]
elif "cidr" in aggregation:
asn_or_cidr = "about CIDR %s" % aggregation["cidr"]
elif "source.geolocation.cc" in aggregation:
asn_or_cidr = "about your Country %s" % aggregation["source.geolocation.cc"]
substitution_variables["asn_or_cidr"] = asn_or_cidr
context.substitutions = substitution_variables
return None

View file

@ -0,0 +1,987 @@
import copy
import datetime
import base64
import logging
import io
import os.path
log = logging.getLogger(__name__)
log.setLevel("DEBUG")
from intelmqmail.tableformat import build_table_formats, ExtraColumn, IntelMQColumn, format_as_csv
from intelmqmail.notification import Postponed
from intelmqmail.templates import full_template_filename
standard_column_titles = {
# column titles for standard event attributes
'classification.taxonomy' : 'classification_taxonomy',
'classification.identifier' : 'tag',
#'classification.identifier' : 'service', #drone_brute_force#
'classification.type' : 'classification_type',
'destination.account' : 'username',
'destination.asn' : 'dst_asn', #sinkhole_http_drone#ipv6_sinkhole_http_drone#microsoft_sinkhole#outdated_dnssec_key#darknet#http_scanners#ics_scanners#
#'destination.asn' : 'dest_asn', #drone_brute_force#
#'destination.asn' : 'cc_asn', #drone#drone_spam#
'destination.fqdn' : 'http_host', #sinkhole_http_drone#ipv6_sinkhole_http_drone#microsoft_sinkhole#
#'destination.fqdn' : 'cc_dns', #drone#drone_spam#
#'destination.fqdn' : 'dst_dns', #http_scanners#ics_scanners#
#'destination.fqdn' : 'dest_dns', #drone_brute_force#
'destination.geolocation.cc' : 'dst_geo', #sinkhole_http_drone#
#'destination.geolocation.cc' : 'dest_geo', #drone_brute_force#
#'destination.geolocation.cc' : 'cc_geo', #drone#drone_spam#
'destination.geolocation.region' : 'dst_region', #ipv6_sinkhole_http_drone#
'destination.ip' : 'dst_ip',
#'destination.ip' : 'dest_ip', #drone_brute_force#
#'destination.ip' : 'cc_ip', #drone#drone_spam#
'destination.port' : 'dst_port',
#'destination.port' : 'dest_port', #drone_brute_force#
#'destination.port' : 'cc_port', #drone#drone_spam#
'destination.url' : 'url',
#'destination.url' : 'http_url', #ipv6_sinkhole_http_drone#
'event_description.text' : 'category',
'malware.hash' : 'md5hash',
'malware.name' : 'type', #sinkhole_http_drone#microsoft_sinkhole
#'malware.name': 'infection', #drone#
#'malware.name' : 'tag', #ipv6_sinkhole_http_drone#compromised_website
'protocol.application' : 'application', #drone#drone_spam#compromised_website#
#'protocol.application' : 'service', #drone_brute_force#
#'protocol.application' : 'protocol', #ics_scanners#
'protocol.transport' : 'protocol',
'source.account' : 'username',
'source.asn' : 'asn',
'source.fqdn' : 'hostpname',
'source.fqdn' : 'host',
'source.fqdn' : 'http_host',
#'source.asn' : 'src_asn', #ipv6_sinkhole_http_drone#
'source.geolocation.cc' : 'geo',
#source.geolocation.cc' : 'src_geo', #ipv6_sinkhole_http_drone#
'source.geolocation.city' : 'city', #ALLA#
'source.geolocation.region' : 'region',
#source.geolocation.region' : 'src_region', #ipv6_sinkhole_http_drone#
'source.ip' : 'ip', # Nästan alla#
#'source.ip' : 'src', #spam_url"
#'source.ip' : 'src_ip', #ipv6_sinkhole_http_drone#
'source.local_hostname' : 'server_name', #open_mssql#
#'source.local_hostname' : 'server_name', #open_ldap#
'source.port' : 'port',
#'source.port' : 'src_port', #sinkhole_http_drone#ipv6_sinkhole_http_drone#microsoft_sinkhole#amplification_ddos_victim
'source.reverse_dns' : 'hostname',
#'source.reverse_dns' : 'host', #spam_url#
'source.tor_node' : 'tor', #sinkhole_http_drone#microsoft_sinkhole#
'source.url' : 'url',
'time.source' : 'timestamp', #ALLA#
'user_agent' : 'agent', #2st
#'user_agent' : 'http_agent', #sinkhole_http_drone#
#'user_agent' : 'user_agent', #sandbox_url#
}
def add_default_titles(columns):
"""
Add the standard title to each of the columns.
Args:
columns:
Returns:
"""
log.debug("add_default_titles; %r",columns)
extended_columns = []
for col in columns:
if isinstance(col, str):
if col.startswith("extra:"):
extended_columns.append(ExtraColumn(col[6:],col[6:]))
else:
extended_columns.append(IntelMQColumn(standard_column_titles[col],col))
else:
extended_columns.append(col)
log.debug("add_default_titles; %r",extended_columns)
return extended_columns
# This function takes a list of tuples as argument,
# The tuples are made up of (<event_data_format>,[list of columns]
def table_formats_with_default_titles(formats):
"""
Frontend for build_table_formats that adds standard column titles.
Args:
formats: a list of formats
Returns:
A TableFormat
Each format is a tuple made up of a "key" that should match an event_data_format and a list of columns
A column can be given in four different ways
1) A single key string. The string will be translated using the standard_column_titles dictionary.
If it starts with extra: it will become an ExtraColumn instance, otherwise an IntelMQColumn instance
2) A tuple("<key>","<title>"). The key must not start with extra:
3) An IntelMQColumn("<title>", "<key>")
4) An ExtraColumn("<title>","<key>"). Please note that there is no "extra:" in the key
Example;
table_formats_with_default_titles([
(csv_Accessible-RDP", ["source.ip",
"extra:handshake",
("time.source", "timestamp"),
IntelMQColumn("port_number", "source.port"),
ExtraColumn("certificate_length", "cert_length"),
]),
])
"""
log.debug("table_formats_with_default_titles: %r",formats)
for name, columns in formats:
log.debug("table_formats_with_default_titles: %r, %r",name, add_default_titles(columns))
btf = build_table_formats([(name, add_default_titles(columns))
for name, columns in formats])
log.debug("table_formats_with_default_titles: %r", btf)
return btf
return build_table_formats([(name, add_default_titles(columns))
for name, columns in formats])
# Used to create ${events_as_csv}
csv_formats = table_formats_with_default_titles([
('csv_Amplification-DDoS-Victim',
[
'time.source',
'source.ip',
'protocol.transport',
'destination.port',
'extra:tag',
'source.port',
('source.port', 'src_port'),
'source.reverse_dns',
'source.asn',
'source.geolocation.cc',
'source.geolocation.region',
'source.geolocation.city',
'extra:naics',
'extra:sic',
'extra:request',
'extra:count',
'extra:bytes',
'extra:sensor_geo',
'extra:sector',
'extra:end_time',
'extra:public_source',
]),
("csv_Accessible-FTP", [
#"timestamp","ip","protocol","port","hostname","tag","asn","geo","region","city","naics","sic","banner","handshake","cipher_suite","cert_length","subject_common_name","issuer_common_name","cert_issue_date","cert_expiration_date","sha1_fingerprint","cert_serial_number","ssl_version","signature_algorithm","key_algorithm","subject_organization_name","subject_organization_unit_name","subject_country","subject_state_or_province_name","subject_locality_name","subject_street_address","subject_postal_code","subject_surname","subject_given_name","subject_email_address","subject_business_category","subject_serial_number","issuer_organization_name","issuer_organization_unit_name","issuer_country","issuer_state_or_province_name","issuer_locality_name","issuer_street_address","issuer_postal_code","issuer_surname","issuer_given_name","issuer_email_address","issuer_business_category","issuer_serial_number","sha256_fingerprint","sha512_fingerprint","md5_fingerprint","cert_valid","self_signed","cert_expired","validation_level","auth_tls_response","auth_ssl_response","tlsv13_support","tlsv13_cipher"
'time.source',
'source.ip',
'protocol.transport',
'source.port',
'source.reverse_dns',
'classification.identifier',
'source.asn',
'source.geolocation.cc',
'source.geolocation.region',
'source.geolocation.city',
'extra:naics',
'extra:sic',
'extra:banner',
'extra:handshake',
'extra:cipher_suite',
'extra:cert_length',
'extra:subject_common_name',
'extra:issuer_common_name',
'extra:cert_issue_date',
'extra:cert_expiration_date',
'extra:sha1_fingerprint',
'extra:cert_serial_number',
'extra:ssl_version',
'extra:signature_algorithm',
'extra:key_algorithm',
'extra:subject_organization_name',
'extra:subject_organization_unit_name',
'extra:subject_country',
'extra:subject_state_or_province_name',
'extra:subject_locality_name',
'extra:subject_street_address',
'extra:subject_postal_code',
'extra:subject_surname',
'extra:subject_given_name',
'extra:subject_email_address',
'extra:subject_business_category',
'extra:subject_serial_number',
'extra:issuer_organization_name',
'extra:issuer_organization_unit_name',
'extra:issuer_country',
'extra:issuer_state_or_province_name',
'extra:issuer_locality_name',
'extra:issuer_street_address',
'extra:issuer_postal_code',
'extra:issuer_surname',
'extra:issuer_given_name',
'extra:issuer_email_address',
'extra:issuer_business_category',
'extra:issuer_serial_number',
'extra:sha256_fingerprint',
'extra:sha512_fingerprint',
'extra:md5_fingerprint',
'extra:cert_valid',
'extra:self_signed',
'extra:cert_expired',
'extra:validation_level',
'extra:auth_tls_response',
'extra:auth_ssl_response',
'extra:tlsv13_support',
'extra:tlsv13_cipher',
]),
("csv_Accessible-RDP", [
"time.source",
"source.ip",
("source.port","port"),
"source.reverse_dns",
("classification.identifier", "tag"),
"extra:handshake",
"source.asn",
"source.geolocation.cc",
"source.geolocation.region",
"source.geolocation.city",
"extra:rdp_protocol",
"extra:cert_length",
"extra:subject_common_name",
"extra:issuer_common_name",
"extra:cert_issue_date",
"extra:cert_expiration_date",
"extra:sha1_fingerprint",
'extra:cert_serial_number',
'extra:ssl_version',
'extra:signature_algorithm',
'extra:key_algorithm',
'extra:sha256_fingerprint',
'extra:sha512_fingerprint',
'extra:md5_fingerprint',
'extra:naics',
'extra:sic',
'extra:sector',
'extra:tlsv13_support',
'extra:tlsv13_cipher',
'extra:cve20190708_vulnerable',
'extra:bluekeep_vulnerabe',
]),
("csv_Accessible-SMB", [
# "timestamp","ip","port","hostname","asn","geo","region","city","naics","sic","smb_implant","arch","key"
'time.source',
'source.ip',
'source.port',
'source.reverse_dns',
'source.asn',
'source.geolocation.cc',
'source.geolocation.region',
'source.geolocation.city',
'extra:naics',
'extra:sic',
'extra:smb_implant',
'extra:arch',
'extra:key',
]),
("csv_Accessible-Telnet", [
#"timestamp","ip","protocol","port","hostname","tag","asn","geo","region","city","naics","sic","banner"
'time.source',
'source.ip',
'protocol.transport',
'source.port',
'source.reverse_dns',
'classification.identifier',
'source.asn',
'source.geolocation.cc',
'source.geolocation.region',
'source.geolocation.city',
'extra:naics',
'extra:sic',
'extra:banner',
]),
("csv_Accessible-VNC", [
#"timestamp","ip","port","hostname","asn","geo","region","city","naics","sic","product","banner"
'time.source',
'source.ip',
'source.port',
'source.reverse_dns',
'source.asn',
'source.geolocation.cc',
'source.geolocation.region',
'source.geolocation.city',
'extra:naics',
'extra:sic',
'extra:product',
'extra:banner',
]),
("csv_Block-Listed-IP", [
"time.source",
"source.ip",
"source.reverse_dns",
"extra:source",
"extra:reason",
"source.asn",
"source.geolocation.cc",
"source.geolocation.region",
"source.geolocation.city",
"extra:naics",
"extra:sic",
"extra:sector",
]),
("csv_Drone", [
#"timestamp","ip","port","asn","geo","region","city","hostname","type","infection","url","agent","cc_ip","cc_port","cc_asn","cc_geo","cc_dns","count","proxy","application","p0f_genre","p0f_detail","machine_name","id","naics","sic","cc_naics","cc_sic","sector","cc_sector","ssl_cipher","family","tag","public_source",
'time.source',
'source.ip',
'source.port',
'source.asn',
'source.geolocation.cc',
'source.geolocation.region',
'source.geolocation.city',
'source.reverse_dns',
('protocol.transport','type'), #Will often fail and be put in extra:type instead because shadowserver puts "http" as value
('malware.name', 'infection'),
'destination.url',
'extra:user_agent',
('destination.ip', 'cc_ip'),
('destination.port', 'cc_port'),
('destination.asn', 'cc_asn'),
('destination.geolocation.cc', 'cc_geo'),
('destination.fqdn', 'cc_dns'),
ExtraColumn('connection_count','count'),
'extra:proxy',
'protocol.application',
ExtraColumn('os.name','p0f_genre'),
ExtraColumn('os.version','p0f_detail'),
'extra:machine_name',
'extra:id',
'extra:naics',
'extra:sic',
ExtraColumn('destination.naics', 'cc_naics'),
ExtraColumn('destination.sic', 'cc_sic'),
ExtraColumn('destination.sector', 'cc_sector'),
'extra:sector',
'extra:ssl_cipher',
'extra:family',
'extra:tag',
'extra:public_source',
'extra:type', # In case protocol.transport fails. The report will not be 100% shadowserver compatible
]),
("csv_Drone-Brute-Force", [
#"timestamp","ip","port","asn","geo","region","city","hostname","dest_ip","dest_port","dest_asn","dest_geo","dest_dns","service","naics","sic","dest_naics","dest_sic","sector","dest_sector","public_source","start_time","end_time","client_version","username","password","payload_url","payload_md5"
'time.source',
'source.ip',
'source.port',
('source.asn', 'asn'),
('source.geolocation.cc', 'geo'),
('source.geolocation.region', 'region'),
('source.geolocation.city', 'city'),
('source.reverse_dns', 'hostname'),
('destination.ip', 'dest_ip'),
('destination.port', 'dest_port'),
('destination.asn', 'dest_asn'),
('destination.geolocation.cc', 'dest_geo'),
('destination.fqdn', 'dest_dns'),
('protocol.application', 'service'),
'extra:naics',
'extra:sic',
ExtraColumn('destination.naics', 'dest_naics'),
ExtraColumn('destination.sic', 'dest_sic'),
'extra:sector',
ExtraColumn('destination.sector', 'dest_sector'),
'extra:public_source',
'extra:start_time',
'extra:end_time',
'extra:client_version',
'destination.account',
'extra:password',
'extra:payload_url',
'extra:payload_md5',
]),
("csv_Microsoft-Sinkhole", [
#"timestamp","ip","asn","geo","url","type","http_agent","tor","src_port","p0f_genre","p0f_detail","hostname","dst_port","http_host","http_referer","http_referer_ip","http_referer_asn","http_referer_geo","dst_ip","dst_asn","dst_geo","naics","sic","http_referer_naics","http_referer_sic","sector","ssl_cipher","application","version"
'time.source',
'source.ip',
'source.asn',
'source.geolocation.cc',
'destination.url',
'malware.name',
'extra:http_agent',
'source.tor_node',
('source.port', 'src_port'),
ExtraColumn('os.name','p0f_genre'),
ExtraColumn('os.version','p0f_detail'),
'source.reverse_dns',
'destination.port',
'destination.fqdn',
'extra:http_referer',
'extra:http_referer_ip',
'extra:http_referer_asn',
'extra:http_referer_geo',
'destination.ip',
'destination.asn',
'destination.geolocation.cc',
'extra:naics',
'extra:sic',
'extra:http_referer_naics',
'extra:http_referer_sic',
'extra:sector',
'extra:ssl_cipher',
'extra:application',
'extra:version',
]),
("csv_Open-Elasticsearch", [
#"timestamp","ip","protocol","port","hostname","tag","version","asn","geo","region","city","naics","sic","ok","name","cluster_name","status","build_hash","build_timestamp","build_snapshot","lucene_version","tagline","sector"
'time.source',
'source.ip',
'protocol.transport',
'source.port',
'source.reverse_dns',
'classification.identifier',
'extra:version',
'source.asn',
'source.geolocation.cc',
'source.geolocation.region',
'source.geolocation.city',
'extra:naics',
'extra:sic',
'extra:ok',
'extra:name',
'extra:cluster_name',
'extra:status',
'extra:build_hash',
'extra:build_timestamp',
'extra:build_snapshot',
'extra:lucene_version',
'extra:tagline',
'extra:sector',
]),
("csv_Open-Memcached", [
#"timestamp","ip","protocol","port","hostname","tag","version","asn","geo","region","city","naics","sic","pid","pointer_size","uptime","time","curr_connections","total_connections","sector"
'time.source',
'source.ip',
'protocol.transport',
'source.port',
'source.reverse_dns',
'classification.identifier',
'extra:version',
'source.asn',
'source.geolocation.cc',
'source.geolocation.region',
'source.geolocation.city',
'extra:naics',
'extra:sic',
'extra:pid',
'extra:pointer_size',
'extra:uptime',
'extra:time',
'extra:curr_connections',
'extra:total_connections',
'extra:sector',
]),
("csv_Open-LDAP", [
#"timestamp","ip","protocol","port","hostname","tag","asn","geo","region","city","naics","sic","size","configuration_naming_context","current_time","default_naming_context","dns_host_name","domain_controller_functionality","domain_functionality","ds_service_name","forest_functionality","highest_committed_usn","is_global_catalog_ready","is_synchronized","ldap_service_name","naming_contexts","root_domain_naming_context","schema_naming_context","server_name","subschema_subentry","supported_capabilities","supported_control","supported_ldap_policies","supported_ldap_version","supported_sasl_mechanisms"
'time.source',
'source.ip',
'protocol.transport',
'source.port',
'source.reverse_dns',
'classification.identifier',
'source.asn',
'source.geolocation.cc',
'source.geolocation.region',
'source.geolocation.city',
'extra:naics',
'extra:sic',
'extra:size',
'extra:configuration_naming_context',
'extra:current_time',
'extra:default_naming_context',
('source.local_hostname', 'dns_host_name'),
'extra:domain_controller_functionality',
'extra:domain_functionality',
'extra:ds_service_name',
'extra:forest_functionality',
'extra:highest_committed_usn',
'extra:is_global_catalog_ready',
'extra:is_synchronized',
'extra:ldap_service_name',
'extra:naming_contexts',
'extra:root_domain_naming_context',
'extra:schema_naming_context',
'extra:server_name',
'extra:subschema_subentry',
'extra:supported_capabilities',
'extra:supported_control',
'extra:supported_ldap_policies',
'extra:supported_ldap_version',
'extra:supported_sasl_mechanisms',
]),
("csv_Open-LDAP-TCP", [
#"timestamp","ip","protocol","port","hostname","tag","asn","geo","region","city","naics","sic","size","configuration_naming_context","current_time","default_naming_context","dns_host_name","domain_controller_functionality","domain_functionality","ds_service_name","forest_functionality","highest_committed_usn","is_global_catalog_ready","is_synchronized","ldap_service_name","naming_contexts","root_domain_naming_context","schema_naming_context","server_name","subschema_subentry","supported_capabilities","supported_control","supported_ldap_policies","supported_ldap_version","supported_sasl_mechanisms"
'time.source',
'source.ip',
'protocol.transport',
'source.port',
'source.reverse_dns',
'classification.identifier',
'source.asn',
'source.geolocation.cc',
'source.geolocation.region',
'source.geolocation.city',
'extra:naics',
'extra:sic',
'extra:size',
'extra:configuration_naming_context',
'extra:current_time',
'extra:default_naming_context',
('source.local_hostname', 'dns_host_name'),
'extra:domain_controller_functionality',
'extra:domain_functionality',
'extra:ds_service_name',
'extra:forest_functionality',
'extra:highest_committed_usn',
'extra:is_global_catalog_ready',
'extra:is_synchronized',
'extra:ldap_service_name',
'extra:naming_contexts',
'extra:root_domain_naming_context',
'extra:schema_naming_context',
'extra:server_name',
'extra:subschema_subentry',
'extra:supported_capabilities',
'extra:supported_control',
'extra:supported_ldap_policies',
'extra:supported_ldap_version',
'extra:supported_sasl_mechanisms',
]),
("csv_Open-MongoDB", [
#"timestamp","ip","protocol","port","hostname","tag","version","asn","geo","region","city","naics","sic","gitversion","sysinfo","opensslversion","allocator","javascriptengine","bits","maxbsonobjectsize","ok","visible_databases","sector"
'time.source',
'source.ip',
'protocol.transport',
'source.port',
'source.reverse_dns',
'classification.identifier',
'extra:version',
'source.asn',
'source.geolocation.cc',
'source.geolocation.region',
'source.geolocation.city',
'extra:naics',
'extra:sic',
'extra:gitversion',
'extra:sysinfo',
'extra:opensslversion',
'extra:allocator',
'extra:javascriptengine',
'extra:bits',
'extra:maxbsonobjectsize',
'extra:ok',
'extra:visible_databases',
'extra:sector',
]),
("csv_Sinkhole-HTTP-Drone", [
#"timestamp","ip","asn","geo","url","type","http_agent","tor","src_port","p0f_genre","p0f_detail","hostname","dst_port","http_host","http_referer","http_referer_ip","http_referer_asn","http_referer_geo","dst_ip","dst_asn","dst_geo","naics","sic","http_referer_naics","http_referer_sic","sector","ssl_cipher","application","version"
'time.source',
'source.ip',
'source.asn',
'source.geolocation.cc',
'destination.url',
('malware.name', 'infection'),
'extra:user_agent',
'source.tor_node',
'source.port',
ExtraColumn('os.name','p0f_genre'),
ExtraColumn('os.version','p0f_detail'),
'source.reverse_dns',
'destination.port',
'destination.fqdn',
'extra:http_referer',
'extra:http_referer_ip',
'extra:http_referer_asn',
'extra:http_referer_geo',
'destination.ip',
'destination.asn',
'destination.geolocation.cc',
'extra:naics',
'extra:sic',
'extra:http_referer_naics',
'extra:http_referer_sic',
'extra:sector',
'extra:ssl_cipher',
'extra:application',
'extra:version',
]),
("csv_SSL-POODLE-Vulnerable-Servers", [
#"timestamp","ip","port","hostname","tag","handshake","asn","geo","region","city","cipher_suite","ssl_poodle","cert_length","subject_common_name","issuer_common_name","cert_issue_date","cert_expiration_date","sha1_fingerprint","cert_serial_number","ssl_version","signature_algorithm","key_algorithm","subject_organization_name","subject_organization_unit_name","subject_country","subject_state_or_province_name","subject_locality_name","subject_street_address","subject_postal_code","subject_surname","subject_given_name","subject_email_address","subject_business_category","subject_serial_number","issuer_organization_name","issuer_organization_unit_name","issuer_country","issuer_state_or_province_name","issuer_locality_name","issuer_street_address","issuer_postal_code","issuer_surname","issuer_given_name","issuer_email_address","issuer_business_category","issuer_serial_number","naics","sic","sector","sha256_fingerprint","sha512_fingerprint","md5_fingerprint","http_response_type","http_code","http_reason","content_type","http_connection","www_authenticate","set_cookie","server_type","content_length","transfer_encoding","http_date","cert_valid","self_signed","cert_expired","browser_trusted","validation_level","browser_error","tlsv13_support","tlsv13_cipher","raw_cert","raw_cert_chain"
'time.source',
'source.ip',
'source.port',
'source.reverse_dns',
'classification.identifier',
'extra:handshake',
'source.asn',
'source.geolocation.cc',
'source.geolocation.region',
'source.geolocation.city',
'extra:cipher_suite',
'extra:ssl_poodle',
'extra:cert_length',
'extra:subject_common_name',
'extra:issuer_common_name',
'extra:cert_issue_date',
'extra:cert_expiration_date',
'extra:sha1_fingerprint',
'extra:cert_serial_number',
'extra:ssl_version',
'extra:signature_algorithm',
'extra:key_algorithm',
'extra:subject_organization_name',
'extra:subject_organization_unit_name',
'extra:subject_country',
'extra:subject_state_or_province_name',
'extra:subject_locality_name',
'extra:subject_street_address',
'extra:subject_postal_code',
'extra:subject_surname',
'extra:subject_given_name',
'extra:subject_email_address',
'extra:subject_business_category',
'extra:subject_serial_number',
'extra:issuer_organization_name',
'extra:issuer_organization_unit_name',
'extra:issuer_country',
'extra:issuer_state_or_province_name',
'extra:issuer_locality_name',
'extra:issuer_street_address',
'extra:issuer_postal_code',
'extra:issuer_surname',
'extra:issuer_given_name',
'extra:issuer_email_address',
'extra:issuer_business_category',
'extra:issuer_serial_number',
'extra:naics',
'extra:sic',
'extra:sector',
'extra:sha256_fingerprint',
'extra:sha512_fingerprint',
'extra:md5_fingerprint',
'extra:http_response_type',
'extra:http_code',
'extra:http_reason',
'extra:content_type',
'extra:http_connection',
'extra:www_authenticate',
'extra:set_cookie',
'extra:server_type',
'extra:content_length',
'extra:transfer_encoding',
'extra:http_date',
'extra:cert_valid',
'extra:self_signed',
'extra:cert_expired',
'extra:browser_trusted',
'extra:validation_level',
'extra:browser_error',
'extra:tlsv13_support',
'extra:tlsv13_cipher',
]),
])
# Used to create ${inline_events}
inline_formats = table_formats_with_default_titles([
("csv_Amplification-DDoS-Victim", [
"time.source",
('source.ip' , 'victim_ip'),
('source.port' , 'victim_target_port'),
('source.reverse_dns' , 'victim_hostname'),
'extra:end_time',
('destination.port' , 'ddos_source_port'),
]),
("csv_Accessible-FTP", [
'time.source',
'source.ip',
'source.port',
'source.reverse_dns',
]),
("csv_Accessible-RDP", [
"time.source",
"source.ip",
("source.port", "port"),
'source.reverse_dns',
'extra:subject_common_name',
'extra:cve20190708_vulnerable',
'extra:bluekeep_vulnerable',
]),
("csv_Accessible-SMB", [
'time.source',
'source.ip',
'source.port',
'source.reverse_dns',
'extra:smb_implant',
]),
("csv_Accessible-Telnet", [
'time.source',
'source.ip',
'source.port',
'source.reverse_dns',
]),
("csv_Accessible-VNC", [
'time.source',
'source.ip',
'source.port',
'source.reverse_dns',
]),
("csv_Block-Listed-IP", [
"time.source",
"source.ip",
"source.reverse_dns",
"extra:source",
"extra:reason",
]),
("csv_Drone", [
'time.source',
'source.ip',
'source.port',
'source.reverse_dns',
('classification.identifier', 'malware_family'),
'destination.url',
('destination.ip', 'cc_ip'),
('destination.port', 'cc_port'),
('destination.fqdn', 'cc_dns'),
'extra:public_source',
]),
("csv_Drone-Brute-Force", [
'time.source',
'source.ip',
'source.port',
('source.reverse_dns', 'hostname'),
('destination.ip', 'dest_ip'),
('destination.port', 'dest_port'),
'extra:start_time',
'extra:end_time',
'destination.account',
'extra:password',
]),
("csv_Microsoft-Sinkhole", [
'time.source',
'source.ip',
'source.port',
'source.reverse_dns',
('classification.identifier', 'malware_family'),
'destination.url',
'destination.ip',
'destination.port',
]),
("csv_Open-Elasticsearch", [
'time.source',
'source.ip',
'source.port',
'source.reverse_dns',
'extra:version',
'extra:name',
]),
("csv_Open-LDAP", [
'time.source',
'source.ip',
'source.port',
'protocol.transport',
'source.reverse_dns',
]),
("csv_Open-LDAP-TCP", [
'time.source',
'source.ip',
'source.port',
'protocol.transport',
'source.reverse_dns',
]),
("csv_Open-Memcached", [
'time.source',
'source.ip',
'source.port',
'protocol.transport',
'source.reverse_dns',
'extra:version',
]),
("csv_Open-MongoDB", [
'time.source',
'source.ip',
'source.port',
'source.reverse_dns',
'extra:version',
'extra:visible_databases',
'extra:opensslversion',
]),
("csv_Sinkhole-HTTP-Drone", [
'time.source',
'source.ip',
'source.port',
'source.reverse_dns',
('classification.identifier', 'malware_family'),
'destination.url',
'destination.ip',
'destination.port',
]),
("csv_DNS-open-resolvers", [
"source.asn",
"source.ip",
"time.source",
]),
("csv_Open-Portmapper", [
"source.asn",
"source.ip",
"time.source",
]),
("csv_Open-SNMP", [
"source.asn",
"source.ip",
"time.source",
"extra:system_desc",
]),
("csv_Open-MSSQL", [
"source.asn",
"source.ip",
"time.source",
"extra:mssql_version",
"source.local_hostname",
ExtraColumn("instance_name", "instance_name"),
]),
("csv_Open-Chargen", [
"source.asn",
"source.ip",
"time.source",
]),
("csv_Open-IPMI", [
"source.asn",
"source.ip",
"time.source",
]),
("csv_Open-NetBIOS", [
"source.asn",
"source.ip",
"time.source",
"extra:workgroup_name",
"extra:machine_name",
]),
("csv_NTP-Monitor", [
"source.asn",
"source.ip",
"time.source",
]),
("csv_Open-mDNS", [
"source.asn",
"source.ip",
"time.source",
"extra:workstation_info",
]),
("csv_Open-Redis", [
"source.asn",
"source.ip",
"time.source",
"extra:redis_version",
]),
("csv_Open-SSDP", [
"source.asn",
"source.ip",
"time.source",
"extra:ssdp_server",
]),
("csv_Ssl-Freak-Scan", [
"source.asn",
"source.ip",
"time.source",
"source.reverse_dns",
"extra:subject_common_name",
"extra:issuer_common_name",
"extra:freak_cipher_suite",
]),
("csv_SSL-POODLE-Vulnerable-Servers", [
#"timestamp","ip","port","hostname","tag","handshake","asn","geo","region","city","cipher_suite","ssl_poodle","cert_length","subject_common_name","issuer_common_name","cert_issue_date","cert_expiration_date","sha1_fingerprint","cert_serial_number","ssl_version","signature_algorithm","key_algorithm","subject_organization_name","subject_organization_unit_name","subject_country","subject_state_or_province_name","subject_locality_name","subject_street_address","subject_postal_code","subject_surname","subject_given_name","subject_email_address","subject_business_category","subject_serial_number","issuer_organization_name","issuer_organization_unit_name","issuer_country","issuer_state_or_province_name","issuer_locality_name","issuer_street_address","issuer_postal_code","issuer_surname","issuer_given_name","issuer_email_address","issuer_business_category","issuer_serial_number","naics","sic","sector","sha256_fingerprint","sha512_fingerprint","md5_fingerprint","http_response_type","http_code","http_reason","content_type","http_connection","www_authenticate","set_cookie","server_type","content_length","transfer_encoding","http_date","cert_valid","self_signed","cert_expired","browser_trusted","validation_level","browser_error","tlsv13_support","tlsv13_cipher","raw_cert","raw_cert_chain"
'time.source',
'source.ip',
'source.port',
'source.reverse_dns',
'extra:handshake',
'extra:cipher_suite',
'extra:cert_length',
'extra:subject_common_name',
'extra:cert_issue_date',
'extra:cert_expiration_date',
]),
("csv_Ssl-Scan", [
"source.asn",
"source.ip",
"time.source",
"source.reverse_dns",
"extra:subject_common_name",
"extra:issuer_common_name",
]),
])
# Minimum age of the newest of a group of directives being aggregated
#
# The value should be chosen such that it's very unlikely that any more
# directives will be added to the event database that would end up in
# the same aggregation when the newest directive has reached at least
# this age.
#minimum_directive_age = datetime.timedelta(minutes=15)
minimum_directive_age = datetime.timedelta(minutes=1)
#minimum_observation_age = datetime.timedelta(hours=2)
minimum_observation_age = datetime.timedelta(minutes=1)
def create_notifications(context):
"""
Args:
context:
Returns:
"""
if context.directive.notification_format == "shadowserver":
if context.directive.event_data_format not in inline_formats and context.directive.event_data_format not in csv_formats:
# We don't handle this event type
return None
template_file = full_template_filename(context.config["template_dir"],context.directive.template_name)
if not os.path.isfile(template_file):
raise RuntimeError("Template file %s missing" % (template_file,))
context.logger.debug("10shadowservercsv.py: notification format is shadowserver and we have something to do")
format_spec = None
format_spec2 = None
if context.directive.event_data_format in inline_formats:
format_spec2 = inline_formats.get(context.directive.event_data_format)
events = context.load_events(format_spec2.event_table_columns())
context.logger.debug("Events loaded: %r",events)
if context.directive.event_data_format in csv_formats:
format_spec = csv_formats.get(context.directive.event_data_format)
context.logger.debug("format_spec: %r",format_spec)
context.logger.debug("Events loaded: %r", context.load_events(format_spec.event_table_columns()))
# Copy substitutions from the context.
# This way we can edit the variables in this script
# without changing the context.
substitution_variables = copy.copy(context.substitutions)
context.logger.debug("Format_spec2: %r",format_spec2)
if format_spec2 is not None:
# context.logger.debug("Format_spec2: column_keys: %r(%r)",type(format_spec2.column_keys()),format_spec2.column_keys())
# context.logger.debug("Format_spec2: column_titles: %r(%r)",type(format_spec2.column_titles()),format_spec2.column_titles())
# context.logger.debug("Format_spec2: event_table_columns: %r(%r)",type(format_spec2.event_table_columns()),format_spec2.event_table_columns())
substitution_variables["inline_events"] = format_as_csv(format_spec2,events)
else:
substitution_variables["inline_events"] = "Inga inline data att visa. Se bifogad CSV-fil istället"
if format_spec is not None:
# if (context.age_of_newest_directive() < minimum_directive_age
# or context.age_of_observation() < minimum_observation_age):
# if (context.age_of_newest_directive() < minimum_directive_age):
# return Postponed
return context.mail_format_as_csv(format_spec, substitutions=substitution_variables,attach_event_data=True)
elif format_spec2 is not None:
return context.mail_format_as_csv(format_spec2, substitutions=substitution_variables)
else:
# We should never be here
raise RuntimeError("Strange. Couldn't format events according to directives")
return None

View file

@ -0,0 +1,10 @@
{
"substitutions": {
"ticket_prefix": "SUNET-IntelMQ#",
"data_inline_separator": "-----------------------------------------------------------------------",
"data_explanation": "Lista över påverkade system\nFör en mer detaljerad lista hänvisas till den bifogade csv-filen",
"note_automated": "Detta meddelande har automatgenererats baserat på information från Shadowserver. Hör av er om ni har några frågor om denna tjänst. För system där ni inte vill ha en rapport kan vi göra undantag. Enklast är om ni svarar på den rapport som ni vill göra undantag för och tala om vilket/vilka ip-nummer som skall vitlistas.",
"note_risk" : "Notera att Detta är en riskrapport och inte en direkt uppmaning till åtgärd. Det är bara ni som kan avgöra om tjänsten utgör en risk för er organisation. Vi på SUNET CERT beskriver längre ner vad vi anser riskerna är och våra generella rekommendationer.",
"signature" : "Hälsningar,\n\nSUNET CERT <cert@cert.sunet.se>"
}
}

View file

@ -0,0 +1,47 @@
Öppna FTP-servrar hos ${org_name} [${ticket_prefix} ${ticket_number}]
Hej!
Vi har fått en rapport om öppna FTP-servrar på ert nät.
${signature}
${data_inline_separator}
${data_explanation}
${inline_events}
${data_inline_separator}
Förklaring till fälten ovan:
timestamp: Den tidpunkt Shadowserver scannade tjänsten
ip: IP-adress på systemet med öppen FTP
port: Porten med öppen FTP (21)
hostname: Reverse DNS namn för ip
En FTP server är inte nödvändigtvis ett problem om den är korrekt konfigurerad och används på rätt sätt. Det är dock lätt att göra fel och det är inte ovanligt att utrustning som ansluts till nätet kommer med standardvärden för användare/lösenord. Dessutom finns en liten risk att FTP-servern är uppsatt av illasinade aktörer.
Några exempel på tänkbara problem är:
* System som exponeras med defaultlösenord. (Även om man ändrar "direkt" kan det räcka med några få minuter för att tjänsten/utrustningen skall bli ägd)
* Sårbar version av FTP-serverns mjukvara. Flera varianter och versioner att hålla reda på
* Autenticerad anslutning över okrypterad länk. Konton/lösenord kan avlyssnas och särskilt allvarligt om dessa även används på andra system.
* Känslig data som överförs på okrypterad länk
* Autenticerad FTP där man glömt stänga av anonym access.
* Blandning av anonym/autenticerad anslutning där känslig data oavsiktligt exponeras för anonym anslutning..
* Anonym anslutning med tillåten uppladdning, där det som laddas upp går att ladda ner anonymt. -> Delning av copyrightskyddat material och spridning av malware.
SUNET CERTs rekommendation är att ni ser över listan så att bara det som skall vara exponerat mot Internet är det.
Ni kan t.ex. försöka sortera listan i följande kategorier.
1) Korrekt konfigurerade servrar som skall vara nåbara från Internet. Meddela oss så vitlistar vi dessa så ni slipper vidare utskick.
2) Korrekt konfigurerade servrar som inte behöver vara nåbara från Internet. Begränsa access
3) Felaktigt konfigurerade som behöver åtgärdas innan de exponeras vare sig internt eller externt.
4) Felaktigt konfigurerade som skall stängas av.
Referenser:
https://www.shadowserver.org/what-we-do/network-reporting/accessible-ftp-report/
${note_automated}
${signature}

View file

@ -0,0 +1,43 @@
Öppen RDP rapport för ${org_name} [${ticket_prefix} ${ticket_number}]
Hej!
Vi har fått en rapport om att det finns öppna RDP tjänster på ert nät.
Det kan vara så att ni har goda skäl att ha dessa tjänster öppna och i
så fall kan vi göra en vitlistning för de maskiner det gäller.
${signature}
${data_inline_separator}
${data_explanation}
${inline_events}
${data_inline_separator}
Förklaring till fälten ovan:
timestamp: Den tidpunkt Shadowserver scannade tjänsten
ip: IP-adress på systemet med öppen RDP
port: Porten med öppen RDP (3389)
hostname: Reverse DNS namn för ip
CVE-2019-0708: True/False: True indikerar att tjänsten är sårbar för CVE-2019-0708
BLUEKEEP: True/False: True indikerar att tjänsten är sårbar för BlueKeep (skall rimligtvis ha samma värde som CVE-2019-0708)
Öppna RDP-tjänster kan innebära ett säkerhetsproblem om de inte är korrekt konfigurerade. De kan också oavsiktligt röja information via sina SSL-certifikat.
Historiskt har det funnits en del sårbarheter i RDP, noterbart är CVE-2019-0707 (BlueKeep).
RDP används av angripare för att försöka knäcka lösenord och även om man har starka lösenord finns en risk att konton blir temporärt blockerade pga för många misslyckade inloggningsförsök.
SUNET CERTs rekommendation är att inte ha RDP öppet direkt mot nätet. Finns behovet rekommenderar vi att man använder Remote Desktop Gateway eller VPN.
Om ni har goda skäl att ha RDP-tjänsten öppen kan vi vitlista så ni slipper fler utskick. Vitlistning kan göras för enskilda maskiner, nätblock eller hela organisationen.
Referenser:
https://www.shadowserver.org/what-we-do/network-reporting/accessible-rdp-report/
https://security.berkeley.edu/education-awareness/best-practices-how-tos/system-application-security/securing-remote-desktop-rdp
${note_automated}
${signature}

View file

@ -0,0 +1,37 @@
Öppen SMB rapport för ${org_name} [${ticket_prefix} ${ticket_number}]
Hej!
Vi har fått en rapport om att det finns öppna SMB tjänster på ert nät.
${signature}
${data_inline_separator}
${data_explanation}
${inline_events}
${data_inline_separator}
Förklaring till fälten ovan:
timestamp: Den tidpunkt Shadowserver scannade tjänsten
ip: IP-adress på systemet med öppen SMB
port: Porten med öppen SMB (445)
hostname: Reverse DNS namn för ip
smb_implant: Om "True" tyder det på att det finns en bakdörr i SMB tjänsten.
Öppna SMB-tjänster kan innebära ett säkerhetsproblem om de inte är korrekt konfigurerade. Gamla versioner är osäkra och protokollet har haft ett antal sårbarheter genom åren.
SUNET CERTs rekommendation är att inte ha SMB öppet direkt mot nätet. Behöver användare komma åt filerna när de inte är på plats så rekommenderar vi användning av VPN.
Om ni har goda skäl att ha SMB-tjänsten öppen kan vi vitlista så ni slipper fler utskick. Vitlistning kan göras för enskilda maskiner, nätblock eller hela organisationen.
Referenser:
https://www.shadowserver.org/what-we-do/network-reporting/accessible-smb-report/
https://support.microsoft.com/en-us/help/3185535/preventing-smb-traffic-from-lateral-connections
${note_automated}
${signature}

View file

@ -0,0 +1,35 @@
Öppna telnet-servrar hos ${org_name} [${ticket_prefix} ${ticket_number}]
Hej!
Vi har fått en rapport om öppna telnet-servrar på ert nät.
${signature}
${data_inline_separator}
${data_explanation}
${inline_events}
${data_inline_separator}
Förklaring till fälten ovan:
timestamp: Den tidpunkt Shadowserver scannade tjänsten
ip: IP-adress på systemet med öppen telnet
port: Porten med öppen telnet (23)
hostname: Reverse DNS namn för ip
En öppen telnet server är för det mesta en dålig ide, i alla fall om den som de i listan är öppen mot världen. Helst bör den bara vara tillgängligt på ett slutet nätverk, alternativt skyddas av lämpliga brandväggsregler. Telnet är ett okrypterat protokoll och används ofta för att enkelt kunna få terminalaccess för administration av en enhet. Många enheter kommer dessutom med standardlösenord och kan då enkelt tas över av illasinnade aktörer.
SUNET CERT rekommenderar att ni ser över listan över exponerade enheter och ser till så att telnet antingen stängs av eller sätts upp så det bara går att nå från de system som behöver access.
Anser ni att enheten kör en tjänst som tål att exponeras kan vi sätta upp undantag så ni slipper framtida rapporter om den.
Referenser:
https://www.shadowserver.org/what-we-do/network-reporting/accessible-telnet-report/
${note_automated}
${signature}

View file

@ -0,0 +1,35 @@
Öppna VNC-servrar hos ${org_name} [${ticket_prefix} ${ticket_number}]
Hej!
Vi har fått en rapport om öppna VNC-servrar på ert nät.
${signature}
${data_inline_separator}
${data_explanation}
${inline_events}
${data_inline_separator}
Förklaring till fälten ovan:
timestamp: Den tidpunkt Shadowserver scannade tjänsten
ip: IP-adress på systemet med öppen VNC
port: Porten med öppen VNC (5900)
hostname: Reverse DNS namn för ip
VNC används generellt för att ansluta till en enhet för att fjärradministrera den. Det ursprungliga VNC-protokollet saknar tillräckliga skyddsmekanismer, men de flesta moderna implementationer använder idag krypterade och autenticerade anslutningar. Det finns dock ett antal olika implementationer av VNC och flera av dem har historiskt haft säkerhetsproblem och används det på system som inte uppdateras automatiskt finns det risk för att en angripare kan få kontroll över enheten.
SUNET CERT rekommenderar att ni inte har VNC öppet för världen. För de fall VNC behöver gå att nå utifrån rekommenderar vi att man använder VPN.
Om ni anser att enheten kan ha VNC exponerat för världen kan vi vitlista så ni slipper fler utskick om den enheten.
Referenser:
https://www.shadowserver.org/what-we-do/network-reporting/accessible-vnc-report/
${note_automated}
${signature}

View file

@ -0,0 +1,55 @@
Rapport om DDoS mot ${org_name} [${ticket_prefix} ${ticket_number}]
Hej!
Vi har fått en rapport från Shadowserver om att en eller flera IP-adresser hos er utsatts för en förstärkt, reflekterad DDoS attack.
${signature}
${data_inline_separator}
${data_explanation}
${inline_events}
${data_inline_separator}
Förklaring till fälten ovan:
timestamp: Tidpunkt när sensorn registrerade attacken (UTC+0)
victim_ip: IP-adress för systemet som angripits
victim_target_port: Port som angripits
victim_hostname: Reverse DNS för victim_ip
end_time: Tidpunkt när sensorn sist noterade attacken (UTC+0), kan vara tomt.
ddos_source_port: Port som "angripande" system använt.
Uppgifterna härrör från sensorer/honeypots. Dessa ser för angriparen ut som system som kan användas för en förstärkt, reflekterad attack.
En förstärkt, reflekterad DDoS (Amplified Reflection DDoS) är en attack som använder öppna tjänster på nätet för att dölja och förstärka en attack.
De döljs genom att angriparen skickar ett ip-förfalskat (spoof) anropt till en öppen tjänst på nätet över ett protokoll som tillåter detta (oftast UDP). Tjänsten kommer att skicka sitt svar till offret som bara ser ip-adressen från tjänsten ifråga och inte angriparen.
De förstärks genom att tjänsten svarar med fler bytes/paket än anropet bestod av. Olika sårbarara tjänster har olika hög grad av förstärkning.
Exempel på sårbara tjänster: (Siffror från US-CERT)
NTP (UDP/123): 556,9
LDAP (UDP/389: 46-55
DNS (UDP/53): 28-54
Memcached: 10000-51000
Den angripande tjänsten är ett oskyldigt offer såtillvida att den inte aktivt deltar i attacken, men har en "sårbar" tjänst exponerad på nätet.
Vi rekommenderar att man i möjligaste mån försöker analysera en DDoS för att försöka förstå syftet. Har man försökt störa ut en tjänst eller nätverksinfrastrukture? Var det en test av säkerhetsfunktionerna? Testar man tjänstens robustet? Orsakerna kan vara många men det är bra om man försöker förstå varför.
För att skydda sig mot den här typen av attacken kan man blockera eller trafikbegränsa trafik.
Beroende på attackens natur kan det ofta vara bra att placera dessa begränsningar så långt ut i nätverket som möjligt. Regler i en gateway/firewall som ansluter till Internet skyddar hela nätverket och avlastar de interna nätverken.
Vid behov kan ni kontakta Sunets NOC för hjälp att begränsa attacken utanför lärosätet.
Tel: 08-207 860
Epost: noc@sunet.se (247@sunet.se vid behov av akut hjälp)
Referenser:
https://www.shadowserver.org/what-we-do/network-reporting/amplification-ddos-victim-report/
https://www.malwarepatrol.net/ddos-reflection-and-amplification-attacks/
${note_automated}
${signature}

View file

@ -0,0 +1,36 @@
Svartlistade maskiner hos ${org_name} [${ticket_prefix} ${ticket_number}]
Hej!
Vi har fått en rapport om att det finns svartlistade maskiner i ert nät.
${signature}
${data_inline_separator}
${data_explanation}
${inline_events}
${data_inline_separator}
Förklaring av fälten ovan:
timestamp: Tidpunkt för registrering (UTC+0)
ip: Svartlistat ip-nummer
hostname: DNS namn för ip
source: Källa för svartlistning
reason: Anledning till svartlistning
Källan för denna information i Shadowservers "Block List Report", som i sin tur samlar in den från ett antal olika blocklistor.
Att en maskin blir svartlistad kan ha ett flertal orsaker och konsekvenserna av att bli svartlistad varierar beroende på vilken blocklista det rör sig om.
I vissa fall finns det starka skäl att misstänka att maskinen betett sig illa på ett sätt som tyder på virus, intrång eller felkonfiguration. I andra fall kan det röra sig om en blocklista som t.ex. listar TOR-proxies eller andra tjänster som ni valt att ha öppna. source/reason i listan kan förhoppningsvis ge en ledtråd till varför.
Referenser:
https://www.shadowserver.org/what-we-do/network-reporting/blocklist-report/
${note_automated}
${signature}

View file

@ -0,0 +1,41 @@
Malware rapport för ${org_name} [${ticket_prefix}: ${ticket_number}]
Hej!
Vi har fått en rapport om att det finns maskiner smittade med malware på ert nät.
Vänligen undersök och åtgärda om det inte redan är gjort.
${signature}
${data_inline_separator}
${data_explanation}
${inline_events}
${data_inline_separator}
Förklaring till fälten ovan:
timestamp: Den tidpunkt som trafik först observerades [UTC+0]
ip: IP-adress på maskinen
port: Anslutande port på maskinen
hostname: Reverse DNS namn för ip
malware_family: Den malware-familj som identifierats.
url: Den URL som maskinen kontaktat.
cc_ip: Ip adress för C&C
cc_port: Port för C&C
cc_dns: Hostnamn för C&C
public_source: Källa för rapporten.
Rapporten härrör sannolikt från någon som tagit kontroll över en Command & Control server eller liknande och har då sett trafik från de rapporterade maskinerna. Detta innebär med hög sannolikhet att maskinen är drabbad av någon form av malware och att den behöver åtgärdas.
SUNET CERT rekommenderar att maskinen kopplas bort från nätet och undersöks. Om ni inte har goda skäl att anta att uppgifterna om smitta är falska bör maskinen installeras om, då det är mycket svårt att göra en fullständig rensning av malware utan omstart.
Referenser:
https://www.shadowserver.org/what-we-do/network-reporting/drone-botnet-drone-report/
${note_automated}
${signature}

View file

@ -0,0 +1,42 @@
Brute-force försök från ${org_name} [${ticket_prefix}: ${ticket_number}]
Hej!
Vi har fått en rapport om att det finns maskiner på ert nät som försöker göra brute-force intrång. Rapporten kommer från Shadowserver (Drone Brute Force Attack)
Vänligen undersök och åtgärda om det inte redan är gjort.
${signature}
${data_inline_separator}
${data_explanation}
${inline_events}
${data_inline_separator}
Förklaring till fälten ovan:
timestamp: Den tidpunkt som trafik först observerades [UTC+0]
ip: IP-adress på maskinen
port: Anslutande port på maskinen
hostname: Reverse DNS namn för ip
dest_ip: Den ip adress som attackerats
dest_port: Det portnumer som attackerats
start_time: Tid för första aktivitet i attacken
end_time: Tid för sista aktivitet i attacken
username: Ev användarnamn som testats
password: Ev lösenord som testats
Rapporten baseras på data från SISSDENs nätverk av honeypots. Det är alltså väldigt osannolikt att det rör sig om legitim trafik. Har ni någon anledning att tro att dessa uppgifter inte stämmer vill vi väldigt gärna få veta varför ni tror det.
SUNET CERT rekommenderar att maskinen kopplas bort från nätet och undersöks. Då det är honeypots som angripits rör det sig sannolikt om någon form av malware-infektion och vår rekommendation är att installera om systemet. När en maskin väl är infekterad med malware är det mycket svårt att garantera att man lyckats rensa den helt och hållet.
Referenser:
https://www.shadowserver.org/what-we-do/network-reporting/brute-force-attack-report/
https://sissden.eu/
${note_automated}
${signature}

View file

@ -0,0 +1,39 @@
Malware rapport för ${org_name} [${ticket_prefix}: ${ticket_number}]
Hej!
Vi har fått en rapport (Shadowserver Microsoft Sinkhole Report) om att det finns maskiner smittade med malware på ert nät.
Vänligen undersök och åtgärda om det inte redan är gjort.
${signature}
${data_inline_separator}
${data_explanation}
${inline_events}
${data_inline_separator}
Förklaring till fälten ovan:
timestamp: Den tidpunkt som trafik först observerades [UTC+0]
ip: IP-adress på maskinen som kontaktat C&C
port: Anslutande port på maskinen
hostname: Namn på maskinen
malware_family: Namn på malware
url: Den URL som maskinen kontaktat.
dst_ip: Ip adress för C&C
dst_port: Port för C&C
Rapporten härrör från Microsofts Sinkhole server. Denna hanterar ett antal övertagna C&C domäner och trafik dit är nästan alltid ett tecken på att maskinen är infekterad.
SUNET CERT rekommenderar att maskinen kopplas bort från nätet och undersöks. Om ni inte har goda skäl att anta att uppgifterna om smitta är falska bör maskinen installeras om, då det är mycket svårt att göra en fullständig rensning av malware utan omstart.
Referenser:
https://www.shadowserver.org/what-we-do/network-reporting/microsoft-sinkhole-report/
${note_automated}
${signature}

View file

@ -0,0 +1,35 @@
Öppen Elasticsearch rapport för ${org_name} [${ticket_prefix} ${ticket_number}]
Hej!
Vi har fått en rapport om att det finns öppna och oskyddade Elasticsearch-instanser på ert nät.
${signature}
${data_inline_separator}
${data_explanation}
${inline_events}
${data_inline_separator}
Förklaring till fälten ovan:
timestamp: Den tidpunkt Shadowserver scannade tjänsten
ip: IP-adress på systemet med öppen Elasticsearch
port: Port som Elastic kör på
hostname: Reverse DNS namn för maskinen
version: Elastic version
name: Namn på Elastic instansen
De Elasticsearch instanser som rapporterats här verkar sakna TLS och sannolikt även behörighetskontroll. En grundinstallation av Elastic saknar skydd och sätts normalt bara upp för att lyssna på localhost. Numera är det möjligt att installera Elastics säkerhetfunktioner även i den fria versionen av Elasticsearch och på så vis få både TLS och behörighetskontroll.
SUNET CERTs rekommendation är att ovan listade system omedelbart tas ner. Data på dem bör anses röjd och eventuellt också manipulerad. I övrigt bör Elasticsearch sättas upp med TLS och behörighetskontroll, samt ha begränsad tillgänglighet och inte exponeras fritt på nätet.
Referenser:
https://www.shadowserver.org/what-we-do/network-reporting/open-elasticsearch-report/
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/elasticsearch-security.html
${note_automated}
${signature}

View file

@ -0,0 +1,40 @@
Öppen CLDAP rapport för ${org_name} [${ticket_prefix} ${ticket_number}]
Hej!
Vi har fått en rapport om att det finns LDAP-servrar som tillåter anslutning via UDP på ert nät.
${signature}
${data_inline_separator}
${data_explanation}
${inline_events}
${data_inline_separator}
Förklaring till fälten ovan:
timestamp: Den tidpunkt Shadowserver scannade tjänsten
ip: IP-adress på systemet med öppen LDAP
port: Porten med öppen LDAP (389)
protocol: Skall vara udp
hostname: Reverse DNS namn för ip
LDAP över UDP (Connection-less LDAP, CLDAP) kan användas av illasinnade aktörer som förstärkare i DDoS attacker med en förstärkningsfaktor upp till 60 ggr. UDP tillåter förfalskade/spoofade anslutningar och en angripare kan genom att förfalska offrets IP-adress studsa och förstärka attacken via sårbara tjänster.
Förutom att den kan användas som UDP förstärkare finns risken att LDAP-tjänsten exponerar känslig information eller personuppgifter som skall skyddas enligt GDPR.
SUNET CERTs rekommendation är att inte ha LDAP över UDP öppet mot Internet. Okrypterad LDAP över TCP går inte att missbruka för DDoS attacker, men kan fortfarande läcka information. Behöver ni ha LDAP tillgängligt utifrån är vår rekommendation att ni endast tillåter autenticerad LDAP över SSL eller TLS
Om ni anser er ha goda skäl att ha LDAP över UDP öppet kan vi vitlista så ni slipper fler utskick. Vitlistning kan göras för enskilda maskiner, nätblock eller hela organisationen.
Referenser:
https://www.shadowserver.org/what-we-do/network-reporting/open-ldap-report/
https://us-cert.cisa.gov/ncas/alerts/TA14-017A
https://www.akamai.com/us/en/resources/our-thinking/threat-advisories/connection-less-lightweight-directory-access-protocol-reflection-ddos-threat-advisory.jsp
${note_automated}
${signature}

View file

@ -0,0 +1,36 @@
Öppen LDAP rapport för ${org_name} [${ticket_prefix} ${ticket_number}]
Hej!
Vi har fått en rapport om att det finns öppna LDAP-servrar på ert nät.
${signature}
${data_inline_separator}
${data_explanation}
${inline_events}
${data_inline_separator}
Förklaring till fälten ovan:
timestamp: Den tidpunkt Shadowserver scannade tjänsten
ip: IP-adress på systemet med öppen LDAP
port: Porten med öppen LDAP (389)
protocol: Skall vara tcp
hostname: Reverse DNS namn för ip
En LDAP-server som tillåter oautenticerade anrop kan exponera känslig information och/eller personuppgifter som skall skyddas enligt GDPR. En LDAP-server som kräver autenticering kan fortfarande läcka en del känslig data som svar på ett rootDSE anrop.
SUNET CERT rekommenderar att ni ser över era öppna LDAP-servrar så att de inte exponerar känslig data. Se också till så att de inte tillåter autenticerade anrop över okrypterat protokoll utan att de kräver TLS eller SSL för autenticerade anrop. Finns det inget skäl att ha LDAP öppet mot Internet rekommenderar vi att ni blockerar sådana anrop.
De servrar i rapporten som ni kontrollerat och anser skall fortsätta vara öppna mot Internet kan vi vitlista så att ni slipper fler rapporter om dem.
Referenser:
https://www.shadowserver.org/what-we-do/network-reporting/open-ldap-tcp-report/
${note_automated}
${signature}

View file

@ -0,0 +1,35 @@
Öppen Memcached rapport för ${org_name} [${ticket_prefix} ${ticket_number}]
Hej!
Vi har fått en rapport om att det finns öppna Memcached på ert nät
${signature}
${data_inline_separator}
${data_explanation}
${inline_events}
${data_inline_separator}
Förklaring till fälten ovan:
timestamp: Den tidpunkt Shadowserver scannade tjänsten
ip: IP-adress på systemet med öppen Memcached
port: Port som Memcached kör på
hostname: Reverse DNS namn för maskinen
version: Memcached version
Memcached är en minnescache som oftast används för att snabba upp webapplikationer. Memcached saknar behörighetskontroll och att exponera memcached öppet innebär både att man riskerar att läcka känslig data, men även att en angripare kan fylla cachen med egen data och på så vis ta kontroll över webapplikationen. Exponeras memcached över UDP kan den dessutom användas som förstärkare i DDoS attacker. Förstärkningsfaktorn ligger enligt US-CERT på 10 000 - 50 000, men rapporter om uppåt 500 000 finns. Några av de mest framgångsrika DDoS attackerna som genomförts har använt Memcached som förstärkare.
SUNET CERTs rekommendation är att ovan listade system omedelbart tas ner. Applikationer som använder cachen bör undersökas efter spår av intrång och manipulation. En riskanalys bör göras baserat på vilken typ av data som funnits i cachen och de applikationer som använder den.
Referenser:
https://www.shadowserver.org/what-we-do/network-reporting/open-memcached-report/
https://us-cert.cisa.gov/ncas/alerts/TA14-017A
https://blogs.akamai.com/2018/03/memcached-fueled-13-tbps-attacks.html
${note_automated}
${signature}

View file

@ -0,0 +1,36 @@
Öppen MongoDB rapport för ${org_name} [${ticket_prefix} ${ticket_number}]
Hej!
Vi har fått en rapport om att det finns öppna MongoDB-instanser på ert nät.
${signature}
${data_inline_separator}
${data_explanation}
${inline_events}
${data_inline_separator}
Förklaring till fälten ovan:
timestamp: Den tidpunkt Shadowserver scannade tjänsten
ip: IP-adress på systemet med öppen Elasticsearch
port: Port som Elastic kör på
hostname: Reverse DNS namn för maskinen
version: MongoDB version
visible_databases: Databaser som visas
opensslversion: OpenSSL version om OpenSSL används.
MongoDB kräver varken behörighetskontroll eller TLS/SSL och många instanser saknar det. Om visible_datases inte är "non visible" i listan ovan är det sannolikt så att databasen saknar behörighetskontroll. Saknas opensslversion i listan ovan så används sannolikt inte heller TLS/SSL för att skydda trafiken.
SUNET CERTs rekommendation är att system som har synliga databaser omedelbart tas ner och att en utredning görs om känslig data kan ha exponerats. Tänk på att "none visible" bara indikerar att Shadowserver inte kunnat lista några databaser vilket inte är en garanti för att behörighetskontroll används. Saknas opensslversion saknas sannolikt TLS/SSL vilket också är ett skäl att ta ner tjänsten och fundera på om känslig data (inklusive inloggnignsuppgifter) har röjts. Även med korrekt uppsatt MongoDB med TLS/SSL och behörighetskontroll kan det vara lämpligt att begränsa tillgång och inte exponera tjänsten för hela Internet.
Referenser:
https://www.shadowserver.org/what-we-do/network-reporting/open-mongodb-report/
https://docs.mongodb.com/manual/administration/security-checklist/
${note_automated}
${signature}

View file

@ -0,0 +1,41 @@
Sårbara SSLv3/Poodle servrar hos ${org_name} [${ticket_prefix} ${ticket_number}]
Hej!
Vi har fått en rapport om maskiner med sårbara TLS/SSL implementationer på ert nät
${signature}
${data_inline_separator}
${data_explanation}
${inline_events}
${data_inline_separator}
Förklaring till fälten ovan:
timestamp: Den tidpunkt Shadowserver scannade tjänsten
ip: IP-adress på systemet med SSLv3/Poodle
port: Porten som SSL-svaret kom från
hostname: Reverse DNS namn för ip
handshake: De högsta SSL-version som kunde hittas
Att sätta upp TLS/SSL på ett säkert sätt är inte helt enkelt då det dels kräver att man bara tillåter nyare version av protokollet samt att man inte tillåter svaga kryptoimplementationer eller för korta nycklar.
Det finns sex protokoll som används/använts inom TLS/SSL familjen. SSL v2 och v3, TLS v1.0, v1.1, v1.2, v1.3 och moderna webservrar kräver stöd för TLS v1.2 eller v1.3 vilket innebär att tjänsterna inte går att nå utan besvär om de inte stöder TLS v1.2 eller v1.3.
Samtliga tjänster i listan tillåter enligt Shadowserver nedgradering till SSL v3.0 med CBC-krypto vilket innebär att de är sårbara för POODLE (Padding Oracle In Downgraded Legacy Encryption) vilket gör det möjligt för en Man-in-the-middle attack där den som attackerar nedgraderar till ett sårbart krypto som går att knäcka och därefter kan dekryptera all trafik.
SUNET CERTs rekommendation är att ni ser över listan ovan och försöker stänga av eller uppgradera dessa system. Följ gärna Qualys/SSLabs "SSL and TLS Deployment Best Practices" som länkas nedan och testa sedan tjänsten med SSL Labs som också länkas nedan (förutsätter att tjänsten körs på port 443 och är nåbar från SSL Labs)
Referenser:
https://www.shadowserver.org/what-we-do/network-reporting/ssl-poodle-report/
https://github.com/ssllabs/research/wiki/SSL-and-TLS-Deployment-Best-Practices
https://www.ssllabs.com/ssltest/index.html
https://en.wikipedia.org/wiki/Transport_Layer_Security
${note_automated}
${signature}

View file

@ -0,0 +1,39 @@
Malware rapport för ${org_name} [${ticket_prefix}: ${ticket_number}]
Hej!
Vi har fått en rapport (Shadowserver Sinkhole HTTP Drone Report) om att det finns maskiner smittade med malware på ert nät.
Vänligen undersök och åtgärda om det inte redan är gjort.
${signature}
${data_inline_separator}
${data_explanation}
${inline_events}
${data_inline_separator}
Förklaring till fälten ovan:
timestamp: Den tidpunkt som trafik först observerades [UTC+0]
ip: IP-adress på maskinen som kontaktat C&C
port: Anslutande port på maskinen
hostname: Namn på maskinen
malware_family: Vilken typ av malware
url: Den URL som maskinen kontaktat.
dst_ip: Ip adress för C&C
dst_port: Port för C&C
Rapporten härrör från Shadowservers Sinkhole server. Denna hanterar ett antal övertagna C&C domäner och trafik dit är nästan alltid ett tecken på att maskinen är infekterad.
SUNET CERT rekommenderar att maskinen kopplas bort från nätet och undersöks. Om ni inte har goda skäl att anta att uppgifterna om smitta är falska bör maskinen installeras om, då det är mycket svårt att göra en fullständig rensning av malware utan omstart.
Referenser:
https://www.shadowserver.org/what-we-do/network-reporting/sinkhole-http-drone-report/
${note_automated}
${signature}

View file

@ -1,197 +1,204 @@
class soc::intelmq(
Optional[String] $tls_cert = undef,
Optional[String] $tls_chain = undef,
Optional[String] $tls_key = undef,
String $servername = $facts['networking']['fqdn'],
Boolean $use_snakeoil = false,
String $apache_group = 'sunet-cert',
Boolean $use_shib = false,
) {
include sunet::systemd_reload
Optional[String] $tls_cert = undef,
Optional[String] $tls_chain = undef,
Optional[String] $tls_key = undef,
String $servername = $facts['networking']['fqdn'],
Boolean $use_snakeoil = false,
String $apache_group = 'sunet-cert',
Boolean $use_shib = false,
) {
include sunet::systemd_reload
# Set some global variables
$api_user = lookup('intelmq_api_user.username', undef, undef, 'test')
$api_pass = lookup('intelmq_api_user.password', undef, undef, 'pass')
$db_user = lookup('intelmq_db_user.username', undef, undef, 'test')
$db_pass = lookup('intelmq_db_user.password', undef, undef, 'pass')
# Set some global variables
$api_user = lookup('intelmq_api_user.username', undef, undef, 'test')
$api_pass = lookup('intelmq_api_user.password', undef, undef, 'pass')
$db_user = lookup('intelmq_db_user.username', undef, undef, 'test')
$db_pass = lookup('intelmq_db_user.password', undef, undef, 'pass')
group { 'intelmq':
ensure => present,
}
user { 'intelmq':
ensure => present,
gid => 'intelmq',
groups => 'www-data',
home => '/opt/intelmq',
managehome => true,
shell => '/bin/bash',
}
file {
'/etc/intelmq':
ensure => directory,
owner => 'intelmq',
group => 'intelmq',
;
'/etc/intelmq/mailgen':
ensure => directory,
owner => 'intelmq',
group => 'intelmq',
;
'/etc/intelmq/mailgen/formats':
ensure => directory,
owner => 'intelmq',
group => 'intelmq',
;
'/etc/intelmq/mailgen/gnupghome':
ensure => directory,
owner => 'intelmq',
group => 'intelmq',
;
'/etc/intelmq/mailgen/templates':
ensure => directory,
owner => 'intelmq',
group => 'intelmq',
;
}
file { '/etc/intelmq/api':
ensure => directory,
owner => 'intelmq',
group => 'www-data',
mode => '0770',
}
file { '/etc/intelmq/fody':
ensure => directory,
owner => 'intelmq',
group => 'www-data',
mode => '0770',
}
package { 'apache2':
ensure => 'latest',
}
package { 'libapache2-mod-wsgi-py3':
ensure => 'latest',
}
$intelmq_dirs = ['/opt/intelmq/install', '/opt/intelmq/var', '/opt/intelmq/var/lib', '/opt/intelmq/var/lib/bots', '/opt/intelmq/var/lib/bots/sieve', ]
$intelmq_dirs.each |String $intelmqdir| {
file { $intelmqdir:
ensure => directory,
owner => 'intelmq',
group => 'intelmq',
mode => '0755',
group { 'intelmq':
ensure => present,
}
}
file {
'/opt/intelmq/www':
ensure => directory,
owner => 'intelmq',
group => 'intelmq',
mode => '0755',
;
'/opt/intelmq/www/intelmq-manager':
user { 'intelmq':
ensure => present,
gid => 'intelmq',
groups => 'www-data',
home => '/opt/intelmq',
managehome => true,
shell => '/bin/bash',
}
file {
'/etc/intelmq':
ensure => directory,
owner => 'intelmq',
group => 'intelmq',
;
'/etc/intelmq/mailgen':
ensure => directory,
owner => 'intelmq',
group => 'intelmq',
;
'/etc/intelmq/mailgen/formats':
ensure => directory,
owner => 'intelmq',
group => 'intelmq',
;
'/etc/intelmq/mailgen/templates':
ensure => directory,
owner => 'intelmq',
group => 'intelmq',
;
}
file { '/etc/intelmq/api':
ensure => directory,
owner => 'intelmq',
group => 'www-data',
mode => '0750',
;
'/opt/intelmq/www/fody':
mode => '0770',
}
file { '/etc/intelmq/fody':
ensure => directory,
owner => 'intelmq',
group => 'www-data',
mode => '0750',
;
}
mode => '0770',
}
file { '/opt/intelmq/install/setup-nodesource.sh':
ensure => file,
content => file('soc/intelmq/setup-nodesource.sh'),
mode => '0540',
}
package { 'apache2':
ensure => 'latest',
}
exec { 'Add nodesource repo':
command => '/opt/intelmq/install/setup-nodesource.sh',
creates => '/etc/apt/sources.list.d/nodesource.list',
}
package { 'libapache2-mod-wsgi-py3':
ensure => 'latest',
}
package { ['postgresql', 'python3-venv', 'python3-pip', 'python3-gpg', 'python3-psycopg2', 'redict', 'nodejs', ]:
ensure => 'latest',
}
$intelmq_dirs = ['/opt/intelmq/install', '/opt/intelmq/var', '/opt/intelmq/var/lib', '/opt/intelmq/var/lib/bots', '/opt/intelmq/var/lib/bots/sieve', ]
$intelmq_dirs.each |String $intelmqdir| {
file { $intelmqdir:
ensure => directory,
owner => 'intelmq',
group => 'intelmq',
mode => '0755',
}
}
package { ['cmdtest', ]:
ensure => 'absent',
}
file {
'/opt/intelmq/www':
ensure => directory,
owner => 'intelmq',
group => 'intelmq',
mode => '0755',
;
'/opt/intelmq/www/intelmq-manager':
ensure => directory,
owner => 'intelmq',
group => 'www-data',
mode => '0750',
;
'/opt/intelmq/www/fody':
ensure => directory,
owner => 'intelmq',
group => 'www-data',
mode => '0750',
;
}
exec { 'Install yarn from npm':
command => 'npm install --global yarn',
creates => '/usr/bin/yarn',
}
exec { 'Install IntelMQ venv':
command => 'sudo -u intelmq /usr/bin/python3 -m venv --system-site-packages /opt/intelmq/venv',
creates => '/opt/intelmq/venv',
}
exec { 'Always active venv for IntelMQ':
command => 'echo ". venv/bin/activate" >> /opt/intelmq/.profile',
unless => 'grep -q activate /opt/intelmq/.profile 2> /dev/null',
}
file { '/opt/intelmq/install/eventdb-notifications.sql':
ensure => file,
content => file('soc/intelmq/eventdb-notifications.sql'),
}
file { '/opt/intelmq/install/install-intelmq.sh':
ensure => file,
content => file('soc/intelmq/install-intelmq.sh'),
mode => '0555',
}
exec { 'Install IntelMQ':
command => 'sudo -u intelmq /opt/intelmq/install/install-intelmq.sh',
creates => '/opt/intelmq/.installed'
}
exec { 'Run IntelMQ setup script':
command => '/opt/intelmq/venv/bin/intelmqsetup',
creates => '/opt/intelmq/var/lib/state.json',
returns => ['0', '1',],
}
file { '/usr/bin/intelmqctl':
ensure => file,
mode => '0555',
content => file('soc/intelmq/usr-bin-intelmqctl'),
}
file { '/opt/intelmq/install/setup-pgsql.sh':
ensure => file,
content => template('soc/intelmq/setup-pgsql.sh'),
mode => '0500',
}
exec { 'Setup IntelMQ eventdb':
command => '/opt/intelmq/install/setup-pgsql.sh',
creates => '/opt/intelmq/.pgsql-installed',
}
$sieve_scripts = ['domains', 'phishers', 'squatters', ]
$sieve_scripts.each |String $sieve| {
file { "/opt/intelmq/var/lib/bots/sieve/${sieve}.sieve":
file { '/opt/intelmq/install/setup-nodesource.sh':
ensure => file,
content => file('soc/intelmq/setup-nodesource.sh'),
mode => '0540',
}
exec { 'Add nodesource repo':
command => '/opt/intelmq/install/setup-nodesource.sh',
creates => '/etc/apt/sources.list.d/nodesource.list',
}
package { ['postgresql', 'python3-venv', 'python3-pip', 'python3-gpg', 'python3-psycopg2', 'redict', 'nodejs', ]:
ensure => 'latest',
}
package { ['cmdtest', ]:
ensure => 'absent',
}
exec { 'Install yarn from npm':
command => 'npm install --global yarn',
creates => '/usr/bin/yarn',
}
exec { 'Install IntelMQ venv':
command => 'sudo -u intelmq /usr/bin/python3 -m venv --system-site-packages /opt/intelmq/venv',
creates => '/opt/intelmq/venv',
}
exec { 'Always active venv for IntelMQ':
command => 'echo ". venv/bin/activate" >> /opt/intelmq/.profile',
unless => 'grep -q activate /opt/intelmq/.profile 2> /dev/null',
}
file { '/opt/intelmq/install/eventdb-notifications.sql':
ensure => file,
content => file('soc/intelmq/eventdb-notifications.sql'),
}
file { '/opt/intelmq/install/install-intelmq.sh':
ensure => file,
content => file('soc/intelmq/install-intelmq.sh'),
mode => '0555',
}
exec { 'Install IntelMQ':
command => 'sudo -u intelmq /opt/intelmq/install/install-intelmq.sh',
creates => '/opt/intelmq/.installed'
}
exec { 'Run IntelMQ setup script':
command => '/opt/intelmq/venv/bin/intelmqsetup',
creates => '/opt/intelmq/var/lib/state.json',
returns => ['0', '1',],
}
# System tools
file { '/usr/bin/intelmqctl':
ensure => file,
mode => '0555',
content => file('soc/intelmq/usr-bin-intelmqctl'),
}
file { '/opt/intelmq/install/setup-pgsql.sh':
ensure => file,
content => template('soc/intelmq/setup-pgsql.sh'),
mode => '0500',
}
exec { 'Setup IntelMQ eventdb':
command => '/opt/intelmq/install/setup-pgsql.sh',
creates => '/opt/intelmq/.pgsql-installed',
}
$sieve_scripts = ['domains', 'phishers', 'squatters', ]
$sieve_scripts.each |String $sieve| {
file { "/opt/intelmq/var/lib/bots/sieve/${sieve}.sieve":
ensure => file,
owner => 'intelmq',
group => 'intelmq',
mode => '0644',
content => file("soc/intelmq/sieve/${sieve}.sieve"),
}
}
# Mailgen stuff
file { "All mailgen conf":
name => '/etc/intelmq/mailgen',
ensure => directory,
owner => 'intelmq',
group => 'intelmq',
mode => '0644',
content => file("soc/intelmq/sieve/${sieve}.sieve"),
recurse => true,
replace => true,
source => "puppet://modules/soc/files/intelmq/mailgen",
}
}
file { '/etc/sudoers.d/01_intelmq-api':
ensure => file,

View file

@ -1,8 +1,8 @@
{
"openpgp": {
"gnupg_home" : "/etc/intelmq/mailgen/gnupghome",
"gnupg_home" : "/opt/intelmq/.gnupg"
"always_sign" : false,
"signing_key" : "5F503EFAC8C89323D54C252591B8CD7E15925678"
"signing_key" : "9CBFAF18D1E1AF3176E74C3E2F23CB193ACFD1F0"
},
"database": {
"event": {

File diff suppressed because one or more lines are too long