--- tags: 技術文章, Openstack GA: UA-79596126-4 title: OpenStack - Container Security --- {%hackmd BJrTq20hE %} # OpenStacK - Container Security ###### 撰寫日期:2020/04/13 ###### 作者: 子航 [TOC] Container 是一種容器化的技術,這技術已經存在這世上很久的時間了,那怎麼把他跟 Docker 做區分呢? 先用一張[圖片](https://larrylu.blog/step-by-step-dockerize-your-app-ecd8940696f4)看一下 ![](https://i.imgur.com/Cr7F7gx.png) Docker 就是下面的藍色鯨魚,負責乘載著許多容器在身上,也就是說 Docker 是管理與運行 Container 的平台。 而 Container 就是鯨魚身上所揹貨櫃(容器),每個 Container 都是互相獨立運行,當然也由於與主機端( Host )共用Kernel,這導致許多安全性問題值得討論 ## 透過 Linux 既有的功能提升 Container 的安全 根據官方文件的說明,當我們在使用 Container 進行部屬或使用時很容易給予 Container 過高的權限,舉例來說: 今天我負責處理 Web 服務的 Container 為求方便提供較高的權限供給他進行一些資料存取,然而當遭受到惡意攻擊者並取得其控制權,其惡意攻擊者便可以透過此 Web Container進行本機端的攻擊、破壞、資料竊取等。 為了避免這種事情, Docker 官方建議透過 Linux 既有的功能進行防禦的加層,如 Namespace 、 Cgroups 、 SELiux/AppArmor 與 Capabilities 等功能 1. Namespace - 簡單來說,Container 內的 root 權限在 Container 之外必須處於非高權限狀態,以此避免此 Container 誤刪一些本機端重要資料或是控制其他 Container 等。 2. Cgroups - 針對 Container 進行資源的限制與分配,不讓一台 Container 占用較高資源卻讓他閒置在那。 3. SELiux/AppArmor - 這兩個功能都是用來控製資料訪問權限,讓 Container 僅能存取限定給他的資料,而不是連其他 Container 甚至本機端的重要資料。 4. Capabilities - 是一種權限控管工具,此工具以『有使用才給予』為原則,作為區分使用者與 root 權限的工具非常好用。 ## 透過其他工具能提升 Container 的安全 上述透過 Linux 本身既有的功能便可以做到基本的防護,然而該如何確定映像檔( image )本身是否存在著漏洞呢? ### Docker Hub Docker hub 是 Docker 官方用來存放映像檔的註冊表( registry ),任何人均可製作自己的映像檔上傳至 Docker hub 進行儲存;同時,Docker 官方也推出了 Docker Security Scanning 的工具進行漏洞掃描,以此確保此映像檔沒有被植入惡意程式或後門。 然而,Docker Security Scanning 並不是免費提供的服務,必須每個月繳交一定的費用才可使用這項功能,這導致許多映像檔存在著惡意程式卻無從得知,也造就這篇新聞的發生: [前十大熱門Docker映像檔都有至少30個以上的漏洞](https://www.ithome.com.tw/news/129018) 對於資安考量來看,若預算較低(~~免費仔~~)的人也需要安全防護該如何是好? ### Harbor + Clair + Notary 俗話說,山不轉路轉,路不轉人轉,竟然沒足夠的預算(~~想當免費仔~~),這裡就來介紹開源的掃描軟體 1. Harbor - 是 CNCF Incubating 專案,該專案是基於 Docker Distribution 擴展功能的 Container Registry,提供映像檔儲存、簽署、漏洞掃描等功能。另外增加了安全、身份認證與 Web-based 管理介面等功能。 2. Clair - 是 CoreOS 開源的容器映像檔安全掃描專案(近期被 Redhat 幹...買走了),其提供 API 式的分析服務,透過比對公開漏洞資料庫 CVE(Common Vulnerabilities and Exposures)的漏洞資料,並發送關於容器潛藏漏洞的有用和可操作資訊給管理者。 3. Notary - CNCF Incubating 專案,該專案是 Docker 對安全模組重構時,抽離的獨立專案。Notary 是用於建立內容信任的平台,目標是確保 Server 與 Client 之間交互使用已經相互信任的連線,並保證在 Internet 上的內容發佈安全性,該專案在容器應用時,能夠對映像檔、映像檔完整性等安全需求提供內容信任支援,避免遭到竄改或第三人攻擊。 將以上三套開源套件進行整合,除了可以掃描外部的映像檔,也可以把它當成自己內部的 registry ,儲存自己開發中的映像檔在上面。一舉兩得,真是可喜可賀! ### 安裝步驟 首先先確認環境是否有 docker.io 與 docker-compose 套件,指令如下 ``` sudo apt update && sudo apt upgrades -y sudo apt install docker.io ``` 對於 docker-compose 為避免載到版本不相符的問題,這邊直接取得最新的版本 ``` VERSION=$(curl --silent https://api.github.com/repos/docker/compose/releases/latest | jq .name -r) DESTINATION=/usr/local/bin/docker-compose sudo curl -L https://github.com/docker/compose/releases/download/${VERSION}/docker-compose-$(uname -s)-$(uname -m) -o $DESTINATION sudo chmod 755 $DESTINATION ``` Harbor 是由多個容器部署而成,因此我們需要在部署前取得安裝檔案。這邊可以利用 wget 下載 Offline 安裝的檔案:(這裡已v1.9版本為例,目前最新是v1.10) ``` wget https://storage.googleapis.com/harbor-releases/release-1.9.0/harbor-offline-installer-v1.9.0.tgz tar xvf harbor-offline-installer-v1.9.0.tgz && rm harbor-offline-installer-v1.9.0.tgz cd harbor ``` 這邊安裝透過 Offline 進行,因此在部署前,需要透過 Docker 載入映像檔: ``` sudo docker load < harbor.v1.9.0.tar.gz sudo docke images ``` 接著由於部署的 Harbor 使用 HTTPS,因此需要提供憑證。這邊由於測試用,因此以自簽(Self signed)來處理: <your IP>的部分請改成你自己的IP ``` # 產生 CA crt openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt -subj "/C=TW/ST=New Taipei/L=New Taipei/O=test_company/OU=IT/CN=test" # 產生 Harbor csr openssl req -newkey rsa:4096 -nodes -sha256 -keyout harbor-registry.key -out harbor-registry.csr -subj "/C=TW/ST=New Taipei/L=New Taipei/O=test_company/OU=IT/CN=<your IP>" cat > v3.ext <<-EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1=harbor-server IP.1=<your IP> EOF openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in harbor-registry.csr -out harbor-registry.crt ``` 複製檔案至/data/cert/目錄底下: ``` sudo mkdir -p /data/cert/ sudo cp -rp ./{ca.key,ca.crt,harbor-registry.key,harbor-registry.crt} /data/cert/ ``` 修改 Harbor 組態檔案harbor.yml內容,如以下所示: ``` hosthome: <your IP> 取消註解 https、certificate、private_key certificate: /data/cert/harbor-registry.crt private_key: /data/cert/harbor-registry.key harbor_admin_password: <admin_password> ``` ![](https://i.imgur.com/yrX95rr.png) 完成後,即可執行腳本進行部署 Harbor: ``` sudo ./prepare ... Clean up the input dir sudo ./install.sh --with-notary --with-clair ``` 複製 ca 憑證到 Docker certs 目錄,以確保 HTTPs 能夠授權: ``` sudo mkdir -p /etc/docker/certs.d/<your IP> sudo cp /data/cert/ca.crt /etc/docker/certs.d/<your IP>/ ``` 取得測試用映像檔,並推送映像檔到 Harbor 中: ``` sudo docker pull alpine:3.7 # 輸入帳密登入 sudo docker login <your IP> sudo docker tag alpine:3.7 <your IP>/library/alpine:3.7 sudo docker push <your IP>/library/alpine:3.7 ``` 完成後登入網頁便可以看到如下畫面 ![](https://i.imgur.com/5f77v5I.png) 我有在我們的 OpenStack 上的 VM 架設,如果有需要,連進140.135.13.232就可以看到瞜! ## Harbor 介面簡單介紹 如上述所說,Harbor主要目標是用來儲存映像檔的地方,搭配 Clair 進行弱點掃描後,便新增了幫忙掃描映像檔的功能,那下面很簡單的來說明一下介面 ### Project 透過介面登入後,預設會進入 project 頁面,此處可以看到所有 Project 存在多少 images 等資訊 ![](https://i.imgur.com/93sQQsa.png) Harbor 對於 project 採用基於角色的訪問控制。在 Harbor 中 projects 有兩種類型: * Public:所有的使用找都具有讀取 public project 的權限, 其主要是為了方便分享一些 repositories * Private:一個私有project只能被特定使用者以適當的權限進行訪問 ![](https://i.imgur.com/9urgm7g.png) 完成創建後,進入project查看 ![](https://i.imgur.com/oSXmUd7.png) 點擊 repositories 查看所有存在此 project 的 images ![](https://i.imgur.com/ffZUaJZ.png) 點擊PUSH IMAGE便可知道如何上傳image至此project ![](https://i.imgur.com/GbjybwN.png) 點擊任意image連結便可檢視此image的狀態,是否有漏洞 ![](https://i.imgur.com/SNGHGT2.png) 點擊tag連結便可以檢視詳細的漏洞原因與問題 ![](https://i.imgur.com/MtyRudI.png) ### Tasks Vulnerability連結可以設定什麼時候進行所有image掃描以及檢視資料庫更新的狀況 ![](https://i.imgur.com/4QVpN94.png) ### Configuration Configuration連結可以設定包刮使用者認證權限、使用者忘記密碼時寄送電子郵件等功能 ##### Authentication 可以選擇透過database、LDAP、UAA、OIDC進行使用者認證 ![](https://i.imgur.com/OvMuM1u.png) #### Email 此email服務主要適用於當使用者忘記帳號密碼時,寄送重製密碼 ![](https://i.imgur.com/GRjNS9V.png) ## 結語 這一套東西也是各種雷阿,踩了一個禮拜才搞好這個鬼套件,Harbor 不只可以只安裝 Clair 一個掃描器在裡面,也可以使用其他包括:Anchore、Trivy 等,可以根據自己的需求去找適合的掃描器來用。當然這是可以拿來當作內部儲存映像檔空間,同時檢視自己撰寫的映像檔是不是有漏洞,也可以檢查你下載的映像檔是不是有漏洞的存在。 依照目前這樣看起來,內部自行使用是滿好用的,不用花錢、漏洞資料庫會自己每12小時更新一次(這是預設值,最快可以每1個小時更新一次),如果你想玩玩 Container 的話,可以在這樣的環境裡面保護好自己的開發環境。