現代伺服器管理強調安全性和資源效率。本文介紹如何設定防火牆、啟用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
內容解密:
sudo ufw status:用於檢查目前的防火牆狀態,確認哪些埠是開放的。sudo ufw delete allow 'Apache':刪除允許Apache服務的舊規則。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伺服器通訊,並執行挑戰以驗證您對所請求憑證的網域控制權。
內容解密:
sudo certbot --apache:使用Certbot的Apache外掛來取得和安裝SSL憑證。-d example.com -d www.example.com:指定要為哪些網域取得憑證。
驗證Certbot自動續約功能
Let’s Encrypt憑證的有效期為90天,因此自動續約機制至關重要。Certbot已安裝了一個續約指令碼到/etc/cron.d,該指令碼每天執行兩次,並在必要時自動續約憑證。
測試續約過程:
sudo certbot renew --dry-run
內容解密:
sudo certbot renew --dry-run:測試憑證續約過程,而不實際變更任何憑證。
Docker容器化技術
Docker是一種管理在容器中執行的程式的技術。Docker容器在資源隔離的環境中執行應用程式,具有比虛擬機器更高的可移植性和資源效率。
Docker與虛擬機器的比較
- Docker基礎設施:只需要一份作業系統副本,所有容器分享宿主作業系統核心。
- 虛擬機器基礎設施:每個虛擬機器都需要一份完整的作業系統副本,消耗更多系統資源。
Docker技術透過容器實作了應用程式的快速擴充套件和高效資源利用。Docker容器的啟動速度遠快於虛擬機器,且佔用資源更少。
此圖示展示了Docker的基本架構,從宿主基礎設施到Docker容器的層級結構。
內容解密:
- Docker容器根據Docker映像建立,可以快速啟動和停止。
- Docker映像儲存在Docker Hub等登入檔中,方便共用和重用。
Docker 安裝與基礎操作
Docker 是一種流行的容器化技術,允許開發者將應用程式及其依賴封裝成一個可移植的容器。本文將介紹如何在 Ubuntu 系統上安裝 Docker,並進行基礎的操作和管理。
從官方 Docker 倉函式庫安裝 Docker
使用發行版內建的倉函式庫安裝 Docker 可能不是最新版本。若要取得最新版本的 Docker,需要將套件管理器指向官方倉函式庫。
更新套件管理器倉函式庫資訊:
sudo apt-get update確保 apt 套件管理器具備使用 HTTPS 下載的前提條件:
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common將官方 Docker 倉函式庫的 GPG 金鑰新增到 apt 套件管理器:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -將 Docker 倉函式庫新增到 apt 源:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"使用 Docker 套件更新 apt 套件資料函式庫:
sudo apt-get update確認即將安裝的 Docker 版本來自正確的倉函式庫:
apt-cache policy docker-ce你應該會看到安裝套件來自 Docker 倉函式庫的訊息。
安裝 Docker 服務:
sudo apt-get install docker-ce檢查 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
內容解密:
sudo apt-get update:更新本地端的套件列表,以確保安裝的是最新版本的套件。sudo apt-get install apt-transport-https ca-certificates curl software-properties-common:安裝必要的套件,以支援 HTTPS 下載和倉函式倉管理。curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -:下載並新增 Docker 官方的 GPG 金鑰,以驗證套件的真實性。sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable":新增 Docker 的官方倉函式庫到系統的源列表中。sudo apt-get update:再次更新套件列表,以包含剛才新增的 Docker 倉函式庫。apt-cache policy docker-ce:檢查即將安裝的 Docker 版本和來源。sudo apt-get install docker-ce:安裝 Docker 社群版。sudo systemctl status docker:檢查 Docker 服務的執行狀態。
使用和測試 Docker 服務
假設你已將使用者帳戶新增到 docker 安全群組中。
檢查 Docker 是否正常執行:
docker run hello-world顯示已下載到本地端的映像檔:
docker images搜尋 Docker Hub 上的映像檔:
docker search hello-world
程式碼解析:
docker run hello-world
docker images
docker search hello-world
內容解密:
docker run hello-world:執行一個名為hello-world的 Docker 容器,若本地端沒有該映像檔,則會自動從 Docker Hub 下載。docker images:列出本地端所有已下載的 Docker 映像檔。docker search hello-world:在 Docker Hub 上搜尋名為hello-world的映像檔。
管理 Docker 映像檔和容器
顯示正在執行的容器:
docker ps顯示所有容器(包括未執行):
docker ps -a啟動一個容器:
docker start d57e5d79b88d停止一個容器:
docker stop happy_villani刪除一個容器:
docker rm happy_villani
程式碼解析:
docker ps
docker ps -a
docker start d57e5d79b88d
docker stop happy_villani
docker rm happy_villani
內容解密:
docker ps:列出目前正在執行的容器。docker ps -a:列出所有容器,包括未執行的。docker start d57e5d79b88d:啟動一個指定的容器。docker stop happy_villani:停止一個指定的容器。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
內容解密:
docker commit:提交一個容器的更改,建立一個新的映像檔。-m "added apps":新增提交訊息,描述更改的內容。-a "jane":指定作者的名字。d57e5d79b88d:容器的 ID。jane2020/Ubuntu_testapp1:新的映像檔名稱,包含倉函式庫名稱和映像檔名稱。
Docker 映像檔推播至儲存函式庫與安全管理
在自訂 Docker 映像檔完成後,將其上傳至 Docker Hub 可讓其他系統使用或與他人分享。以下將介紹如何推播映像檔、Docker 指令詳解,以及系統安全管理的重要哲學與實踐方法。
推播 Docker 映像檔至 Docker Hub
- 登入 Docker Hub:使用
docker login -u docker-使用者名稱命令,並輸入帳戶密碼進行驗證。 - 推播映像檔:驗證成功後,使用
docker push docker-registry-username/docker-image-name將自訂映像檔推播至 Docker Hub。- 例如:
docker push jane2020/Ubuntu_testapp1
- 例如:
- 驗證結果:推播成功後,映像檔將顯示在 Docker Hub 帳戶的儀錶板中。
- 提取映像檔:在其他電腦上使用
docker pull jane2020/Ubuntu_testapp1命令即可下載該映像檔。
Docker 指令詳解(版本 18)
以下是 Docker 的主要指令及其功能:
attach:將本地標準輸入、輸出及錯誤串流附加至執行中的容器。build:從 Dockerfile 建立映像檔。commit:根據容器的變更建立新映像檔。
程式碼範例:
docker commit -m "Update Ubuntu image" my_container jane2020/ubuntu_updated
內容解密:
docker commit:此指令用於根據現有容器的變更建立新的 Docker 映像檔。-m "Update Ubuntu image":為新映像檔新增描述訊息,方便日後管理與識別。my_container:指定要提交變更的容器名稱或 ID。jane2020/ubuntu_updated:定義新映像檔的名稱及標籤,用於推播至 Docker Hub 或本地儲存。
cp:在容器與本地檔案系統間複製檔案或資料夾。create:建立新容器。diff:檢查容器檔案系統中檔案或目錄的變更。events:從伺服器取得即時事件。exec:在執行中的容器內執行命令。
程式碼範例:
docker exec -it my_container /bin/bash
內容解密:
docker exec:此指令允許在執行中的容器內執行特定命令。-it:選項引數,其中-i表示互動模式,-t分配一個虛擬終端機。my_container:指定要執行命令的容器名稱或 ID。/bin/bash:在容器內啟動 Bash 終端機,方便進行互動式操作。
export:將容器的檔案系統匯出為 tar 壓縮檔。history:顯示映像檔的歷史紀錄。images:列出本地的映像檔清單。import:從 tar 壓縮檔匯入內容以建立檔案系統映像檔。info:顯示 Docker 系統的整體資訊。
程式碼範例:
docker info
內容解密:
docker info:此指令提供 Docker 系統的詳細資訊,包括版本、容器數量、儲存驅動程式等關鍵資料。- 該指令可用於快速診斷 Docker 環境組態及執行狀態。
inspect:傳回 Docker 物件的詳細資訊。kill:終止一個或多個執行中的容器。
程式碼範例:
docker kill my_container
內容解密:
docker kill:此指令用於強制終止一個或多個執行中的容器。my_container:指定要終止的容器名稱或 ID。
load:從 tar 壓縮檔或標準輸入載入映像檔。login/logout:登入或登出 Docker 登入服務。logs:檢索特定容器的日誌記錄。
程式碼範例:
docker logs -f my_container
內容解密:
docker logs:此指令用於取得容器的日誌輸出,幫助除錯應用程式執行狀態。-f:持續追蹤日誌輸出,類別似於tail -f命令的功能。
pause/unpause:暫停或還原容器內的程式。port:列出容器的連線埠對映。ps:列出系統上的容器清單。
程式碼範例:
docker ps -a
內容解密:
docker ps:此指令用於列出當前系統上的容器狀態,包括執行中和已停止的容器。-a:顯示所有容器,包括未執行者。
pull/push:從登入服務提取或推播映像檔。rename:重新命名容器。restart:重新啟動一個或多個容器。
程式碼範例:
docker restart my_container
內容解密:
docker restart:此指令用於重新啟動一個或多個已停止或正在執行的容器。my_container:指定要重新啟動的容器名稱或 ID。
rm/rmi:移除一個或多個容器或映像檔。
程式碼範例:
docker rmi jane2020/ubuntu_updated
內容解密:
docker rmi:此指令用於刪除指定的 Docker 映像檔,釋放儲存空間。jane2020/ubuntu_updated:指定要刪除的映像檔名稱及標籤。
run:在新容器中執行命令。
程式碼範例:
docker run -d --name my_new_container jane2020/ubuntu_updated
內容解密:
docker run:此指令用於在新容器中執行指定的映像檔,並可附加各種執行引數。-d:以分離模式執行容器(後台執行)。--name my_new_container:為新容器指定名稱,方便管理。
save:將一個或多個映像檔儲存為 tar 壓縮檔(預設輸出至標準輸出)。search:在 Docker Hub 中搜尋映像檔。
程式碼範例:
docker search ubuntu
內容解密:
docker search:此指令用於在 Docker Hub 中搜尋公開的映像檔資源。ubuntu:搜尋關鍵字,此處為查詢與 Ubuntu 相關的映像檔。
start/stop:啟動或停止一個或多個容器。
程式碼範例:
docker stop my_container && docker start my_container
內容解密:
docker stop和docker start:這兩個指令分別用於停止和啟動指定的容器,用於維護和資源管理。
系統安全管理
核心安全哲學
最低許可權原則(Least Privilege)
- 只授予使用者完成工作所需的最低許可權,避免濫用管理許可權。
深度防禦(Defense in Depth)
- 建立多層次的安全防護,例如周邊防火牆、主機端防火牆以及資料加密等措施。
持續更新與適應(Be Persistent)
- 不斷更新防禦策略,以對抗不斷演變的攻擊手法。
縮減攻擊面(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 建置到最終佈署的完整流程。