2016-11-06 35 views
0

我有樹莓裨,這是我的GIT中服務器使用的回購。有多個物理用戶訪問它,目前這些用戶中的每個用戶都有自己的登錄服務器。換句話說,用戶John和Doe可以通過運行ssh [email protected][email protected]通過SSH登錄到服務器。GIT中:一個git的用戶能夠控制多個物理用戶

物理用戶擁有私有Git倉庫,這是任何其他用戶能夠訪問。例如。 John的回購站位於/home/john/repos,而Doe的回購站位於服務器上的/home/doe/repos

我要的是隻有一個用戶名爲git,控制所有用戶的回購。例如,而不是約翰有遠程[email protected]:repos/project.git,他會使用[email protected]:john/project.git。同樣,能源部將推動以[email protected]:doe/some_other_project.git

這怎麼能同時確保人們不能互相訪問對方的回購可以實現嗎?服務器通過SSH訪問。

+0

您當前的場景使用Unix內置設施隔離不想使用的用戶。這意味着您需要找到類似的功能來隔離用戶,並將該代碼添加到您現在擁有的代碼中。這可能比你想象的更復雜。你不希望unix用戶登錄的原因是什麼? –

+0

這個設置的主要原因是我想了解如何做到這一點,以瞭解更多關於Git和UNIX的知識。例如。 Github和Bitbucket使用這種方法,所以我只是想了解它是如何工作的,如果它看起來不錯,我想我可以使用它。 – lklun

回答

0

最簡單的解決方案是設置一些像gitlab,它提供了一個Web界面,各種訪問控制,以及各種各樣的其他花裏胡哨的東西。

如果你真的想推出自己的:與directions in the Git book

入門設置服務器允許訪問一個共享的用戶通過SSH。

那些指令將讓你共享git帳戶,每個人都可以訪問,並且將讓任何人推/拉從任何存儲庫。我們可以實現一個簡單的授權層,將用戶限制在特定目錄中的存儲庫。

開始用小包裝腳本:

#!/bin/sh 

repo_prefix=$1 

eval set -- $SSH_ORIGINAL_COMMAND 
case "$1" in 
    (git-receive-pack|git-upload-pack|git-upload-archive) 

     # prevent attempts at using dir/../path to escape 
     # repository directory 
     case "$2" in 
      (*..*) echo "Invalid repository name." >&2 
        exit 1 
        ;; 
     esac 

     repo_path="$repo_prefix/$2" 
     eval exec $1 $repo_path 
     ;; 

    (*) echo "Unsupported command" >&2 
     exit 1 
     ;; 
esac 

這會在前面加上一個前綴路徑,作爲命令行參數提供給所有的版本庫路徑。現在,我們需要安排這個包裝來攔截git操作。

要使用此功能,您需要修改您添加到git用戶的authorized_keys文件的公鑰。如果你遵循了Git的書的指示,authorized_keys文件將在它的一個或多個公共密鑰,像這樣:

ssh-rsa AAAA...== some comment 

對於每一個公共密鑰,你將需要添加一個配置選項,將導致包裝腳本將被調用以代替原始命令。從sshd手冊頁:

文件的每一行包含一個鍵(空行和以「#」開始 被忽略爲註釋)。協議1個公共密鑰由以下空間分隔的字段 :選項,比特,指數, 模量,評論。協議2公鑰包括:options,keytype, base64編碼密鑰,註釋。選項字段是可選的...

略進一步下跌:

下列選項規範的支持(注意,選擇 關鍵字是不區分大小寫):[...]

命令= 「命令」

指定只要將此密鑰用於 身份驗證,就會執行該命令。由用戶提供的命令(如果有)被忽略... 最初由客戶端提供的命令在SSH_ORIGINAL_COMMAND環境變量中可用 。

考慮到這一點,我們修改我們authorized_keys文件看起來是這樣的:

command="/usr/bin/git-wrapper.sh username" ssh-rsa AAAA...=== 

這意味着,當有人用相應的私有密鑰連接,sshd將運行git-wrapper.sh username,造成我們git-wrapper.sh腳本使用字符串username預存存儲庫路徑,確保git只能在給定目錄中看到存儲庫。更具體地說,當您運行:

git push origin master 

並假設originproject.git git的服務器上,然後git將試圖在遠程服務器上運行命令:

git-receive-pack project.git 

我們的包裝腳本攔截,並將其轉變成:

git-receive-pack $1/project.git 

因此,舉例來說,如果我們的混帳git用戶家裏d irectory沒有倉庫:

git$ ls 

而且我們authorized_keys文件看起來是這樣的:

git$ cat .ssh/authorized_keys 
command="/usr/bin/git-wrapper.sh alice" ssh-rsa ... [email protected] 
command="/usr/bin/git-wrapper.sh bob" ssh-rsa ... [email protected] 

這時如果alice做到這一點:

alice$ git remote add origin [email protected]:project.git 
git push origin master 

她將看到:

fatal: 'alice/project.git' does not appear to be a git repository 
fatal: Could not read from remote repository. 

如果我們創建目標庫:

git$ mkdir alice 
git$ git init --bare alice/project.git 

然後,她可以推:

alice$ git push origin master 
[...] 
To [email protected]:project.git 
* [new branch]  master -> master 

但如果Bob是盡力去克隆庫:

bob$ git clone [email protected]:project.git 

它會失敗:

fatal: 'bob/project.git' does not appear to be a git repository 
fatal: Could not read from remote repository. 

Ev恩,如果他想的東西偷偷摸摸:

bob$ git clone [email protected]:../alice/project.git 
Invalid repository name 
fatal: Could not read from remote repository. 

而且,在一個有點冗長簡單地說,就是你可以爲你的git倉庫服務器訪問授權。請注意,這僅僅是爲了演示而完成;您會希望在生產環境中使用更強大的腳本。