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 - 安全地记住凭据的主要内容,如果未能解决你的问题,请参考以下文章