launchd 守护程序的安全密码存储
Posted
技术标签:
【中文标题】launchd 守护程序的安全密码存储【英文标题】:Secure password storage for a launchd daemon 【发布时间】:2009-09-29 04:00:54 【问题描述】:在普通的 Cocoa 应用程序中,通常会将所有保存的密码存储在 Keychain 中,从而避免许多陷阱。现在我正在编写一个需要存储密码并在任何用户登录之前运行的启动守护程序。这意味着我不能像往常一样使用钥匙串。
我在 Keychain Access 中看到有一个“系统”钥匙串,但我一直无法找到任何关于如何使用它的文档(或者如果这是它的正确用途)。
存储 launchd 守护程序使用的密码的最佳做法是什么?
【问题讨论】:
【参考方案1】:您可以创建自己的钥匙串并随意使用它们。例如,如果您有一个应用程序包,您可以在您的应用程序包中包含一个。
或者您可以以特定用户(安装它的人)身份运行守护程序并将密钥放入他的钥匙串中,然后在需要时进入他的主文件夹。
或者您可以以 root 身份运行守护程序并将您的密钥放入系统钥匙串中。
-威尔
【讨论】:
知道系统钥匙串记录在哪里吗?我不知道如何在系统钥匙串中放一些东西。 您可以使用打开的钥匙串功能(不知道它的副手),只需将路径传递给系统钥匙串。大功告成。 这行得通。我从以 root 身份运行的守护进程中使用了 SecKeychainOpen("/Library/Keychains/System.keychain")。最大的警告是您必须使用代码签名,否则任何代码更改都会导致无法读取您存储的密码。 那么由于进程以作为某个用户的身份运行,它会自动访问该用户的钥匙串吗?这听起来……可能是一个安全漏洞。 是的,但是用户能够在每个钥匙串上设置策略可以缓解这种情况。例如:登录时解锁与需要密码解锁,超时自动重新锁定钥匙串。另外,我相信,个别项目每次都需要密码。【参考方案2】:钥匙串与用户上下文的概念紧密相关。因此,如果您需要一个处理用户钥匙串的后台进程,那么您应该使用 UserAgent 模型。 因为守护进程通常(如果不总是)具有 root:wheel 特权,因此 kerberos 将涵盖守护进程需要某种凭据的典型场景(Web 服务器上的文件共享、XGrid 代理等)。 root:wheel 守护进程绝不应该使用用户的凭据。
【讨论】:
它特别不关心用户,但它仍然需要存储凭据。在这种情况下,远程 Web 服务的秘密 API 密码。即使您在登录屏幕,在任何用户登录之前,该过程也需要拥有此凭据。 如果您查看 /private/etc,您会发现在您的计算机上运行的许多守护程序都引用了该文件夹中的 .conf 文件。但是在只读的基础上AFAIK。也许你可以让你的安装程序在那里放置一个 .conf 文件,然后用 MD5 将你的凭据放入其中......以上是关于launchd 守护程序的安全密码存储的主要内容,如果未能解决你的问题,请参考以下文章