IntelMQ的邮件发送模块
项目描述
IntelMQ Mailgen
IntelMQ命令行工具,用于处理事件。
调用 intelmqcbmail --help
查看当前用法。
安装
依赖项
这些库和程序是必需的
- Python库
psycopg2
(python3-psycopg2
) 用于PostgreSQL通信。 - Python库
gpg
(python3-gpg
),是库gpgme的一部分。由于与Ubuntu 20.04有关的问题,此依赖项在通过pip
或setup.py
安装时不会安装。其他发行方式(deb软件包)不受此错误的影响。 - GnuPG (v>=2.2) 用于
python3-gpg
。
作为一个Python3应用程序,请参阅setup.py中的 install_requires
部分,以了解其依赖项。
如果您安装deb软件包,则软件包管理器会处理所有依赖项。
从源安装时使用此命令
pip3 install -v -e .
为了使用IntelMQ Mailgen,您需要一个有效的certbund-contact-expert,因为Mailgen使用的信息和数据在IntelMQ默认字段中不可用。
IntelMQ配置
为了使Mailgen工作,需要首先配置以下IntelMQ机器人
- 专家:CERT-bund联系人数据库
- 专家:CERT-bund联系人规则
- 输出:PostgreSQL
您必须先按照这些机器人的设置说明进行设置,然后再设置Mailgen。
数据库
intelmq-events
数据库和 intelmq
数据库用户应由PostgreSQL输出机器人的配置设置好。为了与Mailgen一起使用,此设置需要扩展
作为数据库超级用户(通常通过系统用户postgres)
-
创建一个新的数据库用户
createuser --encrypted --pwprompt intelmq_mailgen
-
扩展数据库
psql -f sql/notifications.sql intelmq-events
-
授予
intelmq
通过触发器插入新事件的权利psql -c "GRANT eventdb_insert TO intelmq" intelmq-events
-
授予新用户发送通知的权利
psql -c "GRANT eventdb_send_notifications TO intelmq_mailgen" intelmq-events
与IntelMQ和事件数据库的交互
写入事件数据库的事件已经由规则机器人处理,该机器人将通知指令添加到事件中。这些指令告诉mailgen根据该事件生成哪些通知。sql/notifications.sql
中的语句在事件数据库中添加触发器和表,以处理这些指令,并准备供mailgen使用。特别是
-
directives
表包含所有指令。指令的主要属性包括- 事件的ID
- 收件人地址
- 数据格式
- 模板名称(见下文“模板”)
- 如何聚合
- 是否以及何时发送。这是
sent
表(见下文)中相应行的ID
-
当新事件插入到
events
表时,触发器过程会提取指令并将它们插入到directives
。 -
sent
表记录了哪些通知实际上已经发送。其主要属性是- 为通知生成的票据号
- 表示发送时间的戳记
当mailgen处理指令时,它会从数据库中读取尚未发送的指令,将足够相似可以发送在同一封邮件中的指令进行聚合,并为每个聚合的指令调用一系列脚本。这些脚本检查指令,如果可以处理指令,则从中生成邮件。mailgen然后发送这些邮件并在 sent
表中记录。
票据号
对于Mailgen发送的每封电子邮件,都会生成一个票据号。如果邮件成功发送,则该号码存储在 sent
表中,同时记录了邮件发送的时间戳。
配置
intelmq-mailgen
目前在两个地方搜索配置文件
$HOME/.intelmq/intelmq-mailgen.conf
(用户配置文件)和/etc/intelmq/intelmq-mailgen.conf
(系统配置文件)。
设置从两个文件中读取,用户的家目录中的文件优先。
可以使用 --config
命令行参数覆盖系统配置文件路径。
两个文件都必须是JSON格式。一个完整的示例可以在 intelmq-mailgen.conf.example
中找到。
OpenPGP签名
gnupg_home
必须指向用于电子邮件签名的GnuPG主目录。它必须
- 包含OpenPGP签名的私钥和公钥部分,没有密码保护。
- 对运行intelmq-mailgen的用户可读/写。
例如,以下步骤将创建这样一个目录并导入测试签名密钥。
GNUPGHOME=/tmp/gnupghome mkdir $GNUPGHOME
chmod og-rwx $GNUPGHOME
GNUPGHOME=/tmp/gnupghome gpg2 --list-secret-keys
GNUPGHOME=/tmp/gnupghome gpg2 --import src/intelmq-mailgen/tests/keys/test1.sec
根据您的GnuPG版本,您可能需要通过编辑 $GNUPGHOME/gpg.conf
来设置其他选项。
例如,以下设置将设置默认摘要算法并添加注释行以抑制签名版本
personal-digest-preferences SHA256
no-emit-version
comment Key verification <https://example.org/hints-about-verification>
(有关详细信息,请参阅GnuPG文档。)
现在,您应该能够使用此密钥进行签名而无需提示密码。例如
echo Moin moin. | GNUPGHOME=/tmp/gnupghome gpg2 --clearsign --local-user "5F503EFAC8C89323D54C252591B8CD7E15925678"
模板
mailgen附带了模板机制,脚本在处理指令时可以使用该机制。该机制假设所有模板都是配置文件中template_dir
设置的目录中的文件。
mailgen自带的脚本仅从它们正在处理的指令中获取模板名称。这意味着名称由规则机器使用的规则设置,因此请参阅其文档和配置以了解您需要的模板。
模板格式
模板文件的第一行用作邮件的主题行。其余行将成为邮件正文。正文可以由一个或多个空行与主题行分隔。
主题和正文文本将解释为Python3模板字符串,并且可能允许一些替换,具体取决于格式。主题和正文允许相同的替换。
通常支持的替换
-
所有格式
${ticket_number}
-
CSV格式格式的额外替换
${events_as_csv}
用于CSV格式的活动数据。这仅在正文中有用。
-
当按事件字段聚合时,也可以使用事件字段。例如,如果指令按
source.asn
聚合,则可以使用${source.asn}
与模板名称一样,聚合由规则机器确定,因此请参阅那里以获取详细信息。
数据库
配置中的数据库部分可能如下所示
"database": {
"event": {
"name": "intelmq-events",
"username": "intelmq_mailgen",
"password": "your DB password",
"host": "localhost",
"port": 5432
},
"additional_directive_where": ""
},
additional_directive_where
参数是可选的,可以包含附加到directives
表上的SELECT
操作WHERE
子句的SQL代码。自动附加AND
。表directives
的列可用作d3
,表events
的列可用作events
。通常不查询表events
,只有在additional_directive_where
包含events
时才连接到where语句。示例
"additional_directive_where": "\"template_name\" = 'qakbot_provider'"
"additional_directive_where": "events.\"feed.code\" = 'oneshot'"
注意正确的引号。如果需要访问事件表,使用的postgres用户需要访问表的UPDATE
权限。默认情况下,对于mailgen安装不是这种情况!这是由于directives
表上的更新锁定和同一子句中的事件连接引起的。这是不完美的地方。
操作手册
应监控日志文件以检测错误条件。特别是grep
* 'ERROR'
* 'Error:'
每个错误条件都应由管理员或服务技术人员尽快处理。建议使用监控系统,以便在日志中首次出现此类字符串时通知管理员。
日志文件内容
mailgen的日志中不应出现Traceback
或其他ERROR信息。请阅读相关行,它们通常有关于失败原因的良好提示。某些问题可以通过纠正配置来解决。
INFO行出现在正常操作期间。获得INFO消息的条件之一是如果Mailgen检测到它已经在运行,那么第二个实例不会启动。如果是这种情况,正在运行的Mailgen进程可能仍然存在问题,并且在日志文件的性质中,尝试启动的Mailgen的消息可能与错误条件交织在一起。
Mailgen需要锁定数据库行
在运行过程中,如果mailgen第二次启动,它将无法锁定数据库中的必要行。postgres.log
文件将记录失败的锁定,例如
2020-12-15 09:00:02 UTC ERROR: could not obtain lock on row in relation "directives"
这可以忽略。
Mailgen尝试继续
即使某些批次的邮件由于几个原因无法发送,Mailgen也会尝试继续处理指令和发送邮件。
如果找不到模板,例如,它将继续处理下一个指令并记录错误消息和堆栈跟踪。错误消息包含有关无法处理的指令的信息。输出中的directive_ids
部分是directives
表中行的ID列表,event_ids
是events
表中事件的ID列表。
这些信息可以被管理员用来查看哪些事件和电子邮件可能没有详细发送,以便稍后处理,可能需要根据问题原因编写一个小脚本。
开发者信息
安全考虑
- 我们假设需要防止恶意外部数据通过数据库到达我们这里。
- 我们不需要(或无法)防止具有管理员权限的本地攻击。
- 由于我们的命令可以在有和无用户交互的情况下运行,我们假设只有具有管理员权限的用户才能访问机器并启动交互式变体。
- 用于签名的私钥材料将没有额外的密码保护,因此系统本身需要得到充分的安全保障。(这可以包括在只有访问权限填充数据库的不同机器上设置 intelmq。)
- 我们应该注意防止整个系统成为一个有效的签名(或加密)预言机。解释如下:考虑一个会从我们的系统中收到自动通知的攻击者。如果这个攻击者还能触发一个关于已使用源的数据的警告,她可能部分控制要签名的明文(或加密)的内容,并获得自动的结果。在某些情况下,这可能会被用于自适应明文攻击。
列名
可以在代码中为 CSV 列定义名称。例如,在 example_scripts/10shadowservercsv.py
中,字典 standard_column_titles
将事件字段名映射到列标题。这些在后续定义在 table_formats
中的大多数 CSV 格式中被使用。如果需要,那里指定的格式仍然可以使用特殊列标题。
转换
目前,在将数据添加到 CSV 输出时,不会对其进行转换。
Mailgen 总是会从 time.source
的时间戳中移除 "UTC" 注释。这确保时间戳始终是 UTC。
测试
测试电子邮件实际发送的一个简单方法是使用 Python 的 smtpd
模块运行 DebuggingServer
python3 -m smtpd -d -n -c DebuggingServer localhost:8025
(不要忘记在您的配置中配置相应的 SMTP 主机和端口。)
如果您想捕获 Maildir 格式的电子邮件,可以使用 https://pypi.ac.cn/project/dsmtpd/,例如。
git clone git://github.com/matrixise/dsmtpd.git
cd dsmtpd
python3 -m dsmtpd -i localhost -p 8025 -d /path/to/Maildir
/path/to/Maildir
必须是一个现有的 Maildir 或不存在,在这种情况下,它将由 dsmtpd 创建。
您可以使用 mutt 访问 Maildir,例如。
mutt -f /path/to/Maildir
提示:默认情况下 Esc P
将触发 mutt 的 <check-traditional-pgp>
功能,如果您想检查没有 MIME 签名。
测试套件
由于某些测试可能取决于硬件规格(执行时间)并可能导致失败,而失败本身并不一定表示错误,因此测试套件分为两部分。
必须成功的常规单元测试可以使用 make check
启动;要运行完整的测试套件,请使用 make check_all
。
历史
intelmq-mailgen 文件最初是从 https://github.com/certat/intelmq/blob/a29da5d798bd114535326ffdd2f5000c4b6a21e7/intelmq/bin/intelmqcli(2016-03-08 版本)复制的。
项目详细信息
下载文件
为您的平台下载文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源分发
构建版本
intelmqmail-1.3.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 75bc75a5b299c6ea3aab96ed78d79ae12bb38ca96f3cc14064778936ccdacfc8 |
|
MD5 | b423ed5fcb470b95160afdf8ec69e993 |
|
BLAKE2b-256 | 31fb62256325376eae1a57d3730d87768f411b6c505ed28786a16b173cca8dac |
intelmqmail-1.3.1-py2.py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ff7531f4840d0ec31aeb1c9dfe76c80ba09742c4c9a6377f2c3a48d1002aa4d8 |
|
MD5 | fca27846dc96b86d7f682c4ec5f790ae |
|
BLAKE2b-256 | f35a7f11756c1648cc341769415acc0643f89c5ae3ff48ba16aab3d00c61c4fc |