《中交興路運維總監(jiān):中小企業(yè)如何優(yōu)雅的管理多機房服務(wù)器賬號》要點:
本文介紹了中交興路運維總監(jiān):中小企業(yè)如何優(yōu)雅的管理多機房服務(wù)器賬號,希望對您有用。如果有疑問,可以聯(lián)系我們。
許穎維(中交興路 運維總監(jiān))
曾經(jīng)就職于日 PV 超億次的 WAP 搜索公司,后加入多次占領(lǐng) Facebook 日活躍 Top10 的游戲公司(產(chǎn)品有開心水族箱、開心消消樂),負(fù)責(zé)搭建自動化運維平臺.
現(xiàn)在國內(nèi)領(lǐng)先的商用車聯(lián)網(wǎng)公司擔(dān)任系統(tǒng)支持部負(fù)責(zé)人,同時負(fù)責(zé)并發(fā)百萬級別的實時在線車聯(lián)網(wǎng)平臺運維工作.
本文內(nèi)容大致分成四部分:
整個故事要從一臺老舊的服務(wù)器開始
那年,我們的集群規(guī)模有400多臺服務(wù)器,部分是很穩(wěn)定地,大家慢慢就忽略掉它了.突然有一天監(jiān)控系統(tǒng)上發(fā)現(xiàn)一臺邊緣很老的服務(wù)器負(fù)載太高,影響了主站的穩(wěn)定性.
我的第一反應(yīng)就是讓業(yè)務(wù)運維登陸上去處理,結(jié)果過了5分鐘業(yè)務(wù)運維反饋說“密碼錯誤”.因為我們有業(yè)務(wù)運維和系統(tǒng)運維區(qū)分,所以我讓系統(tǒng)工程師去登錄一下.
結(jié)果不幸的是,系統(tǒng)管理員反饋“這個服務(wù)器比我們所有的工程師都早出現(xiàn)在這個公司,大家都不知道他的密碼”.這個時候就非常著急了,我們收到大量的用戶投訴.一個本來五分鐘就可以解決的問題,但是我們卻花了兩個小時.
最后我們開總結(jié)會的時候,大家都認(rèn)定這個問題得必須重視了,業(yè)務(wù)的擴展非常快,我們不可能每一個服務(wù)器都記錄一個帳號,我們需要有一套統(tǒng)一的身份認(rèn)證.
當(dāng)我們還在使用 SSH 跟 SCP 的時候,每個員工只需要一個密碼,不管是登陸生產(chǎn)環(huán)境還是測試環(huán)境.我更改密碼的時候也立即生效,而且我不想讓 SA 知道我的密碼,這就是我們最初的需求.
明確了需求之后,我們就開始考慮選擇什么工具合適.有一種方案很簡單就是我們用一個配置管理工具把這個服務(wù)器上面的 shadow/passwd 文件管理起來.
但是這樣很被動,我所有的操作都依賴于它,我很多的操作生效期都會受到影響.還有另一個解決方案就是身份認(rèn)證系統(tǒng),我們知道這個是人人一直在用的 ?Kerberos,還有 OpenLDAP 也是一個比較熱門的,最后就是商業(yè)產(chǎn)品堡壘機.
而創(chuàng)業(yè)公司的我們認(rèn)為成本是第一要素,毋庸置疑首選就是開源.究竟是選擇 kerberos 還是 OpenLDAP 呢?
我們請教了一個以前用過這方面的大拿,他推薦使用 OpenLDAP,因為使用起來很簡單,就是用賬戶密碼登陸.而 Kerberos 他可能會比較復(fù)雜一些,因為它有 Ticket 的認(rèn)證過程.
所以我們就初步選擇 OpenLDAP 了.同時我們發(fā)現(xiàn)國外的大廠 Facebook 和 谷歌都要使用 OpenLDAP,這就給了我們很大的信心.
同時,我們與商業(yè)產(chǎn)品進(jìn)行對比,主要是價格和功能上有大的差異.
最主要的就是價格,老板說 OK 就可以了,畢竟老板對錢都是非常敏感的.
我介紹一下 OpenLDAP,它是輕量級目錄訪問協(xié)議,它特別適用于查詢多但寫入少的場景,可以做到毫秒級響應(yīng),但是如果是變更多的場景就不合適了.
然而它是怎么工作的呢?我們需要在需要認(rèn)證的服務(wù)器上安裝一個 OpenLDAP 的客戶端,這個客戶端其實是系統(tǒng)級別就已經(jīng)是綁定了,我們就從這個圖來看,我們是首先處于左下角.
用戶登陸的時候,先登陸第一臺跳板機,登陸上去的時候,其實訪問的是本地的 PAM 模塊,他通過 nsswitch 模塊訪問調(diào)用兩個文件 passwd & shadow,但是里面還有一個是可以支持多源的權(quán)限訪問方式.
可以調(diào)動 OpenLDAP 的客戶端,把帳號和密碼發(fā)送給 OpenLDAP 服務(wù)器端(右下角的那臺服務(wù)器),如果再 OpenLDAP 服務(wù)器端匹配正確,就返回給所登陸的服務(wù)器【OK】,這時我們就可以順利的登陸服務(wù)器,這個是和使用正常登陸方式一模一樣的.
OpenLDAP 記哪些信息,包括用戶ID用戶帳號,用戶密碼,包括權(quán)限的定義.這里涉及到提權(quán)的過程,因為我們每個人在有了 LDAP 賬號之后,登陸到服務(wù)器上都是個人賬號,而大部分的時候我們是有切換到其他賬號需求的.
OpenLDAP 的提權(quán)管理做的比較強,它是 Sudoers schema 里面去定義每一組的具體權(quán)限,而每個人又對應(yīng)到某個具體組內(nèi).這就能輕松做到我和這個組里的人權(quán)限一致,同時權(quán)限的變更是全局性的,所有服務(wù)器生效.
回顧最初需求
我們回顧當(dāng)時最初的需求,并不是要做精細(xì)化管理,即只需要所有的人登錄到服務(wù)器上,完成人員的賬號認(rèn)證,研發(fā)人員、運維都是個人用戶,登陸上服務(wù)器之后使用 sudo 切換到 root 的 賬號.
當(dāng)時是用這種非常粗放的管理方式,當(dāng)然我們數(shù)據(jù)庫不在這個管理范圍之內(nèi),因為這種OpenLDAP登陸數(shù)據(jù)庫太危險了,不建議使用它們來管理數(shù)據(jù)庫.
接下來是安裝過程,(在這里就不細(xì)寫了我著重講客戶端的配置過程)
我使用 authconfig-tui 命令就可以進(jìn)入到這個模式,這個配置很簡單,只要前面勾選五個選項,然后下一步把 URI 和 Base 配置完成就 OK 了.
但是運維關(guān)注的是,這些操作的背后究竟是做了什么事情.如果我操作完還不生效就需要去查看配置文件.其中包括這么幾個配置文件:
1. /etc/ldap.conf
2. /etc/nsswitch.conf
3. /etc/sysconfig/authconfig
4. /etc/pam.d/system-auth
只要保證這些配置文件按要求進(jìn)行修改,不用使用交互式工具也可以完成配置過程.
完成配置之后我們就會經(jīng)常收到其他同事的抱怨,誤操作刪除掉系統(tǒng)文件,壓力好大.接下來我們就開始了權(quán)限的精細(xì)化管理演變.
上面就是權(quán)限的精細(xì)化管理的成員類別邏輯圖:
還有一個圖非常重要,就是要跟大家講一個普遍新手都會誤會的地方,大部分人認(rèn)為在 OpenLDAP 管理內(nèi),首先就是組,然后下面的分支是人,再下面的分支是權(quán)限.其實不是這樣的,如下圖:
其實人、組、權(quán)限都是并列的,具體而言,在這個人屬性里面包含了一個元素 UID,如果五個人對應(yīng)同一個 UID,那這五個人就是一個組.
權(quán)限分支內(nèi)定義很多的權(quán)限組,權(quán)限組又有屬性和組對應(yīng),因此人跟組、權(quán)限就對應(yīng)起來了,所以大家看書的時候不要被誤導(dǎo)了,這個就是落地的基本形式.
接下來問題來了,我們是一個車聯(lián)網(wǎng)的公司,全國有將近十個機房,我們需要考慮這么多個機房的部署和維護工作.
最簡單是我們所有的服務(wù)器都到一個地方認(rèn)證,看似很棒的一個方案,但其實你想,這是不行的.因為我們很多時候有登陸服務(wù)器的緊急需求就是網(wǎng)絡(luò)故障或者是普通服務(wù)故障.
如果是集中式管理,可能會導(dǎo)致網(wǎng)絡(luò)有故障的時候服務(wù)器認(rèn)證也有問題.所以解決方案是分布式管理,分布式認(rèn)證.
這個跟 MysqlCluster 集群的管理方式是一樣的,有 Master 節(jié)點負(fù)責(zé)寫入,通過日志推到各個機房的 Slave 上面,然后在本地進(jìn)行 redo 到 Slave 上.
同時所有的用戶都是在本機房內(nèi)的節(jié)點進(jìn)行認(rèn)證,所有的修改會被 rewrite 到 Master 節(jié)點上.下圖就是具體日志,我們可以看看里面的描述:
這個就是在幾點幾分的日志,就是他把這個用戶的密碼改了.目前我們能做到七百臺服務(wù)器同時并發(fā)登陸及更改密碼,基本上公司大部分的需求我們都可以滿足.
本以為完成全部的需求,這時候安全部門找到我們,質(zhì)疑我們“你們這個東西安全嗎?你們目前的安全狀況確實是太糟糕了,所有用戶的登陸過程密碼我全部都看見了”……
這確實是太糟糕了,在我的經(jīng)驗里面,上線不到幾小時就發(fā)現(xiàn)從馬來西亞不斷的有嘗試暴力破解我們的服務(wù)器的情況,一旦嘗試暴力破解成功所造成的影響是超過我們預(yù)期的.這樣,我們就開始了安全方面的需求改造.
非常慶幸的是 OpenLDAP 支持 TLS 的證書認(rèn)證方式.這里有一個建議,就是大家做證書的時候一定要使用泛域名證書.為什么?
因為你可能涉及到每一個組機房都使用唯一的一個域名.你所有的機房都可以使用同一個證書,因為你不用管哪一個機房都可以使用泛域名證書.
同時我們還做了限制登錄的方案,這個跟 OpenLDAP 沒有關(guān)系.只是我們使用 PAM 模塊對登錄失敗用戶進(jìn)行限制而已.
只要單個用戶五次登陸失敗,鎖定600秒這個大家可以試一下.
安全部門也搞定了,最后一個問題就是服務(wù)解耦.為什么會有這個需求呢,因為有一天運維反饋所有的服務(wù)器登錄特別慢,是因為在 Nginx 上面,起用了新功能,需要讀本地的文件.
而我們知道每一次讀本地文件的時候,就需要檢查這個用戶是不是有權(quán)限,很不幸他把所有的權(quán)限校驗過程都發(fā)給了 OpenLDAP 服務(wù)器,我們當(dāng)時的用戶是每秒鐘有七千個用戶訪問,我們的服務(wù)器感覺快爆了.
我們看了一下這個 OpenLDAP 的官網(wǎng),其實已經(jīng)給我們解決相關(guān)的辦法,解決這個問題需要在客戶端的 ?/etc/ldap.conf
文件里面增加nss_initgroups_ignoreusers
參數(shù),就是說這些用戶統(tǒng)統(tǒng)都不用去做認(rèn)證,只需要去做本地的 Passwd 和 ?Shadow 里面即可,這樣就解決完成解耦的問題.
后續(xù)又有項目組的領(lǐng)導(dǎo)說,我們現(xiàn)在服務(wù)器比較多,但是我不想其他項目組看到我們的代碼日志等信息,如何?
OpenLDAP 也是可以滿足這個需求的,他可以使用 pam_check_host_attr
這種參數(shù)來保證我可以做到每一個用戶只能登陸我們指定的服務(wù)器,這里我就不詳細(xì)說明,給大家點個方向.
我們到目前為止沒有發(fā)生大問題的時候,但是發(fā)現(xiàn)公司不斷的發(fā)展,人員的離職、入職及人員的變動經(jīng)常需要我們進(jìn)行賬號的刪除添加,這是我們內(nèi)部管理的要求.
后來我們給自己開發(fā)了一個 web 管理系統(tǒng),對添加刪除賬號轉(zhuǎn)變成更為簡單的操作.
這個就是把一個修改賬號的請求通過 web 頁面進(jìn)行描述,將請求存儲到數(shù)據(jù)庫內(nèi),并在后端使用定時任務(wù)將其操作內(nèi)容在 OpenLDAP 內(nèi)進(jìn)行生效,并返回給他結(jié)果的過程.最終體現(xiàn)在頁面上就是這樣.
回顧一下我們整個系統(tǒng)的發(fā)展階段:
原文來自微信公眾號:高效運維
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/4296.html