越來越多軟體開發人員使用 Git 作為版本控制器,可以像 Github 一樣開發協作的整合式版本控制平台的確迎合了許多企業的需求,因此有越來越多企業在內部架設 Gitlab 作為企業內的協作平台。企業內的應用整合 Active Directory 尤為重要,在人員離職的時帳號即被註銷,因此有較大的安全性。並且透過 LDAP 的機制,新進人員不用申請帳號即可設定使用 Guest 權限,讓每個企業員工都可以在 Gitlab 上報 Issue 並對 Issue 進行追蹤,加強了內部使用者與開發人員的溝通管道。

我的 Gitlab 版本選擇為 6.4-Stable,若是其他版本可能需要有其他額外或省略部分設定。 系統首選 Ubuntu 12.04 Server,這應該是大多數人的選擇。

Gitlab 的安裝可以參考官方文件:

https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/installation.md

另外有一份 Tsung 的中文版本可以參考:

整個安裝步驟看起來很複雜,其實在 Ubuntu 12.04 下照著說明一步步進行安裝,完全不會碰到什麼難解的特殊情況,我認為 Linux 新手也很容易能夠照說明安裝好一套 Gitlab。我第一次安裝因為網路慢的原因大概花了兩個多小時,後來安裝正式環境的時候大概因為比較熟練,一個多小時就完成安裝了。

針對安裝部分補充說明一下,「第一次啟動網頁要跑比較久」這個問題其實是可以透過 Precompile 解決的,網路上也有人說改 Timeout 值,但是有些比較慢的機器 Timeout 值改很大也沒什麼作用,這還是得從根本用 Precompile 解,直接用下列指令在第一次啟動後做 Precompile:

cd /home/git/gitlab; 
sudo bundle exec rake assets:precompile RAILS_ENV=production

好了,接下來回到正題。 整合 Active Directory 主要是參考網路上的這一篇:

https://raymii.org/s/tutorials/Gitlab_and_Active_Directory_LDAP_Authentication.html

一般來說如果你的 AD 環境不複雜直接照著做就可以成功了,但是我還是碰到了坑,主要是栽在這一段

bind_dn: 'CN=Gitlab LDAP,CN=Users,DC=Domain,DC=tld'

原作者的 AD 環境可能比較簡單,建立的帳號直接在 CN=Users 下就可以找到,我設定的服務帳號卻一直都不成功,提示 “Invalid credentials“,網路上查詢到的都是要 Patch omniauth-ldap 的方法,不過那是在 Gitlab 5.4 的 Workaround 了,現在都過了大半年了以 Gitlab 的開發速度應該早就 Patch 掉了,因此不做考慮。接下來發現一個日本的網頁在說明 Gitlab AD 整合,其作者在 bind_dn 這段沒有用 CN=Users,而是使用了:

OU=DEPT,CN=Users,DC=Domain,DC=tld

這樣的語法,原來在 bind_dn 中需要指定完整的 LDAP 路徑 (Full LDAP path)

於是找到以前寫的程式查詢我所用的服務帳號到底是建在哪裡:

public string UserBelongOU (string s)
{
    Impersonator im = new Impersonator();
    im.Impersonate();
    try
    {
        DirectoryEntry entry = new DirectoryEntry("LDAP://DC=fetag,DC=net", Account, Password);
        DirectorySearcher mySearcher = new DirectorySearcher(entry);
        mySearcher.Filter = "(samAccountName=" + s + ")";
        SearchResultCollection result = mySearcher.FindAll();
        foreach(System.DirectoryServices.SearchResult resent in result)
        {
            string Return = "";
            Return = resEnt.Path;
            Return = "LDAP://" + Return.Substring(Return.IndexOf ("OU="));
            return Return;
        }
    } 
    catch {}
    im.Undo();
    return "";
}

結果是在

OU=NewTech,OU=IT,OU=Site,DC=fetag,DC=net

這麼一串下,然後修改 bind_dn:

bind_dn: 'CN=Gitlab Service,OU=NewTech,OU=IT,OU=Site,DC=fetag,DC=net'

後重新啟動 Gitlab 就可以了。

加碼:如果有「LDAP 認證時使用 Filter」需求請參考底下這一篇:

http://blog.dimaj.net/content/howto-enable-ldap-filters-gitlab

原則上是需要 Patch omniauth-ldap,然後加上 filter 屬性,這樣可以在驗證時不是所有 Domain User 都能登入,而是在某個 Group 下的使用者才能夠登入使用 Gitlab。這一個做法只要是 LDAP 都可以,Active Directory 非必要。

[補充] Gitlab 的備份與恢復可以參考: https://github.com/gitlabhq/gitlabhq/blob/master/doc/raketasks/backup_restore.md

最後修改日期: 2022-06-04

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。