Zammad: PGP

创建于 2016-10-19  ·  58评论  ·  资料来源: zammad/zammad

如果与用户的邮件可以进行 PGP 加密,并且用户可以发送服务 PGP 加密的邮件,那就太好了。
特别是对于安全意识/技术公司来说,这将是一个独特的功能。

feature backlog mail processing

最有用的评论

@hatscher我们中的许多人都需要它 :) 但毕竟,从事该功能 (@luto) 的每个人都是自愿这样做的 :) 如果有真正的商业需求,我想捐赠(一些面团或工作)将有助于推动推进进度。 不幸的是,我没有时间做出贡献,所以我只剩下希望和耐心:P

谈论贡献:提交当前的开发状态作为 PR 以便其他人可以加入,如果他们觉得自己可以贡献的话,怎么样?

所有58条评论

+1 支持 S/MIME

好吧,我改了标题。 最好的当然是两者都提供。

如果能够发送和接收 X.509 加密邮件,我将不胜感激。

是的,能够发送和接收 X.509 签名或加密邮件会非常好。

所以 X.509 加密邮件是 S/MIME 邮件。 我个人更喜欢 PGP(也因为它更广泛),但这个问题与两个系统有关。 😃

我会将加密通知添加到愿望清单 - 因此用户需要能够将公钥添加到他们的个人资料中。

仅供参考:redmine 存在具有此类功能的不错插件: https ://github.com/C3S/redmine_openpgp

这个 gem 似乎没有得到真正的维护(最后一次提交),但还有很多其他的。 就我个人而言,我会说这个 gem有最近的提交。

今天我们有第一个客户请求 PGP 支持,因为她不想通过未加密的连接请求她的银行详细信息。 因此+1

+1。
我们正在与 IT SEC 社区合作,并收到大量无法在 Zammad 中打开的 PGP 加密邮件,因此我们必须导出和解密,这是一个地狱般的工作流程。 +1 支持 PGP 和 Zammad 中的 S/MIME 邮件:)

如今,电子邮件加密是必须的。 通用数据保护条例 (GDPR) 要求设计和默认情况下的隐私以及根据最先进的技术。

从技术上讲,这可能很容易通过集成p≡p 引擎来解决(非常容易隐私)。

+1
我们经常收到加密邮件。 导出和手动解密加密票是痛苦的,然后我们甚至无法通过票系统回答票。

+1
如果没有 PGP/GPG,我无法从 OTRS 迁移到 Zammad。 我的旧 OTRS 中有许多带有 gnupg 的加密票证。

+1

在一个非常丑陋的伪造我们的电子邮件以抢劫我们的客户的案例之后,我们希望GnuPG 签署所有传出的票务电子邮件。

也许可以集成PeP ,因为它是 PGP 加密的简单且可用的解决方案。

我也认为发送签名的电子邮件将是一个很棒的功能。 这会给收件人一定程度的信心,即地址是真实的并且可以信任。

下一步是对消息进行完全加密。

@martini @monotek我们正在考虑自己在内部解决 GPG 部分。 如果我们这样做,合并这个有什么限制吗? 您希望看到或需要的任何功能?

@luto - 听起来不错! 合并所需的东西是:

  • 测试,最好是 RSpec
  • 文档
  • 代码 API 文档
  • 通过我们的 rubocop 和 coffeelint 配置的 QAd 代码

我们已经查看了一些为 gpg CLI 二进制文件提供 API 的 Ruby gem。 据我记得,他们中没有一个看起来真的很有希望。 请确保仅依赖维护/质量依赖项,因为这是一个关键点。
自定义实现是可能的,但请记住可扩展性和维护性。 不要将所有逻辑都放在模块中,而是为其创建一个 lib 类。 尊重单一责任原则。

功能应包括发送和接收邮件的签名、验证和加密/解密的所有变体🤓
应尽早处理传入消息,以使其他组件中的内容可访问。
应尽可能晚地处理传出消息,以便能够访问其他组件中的内容。

应该有一个很好的管理界面来管理公钥和私钥。

请随时通过[email protected]与我们联系,询问您的任何问题并获得我们的支持。 我们非常高兴收到您的 💪 让我们以 Zammad 的方式来做吧 🏎

我们也得到了第一个需要这种沟通的客户,所以我也投给了这个。 是否已经有任何进展? 我也想帮助测试一个测试版。

@martinseener afaik 这不在 Zammad 团队的路线图上。 我们目前正计划自行实施。 如果您想筹码,我们可以更快地完成它并且您可以为您的客户提供服务,请随时通过我的 github 个人资料上的电子邮件地址与我们联系。

@thorsteneckel我目前正在设计一个用于接收邮件的实现,分为两部分:

  1. 解密Postmaster::PreFilter中的邮件:将解密的消息设置为内容; 扔掉原来的; 将使用的解密密钥存储在元数据中
  2. Postmaster::PostFilter创建一个GpgCryptoInfo对象,将其附加到Article ; 永久存储使用的解密密钥和签名状态等信息

几个问题:

  • 你认为这应该使用那些过滤器 API 来实现吗? 还是应该在Channel::EmailParser中硬编码?
  • 是否有Postmaster::PreFilter订阅者需要访问解密的消息内容? 在这种情况下,需要硬编码实现或Postmaster::EarlyPreFilter
  • 除了用于加密/解密/签名/验证的密钥以及您希望永久保存的已接收邮件的签名状态之外,是否还有其他信息?

另外,一个普遍的问题: EmailParser或过滤器似乎是_decrypt_邮件的理想场所; 你能想到一个“完美”的地方来加密它们吗?

我希望这个问题是提出实施问题的正确地方。 如果没有,请指点我另一个,最好是公开的,一个:)谢谢!

@luto - 我目前正在写下我对此的想法。 由于这是一个相当大而重要的话题,因此需要一些时间。 我试图在周末之前完成它。 谢谢你的理解。

小更新:订购Postmaster::PreFilter过滤器。 我目前把我的放在IdentifySender之后,所以我可以弄清楚要尝试哪些 gpg 键。 知道这一点,过滤器似乎是我解密的正确位置。

@thorsteneckel感谢您抽出宝贵时间! 期待你的来文。 :)

@luto ,很高兴听到这个消息! 我喜欢按照你的建议在这个问题上进行协调。 因此它将是透明的,我们可以将共享信息重新用于技术文档。 你可以在你的 fork 的工作分支中参考这个问题,它会在这里被引用。 请在更改完成后创建一个拉取请求。 同时,我将检查您的分支并查看更改。
我们应该将 S/MIME 功能移至单独的问题,因为我们现在不会实现它。

关于您的问题:您完全走在正确的道路上。 我会写一些东西,并在途中回答你的问题。

一般发展

根据我们的经验,测试驱动开发(使用 RSpec)最适合此类任务。 这取决于您如何处理它,但我们肯定需要一个全面的功能测试套件。 因此,我将为您提供一个 RSpec 助手来简化测试并尽我所能为您提供支持。 我将在接下来的几天将它添加到develop分支。 你应该使用这个分支作为你的基础,因为它也是我们的工作分支。 它将被合并到 master 中并在将来替换 stable。

Postmaster::PreFilter

Postmaster::PreFilter是正确的地方。 您可以通过过滤器注册名称中的数字前缀来影响执行时间。 较低的数字将更早执行
对于已经初始化的系统,也需要添加设置的迁移
我会建议一个类似于app/models/channel/filter/decrypt.rb的名称 - 但最终取决于您。

注册完成后,Zammad 将为每个传入邮件执行过滤器。

PGP 消息类

由于此时我们将只实现 PGP,因此我们必须确保我们不会为以后添加 S/MIME 添加障碍。 此外,将来可能需要在其他渠道上支持 PGP,而不是仅支持电子邮件。 牢记这一点将确保我们设计的后端和 API 易于测试和集成。 按照我的建议(开放讨论):

文件lib/pgp_message.rb中应该有一个名为PgpMessage的类。 此类接受一个必需的参数,该参数将是(可能)加密的消息字符串/邮件内容。 例子:

instance = PgpMessage.new(email_content)

该实例应提供以下接口:

  • #签?
  • #verified?(signature) # 签名是可选的,可以是来自例如附件的外部签名
  • #signature_error
  • #加密?
  • #可解密?
  • #解密
  • #钥匙
  • #解密错误
  • #encrypt( public_key(s) )
  • #符号

PGP接口

老实说,我还没有找到任何我喜欢作为依赖项的宝石。 它们看起来都没有维护、复杂或需要 C 编译扩展。 如果我们不能只访问 PGP CLI,可能值得一试。 你怎么认为?

Postmaster::PreFilter 中的 PgpMessage 集成用于解密

然后可以在Postmaster::PreFilter中使用 PgpMessage 类来初始化实例并检查消息的相关性。 如果它是 PGP 加密消息,我们可以继续使用其他方法来提取我们需要的数据并覆盖给定mail哈希中bodyattachments的内容。
此外,我们必须在将通过设置x-zammad-article-preferences标头创建的文章中存储一些元信息(如您所述):

mail[:'x-zammad-article-preferences']['decryption_key'] = instance.key
...

我认为以下元数据应该足够了:

  • 解密密钥 <- 密钥
  • 解密错误 <- 解密错误(如果存在)
  • 加密消息 <- 邮件 ['body']
  • signature_status <- 已验证?
  • signature_error <- signature_error(如果存在)

支持的可解密消息的变体

PgpMessage 类应该能够处理(至少?)传入 PGP 消息的以下组合和变体:

  • 加密
  • 加密+签名
  • 排队
  • 依恋

你已经有足够的示例邮件了吗?

我们必须有一个完整的测试用例列表,以涵盖将来可以轻松扩展的各种用例。

发送加密消息

由于 Zammad 仅支持发送 HTML 电子邮件,我们只需要涵盖发送detached PGP 邮件。

Zammad 从给定属性构建电子邮件的位置在self.build方法中的 $# app/models/channel/email_build.rb中。 这应该扩展为使用PgpMessage类创建具有给定body属性的实例,并使用encryptedsigned方法创建 PGP 加密和签名的正文内容和附件。
为此,需要查找收件人电子邮件地址的公钥。 用户如何存储他们的密钥(在他们的个人资料中)尚不清楚。 我会在内部讨论这个并让你知道。

我认为一旦配置了 PGP 并且收件人支持它,就不应该有发送未加密邮件的选项。 我们需要澄清这一点,但在那之前,这应该是要走的路。

管理界面

这应该与核心功能隔离开来,稍后将进行描述。 我想你需要我们的支持。 我将在内部讨论它,并让您知道我们如何处理它。

结论

现在这应该足够了,并且指向正确的方向。 我们可能会到达一些我们必须重新调整并涵盖其他情况的地方,但让它们首先出现。
如果出现任何问题,请随时提出。

我期待看到并审查您的更改🤓

谢谢你的支持🚀
托尔斯滕

老实说,我还没有找到任何我喜欢作为依赖项的宝石。 它们看起来都没有维护、复杂或需要 C 编译扩展。 如果我们不能只访问 PGP CLI,可能值得一试。 你怎么认为?

PGP CLI 不稳定,根据 GPG,不应用作 API。 到目前为止,我在使用ruby-gpgme方面取得了成功,所以这就是我现在想要遵循的路线。 鉴于据我所知 GPG 没有 API,而只有 C 级库,我认为如果没有任何 C 扩展,我们将无法逃脱。除了可能在 ruby​​ 中重新实现 GPG,但是我一个都不知道。

谢谢你说清楚。 我没有意识到这一点。 那对我来说听起来不错。 他们的构建失败有点令人担忧,但我会看看它。

嘿! 如前所述,此问题最初是对 PGP 功能的请求。 后来我们也添加了 S/MIME。 但由于两者都是独立实现的并且是不同的技术,我们决定将 S/MIME 要求移至新问题 #1961。 如果您对任何进展感兴趣,请随时订阅那里。 应在社区委员会进行讨论,以避免问题跟踪器上的噪音。 谢谢!

因此,我将为您提供一个 RSpec 助手来简化测试并尽我所能为您提供支持。 我将在接下来的几天将它添加到开发分支中。

@thorsteneckel已经登陆了,如果是的话,它到底在哪里? :)

@luto - 抱歉耽搁了 - 这里是: https ://github.com/zammad/zammad/commit/f2bf4cbd029bbfdc79888c188d2a29d1ebc5f27d

您只需在spec/models/channel/filter/中放置一个*filter_filename*_spec.rb $ (就像models/channel/filter/follow_up_merged.rb一样,并在过滤器类名称后添加, type: :channel_filter
之后,您有两个可用的助手:

filter_parsed(mail_string)
https://github.com/zammad/zammad/blob/f2bf4cbd029bbfdc79888c188d2a29d1ebc5f27d/spec/support/channel_filter.rb#L17 -L27

filter(parsed_mail_hash)
https://github.com/zammad/zammad/blob/f2bf4cbd029bbfdc79888c188d2a29d1ebc5f27d/spec/support/channel_filter.rb#L3 -L13

命名参数channel是可选的,在您的情况下不需要。

谢谢!
仅供参考:分支现在住在我们的叉子中。 随时对任何提交发表评论。 这应该使所有相关人员的最终审查变得简单而简短:)

@luto - 很高兴看到你以这样的速度工作。 我注意到代码看起来不像是用 rubocop 检查过的。 我们使用 rubocop 和 coffeelint 来确保这两种文件的 Zammad 样式指南。 如果您想自动执行检查,甚至可以使用预提交过滤器配置。 让我知道我是否可以为您提供更多信息。

哦,肯定的。 我用pre-commit install以及我的编辑器的匹配扩展安装了钩子。 缩进是通过filter-branch修复的,所以历史看起来更好; 所有其他罪行都是亲手解决的。 警察现在很高兴:)

您可能会注意到代码中带有 pythonisms。 虽然我尽可能地模仿 ruby​​ 做事的方式,但我仍然是一个 python 人;)请指出一些事情,如果它们对你来说似乎是倒退的。 Rubocop 抓住了其中不少 :sweat_smile:

好的! 我刚刚注意到至少有一种类型的更改与我们的 rubocop 配置不匹配:使用unless而不是负的if s。 所以看起来你的 rubocop 在这里做了很多事情。

哦,pythonisms对我来说很好。 到目前为止没有什么可抱怨的🤓

@luto - 我只是想看看开发的当前状态,但注意到自 24 天以来没有任何提交。 有什么我可以做的吗?

有什么我可以做的吗?

修复我们的其他内部项目 :wink: :grin:
Zammad 范围内没有阻挡者,只是普遍缺乏时间。 这方面的工作应该会在下周继续进行。

@thorsteneckel我遇到了障碍。 在大多数情况下,Gpg(或至少是 gpgme)不会区分“电子邮件已加密,但无法解密”和“电子邮件已加密且一切正常”。 该行为与前面概述的encrypted?decryptable?方法不兼容。 现在我有许多黑客来检测加密但不可解密的邮件,但我不能让它在所有情况下都工作。

您如何看待在 UI 中不区分可解密和加密? 除了像缺少 GPG 消息头这样的明显情况外,ofc。

我们什么时候可以期待 Zammad 的实施和集成? 是否为特定版本计划实施?

任何新闻?

我有一种感觉,那些可以提出这个插件开发的人除了查看关于这个问题的回复外,还有其他的想法。
如果你想引起他们的注意,你可以给他们写一封电子邮件: [email protected] - 我已经这样做了 - 或者给他们发一条友好的推文@ubernauten

@hatscher抱歉耽搁了; 正如@0xErnie猜测的那样,我目前还有其他事情要做,但这个功能仍然在我们的雷达上。 请注意,我目前正在独自工作,而不是作为 Zammad, Inc. 团队的一员,也没有任何外部创始。 所以这可能需要一段时间。

至于拦截器,这里有一个@thorsteneckel的问题,还有一个关于我们将如何处理其中的 UI 组件的私人问题。 随时联系他,如果您想参与推动这项工作,@hatscher! 不过,主要的障碍是我没有时间。

很抱歉回复晚了,特别是对你@luto ! 我不能给它目前需要的时间和注意力。 我计划在 2 周内解决这个问题。

任何新闻? 我们需要这个功能...

@hatscher我们中的许多人都需要它 :) 但毕竟,从事该功能 (@luto) 的每个人都是自愿这样做的 :) 如果有真正的商业需求,我想捐赠(一些面团或工作)将有助于推动推进进度。 不幸的是,我没有时间做出贡献,所以我只剩下希望和耐心:P

谈论贡献:提交当前的开发状态作为 PR 以便其他人可以加入,如果他们觉得自己可以贡献的话,怎么样?

鉴于 ruby​​ 和一般情况下 GPG-API 的悲惨状态,新的GPG rust 实现可能值得一看。

一粒盐:

绑定即将推出!

有关于 PGP 和 S/MIME 集成的消息吗? 我也想捐款,因为我迫切需要这个功能。

实际上是否有一个包含即将推出的版本的计划功能的列表?

@hatscher
我们还需要 S/MIME,并且正在与 Zammad 就成本进行谈判。 我们是否想互相交谈,以便我们可以分担整合成本? 也许只是给我发一封电子邮件(姓氏的名字)。

电子邮件正在发送中 ;-)

我们目前正在寻找愿意资助此功能的其他人(可能还与 S/MIME 加密一起作为一个包)。 如果您对我在 lastname .de 中的名字感兴趣,请与我联系。 我会检查一下有多少愿意的人,这样我们就可以分摊成本。

@martinseener很高兴听到您试图为此功能获得资金。 您能分享取得的进展或遇到的问题吗? PGP 支持目前正在决定是否迁移到 Zammad,因此我们将不胜感激。

抱歉,目前我们无法分享有关此主题的任何信息。
一旦 Zammad-Core 发生变化,我们将相应地更新此问题。

查看您几个月的响应时间以及之前关于此问题的讨论,我的结论是,向 Zammad 添加 PGP 支持不是您的优先事项,或者根本不会发生。 (这里只是为将来出现并且不想阅读整个讨论的任何人总结一下。)

@rixx - 你是对的。 我们目前正在根据我们的优先级模式处理任务:

第一:支持/定制开发
这些是资助 Zammad 的人和我们发布的功能。 没有他们,扎马德今天就不会在这里。 拥有它们对我们来说真的很重要,并鼓励我们走在正确的轨道上。

第二:80% 的功能/问题
我们从客户的支持中获得的空闲时间是 100% 地花在产品上。 对我们用户群中的任何用户公平对待对我们来说很重要。 然而,一旦涉及到细节,我们需要做出越来越多的决定,以支持一方而不是另一方。 因此,我们只处理影响 80% 用户群的功能和问题。 通过这种方式,我们可以确保我们的大多数用户群从我们引入的变化中获利。

第三:个人兴趣
在 Zammad,每个人都可以自由地将时间花在个人感兴趣的任务上。 如果您再环顾四周,您会注意到我们对不属于资助或最相关更改类别的问题和问题作出回应。 这是因为我们实际上关心并喜欢帮助人们。 然而,这些大多是较小的任务,因为目前空闲时间非常有限 - 不幸的是。

现在回到主题:PGP 目前不属于上面列出的任何类别。 这就是为什么你说它目前对我们来说不是高优先级是正确的。 但是,当您说 PGP 根本不会发生时,您就错了。 PGP 对我们来说具有相当高的优先级,它实际上在我们的公共路线图内部草案中,其中仅包括最相关的更改。
因此,PGP 的时机尚未到来,但肯定会到来。 取决于优先级架构 - 迟早。
我从你的总结中遗漏了一个事实,即 PGP 开发实际上已经由@luto在我们的支持下作为社区工作开始了(再次感谢@luto !)。 不幸的是,优先级发生了变化,并且更改目前已过时。 但是,每个有知识和能力去拾取并继续努力的人都会得到我们的支持!

对于任何对加密通信的整体主题感兴趣的人来说,还有一个消息: barzahlen.de的 @martinseener 周围的伟人资助了 S/MIME 通信 (#1961) 的开发——很快就会开始。

如果您有兴趣深入讨论甚至贡献,请随时在社区委员会打开一个线程或 PM 我,并保持这个问题的主题。

有关于“S/MIME 通信”的消息吗?

如果非要问,请至少用对地方: https ://github.com/zammad/zammad/issues/1961

抱歉,由于过去几个月缺少反馈,我将这个问题仅限于贡献者。
这是为了减少噪音并帮助我们集中精力解决问题。

如果我们对此有任何更新,我们将相应地更新此问题。

正如您可能在 #1961 中看到的那样,我们添加了 S/MIME 支持,并将与即将发布的 Zammad 3.4 版本一起发布 🎉 非常感谢barzahlen.de的@martinseener 对它的赞助,因此使它成为可能 🙌
不幸的是,我们仍然没有添加 PGP 支持所需的资源。 我们正在考虑测试一些东西,但还没有机会。 这就是为什么我想在这里给你一个简短的更新。
然而,S/MIME 集成为处理安全邮件提供了一个几乎完整的“框架”,并提供了一个关于如何集成/构建事物的很好的参考实现。 @lutoUberspace分支上仍然完成了出色的初步工作。 如果有人愿意冒险,我们很乐意尽我们所能提供帮助。 只需在社区委员会打开一个线程并提及我。

当有新信息可用时,我们会及时通知您 - 承诺✌️

此页面是否有帮助?
0 / 5 - 0 等级