8

我正在尝试找出 Web 应用程序配置的最佳方法。目标是:

  1. 可配置性。强制在部署时指定配置。确保配置与代码或可部署工件分开。
  2. 安全。防止秘密从部署环境中泄露。
  3. 简单。确保解决方案简单,并且对 OS 进程的概念很自然。
  4. 灵活性。不对配置的存储位置做任何假设。

根据12 因素应用程序Web 应用程序配置最好在环境变量中提供。它简单灵活,但看起来有一些与此相关的安全问题

另一种方法可能是将所有配置作为命令行参数传递。这对操作系统来说又是简单、灵活和自然的,但整个配置随后在主机的进程列表中可见。这可能是也可能不是问题(我不是操作系统专家),但至少解决方案很麻烦。

流行的框架Dropwizard采用混合方法,其中命令行参数指定配置文件位置,并从那里读取配置。问题是它打破了对我的配置(本地文件)位置的假设的灵活性约束。它还使我的应用程序实现了文件访问,虽然这在大多数语言/框架/库中通常很容易实现,但本质上并不简单。

我正在考虑另一种方法,即在应用程序的stdin. 最终cat my-config-file.yml | ./my-web-app,在本地存储文件甚至wget https://secure-config-provider/my-config-file.yml | ./my-web-app. 管道似乎很简单,并且是 OS 进程的原生。它看起来非常灵活,并且将配置如何提供到主机操作系统的问题分开。

问题是它是否符合安全约束。假设一旦管道内容被消费,它就永远消失了,这是否安全?

我无法通过谷歌搜索任何尝试此操作的人,因此提出了这个问题。

4

1 回答 1

8

将秘密写入stdin进程的比环境变量更安全 -如果正确完成

事实上,这是我所知道的将秘密从一个进程传递到另一个进程的最安全的方法——如果操作正确的话。

当然,这适用于所有不存在文件系统且无法由其他进程打开的类文件输入,这stdin只是默认情况下可用且易于写入的输入的一个实例。

无论如何,正如您链接的帖子所描述的那样,环境变量的关键在于,一旦您将某些内容放入环境变量中,它就会泄漏到所有子进程中,除非您注意清理它。

而且,以您的用户或任何特权/管理用户身份运行的其他进程也可以检查您正在运行的进程的环境。

例如,在 Linux 上,查看文件/proc/*/environ. 该文件存在于每个正在运行的进程中,您可以检查其内容以查找以您的用户身份运行的任何进程。如果你是root,你可以查看任何用户的任何进程的环境。

这意味着任何本地代码执行漏洞,甚至是一些非特权漏洞,都可以访问您环境变量中的机密,而且这样做非常简单。仍然比将它们放在一个文件中要好,但不是很多。

但是,当您将内容导入stdin进程时,外部进程只有在能够使用调试系统调用“附加”到进程并监视系统调用或扫描其内存的情况下才能拦截。这是一个更复杂的过程,在哪里看不太明显,最重要的是,它可以得到更多的保护。

例如,Linux 可以配置为防止非特权用户进程甚至将调试器系统调用调用到由同一用户启动的其他进程上,而这些进程是由他们未启动的同一用户启动的,并且某些发行版开始默认启用此功能。

这意味着在几乎所有情况下,正确执行的数据写入stdin至少与使用环境变量一样或更安全。


但是请注意,您必须“正确执行”。例如,这两个不会为您提供相同的安全优势:

  • my-command </some/path/my-secret-config
  • cat /some/path/my-secret-config | my-command

因为秘密仍然存在于磁盘上。因此,您可以获得更大的灵活性,但不会获得更多的安全性。(但是,如果catis 实际上sudo cat或以其他方式比 具有对文件的更多特权访问my-command,那么它可能是一个安全优势。)

现在让我们看一个更有趣的案例:

  • echo "$my_secret_data" | my-command

这比环境变量更安全还是更安全?这取决于

如果您在典型的 shell 中调用它,那么echo可能是“内置”,这意味着 shell 永远不需要执行外部echo程序,并且变量在写入stdin.

但是如果你从 shell 外部调用这样的东西,那么这实际上是一个很大的安全漏洞,因为它会将变量放入执行的外部echo程序的命令行中,在许多系统上,任何其他正在运行的程序都可以看到进程,甚至是其他非特权用户!

因此,只要您了解这一点,并使用正确的功能来确保您直接从具有流程凭据的任何内容进行写入,stdin这可能是您拥有的最安全的选择。


TL;DR: stdin可以为您提供更小的数据泄漏“表面积”,这意味着它可以帮助您获得更高的安全性,但是您是否这样做取决于您使用它的方式以及其余部分的方式您的系统的设置。

就个人而言,我stdin会尽可能地用于传递秘密数据。

于 2019-04-23T05:42:44.467 回答