2012年6月20日 星期三

Gitolite ver.3 (g3) 安裝筆記

Gitolite 是一個持續開發中的 git server 專案,自 2009 年開始後,至今已經發展到第 3 版,作者將其稱之為 g3 (之前的版本分別為 g1 與 g2)。由於 g3 相對於之前的版本,是整個重寫的專案,根據紀錄,g3 是大約今年 4 月才開始的,所以很多文件早已過時,只好慢慢研究作者提供的文件。整個專案都放在 github 上,並且作者也提供了相關文件,本文就是參考該文件寫成。
我的操作環境是:
  • Ubuntu 12.04
  • Git version 1.7.9.5
  • Perl 5.14
本文章假設使用者已經具備 git 的基本知識與操作技能,以及基本的 ssh 認知,不再贅述。

準備步驟

  • 伺服器上須先預備好以下套件
    • Git 1.6.6 以上
    • Perl 5.8.8 以上
    • OpenSSH
  • 產生管理者的 ssh key (此 key 將專門提供給 gitolite 管理者使用)
    $ ssh-keygen -t rsa -f <key_filename>
    
    舉例:
    $ ssh-keygen -t rsa -f ~/admin
    
    會產生 ~/admin~/admin.pub 兩個檔案,分別是 private key 與 public key。
    此時會提示輸入 passphrase。passphrase 是用來加密 private key 的密碼,避免 private key 被竊時造成的安全性風險。每次 push/pull 的時候需要輸入 passphrase,可以配合 ssh-add (Linux) 或 Pageant (Windows) 來避免每次都要打 passphrase。
    這邊注意所使用的 <key_filename> 就是 gitolite 管理者 (非主機管理者也非 git 帳號管理者) 所使用的虛擬帳號。
  • 建立 git 專用帳號 (我使用 git 而非有些人慣用的 gitolite)
    # adduser --system git --shell "/bin/bash"
    
    必須給予 git 帳號一個可以執行 command 的 shell,但可放心所有 gitolite user 都只是虛擬帳號,他們會被導向到 gitolite-shell 這個 gitolite 提供的指令去,無法真的登入。
    以下未特別註明的,皆會使用 git 帳號作為 $ 的擁有者。

安裝步驟 (未註明 # 的皆使用 git 帳號)

  1. 取得 gitolite 套件
    $ git clone git://github.com/sitaramc/gitolite.git
    
  2. 安裝 gitolite 於家目錄下 (其實只是做個 soft link 過去)
    $ mkdir -p ~/bin
    $ gitolite/install -ln
    
    記得把 $HOME/bin 加入 $PATH 中。
    或是也可以用複製的方式安裝到其他系統目錄下 (以 /usr/share/gitolite 為例)
    # mkdir -p /usr/share/gitolite
    # gitolite/install -to /usr/share/gitolite
    
  3. 設置 gitolite
    $ gitolite setup -pk admin.pub # 這裡的 admin.pub 就是之前產生的管理者公鑰
    
    這表示 admin.pub 這把公鑰所對應的私鑰擁有者就是 gitolite 的管理者,同時管理者的虛擬帳號即為 admin。 另外,如果 ~/.ssh 底下的 authorized_keys 已經有相同的 public key 的話,會出現 FATAL error:「admin.pub maps to shell access, not admin.」由於 gitolite 透過使用的 key 來決定使用者是不是管理者,故不可以使用本來已可連線取得 shell 的 key。

安全性

  • 實際使用 gitolite 後,會發現 ~git/.ssh/authorized_keys 這個檔案被加入一些東西,像是這樣
    # gitolite start
    command="/usr/share/gitolite/./gl-auth-command admin",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa <很長一串 public key> <description>
    command="/usr/share/gitolite/./gl-auth-command someone",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa <很長一串 public key> <description>
    # gitolite end
    
    前面加上的那個稱為 ssh forced command,可以限制 user 登入後執行的 command。也就是說,gitolite 在使用時,並沒有啟動 daemon,而是透過 ssh 連線,並轉介到 gl-auth-command 進行動作的。
  • gitolite 在運作時,使用的都是 git 這個帳號 (以我的例子而言),如果對安全性有很高的要求,可以盡量限縮這個帳號的權限。不過還是得給他一個 shell 使用就是了,我試過將 shell 改成 /bin/false/usr/sbin/nologin,結果操作就失敗了orz
  • 預設狀況下,透過 gl-setup 產生的 repository 與其他相關檔案,權限都是 700。也就是說,即使主機上有其他的使用者,如果他沒有管理者權限 (或是 sudo 權限) 的話,也無法存取到那些受 gitolite 管轄的 repository。
  • 管理者在進行設定時,最好確認使用者提供的 key 是否正確,可透過
    $ ssh-keygen -lf <pubkey_file>
    
    來獲得 public key 的 fingerprint,並以其他管道與使用者對照確認,避免惡意攻擊。

總結

整體弄起來,覺得 g3 在管理設定上,還有使用上都跟 g2 沒有什麼差別,只是安裝上不一樣就是了。不過由於是 perl 程式,其實安裝上還滿容易的,一開始不了解架構的話容易撞牆而已。

3 則留言:

  1. 我把PATH=$PATH:$HOME/bin已經打上去了

    可是使用使用 git 帳號 輸入gitolite/install -to /usr/share/gitolite 他還是顯示以下錯誤

    fox@fox-VirtualBox:~$ gitolite/install -to /usr/share/gitolite
    bash: gitolite/install: 沒有此一檔案或目錄
    fox@fox-VirtualBox:~$


    我想請問這是為什麼??

    回覆刪除
    回覆
    1. 有先 clone 回來嗎?照理來說 clone 回來後會有 gitolite 這個目錄,裡面有 install 這個檔案。

      刪除
  2. 呵呵~~我昨天發現了這個問題了~~
    所以我使用你的文章"Gitolite 2.2 安裝筆記"的方法
    已經解決我的問題

    現在我正在使用你"Gitolite 設定與管理"的文章
    也輸了下列的指令

    gitolite@fox-VirtualBox:~/gitolite-admin$ cp /var/tmp/fox.pub keydir/
    gitolite@fox-VirtualBox:~/gitolite-admin$ git add keydir/fox.pub
    gitolite@fox-VirtualBox:~/gitolite-admin$ git commit -m 'add user fox'

    不過當我的USER輸入
    $ git clone gitolite@192.168.11.241:testproj.git

    他還是提示我要輸入密碼,並且我輸入了之後,密碼是無效的
    所以我試了設定 ssh host foxr,而產生了.ssh目錄和config文件

    host gitolite

    user gitolite

    hostname 192.168.11.241

    port 22

    identityfile ~/.ssh/fox

    不過使用者還是沒辦法連過去,不知道是我哪裡還沒做到嗎??

    回覆刪除