熱門分類
載入中…
目錄0%

🐧 Linux 安裝到上線實戰藍圖:從裸機到安全上線的一日流程

    如果你今天拿到一台全新的實體主機(或 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 密碼登入、啟用金鑰

    1. 先建立一般管理帳號(下一節會詳細介紹)。
    2. 在自己電腦產生金鑰:ssh-keygen -t ed25519
    3. 上傳金鑰到伺服器: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 項檢查清單

    1. 主機名稱與時區已正確設定,timedatectl 顯示 NTP 正常。
    2. 系統已完整更新(無重大安全更新未裝)。
    3. 帳號 / 群組規劃完成,沒有不必要的預設帳號。
    4. 已關閉 root 直接 SSH 登入。
    5. 管理者帳號均使用 SSH 金鑰登入。
    6. SSH 設定中關閉未使用功能(X11Forwarding、密碼登入等)。
    7. 防火牆已啟用,僅開必要 Port(22、80、443…)。
    8. Fail2Ban 或類似機制已啟用並確認會封鎖測試 IP。
    9. Nginx / Web Server config 已通過 nginx -t 或等效檢查。
    10. HTTPS 憑證有效,瀏覽器無安全警告。
    11. 系統服務皆由 systemd 管理,有設定 Restart 策略。
    12. 所有自訂 service / timer 已 enable 並在重開機後測試正常。
    13. logrotate 已針對大量 log 的服務設好輪替。
    14. 磁碟使用量在安全範圍內(df -h),沒有單一分割占用超過 80%。
    15. 重要設定檔與資料已備份到「另一台機器」或遠端存放。
    16. 備份腳本至少成功執行一次,並手動驗證備份內容。
    17. 已用壓力測試 / 負載測試工具簡單打過(如 ab、wrk),觀察 CPU / RAM / I/O 行為。
    18. 監控 / 告警已掛上(Zabbix、Prometheus、簡易 shell 檢查也好)。
    19. 有記錄文件:包含 IP、帳號、Port、服務版本、備份位置。
    20. 有預備回滾方案:包含舊版 VM / 映像檔、暫停上線的 SOP。

    十二、延伸閱讀與進階方向

    完成這篇藍圖中的步驟,你已經具備一台「可交代」的 Linux 伺服器。接下來可以深入:

    • 虛擬化與叢集:使用 Proxmox / KVM 打造多節點架構與 HA。
    • 自動化與 IaC:導入 Ansible / Terraform,把這篇的步驟變成程式碼。
    • 進階安全:SELinux / AppArmor、端點防護、WAF、Zero Trust 概念。
    • 觀測性:Prometheus + Grafana、ELK / OpenSearch 建立 log 與 metric 平台。

    如果你準備讓這套流程變成團隊標準,可以把本文改寫成公司內部的 「Linux 新主機上線 SOP」,再搭配自動化工具,讓每一台新伺服器都能在一天內 穩定、安全地上線

    🔗 分享這篇 LINE Facebook X

    沒有留言:

    字級