顯示具有 ldap 標籤的文章。 顯示所有文章
顯示具有 ldap 標籤的文章。 顯示所有文章

2024年11月19日 星期二

Linux 開發筆記 - OpenLDAP StartTLS 憑證驗證與故障排除 @ Ubuntu 20.04


負責 DevOps 同事休假,當初 LDAP 架設沒涉入,用 AI 輔助來練一下功,盡量讓同事好好休假不用 oncall 解題,就把這過程筆記一下。

現在有 AI 輔助服務,做事的心態變了不少,包括:
  1. 面對不是自己從頭到尾參與的計劃時,該怎樣建立自己了解系統思維或是達成想做的任務
  2. AI 的答案也不一定是對的,該如何驗證(如同管理或跨團隊合作上,請夥伴做事,但不一定做對,該怎樣驗正)
事件起因是一些小型內部服務,因 LDAP 憑證失效而無法完成登入(已登入不受影響),我的追法:
  1. 請 AI 給我指令或程式,檢驗快速檢驗 ldap 連線過程,著重在憑證檢查,例如檢查 https 憑證最常就是靠 openssl 指令或是 browser 瀏覽檢視憑證
  2. 有時 AI 會回的很搞剛,開始回寫 code 的 python 解法,這時因為自己有經驗 openssl 指令就能搞定,所以不斷提醒 AI 直接給指令解
  3. 對於 OpenLDAP 不熟的我,開始追問 AI 憑證相關的方向,才順勢了解 StartTLS ,才知道有 ldapsearch, slaptest 指令可用
  4. 對於管理線上服務踩過雷,知道不能隨便 service restart,多問一下 AI 該怎樣先檢驗設定檔,避免機器從 running -> stop -> 設定有誤 -> 服務停止營運
使用 openssl 指令檢查 SSL 憑證,假設網域是 ldap-dmz.changyy.org

```
$ openssl s_client -connect ldap-dmz.changyy.org:443 
...
---
SSL handshake has read xxxx bytes and written xxx bytes
Verification: OK
---
...
```

使用 openssl 指令檢查 LDAP + StartTLS 憑證,假設網域是 ldap-dmz.changyy.org

```
$ openssl s_client -connect ldap-dmz.changyy.org:389 -starttls ldap
...
---
SSL handshake has read xxxx bytes and written xxx bytes
Verification error: certificate has expired
---
...
```

得知 LDAP + StartTLS 使用流程中的憑證過期了,且此例剛好 https 憑證已正常工作,僅 LDAP + StartTLS 的部分失敗,所以很輕鬆的可以把 https 憑證複製一份到 ldap 使用即可。先追蹤設定檔位置:

```
$ sudo cat /etc/ldap/slapd.d/cn\=config.ldif | grep -i TLS
olcTLSCACertificateFile: /etc/ssl/ldap/wildcard.*.ca-bundle
olcTLSCertificateFile: /etc/ssl/ldap/wildcard.*.crt
olcTLSCertificateKeyFile: /etc/ssl/ldap/wildcard.*.key
$ sudo tree -L 1 /etc/ssl/
/etc/ssl/
├── certs
├── ldap
├── nginx
├── openssl.cnf
└── private
```

速速解:

```
$ sudo cp -r /etc/ssl/ldap /etc/ssl/ldap-bak
$ sudo cp /etc/ssl/nginx/wildcard.* /etc/ssl/ldap/
```

檢驗設定檔和重啟服務:

```
$ sudo slaptest
config file testing succeeded
$ sudo service slapd restart
```

再次驗證:

```
$ openssl s_client -connect ldap-dmz.changyy.org:389 -starttls ldap
...
---
SSL handshake has read xxxx bytes and written xxx bytes
Verification: OK
---
...
```

此外,追蹤 LDAP 和使用他的服務時,意外發現不同的服務整合過程,也順手筆記一下,例如 Apache2 設定檔:

僅 LDAP 非加密:

<Location />
    Order allow,deny
    Allow from all
    AuthType basic
    AuthName "service.changyy.org"
    AuthBasicProvider ldap
    AuthLDAPUrl "ldap://ldap-dmz.changyy.org/dc=changyy,dc=org?uid"
    Require valid-user
</Location>

LDAP + StartTLS:

<Location />
    Order allow,deny
    Allow from all
    AuthType basic
    AuthName "service.changyy.org"
    AuthBasicProvider ldap
    AuthLDAPUrl "ldap://ldap-dmz.changyy.org/dc=changyy,dc=org?uid" TLS
    Require valid-user
</Location>

對應的其他服務也會有類似架構,舉例來說 Mantis 也有 mantisbt.org/docs/master/en-US/Admin_Guide/html/admin.config.auth.ldap.html

預設是啟用 LDAP + StartTLS

//
// Determines whether the connection will attempt an opportunistic upgrade to a TLS connection (STARTTLS).
//
// Defaults to ON.
//
// $g_ldap_use_starttls = ON

需要測試 LDAP 健康情況時,可以把它關閉

// $g_ldap_use_starttls = OFF

補充檢查 ldap service 健康情況時,最常是直接使用 ldapsearch 指令:

```
$ sudo apt install ldap-utils
$ ldapsearch -x -H 'ldap://ldap-dmz.changyy.org' -b 'dc=changyy,dc=org'
...
# search result
search: #
result: 0 Success
...
# numResponses: ###
# numEntries: ###
```

測試 LDAP + StartTLS:

```
$ ldapsearch -x -H 'ldap://ldap-dmz.changyy.org' -b 'dc=changyy,dc=org' -Z
...
ldap_start_tls: Connect error (-11)
additional info: (unknown error code)
ldap_result: Can't contact LDAP server (-1)
```

測試 LDAP + StartTLS 需要更多 debug 資訊:

```
$ ldapsearch -x -H 'ldap://ldap-dmz.changyy.org' -b 'dc=changyy,dc=org' -Z -d 1
...
TLS: peer cert untrusted or revoked (0x402)
TLS: can't connect: (unknown error code).
...
ldap_start_tls: Connect error (-11)
...
```

用 PHP Code 嘗試建立連線,先確認 php.ini 套件:

```
php -i | grep ldap
/etc/php/7.4/cli/conf.d/20-ldap.ini,
Protocols => dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, ldaps, pop3, pop3s, rtmp, rtsp, scp, sftp, smb, smbs, smtp, smtps, telnet, tftp
ldap
...
```

運行:

```
$ cat /tmp/t.php 
<?php
$ldapconn = ldap_connect("ldap://ldap-dmz.changyy.org");
if ($ldapconn) {
    ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);
    // 關閉 TLS
    putenv('LDAPTLS_REQCERT=never');
    
    $bind = ldap_bind($ldapconn);
    if ($bind) {
        echo "LDAP bind successful...\n";
    } else {
        echo "LDAP bind failed...\n";
    }
}
$ php /tmp/t.php 
LDAP bind successful...
```

收工!

2015年12月31日 星期四

使用付費版騰訊企業郵箱以及從 Microsoft Exchange server 轉移心得

騰訊企業郵箱-付費版功能

由於公司有超過一半的人在中國,過去一直請 IT 人員維護 Microsoft Exchange Mail server,而 2016 年有了新計劃,公司服務雲端化!其中 Mail service 是一塊非常令人頭痛的問題,但責任扛起來就不重,只好硬著頭皮衝了!原先規劃十一月進行,因故延至十二月,而真正執行是十二月中,原先把測試期間拉到一個月,但發現新舊帳號在一起造成同事們不少困擾,所以加速處理,在 2015/12/31 大家還忙著修 bug、業務忙著關帳、老闆趕著出新版軟體的當下,終於完成轉換。

原本心中的首選是想要用 Gmail for Work,但實在是有太多人在中國生活,存取太不靠譜,所以進而挑中國第一大咖的服務:騰訊企業郵箱,簡單的概念:QQ 這麼大咖,不太會倒,它倒了全中國的郵箱也倒光了!

騰訊企業郵箱-免費版

起初,公司已經有在使用騰訊企業郵箱免費版好一陣子了,免費版跟付費版差只差在進階功能,例如郵件稽核、管理這類服務,若只是單純有個 Webmail 收發肯定夠用的。打個岔一下,有興趣可以試試免費使用,預設應該有 50~100 個帳號,並且最多可以申請到 200 個免費帳號的額度。 而付費版的差別,包括可以一次管理多個網域(最多五個),以及一卡車的增值功能。

那談談如何從 Microsoft Exchange Server 移轉過去,這可真不是普通的蛋疼。首先,要是用騰訊企業郵箱時,騰訊企業郵箱會先檢驗某個 domain 是不是您擁有,既然跟 mail 相關,最直觀就是 MX Record 的設定,但對於已經營運的郵箱是根本不能停的,為了這個我跟客服吵了很久 XD 整體上沒有驗證的話,所建立的帳號是完全不能登入的!為了轉移勢必需要先讓公司同仁登入,也因此下了決定,該衝了!最大的傷害就是 MX Record 切換到騰訊後,若有人要寄信給公司同仁,信件會跑去騰訊企業郵箱(在這之前當然要先完成帳號的建立,不然騰訊企業郵箱會以帳號不存在,不給寄而退信)。所幸老闆們很支持也接受這個風險,就衝啦!我先請 IT 人員調出公司收郵件最少的時段,接著在轉換前幾天先把 MX Record 的 ttl 設小,最後就快速轉換,做完騰訊郵箱驗證,再轉回舊的。

原先我打好的如意算盤:騰訊企業郵箱認證成功,成員可以登入試用,而舊信箱(exchange server)還是可以工作,真是完美啊!

但沒一個小時我就發現問題了:所有委託騰訊企業郵箱管理的信箱(例如abcd.com),該公司的成員要寄信到敝公司時,走的是騰訊企業郵箱的 SMTP server,而寄信路徑最佳化的結果,就是被騰訊企業郵箱收走!

這是一個滿嚴重的問題,代表信件部分會被騰訊企業郵箱收走,而乖乖看 MX Record 會被舊 exchange server 收走,也是這個關鍵因素,讓我把測試期從一個月縮短至兩個禮拜(原先想要一個禮拜,但因為有其他問題而延後)。騰訊企業郵箱真的很大咖,不少公司、新創都採用他,再加上 qq.com 也是他的!所有 @qq.com 寄信來問問題、橋接業務的,也完完全全被騰訊企業郵箱收走,因為我們在那驗證了 MX Record,騰訊企業郵箱會認定這 domain 由他接手處理。

在認清環境後,開始不斷號召同仁盡快試用,接著開始碰到奇奇怪怪的問題:
  • outlook 20010 以下,會碰到檢視憑證的問題?
  • 同仁都習慣用 outlook ,那聯絡人該怎樣同步?
  • 公司有高規格單位,防火牆包得緊緊的,怎樣用騰訊企業郵箱?
其中最難處理的是防火牆問題,曾經也有一度要自架 mail server,最後透過管理機制討論再討論,解套了!這個影響是:採用各大 mail service 時,其 smtp/pop/imap server 一定都是用認得那幾組,無論騰訊企業郵箱、Office 365還是 GMail 等,將造成想要管理同仁寄信的安全機制出現了漏洞,例如某同仁只要申請個 a123.com 後,把郵箱也交給騰訊企業郵箱代管,那 a123.com 跟敝公司的 smtp server 基本上是同一組的,完全無法限制同仁外寄信件的。

所以花了將近一週是在做溝通,包含提出 mail reply 架構等(類似多架一台 smtp server,而帳號認證可以走騰訊企業郵箱 pop protocol),所幸最後解套,大家認同有這個風險 XD 我就省去架設及多管理一台機器。但一週就過去了 Orz 接下來就是趕緊處理剩下兩個問題

首先是 outlook 檢視憑證問題,單純只是 outlook bug 而已,解法就是試著更新 outlook 吧!例如 outlook 2007 就裝一下 outlook 2007 sp3。這是因為騰訊企業郵箱在多網域上只用了一組憑證(pop.exmail.qq.com, imap.exmail.qq.com, smtp.exmail.qq.com, hwpop.exmail.qq.com, hwimap.exmail.qq.com, hwsmtp.exmail.qq.com),而 outlook 不支援而已。

接著處理聯絡人同步部分,只需把公用聯絡人打開,同仁寄信時就有自動搜尋補齊信箱的功能,而騰訊企業郵箱有提供 outlook 助手,透過 outlook 助手會自動從騰訊企業郵箱下載聯絡人清單並匯入 outlook 中,也就是 outlook 通訊錄可以繼續用,經測試 outlook 2007 必須更新至 sp3 才能完整使用!若使用 outlook 2013 的使用者,可以試試 activesync 協定,也能同步聯絡人

以上算是完成九成的任務了!剩下的則是佛心來的客服服務,負責做 mail server 轉移,不知不覺就會扛上了管理 mail server 責任。

整個移轉的簡易 SOP:
  1. 請 IT 人員會出聯絡人清單
  2. 撰寫程式將聯絡人清單轉成 CSV 可匯入騰訊企業郵箱(過程包括要製作亂數密碼,但密碼格式有錯時,批次匯入不會告知,有同仁登入不進去時,記得幫他改密碼)
  3. 請 IT 人員給予一天哪個時段收信量最少,將進行 MX Record 的快速轉換,用以認證網域擁有者,完成認證後同仁才能登入 webmail 試用
  4. 請同仁儘速登入使用,並告知會有部份郵件被騰訊企業郵箱收走,在測試期間請新舊信箱都要收信
  5. 協助同仁使用,包含解決 outlook 常見問題,或是請他們直接用騰訊維護的 Foxmail
  6. 時機一到時,直接把 MX Record 切換至騰訊企業郵箱,並設置 TXT Record - spf 的部分,降低騰訊企業郵箱寄出信被誤判成垃圾信
  7. 可以嘗試把舊的 smtp server 關閉,或是限制成員發送的能力(例如信件大於1kb無法寄出),進而半強迫同仁轉用騰訊企業郵箱 smtp server
最後,聊點題外話,其實兩年前也差點用 Mail service 這個題目創業,在學生時代我也開發過 mail app 的,這其中的辛酸血淚說都說不完,而讓我想起這件事是因為 Foxmail !我翻了wiki跟百度,才知道這一開始也是一人開發的,就像 openwebmail 吧 :P 負責開發 Foxmail 的是張小龍,一位 1969 年次的高手,釋出三年後就被公司以 1200萬買走,但最猛的是後來被騰訊收購,以及張小龍後續要開發了 QQMail 以及炙手可熱得微信,是的,他是微信創辦人,更是騰訊副總裁。此外,跟生活在中國的朋友閒聊,更能體會騰訊企業郵箱的恐怖,姑且不論費用的便宜,其實還滿多搬的出檯面上的使用者,例如不少學校採用,如北京大學、深圳大學、上海也有,一個單位開的帳號破萬也都很正常,更別說....還有100k的。不禁回想起當年想拿 mail service 創業,還想說該怎樣打入中國生態這件事,真的...還是要先把市調做好 XD 以及中國生態圈中微信佔了很大很大的一部份,而騰訊企業郵箱又可以跟微信無縫結合,這股氣勢真的非常強。

經過這次深度接觸騰訊企業郵箱的經驗,中國的領域真的很威,若不是生活在當下的人,真的很難有所突破,有興趣的,大概可以參考這篇:PTT China_travel [心得] 來到中國你會需要什麼App

其他參考資料: