Git http-安全记住凭据


68

通过HTTP(S)连接到远程存储库时,是否有办法安全地让git记住我的凭据?

我尝试了core.askpass详细介绍的方法git-config,让外部脚本提供我的凭据。尽管效果很好,但用户名和密码仍以纯文本格式存储在小型Shell脚本中。


4
自2011年12月(git版本1.7.8)以来,您可以使用所谓的凭据助手,请参阅我的答案:stackoverflow.com/a/12938677/46058
JakubNarębski2012年

1
您现在可以拥有一个加密的netrc文件!请参阅下面的答案
VonC

Answers:


65

git通过HTTP运行时调用cURL。您可以通过设置一个.netrc在用户的主目录中文件并将其设置为用户专用(Linux中为0600)。

该文件的内容提供了每个远程域的用户名和密码。

machine myRemoteServer
login myUserName
password s3cret

有关 完整的服务器端配置,请参阅/programming/3947530/git-push-fatal-failed/7177690#7177690,其中可以轻松包括对ldap服务器的调用。


2
这比在命令中键入密码更安全,因为命令历史记录文件是世界可读的,而.netrc应该明确地对除拥有用户之外的任何用户隐藏。 r-- 1个myName域用户8955年8月24日12:53 .bash_history)
艾迪(Eddie

3
这也是正确的,因为在Git命令运行时,它可以防止密码字符串在'ps -ax'的输出中全局显示。
瑞安·林奇

3
如果您没有在命令行上提供密码,git会提示您输入密码。这意味着它在bash历史记录中不可见。如果将其存储在.netrc中,则对计算机具有物理访问权限或root访问权限的任何人都可以读取您的密码,因为密码以纯文本格式存储。但是,您每次都必须键入它,这确实很不方便。
亚历克斯

2
或一行:machine github.com login jqhacker password s3cret
Jesse Glick 2013年

2
@eddie我上面的建议是替代.netrc语法,而不是shell命令。
Jesse Glick 2014年

52

自(我认为)git版本1.7.8(自2011年12月2日起1)以来,git支持所谓的凭据助手

有关详细信息,请参见gitcredentials(7)联机帮助页
(此联机帮助页还描述了core.askpass适合该页的位置)。

默认的git安装包括两个助手:

  • cache:有关详细信息,请参见git-credential-cache(1)

    在短时间内将凭据缓存在内存中。存储的凭据永远不会接触磁盘,并且在可配置的超时后会被忘记。请注意,这是仅Unix的解决方案,因为它使用套接字与守护程序通信。

  • store:有关详细信息,请参见git-credential-store(1)

    将凭据无限期地存储在磁盘上。该文件将设置其文件系统权限,以防止系统上的其他用户读取该文件,但不会被加密或受到其他保护。与Eddie响应中的.netrc解决方案相同的安全性


有一些第三方凭据助手,用于在KDEWallet(KDE),GNOME KeyringWindows Credential Store(现在已集成到Windows的Git中),MacOS X Keychain等中存储用户名和密码。


脚注:

1)成立的Git的GitHub帮助页面中提到,

您需要git 1.7.10或更高版本才能使用凭据帮助器


1
在Ubuntu 12.04下使用Git 1.7.9.5时,凭据缓存方法可以正常工作。感谢您的指导。
MKroehnert

3
谢谢-这对我
有用

让我注意到,对于Windows用户,情况有所不同:stackoverflow.com/q/11693074/…–
YakovL,

14

git 1.8.3(2013年5月)开始,您现在可以指定加密.netrc的git才能使用:

已添加一个新的只读凭证帮助器(in contrib/credential/netrc/)以与.netrc/.authinfo文件进行交互。

该脚本将允许您使用gpg加密的netrc文件,从而避免了将凭据存储在纯文本文件中的问题。

-f|--file AUTHFILE
specify netrc-style files.  

具有.gpg扩展名的文件将在解析之前由GPG解密。
可以使用多个-f参数。它们将按顺序进行处理,找到的第一个匹配条目将通过凭据帮助程序协议返回(请参见下文)。

当没有-f给出选项,.authinfo.gpg.netrc.gpg.authinfo,和.netrc在你的主目录文件的顺序使用。

要启用此凭据助手:

git config credential.helper '$shortname -f AUTHFILE1 -f AUTHFILE2'

(请注意,Git会在“git-credential-在助手名称 ”,并在路径中查找它。)


请参阅以下完整的分步示例
使用https://github.com时是否可以跳过密码输入


3

安全选项是对公共/专用密钥对使用常规SSH。


1
@John,我很不高兴:在Git客户端和服务器之间,正确的,经过身份验证的HTTPS传输与SSH一样安全。在大型组织中,集中的,单一帐户的用户访问权限设置/撤销是一个非常普遍的约束。AFAIK,OpenSSH只能处理本地文件中的用户发布密钥,而不能通过目录查找(例如LDAP)进行处理。
瑞安·林奇

2
@ RyanB.Lynch:仅供参考,有OpenSSH-LPK可将公用密钥存储在LDAP中,但已对其进行了修补OpenSSH code.google.com/p/openssh-lpk
JakubNarębski2012年

8年后:有一个选项AuthorizedKeysCommandsshd_config其中提供了一个选项,该选项指定运行的程序或脚本来获取用户的公共密钥。我不知道支持它的最低版本的OpenSSH,但是它已经存在了几年。一方面,这是在Google Cloud VM中实现ssh身份验证以允许登录到新VM的方式(公钥存储在VM或项目配置中,或者以另一种方式添加到用户的Google帐户中,以实现SSO)。
公里,2008年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.