如果你今天拿到一台全新的實體主機(或 VM),希望在「一天之內」把它從 裸機 建到可對外提供 Web 服務,而且還要兼顧 安全性、備份、維運方便,這篇就是完整藍圖。
文章會用「一日上線流程」的角度,把你常見會做到的事情串成一條線: 從發行版選擇、磁碟規劃、網路與 SSH 基線安全、帳號與權限、systemd 管理、 防火牆與 Fail2Ban,到最後上線前的 checklist。 你可以把這篇當成:每台 Linux 新主機上線前的 SOP。
一、上線前規劃:不要還沒裝就踩雷
1. 先釐清這台機器要做什麼
- 用途:Web 服務?API?資料庫?CI/CD?檔案伺服器?
- 預期負載:同時連線數、 QPS、是否有大量 I/O(LOG、DB)。
- 存取來源:只有內網?要對外?是否需 VPN?
- 壽命與擴充:短期 PoC 還是長期正式環境?是否要支援擴充磁碟 / 加節點?
這些決定會影響你後面要不要用 RAID / ZFS、要不要用 Proxy、要不要做 HA。
2. 發行版與安裝方式選擇
常見伺服器發行版:
- Debian / Ubuntu Server:套件新、文件多,適合 Web / DevOps 場景。
- Rocky / Alma / RHEL 系列:企業環境常用,穩定、生命周期長。
- openSUSE / SLES:有 Yast 管理工具,偏向某些企業導入。
安裝方式:
- 實體機:用 USB / IPMI Virtual Media 開機安裝。
- 虛擬機:在 Proxmox / VMware / Hyper-V 建立 VM,掛載 ISO 安裝。
- Cloud:多數雲平台直接提供 image,省略安裝步驟,但安全基線仍要自己做。
3. 磁碟與檔案系統規劃
建議先想好:
- 系統區 / 資料區分開:/ 與 /data、/var/lib 之類分開,避免某個目錄爆滿拖垮整機。
- LVM 或 ZFS:之後要調整容量、做 snapshot,這兩個很好用。
- RAID:重要服務至少考慮 RAID1/RAID10,以硬體 RAID 控制卡或 ZFS/MD RAID 實現。
# 例:使用 lsblk 查看分割結果
lsblk -f
# 例:查看目前檔案系統使用量
df -h
二、安裝作業系統與基本環境設定
1. 安裝過程中的建議選項
- Minimal / Server 安裝:不需要 GUI,減少攻擊面。
- 啟用 SSH Server:安裝時勾選 openssh-server 或類似選項。
- 分割 / 檔案系統:根據前一節規劃使用 LVM / ZFS / ext4 / xfs。
2. 安裝完第一件事:更新與工具
# Debian / Ubuntu
sudo apt update && sudo apt -y upgrade
sudo apt install -y vim htop curl wget git net-tools
# RHEL / Rocky / Alma
sudo dnf update -y
sudo dnf install -y vim htop curl wget git net-tools
3. 設定主機名稱、時區與 NTP
# 設定主機名稱
sudo hostnamectl set-hostname web01-prod
# 查看目前設定
hostnamectl
# 設定時區(例:台北)
sudo timedatectl set-timezone Asia/Taipei
# 啟用 NTP 同步
sudo timedatectl set-ntp true
timedatectl status
統一時區與時間,對日後看 log、排查問題非常重要。
三、網路與 SSH 基線安全
1. 設定靜態 IP、Gateway 與 DNS
以 Ubuntu 20.04+ Netplan 為例:
sudo vim /etc/netplan/01-netcfg.yaml
network:
version: 2
renderer: networkd
ethernets:
eno1:
dhcp4: no
addresses:
- 192.168.10.50/24
gateway4: 192.168.10.1
nameservers:
addresses: [8.8.8.8, 1.1.1.1]
# 套用設定
sudo netplan apply
2. SSH 安全設定:關閉 root 密碼登入、啟用金鑰
- 先建立一般管理帳號(下一節會詳細介紹)。
- 在自己電腦產生金鑰:
ssh-keygen -t ed25519 - 上傳金鑰到伺服器:
ssh-copy-id user@server
# 編輯 SSH 設定檔
sudo vim /etc/ssh/sshd_config
# 建議至少調整以下幾項
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
X11Forwarding no
AllowUsers youradminuser
# 套用設定
sudo systemctl reload sshd
在 確認金鑰登入沒有問題之前,先不要關閉 PasswordAuthentication,避免鎖在門外。
四、帳號、群組與權限 / ACL 管理
1. 建立管理帳號與 sudo 權限
# 建立帳號並建立家目錄
sudo useradd -m -s /bin/bash admin
# 設定密碼(之後可關閉密碼登入,只保留金鑰)
sudo passwd admin
# 加入 sudo 群組(Ubuntu)
sudo usermod -aG sudo admin
# RHEL / Rocky 可能是 wheel 群組
sudo usermod -aG wheel admin
2. 基本檔案權限
# 查看檔案權限
ls -l
# 修改擁有者
sudo chown user:group filename
# 修改權限
sudo chmod 640 filename
sudo chmod 750 directory
3. ACL 進階權限控制
# 設定額外使用者的 ACL 權限
sudo setfacl -m u:devuser:rwx /srv/app
# 查看 ACL
getfacl /srv/app
ACL 很適合「目錄主要由某群組管理,但又要給特定帳號額外讀寫」的情境。
五、systemd:服務與排程的核心
1. 常用 systemctl 指令
# 查看服務狀態
sudo systemctl status nginx
# 啟動 / 停止 / 重新啟動
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
# 設定開機自動啟動 / 取消
sudo systemctl enable nginx
sudo systemctl disable nginx
# 查看系統開機耗時
systemd-analyze blame
2. 建立自訂服務單元檔(以簡單 Web App 為例)
sudo vim /etc/systemd/system/myapp.service
[Unit]
Description=My Example Web Application
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/srv/myapp
ExecStart=/usr/bin/python3 app.py
Restart=on-failure
[Install]
WantedBy=multi-user.target
# 套用並啟用
sudo systemctl daemon-reload
sudo systemctl enable --now myapp.service
3. 使用 systemd timer 取代 crontab
# 建立備份腳本 service
sudo vim /etc/systemd/system/backup.service
[Unit]
Description=Daily backup job
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/daily-backup.sh
# timer 設定
sudo vim /etc/systemd/system/backup.timer
[Unit]
Description=Run backup.service daily at 02:00
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
# 啟用
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
使用 timer 好處是:有 log、可以用 systemctl status 看執行紀錄,維運更一致。
六、日誌管理:journalctl 與 logrotate
1. journalctl 快速查看系統 log
# 最近啟動紀錄
journalctl -b
# 追蹤某服務 log
journalctl -u nginx -f
# 限定時間範圍
journalctl --since "2025-11-15 00:00" --until "2025-11-15 23:59"
2. logrotate 控制 log 成長
# Nginx 預設會有 logrotate 設定
cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
endscript
}
對自訂應用程式,也可以寫一個 logrotate 檔案,避免 log 把磁碟吃滿。
七、防火牆與入侵防護(iptables / nftables / Fail2Ban)
1. 選擇防火牆前端工具
- ufw(Ubuntu 常見):簡單好記。
- firewalld(RHEL 系列):zone 觀念,整合性佳。
- 直接用 iptables / nftables:較彈性,但規則要自己管理。
# ufw 例子:只開 22、80、443
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
2. Fail2Ban 防暴力破解
# 安裝
sudo apt install -y fail2ban
# 建立 local 設定
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vim /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
findtime = 600
bantime = 3600
# 啟用
sudo systemctl enable --now fail2ban
fail2ban-client status sshd
Fail2Ban 可以針對 Nginx、Postfix 等服務建立其他 jail,整體安全性會提升很多。
八、對外服務上線:以 Nginx 反向代理 + HTTPS 為例
1. 安裝 Nginx
# Debian / Ubuntu
sudo apt install -y nginx
# RHEL / Rocky / Alma
sudo dnf install -y nginx
sudo systemctl enable --now nginx
2. 建立虛擬主機與反向代理
sudo vim /etc/nginx/sites-available/myapp.conf
server {
listen 80;
server_name example.com;
access_log /var/log/nginx/myapp_access.log;
error_log /var/log/nginx/myapp_error.log;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 啟用站台(Debian / Ubuntu)
sudo ln -s /etc/nginx/sites-available/myapp.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
3. 使用 Let's Encrypt 取得免費憑證
# 安裝 certbot 與 Nginx 外掛(依發行版調整)
sudo apt install -y certbot python3-certbot-nginx
# 自動申請與設定
sudo certbot --nginx -d example.com
# 檢查排程
systemctl status certbot.timer
完成後,你的服務就已經透過 HTTPS 對外,搭配前面防火牆與 Fail2Ban,安全性已經有基本高度。
九、Proxy 與系統更新策略(選配)
在某些企業環境,外網必須透過 Proxy(如 Squid)才能更新套件或對外連線。
- 在 Proxy Server 上限制可用目的地,只允許系統更新的官方站點。
- 在應用伺服器上設定
HTTP_PROXY/HTTPS_PROXY環境變數或 apt/dnf proxy 設定。 - 搭配 log 分析工具(如 GoAccess)觀察流量。
如果你有自己架設的 Proxy 教學文,可以在這裡做內部連結,形成「安全上線完整路徑」。
十、備份與還原演練:沒有備份就等於沒上線
1. 要備份什麼?
- 系統設定:/etc、systemd service、Nginx config、Fail2Ban、防火牆規則。
- 應用程式與資料:/srv、/var/www、資料庫。
- 帳號與權限:/home、ACL 設定。
2. 簡單檔案備份(rsync 範例)
# 備份 /etc 到備援主機
rsync -avz /etc backup@backup-server:/backup/web01/etc/
# 備份 web 目錄
rsync -avz /var/www/ backup@backup-server:/backup/web01/www/
3. Snapshot / 映像檔備份
- 如果在 Proxmox 上,可以用 快照 + 備份 的方式保護整台 VM。
- 使用 ZFS 時,考慮
zfs snapshot+zfs send/receive做進階備援。
4. 一定要做還原演練
備份沒有經過還原測試,只能算是「安慰自己」。至少準備:
- 在測試環境用備份資料重新啟動一套服務。
- 記錄完整步驟,寫成 SOP 或 Runbook。
十一、正式上線前的 20 項檢查清單
- 主機名稱與時區已正確設定,
timedatectl顯示 NTP 正常。 - 系統已完整更新(無重大安全更新未裝)。
- 帳號 / 群組規劃完成,沒有不必要的預設帳號。
- 已關閉 root 直接 SSH 登入。
- 管理者帳號均使用 SSH 金鑰登入。
- SSH 設定中關閉未使用功能(X11Forwarding、密碼登入等)。
- 防火牆已啟用,僅開必要 Port(22、80、443…)。
- Fail2Ban 或類似機制已啟用並確認會封鎖測試 IP。
- Nginx / Web Server config 已通過
nginx -t或等效檢查。 - HTTPS 憑證有效,瀏覽器無安全警告。
- 系統服務皆由 systemd 管理,有設定 Restart 策略。
- 所有自訂 service / timer 已
enable並在重開機後測試正常。 - logrotate 已針對大量 log 的服務設好輪替。
- 磁碟使用量在安全範圍內(df -h),沒有單一分割占用超過 80%。
- 重要設定檔與資料已備份到「另一台機器」或遠端存放。
- 備份腳本至少成功執行一次,並手動驗證備份內容。
- 已用壓力測試 / 負載測試工具簡單打過(如 ab、wrk),觀察 CPU / RAM / I/O 行為。
- 監控 / 告警已掛上(Zabbix、Prometheus、簡易 shell 檢查也好)。
- 有記錄文件:包含 IP、帳號、Port、服務版本、備份位置。
- 有預備回滾方案:包含舊版 VM / 映像檔、暫停上線的 SOP。
十二、延伸閱讀與進階方向
完成這篇藍圖中的步驟,你已經具備一台「可交代」的 Linux 伺服器。接下來可以深入:
- 虛擬化與叢集:使用 Proxmox / KVM 打造多節點架構與 HA。
- 自動化與 IaC:導入 Ansible / Terraform,把這篇的步驟變成程式碼。
- 進階安全:SELinux / AppArmor、端點防護、WAF、Zero Trust 概念。
- 觀測性:Prometheus + Grafana、ELK / OpenSearch 建立 log 與 metric 平台。
如果你準備讓這套流程變成團隊標準,可以把本文改寫成公司內部的 「Linux 新主機上線 SOP」,再搭配自動化工具,讓每一台新伺服器都能在一天內 穩定、安全地上線。
沒有留言: