Git http - 安全地记住凭据

Posted

技术标签:

【中文标题】Git http - 安全地记住凭据【英文标题】:Git http - securely remember credentials 【发布时间】:2011-09-05 17:25:31 【问题描述】:

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

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

【问题讨论】:

自 2011 年 12 月(git 版本 1.7.8)以来,您可以使用所谓的 凭证助手,请参阅我的回答:***.com/a/12938677/46058 您现在可以拥有一个加密的netrc 文件!见my answer below 【参考方案1】:

git 在 HTTP 上运行时调用 cURL。您可以通过在用户的主目录中设置 .netrc 文件并将其设为用户私有(Linux 中的 0600)来存储安全凭据。

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

machine myRemoteServer
login myUserName
password s3cret

请参阅https://***.com/questions/3947530/git-push-fatal-failed/7177690#7177690 了解完整的服务器端配置,其中可以轻松包含对您的 ldap 服务器的调用。

【讨论】:

这比在命令中输入密码更安全,因为命令历史文件是世界可读的,而 .netrc 应该明确地对除拥有用户之外的任何人隐藏。. bash_history 文件的 linux/cygwin 示例权限(-rw-r--r-- 1 myName Domain Users 8955 Aug 24 12:53 .bash_history) 这也是正确的,因为它可以防止密码字符串在 Git 命令运行时在 'ps -ax' 的输出中是世界可见的。 如果您没有在命令行上提供密码,git 会提示您输入密码。这意味着它在 bash 历史记录中不可见。如果您将其存储在 .netrc 中,那么任何对机器具有物理访问权限或 root 访问权限的人都可以读取您的密码,因为它以纯文本形式存储。但是,您必须每次都输入它,这真的很不方便。 或一行:machine github.com login jqhacker password s3cret @eddie 我上面的建议是替代 .netrc 语法,而不是 shell 命令。【参考方案2】:

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

有关详细信息,请参阅 gitcredentials(7) 手册页(该手册页还描述了 core.askpass 的适用位置)。

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

缓存:详见git-credential-cache(1)。

在内存中缓存凭据一小段时间。存储的凭据从不接触磁盘,并且在可配置的超时后被遗忘。 请注意,它是 Unix-only 解决方案,因为它使用套接字与守护进程通信。

商店:详情请见git-credential-store(1)。

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


有一些第三方凭证助手用于将用户名和密码存储在 KDEWallet (KDE)、GNOME Keyring、Windows Credential Store(现在集成在 Git for Windows)、MacOS X 钥匙串等中。


脚注:

1)Set Up Git GitHub 帮助页面提到了这一点

您需要 git 1.7.10 或更新版本才能使用凭证助手

【讨论】:

凭证缓存方法在 Ubuntu 12.04 下与 Git 1.7.9.5 一起工作没有问题。谢谢指点。 谢谢——这对我有用:git config credential.helper store 请注意,Windows 用户的情况有所不同:***.com/q/11693074/…【参考方案3】:

自 git 1.8.3(2013 年 5 月)以来,您现在可以指定一个 加密的 .netrc 供 git 使用:

添加了一个new read-only credential helper(在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-”并查找它 在路径中。)


查看完整的分步示例: “Is there a way to skip password typing when using https://github.com”。

【讨论】:

【参考方案4】:

安全选项是使用带有公钥/私钥对的常规 SSH。

【讨论】:

@John,我不赞成:在 Git 客户端和服务器之间,经过身份验证的 HTTPS 传输与 SSH 一样安全。在较大的组织中,集中的、单一帐户的用户访问权限配置/撤销是一个非常常见的约束。 AFAIK,OpenSSH 只能处理本地文件中的用户公钥,而不是通过目录查找(例如 LDAP)。 @RyanB.Lynch:仅供参考,有 OpenSSH-LPK 可以在 LDAP 中存储公钥,但它已修补 OpenSSH code.google.com/p/openssh-lpk 8 年后:sshd_config 中有一个选项 AuthorizedKeysCommand,如果提供,它指定运行以获取用户公钥的程序或脚本。我不知道支持它的 OpenSSH 的最低版本,但它已经存在了几年。一方面,这是如何在谷歌云虚拟机中实现 ssh 身份验证以允许登录到新的虚拟机(公钥存储在虚拟机或项目配置中,或者在另一种模式下,添加到用户的谷歌帐户中,以获得真正的单点登录)。【参考方案5】:

这可能对你有用...http://samuel.kadolph.com/2011/03/store-your-git-https-passwords-in-your-os-x-keychain/

【讨论】:

以上是关于Git http - 安全地记住凭据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 中安全地存储数据库凭据?

如何在爬网程序中安全地使用用户输入的凭据?

如何在 Android 应用程序中安全地存储凭据(密码)?

IBM 工作灯。是不是可以安全地存储用户凭据并在没有用户交互的情况下恢复它们?

Git 2.26.1修复使用换行符创建可能的凭据泄漏

关于【记住我的凭据】,老是记不住!!