弃用账密验证 GitHub 操作

  GitHub防黑客新措施:弃用账密验证Git操作,改用 token 或 SSH 密钥,于 2021-08-13 禁用了账号、密码操作Git,改用了token 或者ssh 方式。GitHub官方表示,这一举措是为了提高Git操作的安全性,防止密码撞库等事情发生。哪些操作会受影响呢?

  • 简单来说,如果你还在用账密验证Git操作,这些行为都会受到影响:
  1. 命令行Git访问

  2. 采用Git的桌面应用程序(GitHub Desktop不受影响)

  3. 账密访问GitHub上Git repo的一切应用程序/服务

  • 这些用户不会受影响:
  1. 已经采用token或SSH密钥方式验证,即启用双因素身份验证(2FA)的用户

  2. 使用GitHub Enterprise Server本地产品的用户(该产品尚未对此进行更改)

  3. 使用GitHub App的用户,此前已经不支持账密验证

  在今年6月30号(15~18时)、7月1号(0~3时)、7月28号(15~18时)和29号(0~3时),GitHub已经针对这件事进行了预演,所有Git操作都被要求用token或SSH密钥验证。

  现在,这项举措已经变成一个永久措施。

  GitHub究竟为什么要这样做呢?

  token 和 SSH 密钥安全在哪里?

  首先需要了解,只用账户和密码进行身份验证会有什么隐患。互联网上,每天都有大量网站遭受黑客攻击,导致数据外泄,这些数据中就包括不少用户的账号密码。拿到账号密码后,黑客会用它们试着登录其他网站,也就是所谓的密码撞库。简单来说,如果你A、B、C网站用的是一套账户密码,在A网站的密码被泄露后,B、C网站也可能会被盗号。

  为了防止密码撞库,网站会采取更多手段验证身份信息,像GitHub就推出了双因素身份验证、登录警报、设备认证、防用泄露密码及支持WebAuth等措施。双因素身份验证,是指在秘密信息(密码等)、个人物品(身份证等)、生理特征(指纹/虹膜/人脸等)这三种因素中,同时用两种因素进行认证的过程。

  现在,GitHub 开始强制用户采用 token 或 SSH 密钥进行身份验证。相比于账密,这两者的安全性显然更高:

  1. 唯一性:仅限GitHub使用,根据设备/使用次数生成

  2. 可撤销性:可随时被单独撤销,其他凭证不受影响

  3. 区域性:使用范围可控,只允许在部分访问活动中执行

  4. 随机性:不受撞库影响,比账密复杂度更高

  那么,token 和 SSH 密钥之间,哪个更合适呢?虽然目前 GitHub 官方推荐的是 token,因为它设置更为简单,不过相比之下,SSH 密钥的安全性要更高一些。

Github 设置 SSH 方式

关于 Github 与 SSH

  使用 SSH 协议可以连接远程服务器和服务并向它们验证。 利用 SSH 密钥可以连接 GitHub,而无需在每次访问时都提供用户名和个人访问令牌。设置 SSH 时,您需要生成新的 SSH 密钥并将其添加到 ssh 代理中。 使用密钥进行身份验证之前,您必须将 SSH 密钥添加到 GitHub 上的帐户中。

SSH 与 SSL 的区别

  1. SSH 与 SSL 应用方向不同,但基于技术都是一样的(公钥和私钥配对)

  2. SSL 主要用在 Browser 和 erver 通信,比如 HTTPS = HTTP + SSL

  3. SSH是由客户端和服务端的软件组成的,用于computer之间通信,比如我们通过SSH登录远端服务器。有两个不兼容的版本分别是:1.x和2.x。用SSH 2.x的客户程序是不能连接到SSH 1.x的服务程序上去的。OpenSSH 2.x同时支持SSH 1.x和2.x。

Item SSL SSH
Abbreviation SecureSocket Layer SecureShell
Port 443 22
Application For Encrypting Communication between Brower and Server For Encryptiong Communication between Two Computer
Adopted by industry Widely used by E-commerce,Banking,Social Media,Government,Healthcare,etc.industries. Widely Adopted by Networking Industry.
Authentication Via Public-Kye/Private-Key Pair via 1) Public-Kye/Private-Key Pair Or 2)User-Id/Password Pair

创建 SSH key

  • SSH 有一套固定命令,其中使用 ssh-keygen 命令创建 ssh-key
1
2
3
4
5
$ ssh-keygen -t rsa -C "comment"
//其中,参数含义为:
// -t 指定密码类型, 默认 rsa 可省略
// -C 添加注释
// -f 指定密钥文件存储路径
  • 生成中会提示输入密码(该密码是你push文件的时候要输入的密码,而不是github管理者的密码)也可以不输入密码,直接按回车,那么push的时候就不需要输入密码,直接提交到github上了。

  • 然后经过几个回车后显示会在指定目录下生成密钥对文件,有.pub后缀的文明公钥,没有后缀名的问私钥

添加 SSH Key 到 Github 网站

  1. 首先你需要拷贝 id_rsa.pub 文件的内容,你可以用编辑器打开文件复制,也可以用git命令复制该文件的内容,如:
    $ clip < ~/.ssh/id_rsa.pub

  2. 在任何页面的右上角,单击您的个人资料照片,然后单击 Settings(设置)

  1. 登录你的github账号,从又上角的设置( Account Settings )进入,然后点击菜单栏的 SSH key 进入页面添加 SSH key;

  2. 在用户设置侧边栏中,单击 SSH and GPG keys(SSH 和 GPG 密钥)

  1. 单击 New SSH key(新 SSH 密钥)或 Add SSH key(添加 SSH 密钥)
  1. 在 “Title”(标题)字段中,为新密钥添加描述性标签。 例如,如果您使用的是个人 Mac,此密钥名称可能是 “Personal MacBook Air”

  2. 将密钥粘贴到 “Key”(密钥)字段

  1. 单击 Add SSH key(添加 SSH 密钥)
  1. 如有提示,请确认您的 GitHub 密码

测试 SSH 连接

设置 SSH 密钥并将其添加到您的 GitHub 帐户后,您可以测试连接

  1. Mac 、Linux 环境下打开 Terminal(终端);Windows环境下打开 Git Bash;

  2. 测试命令:

1
2
$ ssh -T git@github.com
# Attempts to ssh toGithub

您可能会看到类似如下的警告:

The authenticity of host ‘github.com (IP ADDRESS)’ can’t be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)?

  1. 验证所看到消息中的指纹是否匹配 GitHub 的 RSA 公钥指纹。 如果是,则输入 yes:

Hi username! You’ve successfully authenticated, but GitHub does not
provide shell access.

  1. 验证生成的消息包含您的用户名

Github 设置 token 方式

创建个人访问令牌

  1. 登录 Github 后,在任何页面右上角,单击您的个人资料照片,然后单击 Settings(设置)
  1. 在左侧边栏中,单击 Developer settings
  1. 在左侧边栏中,单击 Personal access tokens(个人访问令牌)
  1. 单击 Generate new token(生成新令牌)
  1. 给令牌一个描述性名称
  1. 选择要授予此令牌的作用域或权限。 要使用令牌从命令行访问仓库,请选择 repo(仓库)
  1. 单击 Generate token(生成令牌)
  1. 单击 将令牌复制到剪贴板。 出于安全原因,在离开页面后,您将无法再次看到令牌

警告: 像对待密码一样对待您的令牌,确保其机密性。 使用 API 时,应将令牌用作环境变量,而不是将其硬编码到程序中。

在命令行上使用令牌

如果您有令牌,则可以在通过 HTTPS 执行 Git 操作时输入令牌,而不是密码。

例如,在命令行中输入以下内容:

1
2
3
$ git clone https://github.com/username/repo.git
Username: your_username
Password: your_token

  个人访问令牌只能用于 HTTPS Git 操作。 如果您的仓库使用 SSH 远程 URL,则需要将远程 URL 从 SSH 切换到 HTTPS。

  如果没有提示您输入用户名和密码,说明您的凭据可能已缓存在计算机上。 您可以在密钥链中更新您的凭据,用令牌替换您的旧密码。

  您可以使用 Git 客户端缓存 PAT,而不必为每个 HTTPS Git 操作手动输入 PAT。 Git 会将您的凭据临时存储在内存中,直到过期为止。 您还可以将令牌存储在 Git 可以在每个请求之前读取的纯文本文件中。