git - 如何根据给定的 ssh key 限制 git SSH 访问

标签 git ssh ssh-keys

我有一个私有(private) git 服务器,只有一个用户 git 和 ssh key 身份验证。目前,只有我一个人在用,但我想加更多人,我希望每个人都使用用户 git 连接到服务器并执行 git clone, git push 等。如果所有存储库都是“公开的”,那么我知道如何解决这个问题。但是例如我想有一个私有(private)存储库,我仍然会使用我的 SSH key 通过 git clone git@server:repo 克隆它,但是我不希望其他用户能够使用他们的 SSH key 。

我查看了有关设置服务器的 git-scm 文档(这对公共(public)存储库很有帮助),以及 this帖子,但是这篇帖子似乎只解决了私有(private)存储库的问题。

TLDR:当你在 GitHub 上克隆一个存储库时,你说 git clone git@github.com:user/repo 并且你的 git 用户名和 ssh key 正在被发送过来。现在,根据您是否拥有此存储库的权限,您可以克隆它,否则不能。所以基本上,每个人都在表面上使用 git 用户,但在幕后进行了一些授权。例如,GitHub 如何处理这个问题?

最佳答案

gitolite似乎正是您正在寻找的基于 ssh key 管理对存储库/分支的访问。

但是如果你想从头开始构建这样的东西,你需要查看 authorized_keys 文件中的选项,尤其是 commandenvironment .有了这些,您可以根据使用的 ssh key 强制执行特定的命令/脚本或添加/覆盖环境变量。

例如,您可以编写一个脚本,读取用户允许的存储库作为其参数,并强制它针对选定的 ssh key 运行:

# file ~/.ssh/authorized_keys
command="/home/git/bin/git-only-shell /home/git/repos/repo1" ssh-rsa AAAAB2...
command="/home/git/bin/git-only-shell /home/git/repos/repo1 /home/git/repos/repo2" ssh-rsa AAAAB3...

脚本现在可以从 $SSH_ORIGINAL_COMMAND 读取请求的 repo,并检查它是否包含在传递的列表中。此脚本 git-only-shell 的完整但粗略的示例实现可能是这样的:

#!/bin/bash

# verify that $SSH_ORIGINAL_COMMAND starts with git-upload-pack, git-upload-archive or
# git-receive-pack, followed by a space
if ! [[ "$SSH_ORIGINAL_COMMAND" == git-upload-pack\ * || "$SSH_ORIGINAL_COMMAND" == git-upload-archive\ * || "$SSH_ORIGINAL_COMMAND" == git-receive-pack\ * ]]; then
    echo "unsupported command" >&2
    exit 1
fi

# remove first word (git command)
ARGUMENTS="${SSH_ORIGINAL_COMMAND#git-* }"

# use eval to un-quote repo path (it is passed in single-quotes)
REPO_PATH="$(eval "echo $ARGUMENTS")"

# allowed repos are passed as arguments to this script
ALLOWED_REPOS="$@"

# check if repo was whitelisted
IS_ALLOWED=false
for repo in $ALLOWED_REPOS; do
    if [[ "$REPO_PATH" == "$repo" ]]; then
        IS_ALLOWED=true
    fi
done

if [[ $IS_ALLOWED == "false" ]]; then
    echo "access to this repo not allowed" >&2
    exit 1
fi

# execute the original command
eval "$SSH_ORIGINAL_COMMAND"

关于git - 如何根据给定的 ssh key 限制 git SSH 访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63132448/

相关文章:

ssh - 破坏 Vagrant 上 Ansible 中的代理转发

ssh - Fedora 如何自动运行 ssh 守护进程

gitlab - 指纹已经被gitlab取了

node.js - 回滚 pm2 部署到特定提交

git - git clone 中 --single-branch 的目的?

linux - Jenkins 可以在无代理的 linux 主机上运行 shell 脚本吗

ftp - 使用远程 FTP 原子包和私钥发出与服务器的连接

ssh - 如何为 Jenkins CLI 获取正确格式的 key 文件?

GitKraken 存储库用户和密码被错误记住

git - 如何在命令输出更改时触发 CMake 重新配置