現代伺服器管理強調安全性和資源效率。本文介紹如何設定防火牆、啟用HTTPS、取得SSL憑證,並利用Docker容器化技術提升伺服器安全性和應用佈署效率。首先,需設定防火牆允許HTTPS連線,確保遠端系統能正常存取服務。接著,使用Certbot取得Let’s Encrypt的SSL憑證,並確認自動續約機制,確保憑證有效性。最後,利用Docker容器化技術,在資源隔離的環境中執行應用程式,提升資源利用率並簡化佈署流程。Docker容器相較於虛擬機器,擁有更輕量級的資源消耗和更快的啟動速度,更適合現代化應用佈署。

強化伺服器安全性與容器化技術的實踐

在現代化的伺服器管理與應用佈署中,安全性和高效的資源利用是兩個核心議題。本文將探討如何透過組態防火牆、啟用HTTPS、取得SSL憑證以及利用Docker容器化技術來提升伺服器的安全性和應用佈署的效率。

允許HTTPS透過防火牆

為了確保遠端系統能夠與服務順暢通訊,必須在防火牆中開放HTTPS埠(TCP/443)。首先,檢查目前防火牆的狀態:

sudo ufw status

接著,清除舊的防火牆組態(如有)並替換為新的組態:

sudo ufw delete allow 'Apache'
sudo ufw allow 'Apache Full'

再次檢查防火牆狀態以確認變更:

sudo ufw status

內容解密:

  1. sudo ufw status:用於檢查目前的防火牆狀態,確認哪些埠是開放的。
  2. sudo ufw delete allow 'Apache':刪除允許Apache服務的舊規則。
  3. sudo ufw allow 'Apache Full':允許Apache Full服務,該服務通常包含HTTP和HTTPS的規則。

取得SSL憑證

Certbot提供了多種方式透過外掛取得SSL憑證。使用Apache外掛可以簡化組態過程:

sudo certbot --apache -d example.com -d www.example.com

首次執行Certbot時,需要輸入電子郵件地址並同意服務條款。完成後,Certbot會與Let’s Encrypt伺服器通訊,並執行挑戰以驗證您對所請求憑證的網域控制權。

內容解密:

  1. sudo certbot --apache:使用Certbot的Apache外掛來取得和安裝SSL憑證。
  2. -d example.com -d www.example.com:指定要為哪些網域取得憑證。

驗證Certbot自動續約功能

Let’s Encrypt憑證的有效期為90天,因此自動續約機制至關重要。Certbot已安裝了一個續約指令碼到/etc/cron.d,該指令碼每天執行兩次,並在必要時自動續約憑證。

測試續約過程:

sudo certbot renew --dry-run

內容解密:

  1. sudo certbot renew --dry-run:測試憑證續約過程,而不實際變更任何憑證。

Docker容器化技術

Docker是一種管理在容器中執行的程式的技術。Docker容器在資源隔離的環境中執行應用程式,具有比虛擬機器更高的可移植性和資源效率。

Docker與虛擬機器的比較

  • Docker基礎設施:只需要一份作業系統副本,所有容器分享宿主作業系統核心。
  • 虛擬機器基礎設施:每個虛擬機器都需要一份完整的作業系統副本,消耗更多系統資源。

Docker技術透過容器實作了應用程式的快速擴充套件和高效資源利用。Docker容器的啟動速度遠快於虛擬機器,且佔用資源更少。

此圖示展示了Docker的基本架構,從宿主基礎設施到Docker容器的層級結構。

內容解密:

  1. Docker容器根據Docker映像建立,可以快速啟動和停止。
  2. Docker映像儲存在Docker Hub等登入檔中,方便共用和重用。

Docker 安裝與基礎操作

Docker 是一種流行的容器化技術,允許開發者將應用程式及其依賴封裝成一個可移植的容器。本文將介紹如何在 Ubuntu 系統上安裝 Docker,並進行基礎的操作和管理。

從官方 Docker 倉函式庫安裝 Docker

使用發行版內建的倉函式庫安裝 Docker 可能不是最新版本。若要取得最新版本的 Docker,需要將套件管理器指向官方倉函式庫。

  1. 更新套件管理器倉函式庫資訊

    sudo apt-get update
    
  2. 確保 apt 套件管理器具備使用 HTTPS 下載的前提條件

    sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
    
  3. 將官方 Docker 倉函式庫的 GPG 金鑰新增到 apt 套件管理器

    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    
  4. 將 Docker 倉函式庫新增到 apt 源

    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
    
  5. 使用 Docker 套件更新 apt 套件資料函式庫

    sudo apt-get update
    
  6. 確認即將安裝的 Docker 版本來自正確的倉函式庫

    apt-cache policy docker-ce
    

    你應該會看到安裝套件來自 Docker 倉函式庫的訊息。

  7. 安裝 Docker 服務

    sudo apt-get install docker-ce
    
  8. 檢查 Docker 服務是否正在執行

    sudo systemctl status docker
    

    你應該會看到服務正在執行的訊息。

程式碼解析:

sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
sudo apt-get update
apt-cache policy docker-ce
sudo apt-get install docker-ce
sudo systemctl status docker

內容解密:

  1. sudo apt-get update:更新本地端的套件列表,以確保安裝的是最新版本的套件。
  2. sudo apt-get install apt-transport-https ca-certificates curl software-properties-common:安裝必要的套件,以支援 HTTPS 下載和倉函式倉管理。
  3. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -:下載並新增 Docker 官方的 GPG 金鑰,以驗證套件的真實性。
  4. sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable":新增 Docker 的官方倉函式庫到系統的源列表中。
  5. sudo apt-get update:再次更新套件列表,以包含剛才新增的 Docker 倉函式庫。
  6. apt-cache policy docker-ce:檢查即將安裝的 Docker 版本和來源。
  7. sudo apt-get install docker-ce:安裝 Docker 社群版。
  8. sudo systemctl status docker:檢查 Docker 服務的執行狀態。

使用和測試 Docker 服務

假設你已將使用者帳戶新增到 docker 安全群組中。

  1. 檢查 Docker 是否正常執行

    docker run hello-world
    
  2. 顯示已下載到本地端的映像檔

    docker images
    
  3. 搜尋 Docker Hub 上的映像檔

    docker search hello-world
    

程式碼解析:

docker run hello-world
docker images
docker search hello-world

內容解密:

  1. docker run hello-world:執行一個名為 hello-world 的 Docker 容器,若本地端沒有該映像檔,則會自動從 Docker Hub 下載。
  2. docker images:列出本地端所有已下載的 Docker 映像檔。
  3. docker search hello-world:在 Docker Hub 上搜尋名為 hello-world 的映像檔。

管理 Docker 映像檔和容器

  1. 顯示正在執行的容器

    docker ps
    
  2. 顯示所有容器(包括未執行)

    docker ps -a
    
  3. 啟動一個容器

    docker start d57e5d79b88d
    
  4. 停止一個容器

    docker stop happy_villani
    
  5. 刪除一個容器

    docker rm happy_villani
    

程式碼解析:

docker ps
docker ps -a
docker start d57e5d79b88d
docker stop happy_villani
docker rm happy_villani

內容解密:

  1. docker ps:列出目前正在執行的容器。
  2. docker ps -a:列出所有容器,包括未執行的。
  3. docker start d57e5d79b88d:啟動一個指定的容器。
  4. docker stop happy_villani:停止一個指定的容器。
  5. docker rm happy_villani:刪除一個指定的容器。

提交一個 Docker 映像檔

當你修改了一個容器後,可以提交更改並建立一個新的 Docker 映像檔。

docker commit -m "added apps" -a "jane" d57e5d79b88d jane2020/Ubuntu_testapp1

程式碼解析:

docker commit -m "added apps" -a "jane" d57e5d79b88d jane2020/Ubuntu_testapp1

內容解密:

  1. docker commit:提交一個容器的更改,建立一個新的映像檔。
  2. -m "added apps":新增提交訊息,描述更改的內容。
  3. -a "jane":指定作者的名字。
  4. d57e5d79b88d:容器的 ID。
  5. jane2020/Ubuntu_testapp1:新的映像檔名稱,包含倉函式庫名稱和映像檔名稱。

Docker 映像檔推播至儲存函式庫與安全管理

在自訂 Docker 映像檔完成後,將其上傳至 Docker Hub 可讓其他系統使用或與他人分享。以下將介紹如何推播映像檔、Docker 指令詳解,以及系統安全管理的重要哲學與實踐方法。

推播 Docker 映像檔至 Docker Hub

  1. 登入 Docker Hub:使用 docker login -u docker-使用者名稱 命令,並輸入帳戶密碼進行驗證。
  2. 推播映像檔:驗證成功後,使用 docker push docker-registry-username/docker-image-name 將自訂映像檔推播至 Docker Hub。
    • 例如:docker push jane2020/Ubuntu_testapp1
  3. 驗證結果:推播成功後,映像檔將顯示在 Docker Hub 帳戶的儀錶板中。
  4. 提取映像檔:在其他電腦上使用 docker pull jane2020/Ubuntu_testapp1 命令即可下載該映像檔。

Docker 指令詳解(版本 18)

以下是 Docker 的主要指令及其功能:

  • attach:將本地標準輸入、輸出及錯誤串流附加至執行中的容器。
  • build:從 Dockerfile 建立映像檔。
  • commit:根據容器的變更建立新映像檔。

程式碼範例:

docker commit -m "Update Ubuntu image" my_container jane2020/ubuntu_updated

內容解密:

  1. docker commit:此指令用於根據現有容器的變更建立新的 Docker 映像檔。
  2. -m "Update Ubuntu image":為新映像檔新增描述訊息,方便日後管理與識別。
  3. my_container:指定要提交變更的容器名稱或 ID。
  4. jane2020/ubuntu_updated:定義新映像檔的名稱及標籤,用於推播至 Docker Hub 或本地儲存。
  • cp:在容器與本地檔案系統間複製檔案或資料夾。
  • create:建立新容器。
  • diff:檢查容器檔案系統中檔案或目錄的變更。
  • events:從伺服器取得即時事件。
  • exec:在執行中的容器內執行命令。

程式碼範例:

docker exec -it my_container /bin/bash

內容解密:

  1. docker exec:此指令允許在執行中的容器內執行特定命令。
  2. -it:選項引數,其中 -i 表示互動模式,-t 分配一個虛擬終端機。
  3. my_container:指定要執行命令的容器名稱或 ID。
  4. /bin/bash:在容器內啟動 Bash 終端機,方便進行互動式操作。
  • export:將容器的檔案系統匯出為 tar 壓縮檔。
  • history:顯示映像檔的歷史紀錄。
  • images:列出本地的映像檔清單。
  • import:從 tar 壓縮檔匯入內容以建立檔案系統映像檔。
  • info:顯示 Docker 系統的整體資訊。

程式碼範例:

docker info

內容解密:

  1. docker info:此指令提供 Docker 系統的詳細資訊,包括版本、容器數量、儲存驅動程式等關鍵資料。
  2. 該指令可用於快速診斷 Docker 環境組態及執行狀態。
  • inspect:傳回 Docker 物件的詳細資訊。
  • kill:終止一個或多個執行中的容器。

程式碼範例:

docker kill my_container

內容解密:

  1. docker kill:此指令用於強制終止一個或多個執行中的容器。
  2. my_container:指定要終止的容器名稱或 ID。
  • load:從 tar 壓縮檔或標準輸入載入映像檔。
  • login/logout:登入或登出 Docker 登入服務。
  • logs:檢索特定容器的日誌記錄。

程式碼範例:

docker logs -f my_container

內容解密:

  1. docker logs:此指令用於取得容器的日誌輸出,幫助除錯應用程式執行狀態。
  2. -f:持續追蹤日誌輸出,類別似於 tail -f 命令的功能。
  • pause/unpause:暫停或還原容器內的程式。
  • port:列出容器的連線埠對映。
  • ps:列出系統上的容器清單。

程式碼範例:

docker ps -a

內容解密:

  1. docker ps:此指令用於列出當前系統上的容器狀態,包括執行中和已停止的容器。
  2. -a:顯示所有容器,包括未執行者。
  • pull/push:從登入服務提取或推播映像檔。
  • rename:重新命名容器。
  • restart:重新啟動一個或多個容器。

程式碼範例:

docker restart my_container

內容解密:

  1. docker restart:此指令用於重新啟動一個或多個已停止或正在執行的容器。
  2. my_container:指定要重新啟動的容器名稱或 ID。
  • rm/rmi:移除一個或多個容器或映像檔。

程式碼範例:

docker rmi jane2020/ubuntu_updated

內容解密:

  1. docker rmi:此指令用於刪除指定的 Docker 映像檔,釋放儲存空間。
  2. jane2020/ubuntu_updated:指定要刪除的映像檔名稱及標籤。
  • run:在新容器中執行命令。

程式碼範例:

docker run -d --name my_new_container jane2020/ubuntu_updated

內容解密:

  1. docker run:此指令用於在新容器中執行指定的映像檔,並可附加各種執行引數。
  2. -d:以分離模式執行容器(後台執行)。
  3. --name my_new_container:為新容器指定名稱,方便管理。
  • save:將一個或多個映像檔儲存為 tar 壓縮檔(預設輸出至標準輸出)。
  • search:在 Docker Hub 中搜尋映像檔。

程式碼範例:

docker search ubuntu

內容解密:

  1. docker search:此指令用於在 Docker Hub 中搜尋公開的映像檔資源。
  2. ubuntu:搜尋關鍵字,此處為查詢與 Ubuntu 相關的映像檔。
  • start/stop:啟動或停止一個或多個容器。

程式碼範例:

docker stop my_container && docker start my_container

內容解密:

  1. docker stopdocker start:這兩個指令分別用於停止和啟動指定的容器,用於維護和資源管理。

系統安全管理

核心安全哲學

  1. 最低許可權原則(Least Privilege)

    • 只授予使用者完成工作所需的最低許可權,避免濫用管理許可權。
  2. 深度防禦(Defense in Depth)

    • 建立多層次的安全防護,例如周邊防火牆、主機端防火牆以及資料加密等措施。
  3. 持續更新與適應(Be Persistent)

    • 不斷更新防禦策略,以對抗不斷演變的攻擊手法。
  4. 縮減攻擊面(Reduce Attack Surface)

    • 關閉不必要的服務、變更預設密碼和帳戶、正確組態防火牆規則等,以減少潛在的安全風險。

圖表說明

以下 Plantuml 圖表展示了 Docker 基本操作流程:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 伺服器安全強化與Docker容器化實踐

package "Docker 架構" {
    actor "開發者" as dev

    package "Docker Engine" {
        component [Docker Daemon] as daemon
        component [Docker CLI] as cli
        component [REST API] as api
    }

    package "容器運行時" {
        component [containerd] as containerd
        component [runc] as runc
    }

    package "儲存" {
        database [Images] as images
        database [Volumes] as volumes
        database [Networks] as networks
    }

    cloud "Registry" as registry
}

dev --> cli : 命令操作
cli --> api : API 呼叫
api --> daemon : 處理請求
daemon --> containerd : 容器管理
containerd --> runc : 執行容器
daemon --> images : 映像檔管理
daemon --> registry : 拉取/推送
daemon --> volumes : 資料持久化
daemon --> networks : 網路配置

@enduml

此圖示說明瞭從 Dockerfile 建置到最終佈署的完整流程。