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 程式,其實安裝上還滿容易的,一開始不了解架構的話容易撞牆而已。


Last modified on 2012-06-20