---
# System prepended metadata

title: OpenStack - Container Security
tags: [' Openstack', 技術文章]

---

---
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 的話，可以在這樣的環境裡面保護好自己的開發環境。