SOE的定義和益處
節(jié)選自《基于Linux的企業(yè)自動(dòng)化》第一章。
本章詳細(xì)探討了Linux中的標(biāo)準(zhǔn)操作環(huán)境(Standard Operating Environment以下簡(jiǎn)稱SOE)概念。盡管我們稍后將更詳細(xì)地討論,但簡(jiǎn)而言之,SOE是一個(gè)以標(biāo)準(zhǔn)方式來(lái)創(chuàng)建和修改所有內(nèi)容的環(huán)境。例如,這意味著所有Linux服務(wù)器都以相同的方式,使用相同版本的軟件構(gòu)建。這是一個(gè)重要的概念,因?yàn)樗构芾憝h(huán)境變得更加容易,并減少了那些看管環(huán)境的人的工作量。
1. 2什么是SOE?
既然我們已經(jīng)探討了SOE對(duì)企業(yè)如此重要的原因,并且從較高的層次上理解了解決這些問(wèn)題的方法,那么讓我們來(lái)詳細(xì)了解一下SOE。
我們將從定義SOE本身開始。
1.2.1定義SOE
讓我們從一個(gè)更實(shí)際的角度來(lái)快速看一下。我們已經(jīng)說(shuō)過(guò),SOE是一個(gè)概念,而不是絕對(duì)的。在最簡(jiǎn)單的層次上,它是一個(gè)通用的服務(wù)器映像或構(gòu)建標(biāo)準(zhǔn),部署在整個(gè)公司的大量服務(wù)器上。在這里,所有必需的任務(wù)都是以已知的、文檔化的方式完成的。
首先是基本操作系統(tǒng),正如我們所討論的,有數(shù)百種Linux發(fā)行版可供選擇。從系統(tǒng)管理的角度來(lái)看,有些非常相似(例如,Debian和Ubuntu),而有些則明顯不同(例如,F(xiàn)edora和Manjaro)。舉個(gè)簡(jiǎn)單的例子,假設(shè)你想在Ubuntu 18.04 LTS上安裝Apache Web服務(wù)器,你可以輸入以下命令:
# sudo apt-get update
# sudo apt-get install apache2
現(xiàn)在,如果你想在CentOS 7上執(zhí)行相同的操作,你可以輸入以下命令:
# sudo yum install httpd
如你所見,這些命令之間沒有任何共同之處,甚至連軟件包的名稱都不同,盡管這兩種情況的最終結(jié)果都是安裝了Apache。在小規(guī)模時(shí),這不是一個(gè)問(wèn)題,但是當(dāng)服務(wù)器數(shù)量眾多并且隨著服務(wù)器數(shù)量的增加,管理這樣一個(gè)環(huán)境的復(fù)雜性也會(huì)增加。
基本操作系統(tǒng)只是一個(gè)開始。我們上面的例子是安裝Apache,但是我們也可以安裝nginx甚至lighttpd。畢竟,它們也是web服務(wù)器。
然后是配置。你希望用戶能夠通過(guò)SSH以root身份登錄嗎?為了審計(jì)或調(diào)試的目的,你需要一定級(jí)別的日志記錄嗎?你需要本機(jī)身份驗(yàn)證還是集中式身份驗(yàn)證?這份清單是無(wú)窮無(wú)盡的,如你所見,如果任其發(fā)展,可能會(huì)成為一個(gè)巨大的頭痛問(wèn)題。
這就是SOE的用武之地。它實(shí)際上是一個(gè)規(guī)范,在較宏觀的層次上,它可能會(huì)規(guī)定:
·我們的標(biāo)準(zhǔn)基本操作系統(tǒng)是Ubuntu 18.04 LTS。
·我們的標(biāo)準(zhǔn)web服務(wù)器將是Apache 2.4。
·SSH登錄已啟用,但僅適用于具有SSH密鑰的用戶而不是root用戶。
·所有用戶登錄都必須記錄并存檔,以便進(jìn)行審核。
·除少數(shù)本機(jī)應(yīng)急(break glass)賬戶外,所有賬戶都必須集中管理(例如,通過(guò)LDAP或Active Directory)。
·我們的公司監(jiān)控解決方案必須集成(例如,必須安裝并配置Nagios NCPA代理,以便與Nagios服務(wù)器通信)。
·所有系統(tǒng)日志必須發(fā)送到公司中央日志管理系統(tǒng)。
·必須對(duì)系統(tǒng)應(yīng)用安全加固。
以上只是一個(gè)例子,絕不是完整的;但是,它應(yīng)該開始讓你了解SOE在宏觀層次上的樣子。隨著本章的繼續(xù),我們將深入探討這個(gè)問(wèn)題,并給出更多的例子來(lái)建立一個(gè)明確的定義。
1.2.2了解一下要包含哪些內(nèi)容
在繼續(xù)之前,我們先稍微更詳細(xì)地了解一下環(huán)境中要包含哪些內(nèi)容。在上一節(jié)中,我們概述了一個(gè)非常簡(jiǎn)單的SOE定義。任何一個(gè)好的SOE操作過(guò)程的一部分就是擁有一個(gè)預(yù)定義的操作系統(tǒng)構(gòu)建,它可以隨時(shí)被部署。有多種方法可以實(shí)現(xiàn)這一點(diǎn),我們將在本書后面討論這些,但是,目前,讓我們假設(shè)已經(jīng)建立了Ubuntu 18.04 LTS的基本映像,正如前面所建議的那樣。
我們?cè)谶@個(gè)標(biāo)準(zhǔn)構(gòu)建中集成了什么?例如,我們知道我們的登錄策略將應(yīng)用于整個(gè)組織,因此,在創(chuàng)建構(gòu)建時(shí),/etc/ssh/sshd_config必須定制為包含PermitRootLogin no和PasswordAuthentication no。在部署后,再在配置中執(zhí)行此步驟沒有意義,因?yàn)檫@必須在每個(gè)部署上執(zhí)行。很簡(jiǎn)單,這將是低效的。
對(duì)于我們的操作系統(tǒng)映像,還有一些重要的自動(dòng)化考慮因素。我們知道Ansible本身是通過(guò)SSH進(jìn)行通信的,因此我們知道需要某種憑據(jù)(很可能是基于SSH密鑰的),以便Ansible在所有部署的服務(wù)器上運(yùn)行。在實(shí)際執(zhí)行任何自動(dòng)化操作之前,必須手動(dòng)將Ansible憑據(jù)推送到每臺(tái)計(jì)算機(jī)是沒有什么意義的,因此重要的是要考慮Ansible要使用的身份驗(yàn)證類型(例如,基于密碼或SSH密鑰的身份驗(yàn)證),并在構(gòu)建映像此時(shí)創(chuàng)建賬戶和相應(yīng)的憑據(jù)。具體方法取決于你的公司安全標(biāo)準(zhǔn),但我建議將以下內(nèi)容作為一種潛在的解決方案:
·在標(biāo)準(zhǔn)映像上創(chuàng)建一個(gè)本機(jī)賬戶,以便Ansible進(jìn)行身份驗(yàn)證。
·授予此賬戶適當(dāng)?shù)膕udo權(quán)限,以確??梢詧?zhí)行所有所需的自動(dòng)化任務(wù)。
·設(shè)置此賬戶的本機(jī)口令,或者將從Ansible密鑰對(duì)中取出的SSH公鑰添加到你創(chuàng)建的本機(jī)Ansible賬戶的authorized_keys文件中。
提示
這樣做當(dāng)然會(huì)帶來(lái)一些安全風(fēng)險(xiǎn)。Ansible很可能需要完全訪問(wèn)你服務(wù)器上的root,以便它有效地執(zhí)行你可能要求它執(zhí)行的所有自動(dòng)化任務(wù),因此如果憑據(jù)被泄露,此Ansible賬戶可能會(huì)成為后門。建議盡可能少的人可以訪問(wèn)你的憑據(jù),并建議你使用諸如AWX或Ansible Tower(我們將在第3章“使用AWX優(yōu)化基礎(chǔ)設(shè)施管理”中探討)之類的工具來(lái)管理你的憑據(jù),從而防止人們不適當(dāng)?shù)孬@取憑據(jù)。你幾乎肯定還希望啟用對(duì)Ansible賬戶執(zhí)行的所有活動(dòng)的審計(jì),并將這些活動(dòng)記錄到某個(gè)中央服務(wù)器上,以便你可以檢查它們是否存在任何可疑活動(dòng),并根據(jù)需要對(duì)它們進(jìn)行審計(jì)。
從用戶賬戶和身份驗(yàn)證開始,還可以考慮Nagios跨平臺(tái)代理(NCPA)。在我們的示例中,我們知道需要監(jiān)視所有部署的服務(wù)器,因此必須安裝NCPA代理,并定義令牌以便它可以與Nagios服務(wù)器通信。同樣,在部署標(biāo)準(zhǔn)映像之后,再在每臺(tái)服務(wù)器上執(zhí)行此操作是沒有意義的。
但是web服務(wù)器呢?制定一個(gè)標(biāo)準(zhǔn)是明智的,因?yàn)檫@意味著所有對(duì)環(huán)境負(fù)責(zé)的人都能對(duì)這項(xiàng)技術(shù)感到滿意。這使得管理更容易,并且對(duì)于自動(dòng)化特別有利,我們將在下一節(jié)中看到。但是,除非你只需要部署運(yùn)行在Linux上的web服務(wù)器,否則這可能不應(yīng)該作為標(biāo)準(zhǔn)構(gòu)建的一部分包含在內(nèi)。
作為一個(gè)合理的原則,標(biāo)準(zhǔn)構(gòu)建應(yīng)該盡可能簡(jiǎn)單和輕量級(jí)。當(dāng)額外的服務(wù)都是多余的時(shí),在服務(wù)器上面運(yùn)行它們,占用內(nèi)存和CPU周期是沒有意義的。同樣,擁有未配置的服務(wù)會(huì)增加任何潛在攻擊者的攻擊面,因此出于安全原因,建議將其排除在外。
簡(jiǎn)言之,標(biāo)準(zhǔn)構(gòu)建應(yīng)該只包含將對(duì)部署的每個(gè)服務(wù)器都通用的配置和/或服務(wù)。這種方法有時(shí)被稱為剛剛夠用操作系統(tǒng)(Just enough Operating System)或簡(jiǎn)稱為JeOS,它是SOE的最佳起點(diǎn)。
在了解了SOE的基本原理之后,我們將在下一節(jié)中更詳細(xì)地了解SOE給你的企業(yè)帶來(lái)的好處。
1.3探索SOE的好處
到目前為止,你應(yīng)該對(duì)什么是SOE以及它如何為L(zhǎng)inux環(huán)境帶來(lái)規(guī)模經(jīng)濟(jì)和更高的效率有所了解?,F(xiàn)在,讓我們?cè)诖嘶A(chǔ)上更詳細(xì)地看一個(gè)標(biāo)準(zhǔn)化重要性的例子。
1.3.1在Linux環(huán)境中SOE的好處示例
說(shuō)Linux環(huán)境中有共同點(diǎn),也就是說(shuō)組成SOE的服務(wù)器都共享一些屬性和特性。例如,它們可能都是基于Ubuntu Linux構(gòu)建的,或者它們都用Apache作為其web服務(wù)器。
我們可以用一個(gè)例子來(lái)探討這個(gè)概念。假設(shè)在負(fù)載均衡器后面有10臺(tái)Linux web服務(wù)器,它們都提供簡(jiǎn)單的靜態(tài)內(nèi)容。一切正常,但隨后必須進(jìn)行配置更改。也許這是為了更改每個(gè)web服務(wù)器的文檔根目錄,使其指向另一個(gè)團(tuán)隊(duì)已部署完成的新代碼版本。
作為負(fù)責(zé)人,你知道,由于整個(gè)解決方案是負(fù)載均衡的,所以所有服務(wù)器都應(yīng)該提供相同的內(nèi)容。因此,每臺(tái)服務(wù)器都需要進(jìn)行配置更改。這意味著,如果你手工來(lái)做的話,你需要改變10個(gè)配置。
當(dāng)然,你可以手工完成這項(xiàng)工作,但這將是一項(xiàng)乏味的工作,對(duì)于熟練的Linux管理員來(lái)說(shuō),這肯定不是最佳的時(shí)間利用方式。它也很容易出錯(cuò)——在10臺(tái)服務(wù)器中的一臺(tái)上可能會(huì)出現(xiàn)打字錯(cuò)誤,但不會(huì)被發(fā)現(xiàn)?;蛘吖芾韱T可能會(huì)被其他地方的事情中斷,最后只有服務(wù)器配置的一部分發(fā)生了更改。
更好的解決方案是編寫一個(gè)腳本來(lái)進(jìn)行更改。這正是自動(dòng)化的基礎(chǔ),幾乎可以肯定的是,在10臺(tái)服務(wù)器上運(yùn)行一次單個(gè)腳本要比在10臺(tái)服務(wù)器上手動(dòng)進(jìn)行相同的更改更好地利用時(shí)間。它不僅效率更高,而且如果在一個(gè)月內(nèi)需要進(jìn)行相同的更改,那么只需稍加調(diào)整就可以重用腳本。
現(xiàn)在,讓我們把計(jì)劃打亂。如果由于未知的原因,有人在CentOS 7上使用Apache構(gòu)建了五個(gè)web服務(wù)器,而在Ubuntu 18.04 LTS上使用nginx構(gòu)建了另外五個(gè)服務(wù)器,會(huì)怎么樣?最終的結(jié)果是相同的,畢竟,在一個(gè)基本的水平,它們都是網(wǎng)絡(luò)服務(wù)器。但是,如果要在CentOS 7上的Apache中更改文檔根目錄,則需要執(zhí)行以下操作:
1.在/etc/httpd/conf.d中找到相應(yīng)的配置文件。
2.對(duì)DocumentRoot參數(shù)進(jìn)行所需的更改。
3.使用systemctl reload httpd.service重新加載web服務(wù)器。
如果必須在ubuntu18.04 LTS上對(duì)nginx執(zhí)行相同的操作,你可以執(zhí)行以下操作:
1.在/etc/nginx/sites-available中找到正確的配置文件。
2.對(duì)root參數(shù)進(jìn)行所需的更改。
3.確保已使用a2ensite命令啟用站點(diǎn)配置文件。否則,Apache將看不到配置文件。
4.使用systemctl reload apache2.service重新加載web服務(wù)器。
從這個(gè)相當(dāng)簡(jiǎn)單(盡管是人為的)的例子中可以看出,缺乏通用性是自動(dòng)化的敵人。為了應(yīng)對(duì)這種情況,你需要執(zhí)行以下操作:
1.檢測(cè)每臺(tái)服務(wù)器上的操作系統(tǒng)。這本身就是不簡(jiǎn)單的。沒有一種方法可以檢測(cè)Linux操作系統(tǒng),因此你的腳本必須經(jīng)過(guò)一系列檢查,包括以下內(nèi)容:
1./etc/os版本的內(nèi)容(如果存在)。
2. lsb_release的輸出(如果已安裝)。
3. /etc/redhat-release的內(nèi)容(如果存在)。
4. /etc/debian_version的內(nèi)容(如果存在)。
5.其他操作系統(tǒng)所需的特定文件,如果上述步驟沒有產(chǎn)生有意義的結(jié)果。
2.在不同的目錄中運(yùn)行不同的修改命令以影響更改,如前所述。
3.運(yùn)行不同的命令來(lái)重新加載web服務(wù)器,同樣如前所述。
因此,腳本變得復(fù)雜,更難編寫和維護(hù),當(dāng)然也更難使其可靠。
盡管這個(gè)特殊的例子在現(xiàn)實(shí)生活中不太可能出現(xiàn),但它確實(shí)有助于說(shuō)明一個(gè)重要的問(wèn)題:當(dāng)環(huán)境按照給定的標(biāo)準(zhǔn)構(gòu)建時(shí),自動(dòng)化更容易實(shí)現(xiàn)。如果決定所有web服務(wù)器都基于CentOS 7,都運(yùn)行Apache 2,并以服務(wù)名稱命名站點(diǎn)配置,那么我們的自動(dòng)化就變得簡(jiǎn)單多了。實(shí)際上,你甚至可以運(yùn)行一個(gè)簡(jiǎn)單的sed命令來(lái)完成更改;例如,假設(shè)新的web應(yīng)用程序部署到/var/www/newapp:
# sed -i 's!DocumentRoot.*!DocumentRoot /var/www/newapp!g'
/etc/httpd/conf.d/webservice.conf
# systemctl reload httpd.service
根本不需要環(huán)境檢測(cè),只需兩個(gè)簡(jiǎn)單的shell命令。這可能是一個(gè)非常簡(jiǎn)單的自動(dòng)化腳本的基礎(chǔ),可以依次在10臺(tái)服務(wù)器上運(yùn)行,也可以通過(guò)SSH遠(yuǎn)程運(yùn)行。不管是哪種方式,我們的自動(dòng)化任務(wù)現(xiàn)在都非常簡(jiǎn)單,并且顯示了通用性的重要性。重要的是,SOE在本質(zhì)上提供了這種通用性。缺乏通用性不僅使自動(dòng)化變得困難,而且還會(huì)妨礙測(cè)試,常常會(huì)扭曲測(cè)試結(jié)果,因?yàn)槿绻h(huán)境不同,測(cè)試結(jié)果可能不具有代表性。
在本章的下一節(jié)中,我們將在這些知識(shí)的基礎(chǔ)上演示SOE如何為軟件測(cè)試過(guò)程帶來(lái)好處。
1.3.2SOE對(duì)軟件測(cè)試的好處
我在許多環(huán)境中看到的一個(gè)常見問(wèn)題是,一個(gè)新的軟件部署在一個(gè)隔離的預(yù)生產(chǎn)環(huán)境中成功地進(jìn)行了測(cè)試,但在發(fā)布到生產(chǎn)環(huán)境中時(shí)卻不能正常工作。通常,這個(gè)問(wèn)題可以歸結(jié)到生產(chǎn)環(huán)境和預(yù)生產(chǎn)環(huán)境之間的根本區(qū)別,因此很明顯,要使測(cè)試有效,兩個(gè)環(huán)境必須盡可能相似。
事實(shí)上,像Docker這樣的容器化平臺(tái)要解決的問(wèn)題之一就是這個(gè)問(wèn)題,因此可移植性是容器環(huán)境的一個(gè)核心特性。部署在Docker上的代碼構(gòu)建在容器映像之上,簡(jiǎn)單地說(shuō),就是一個(gè)精簡(jiǎn)的操作系統(tǒng)映像(還記得JeOS嗎?)。實(shí)際上,這是一個(gè)非常小的SOE,只是在容器中運(yùn)行,而不是在裸機(jī)服務(wù)器或虛擬機(jī)上運(yùn)行。然而,值得考慮的是,如果通過(guò)環(huán)境標(biāo)準(zhǔn)化實(shí)現(xiàn)的可移植性是容器技術(shù)的一個(gè)關(guān)鍵特性,那么我們不應(yīng)該嘗試在不考慮基礎(chǔ)設(shè)施的情況下全面實(shí)現(xiàn)這一點(diǎn)。
畢竟,如果生產(chǎn)服務(wù)器的配置與預(yù)生產(chǎn)服務(wù)器不同,那么測(cè)試的有效性如何?如果預(yù)生產(chǎn)環(huán)境是在CentOS 7.6上構(gòu)建的,但是生產(chǎn)環(huán)境是落后于它的CentOS 7.4,那么你真的能確保在一個(gè)環(huán)境中成功的測(cè)試結(jié)果將保證在另一個(gè)環(huán)境中成功嗎?從理論上講,它應(yīng)該可以工作,但由于環(huán)境之間的軟件和庫(kù)版本存在根本性差異,這永遠(yuǎn)無(wú)法得到保證。這甚至是在我們考慮配置文件和安裝的軟件之間可能存在的差異之前需要考慮的。
因此,如果所有的環(huán)境都按照相同的標(biāo)準(zhǔn)構(gòu)建,那么從理論上講,它們都應(yīng)該是相同的,那么SOE在這方面可以提供幫助。你們中那些目光敏銳的人會(huì)注意到“應(yīng)該”(should)這個(gè)詞在前一句中的用法,這是有充分理由的。SOE在定義解決測(cè)試失敗的方案方面向前邁出了一大步,但它們并不是全部。
一個(gè)環(huán)境只有在沒有人修改它的情況下才是標(biāo)準(zhǔn)的,如果所有用戶都有管理員級(jí)別的權(quán)限,那么很容易有人(善意的或其他的)登錄并進(jìn)行更改,這意味著環(huán)境偏離了標(biāo)準(zhǔn)。
這個(gè)問(wèn)題的答案是,自動(dòng)化,SOE不僅僅是促進(jìn)和實(shí)現(xiàn)自動(dòng)化,它們還依賴于自動(dòng)化來(lái)保持最初要求的標(biāo)準(zhǔn)化水平。兩者直接相互支持,理想情況下應(yīng)該是不可分割的伙伴:SOE是環(huán)境本身的定義,自動(dòng)化提供標(biāo)準(zhǔn)的實(shí)現(xiàn)、執(zhí)行和審計(jì)。實(shí)際上,這正是本書的前提,即環(huán)境應(yīng)該盡可能地標(biāo)準(zhǔn)化,并且應(yīng)該讓盡可能多的更改自動(dòng)化。
本書的重點(diǎn)將放在這個(gè)等式的自動(dòng)化方面,因?yàn)槌藞?jiān)持本章概述的原則之外,所采用的標(biāo)準(zhǔn)對(duì)于每個(gè)環(huán)境都是獨(dú)特的,本書的目標(biāo)不是在微觀級(jí)別上確定它們。以我們前面的示例為例,Apache和nginx都有它們的優(yōu)點(diǎn),適合一個(gè)用例的可能不適合另一個(gè)用例。
操作系統(tǒng)也是如此,一些機(jī)構(gòu)可能依賴Red Hat Enterprise Linux提供的支持軟件包,而其他機(jī)構(gòu)則不需要支持軟件包,但需要Fedora提供的前沿技術(shù)。定義一個(gè)標(biāo)準(zhǔn)沒有對(duì)錯(cuò)之分,只要它滿足它所支持的服務(wù)的需求。到目前為止,我們非常關(guān)注通用性和標(biāo)準(zhǔn);然而,在需要替代解決方案的情況下,總會(huì)有一些邊緣案例。在下一節(jié)中,我們將確定如何知道何時(shí)應(yīng)該偏離標(biāo)準(zhǔn)。
審核編輯 :李倩
-
Web
+關(guān)注
關(guān)注
2文章
1267瀏覽量
69601 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
9277瀏覽量
85824 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6874瀏覽量
123563
原文標(biāo)題:高效工作之一:標(biāo)準(zhǔn)操作環(huán)境(SOE)詳解
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論