如何在afs中使用keytab来验证kerberos?

时间:2014-05-29 14:42:40

标签: linux authentication passwords kerberos openafs

在带有AFS文件的Ubuntu(Linux)上,我需要使用" kinit"获取Kerberos票证。在我做之前" aklog"访问AFS文件。我无法访问" keytab"存储在AFS中的文件来做" kinit"在做" aklog"之前。它似乎是一个Catch-22。有什么建议?我现在做的事情是:echo"密码" | kinit user @ realm;它不适用于Mac OSX,但适用于Linux。我无人值守" cron"没有AFS访问权限的工作,直到他们与" kinit"建立访问权限。和" aklog"。

1 个答案:

答案 0 :(得分:0)

通常,如果您计划使用该密钥表对AFS进行身份验证,则不要在/ afs中放置密钥表。这就像把钥匙存放在保险箱内的保险箱里一样;就像你说的,它是一个捕获22。你也不应该运行echo "password" | kinit;您只是将密钥表存储在密码存储区中,并在某处存储密码,而密钥记录则是echo密码的优越替代品。如果您在脚本中的任何位置echo "password" | kinit,则其他用户可以通过查看进程列表来查看该密码,因此不太安全。

通常,您对cron作业提供经过身份验证的AFS访问的方式是将keytab放在本地磁盘上,并让脚本访问它。然后,您可以在密钥表上设置传统的Unix权限,以便只有您可以访问它。无法访问本地磁盘会使这更加困难,但这是可能的。我可以想到几种方法:

让Cron为您获取证书

某些环境能够在为用户运行cron作业时获取特殊“cron”-y用户的凭据。也就是说,您注册了您的cron作业,以便在用户cron.dguertin'而不仅仅是'dguertin'。然后,cron系统本身可以访问密钥表以进行身份​​验证,并且可以设置AFS ACL以允许cron.dguertin访问您想要的任何文件。我不了解这些系统是如何工作的,但我在Stanford CS Stanford IT以及其他地方听说过这个。

当然,系统必须设置为执行此操作。如果您无法控制基础架构,这对您没有帮助。

在Cron中嵌入凭据

假设没有其他人可以读取你的crontab的内容(传统的cron是正确的,所以我认为无论你使用什么cron设置都是如此),你确实只需将凭证嵌入到crontab文件中本身。但是,如上所述,只有echo密码通常不是一个好主意,因为有人可以查看进程列表并查看密码。

cron的某些实现允许您在指定要运行的命令之前设置环境变量。例如:

GUERTIN_PASSWORD=donotuse_TuAk9OgVoigg
# m h dom mon dow command
* * * * * /path/to/script

然后,您的脚本可以读取GUERTIN_PASSWORD环境变量的值,并将密码传递给kinit,或者使用它来解密加密的密钥表/密码等。确保在读取后取消设置GUERTIN_PASSWORD环境变量,所以它不会泄漏给子进程。

或者,您实际上可以直接在cron条目中嵌入keytab文件。由于keytabs是二进制数据,这有点令人讨厌,但它们往往很短。例如,如果您的keytab具有以下内容:

$ cat /path/to.keytab | base64
BQIAAABFAAEAC0VYQU1QTEUuQ09NAAdleGFtcGxlAAAAAVUmAlwBABIAILdV5P6NXT8RrTvapcMJ
QxDYCjRQiD0BzxhwS9h0VgyM

然后你可以像这样创建一个cron条目:

GUERTIN_KEYTAB=BQIAAABFAAEAC0VYQU1QTEUuQ09NAAdleGFtcGxlAAAAAVUmAlwBABIAILdV5P6NXT8RrTvapcMJQxDYCjRQiD0BzxhwS9h0VgyM
# m h dom mon dow command
* * * * * /path/to/script

然后你的脚本可以解码base64,将内容写出到临时文件,并运行如下:

k5start -U -f "$tmp_keytab" -t -- $rest_of_command

(k5start处理运行aklog并为您设置AFS PAG)。或者,使用kinit / aklog:

kinit -k -t "$tmp_keytab" "$principal" && aklog

如前所述,只需确保在运行任何命令之前清除GUERTIN_KEYTAB环境变量。

请注意,并非所有cron实现都允许您单独设置这样的环境变量。一些cron实现要求你做这样的事情:

* * * * * export FOO=bar; /path/to/script

但是在这种情况下这没有用,因为这会导致相关环境变量的内容通过进程列表可见。

将密钥表放在AFS

您实际上可以将密钥表放在AFS中,然后通过IP地址限制对它的访问,因此只有群集上运行的主机才能访问它,而无需先对AFS进行身份验证。 OpenAFS确实有一些限制通过IP访问的工具,但它们有点笨拙。通常也不建议使用这些,但在某些情况下(例如使用cron作业或其他批处理作业),您没有多少选择。这些通常被称为" IP ACL"或者"主机ACL"。

为此,您需要为所需的IP地址创建用户:

$ pts createuser 198.51.100.23

然后您只需将其添加到正常的AFS ACL中:

$ fs setacl /path/to/dir 198.51.100.23 rl

如果要限制对一系列IP的访问,AFS主机ACL对通配符IP具有一些原始功能:

$ fs setacl /path/to/dir 198.51.100.0 rl

这将允许整个198.51.100.0/24范围能够读取该目录。任何' 0' IP地址中的段将被视为通配符。 (您仍然需要创建198.51.100.0用户。)如果要允许访问多个范围或多个单独的IP,只需将它们添加到ACL,就像授予多个用户访问权限一样。

请注意,主机ACL在首次使用后可能需要几个小时才能生效。这是因为仅在后台定期重新计算单个主机的权限。这可能会让人感到困惑,所以如果您想要使用这些,只要等待几个小时,如果它似乎无法正常工作。

但是,如果您无法创建相关的IP用户,则此功能无效。

将keytab放在其他地方

当然,您可以将密钥表放在网络服务器上,就像您提到的那样,让网络服务器通过IP地址限制访问密钥表。同样的方法也可以将keytab的内容放在数据库中,并通过IP或任何其他可以限制通过IP访问的机制来限制对数据库的访问。

要通过Web服务器执行此操作,只需将keytab放在/ afs中的某个目录中,并限制AFS ACL,以便只有Web服务器才能读取它(假设Web服务器使用AFS凭据运行)。然后将Web服务器配置为仅允许某些IP获取该文件。

的组合

当然,您也可以结合上述任何方法。如果您不信任来自群集机IP的所有访问,但您并不完全相信在cron中嵌入密码"方法,您可以使用上述机制之一通过IP地址限制对密钥表的访问,并使用您在crontab条目中嵌入环境变量的密码加密密钥表。

此外,我认识到许多这些解决方案非常繁琐和/或迂回。这就是为什么有几个站点有自己的机制来获取用户的特定于cron的凭据,所以你不必经历所有这些。如果没有本地只有你的cronjobs可以访问的keytab,那么所有这些其他方法都非常明显是hack-y。