文章目錄
- (1) 由於 Gitosis 是基於 Python 開發的,先安裝依賴的 Python-Setuptools RPM
- (2) 從 Gitosis 官方複製代碼
- (2) 準備系統管理使用者公開金鑰
- (3) 初始化 Gitosis
- (4) 添加使用者公開金鑰
- (5) 許可權控制
- (6) 其他
@http://www.inanu.net/post/742.html
這幾天研究 Puppet,剛好需要搭建一個 Git Repository。把過程及遇到的問題簡答記錄一下。
環境:CentOS 6.2 x86_64
1. 安裝 RPM
[root@c1.inanu.net]# yum install httpd[root@c1.inanu.net]# yum install git git-daemon
此處安裝 httpd 和 gitweb 是為了能夠通過 web 對 git 進行方便的瀏覽、管理。正好 apache 也可以用來替換掉 puppet 內建的 WEBrick,一舉兩得了。
2. 配置 Git
在 CentOS 中,Git 是以 xinetd 方式提供服務的,預設的 xinetd 設定檔在:/etc/xinetd.d/git。
編輯設定檔,以下是改好的一份 git xinetd 設定檔:
12345678910111213 |
# default: off# description: The git dæmon allows git repositories to be exported using \# the git:// protocol.service git{ disable = no socket_type = stream wait = no user = nobody server = /usr/libexec/git-core/git-daemon server_args = --base-path=/var/lib/git --export-all --user-path=public_git --syslog --inetd --verbose log_on_failure += USERID} |
接下來啟動 xinetd 服務:
[root@c1.inanu.net]# service xinetd start
3. 建立 Puppet 伺服器端 Git 倉庫
[root@c1.inanu.net]# useradd -d /var/lib/git -s /usr/bin/git-shell git #建立 git 使用者[root@c1.inanu.net]# passwd git #設定 git 使用者密碼[root@c1.inanu.net]# chown -R git:git /var/lib/git[root@c1.inanu.net]# su git #切換到 git 使用者[git@c1.inanu.net]$ cd ~[git@c1.inanu.net]$ mkdir .ssh[git@c1.inanu.net]$ chmod 700 .ssh[git@c1.inanu.net]$ touch .ssh/authorized_keys[git@c1.inanu.net]$ chmod 600 .ssh/authorized_keys[git@c1.inanu.net]$ mkdir /var/lib/git/puppet.git #建立 Puppet 伺服器端 Git 倉庫[git@c1.inanu.net]$ cd /var/lib/git/puppet.git[git@c1.inanu.net]$ git --bare init #初始化 Puppet 伺服器端 Git 倉庫
4. 在用戶端建立 Git 本地倉庫
[root@c2.inanu.net]# ssh-keygen -t rsa #產生使用者使用的 SSH-Key 金鑰組[root@c2.inanu.net]# ssh-copy-id git@c1.inanu.net #將上一步產生的 SSH-Key 公開金鑰複製到伺服器 git 使用者中[root@c2.inanu.net]# mkdir -p /data/git/repo/puppet[root@c2.inanu.net]# cd /data/git/repo/puppet[root@c2.inanu.net]# git init #初始化 Git 倉庫[root@c2.inanu.net]# git clone git@c1.inanu.net:puppet[root@c2.inanu.net]# git config --global user.name 'Nanu'[root@c2.inanu.net]# git config --global user.email 'nanu@inanu.net'[root@c2.inanu.net]# rsync -avz --progress --rsh=ssh root@c1.inanu.net:/etc/puppet/ ./ #將現有的 Puppet Master 設定檔同步到 Git 倉庫中 [root@c2.inanu.net]# git add . #添加所有檔案、目錄到 Git 版本控制中[root@c2.inanu.net]# git status #查看操作結果,確認所有檔案都已添加[root@c2.inanu.net]# git commit -m 'Init' #提交至本地 Git 倉庫[root@c2.inanu.net]# git push -u origin master #提交至遠程 Git 倉庫
5. 更新檢出 Puppet 設定檔
在 Puppet Master 端 (c1.inanu.net) 上執行:
[root@c1.inanu.net]# cd /etc/puppet[root@c1.inanu.net]# git clone git@c1.inanu.net:puppet
這樣就完成了對 Puppet 設定檔的更新。
6. Gitweb 配置
安裝好所有的 RPM 包之後,Gitweb 就可以運行了,預設的訪問地址是:http://IP/git/。
Gitweb 的 Apache 設定檔位於:/etc/httpd/conf.d/gitweb.conf
可以在伺服器端的 Git 倉庫設定檔中對 Gitweb 進行一些定製,以上面的 puppet 倉庫為例:
[root@c1.inanu.net]# vi /var/lib/git/puppet/config
開啟 puppet Git 倉庫設定檔 config 進行編輯,預設的 config 檔案應該是這樣的:
1234 |
[core] repositoryformatversion = 0 filemode = true bare = true |
增加針對 Gitweb 的配置段,變成如下內容:
12345678 |
[core] repositoryformatversion = 0 filemode = true bare = true [gitweb] owner = Nanu url = git@c1.inanu.net:puppet.git |
新增的 [gitweb] 配置段中指定了一些倉庫資訊。
7. Git 許可權控制
Git 預設不提供許可權管理的功能,一般都是通過作業系統自身的安全控制機制來實現,非常麻煩,而且不靈活。我們需要藉助第三方的 Git 應用來管理,一般最常用的是 Gitosis。
把所有使用者的公開金鑰儲存在 authorized_keys 檔案的做法,只能湊和一陣子,當使用者數量達到幾百人的規模時,管理起來就會十分痛苦。每次改刪使用者都必須登入伺服器不去說,這種做法還缺少必要的許可權管理。每個人都對所有項目擁有完整的讀寫權限。
Gitosis 是一套用來管理 authorized_keys 檔案和實現簡單串連限制的指令碼。有趣的是,用來添加使用者和設定許可權的並非通過網頁程式,而只是管理一個特殊的 Git 倉庫。你只需要在這個特殊倉庫內做好相應的設定,然後推送到伺服器上,Gitosis 就會隨之改變運行策略,聽起來就很酷,對吧?
(1) 由於 Gitosis 是基於 Python 開發的,先安裝依賴的 Python-Setuptools RPM
[root@c1.inanu.net]# yum install python-setuptools
(2) 從 Gitosis 官方複製代碼
[root@c1.inanu.net]# cd /usr/local/src[root@c1.inanu.net]# git clone git://eagain.net/gitosis.git[root@c1.inanu.net]# cd gitosis[root@c1.inanu.net]# python setup.py install
(2) 準備系統管理使用者公開金鑰
建立 Gitosis 的主目錄:
[root@c1.inanu.net]# mkdir -p /data/gitosis
Gitosis 將會幫我們系統管理使用者公開金鑰,所以先把當前控制檔案改名備份,以便稍後重新添加,準備好讓 Gitosis 自動管理 authorized_keys 檔案:
[root@c1.inanu.net]# mv /var/lib/git/.ssh/authorized_keys /var/lib/git/.ssh/authorized_keys.bak
接下來,把之前 git 使用者的登入 git-shell 改為普通的 shell。改過之後,大家仍然無法通過該帳號登入。因為 authorized_keys 檔案已經沒有了,不用擔心,這會交給 Gitosis 來實現。所以現在先修改 /etc/passwd 檔案,找到 git 使用者所在的行:
1 |
git:x:501:501::/var/lib/git:/usr/bin/git-shell |
將此行改為:
1 |
git:x:501:501::/var/lib/git:/bin/bash |
(3) 初始化 Gitosis
[root@c1.inanu.net]# su git[git@c1.inanu.net]$ cd ~[git@c1.inanu.net]$ gitosis-init < .ssh/authorized_keys.bakInitialized empty Git repository in /var/lib/git/repositories/gitosis-admin.git/Reinitialized existing Git repository in /var/lib/git/repositories/gitosis-admin.git/
注意:不要再將 git 使用者的預設 Shell 改回 git-shell,否則接下來 gitosis-serve 執行時會報錯!
這樣該公開金鑰的擁有者就能修改用於配置 Gitosis 的那個特殊 Git 倉庫了。接下來,需要手工對該倉庫中的 post-update 指令碼加上可執行許可權:
[git@c1.inanu.net]$ chmod 755 /var/lib/git/repositories/gitosis-admin.git/hooks/post-update
這樣基本上就算是好了。如果設定過程沒出什麼差錯,現在可以試一下用初始化 Gitosis 的公開金鑰的擁有者身份 SSH 登入伺服器,應該會看到類似下面這樣:
[root@c2.inanu.net]# ssh git@c1.inanu.netPTY allocation request failed on channel 0fatal: unrecognized command 'gitosis-serve Nanu'Connection to gitserver closed.
說明 Gitosis 認出了該使用者的身份,但由於沒有運行任何 Git 命令,所以它切斷了串連。那麼,現在運行一個實際的 Git 命令 — 複製 Gitosis 的控制倉庫:
[root@c2.inanu.net]# git clone git@c1.inanu.net:gitosis-admin.git
這會得到一個名為 gitosis-admin 的工作目錄,主要由兩部分組成:
[root@c2.inanu.net]# cd gitosis-admin[root@c2.inanu.net]# find ../gitosis.conf./keydir./keydir/scott.pub
gitosis.conf
這是用來設定使用者、倉庫和許可權的控制檔案。
keydir
這是儲存所有具有存取權限使用者公開金鑰的地方,每人一個。在 keydir 裡的檔案名稱(比如上面的 scott.pub)應該跟你的不一樣。Gitosis 會自動從使用 gitosis-init 指令碼匯入的公開金鑰尾部的描述中擷取該名字。
看一下 gitosis.conf 檔案的內容,它應該只包含與剛剛複製的 gitosis-admin 相關的資訊:
12345 |
[gitosis] [group gitosis-admin]writable = gitosis-adminmembers = Nanu |
它顯示使用者 Nanu(初始化 Gitosis 公開金鑰的擁有者)是唯一能管理 gitosis-admin 項目的人。
現在我們來管理之前的 puppet 倉庫,為此我們要建立一個名為 puppet 的新段落,在其中羅列營運團隊的人員,以及他們擁有寫入權限的項目。由於 Nanu 是系統中的唯一使用者,我們把他設為唯一使用者,並允許他讀寫名為 puppet 項目:
123 |
[group puppet]writable = puppetmembers = Nanu |
修改完之後,提交 gitosis-admin 裡的改動,並推送到伺服器使其生效:
[root@c2.inanu.net]# git commit -am 'Modify puppet'[root@c2.inanu.net]# git push
接下來,由於安裝 Gitosis 後,預設的 Git 倉庫位置已經變為 /var/lib/git/repositories,所以必須先將之前位於 /var/lib/git/puppet.git 的倉庫移動至 /var/lib/git/repositories/ 中,否則,在第一次檢出或推送的操作時,Gitosis 會自動在 /var/lib/git/repositories 中建立一個新的 puppet.git 倉庫。
[git@c1.inanu.net]$ mv /var/lib/git/puppet.git /var/lib/git/repositories/
(4) 添加使用者公開金鑰
要和朋友們在一個項目上協同工作,就得重新添加他們的公開金鑰。不過這次不用在伺服器上一個一個手工添加到 ~/.ssh/authorized_keys 檔案末端,而只需管理 keydir 目錄中的公開金鑰檔案。檔案的命名將決定在 gitosis.conf 中對使用者的標識。現在我們為 Tyra 添加公開金鑰:
[root@c2.inanu.net]# cp /tmp/id_rsa.tyra.pub keydir/tyra.pub
然後把他們都加進 'puppet' 團隊,讓他們對 puppet 倉庫具有讀寫權限:
123 |
[group puppet]writable = puppetmembers = Nanu tyra |
最後重新提交 gitosis-admin 倉庫。
(5) 許可權控制
Gitosis 也具有簡單的存取控制功能。如果想讓 Tyra 只有讀許可權,可以這樣做:
1234567 |
[group puppet]writable = puppetmembers = Nanu [group puppet_ro]readonly = puppetmembers = tyra |
現在 Tyra 可以複製和擷取更新,但 Gitosis 不會允許她向項目推送任何內容。像這樣的組可以隨意建立,多少不限,每個都可以包含若干不同的使用者和項目。甚至還可以指定某個組為成員之一(在組名前加上 @ 首碼),自動繼承該組的成員:
12345678910 |
[group puppet_committers]members = Nanu tyra [group puppet_1]writable = puppetmembers = @puppet_committers [group puppet_2]writable = another_puppetmembers = @Nanu_committers vv |
(6) 其他
安裝 Gitosis 之後,如果啟用了 Gitweb,那麼還需要修改一下 Gitweb 的 CGI 程式,因為安裝 Gitosis 後,預設 Git 倉庫存放位置已經改變。
[root@c1.inanu.net]# vi /etc/httpd/conf.d/git.conf
搜尋 '/var/lib/git',將其改為 '/var/lib/git/repositories'。
如果遇到意外問題,試試看把 loglevel=DEBUG 加到 [gitosis] 的段落。
如果一不小心搞錯了配置,失去了推送許可權,也可以手工修改伺服器上的 /var/lib/git/.gitosis.conf 檔案。Gitosis 實際是從該檔案讀取資訊的。它在得到推送資料時,會把新的 gitosis.conf 存到該路徑上。所以如果你手工編輯該檔案的話,它會一直保持到下次向 gitosis-admin 推送新版本的配置內容為止。