通常伺服器為了求穩定,不會隨便進行安全性之外的系統更新。不過就算只是更新安全性相關的套件,也有可能會讓伺服器出問題,為了保險起見,很多人會選擇完全關閉Ubuntu Server的自動更新,等到管理員在操作伺服器,甚至是在機器旁邊的時候才會進行更新維護。那麼Ubuntu Server究竟是開啟自動更新比較好,還是關閉自動更新比較好?



要不要讓伺服器自動更新,其實沒有一定的答案,得看該伺服器的運用場合。一般會認為開啟自動更新,可以享有相對即時的安全性更新,進而提升系統的安全性;而關閉所有更新,可以避免運行在伺服器上的程式因為系統套件版本發生變化而出現不相容的問題,進而提升系統的穩定性。

這篇文章將會介紹Ubuntu Server開啟與關閉自動更新的方式,以及手動使用指令更新安全性相關套件的方式。

Ubuntu Server的自動更新

Ubuntu Server的自動更新仰賴其使用的APT套件管理工具,我們可以藉由設定APT的設定檔,來實現Ubuntu的自動更新功能。APT設定檔的目錄為/etc/apt/apt.conf.d,設定檔的名稱必須以兩位數的十進位數值開頭,表示設定檔的載入順序,也就是說,後面讀取的設定檔,有可能會覆蓋掉前面讀取過的設定檔的設定。

與自動更新有關的設定項目主要有以下四個:

APT::Periodic::Update-Package-Lists

指定自動更新套件庫清單(apt update)的週期,單位是天。如果將這個項目設為0,則表示不自動啟用這個功能。

APT::Periodic::Download-Upgradeable-Packages

指定自動把可更新的套件下載下來(apt upgrade -d)的週期,單位是天。如果將這個項目設為0,則表示不自動啟用這個功能。

APT::Periodic::AutocleanInterval

指定自動把目前已經不可下載,但是先前已經被下載下來的套件清除(apt autoclean)的週期,單位是天。如果將這個項目設為0,則表示不自動啟用這個功能。

APT::Periodic::Unattended-Upgrade

與套件unattended-upgrades互相搭配使用。可以指定要自動下載並安裝套件(類似apt upgrade)的週期,單位是天。Ubuntu Server通常會內建unattended-upgrades套件,如果沒有的話,可以使用以下指令來安裝:

sudo apt install unattended-upgrades

ubuntu-server-auto-upgrade

有了unattended-upgrades套件並啟用APT::Periodic::Unattended-Upgrade後,就可以在APT設定檔內設定Unattended-Upgrade::Allowed-Origins區塊,來指定自動更新要只安裝哪些類型的套件。

預設的設定值如下:

Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}";             // 發行版的預設軟體源(通常不會有變化)
    "${distro_id}:${distro_codename}-security";    // 安全性更新
    "${distro_id}ESM:${distro_codename}";          // 針對過期的LTS版提供的付費延展安全性更新
//  "${distro_id}:${distro_codename}-updates";     // 官方建議的軟體更新(功能更新、Bug修復等)
//  "${distro_id}:${distro_codename}-proposed";    // 尚未官方建議的軟體更新
//  "${distro_id}:${distro_codename}-backports";   // 針對舊版Ubuntu提供的新軟體更新
};

在安裝unattended-upgrades套件後,/etc/apt/apt.conf.d目錄便會多出一個50unattended-upgrades設定檔,裡頭就是Unattended-Upgrade::Allowed-Origins區塊的設定。預設會啟用「發行版的預設軟體源」和「安全性更新」(含ESM)。

使用unattended-upgrades套件來開啟或關閉自動更新

安裝完unattended-upgrades套件後,可以執行以下指令,來設定自動更新的開啟或關閉:

sudo dpkg-reconfigure -plow unattended-upgrades

ubuntu-server-auto-upgrade

選擇Yes,可開啟自動更新,包含開啟自動更新套件庫清單的功能。選擇No,可關閉自動更新,包含關閉自動更新套件庫清單的功能。

ubuntu-server-auto-upgrade

這個動作會在/etc/apt/apt.conf.d目錄中產生一個20auto-upgrades檔案,並將APT::Periodic::Update-Package-ListsAPT::Periodic::Unattended-Upgrade都預設為1(天)。當然,如果要自訂自動更新的週期,可以去編輯這個檔案。

ubuntu-server-auto-upgrade

不過在手動編輯完這個檔案之後,若再次使用以下指令,來設定自動更新的開啟或關閉:

sudo dpkg-reconfigure -plow unattended-upgrades

可能會出現以下畫面,要求使用者選擇要不要保留原來的設定。(之所以說「可能」,是因為不是每個狀況都會出現以下畫面,像是如果原本設啟用,後來卻手動把設定檔中的天數都改為0,然後又用指令再設啟用的話,就什麼事都不會發生,天數會依然是0)

ubuntu-server-auto-upgrade

/etc/apt/apt.conf.d目錄中可能會有個Ubuntu預設的(非來自unattended-upgrades套件)10periodic設定檔,在這個設定檔中預設會有APT::Periodic::Update-Package-ListsDownload-Upgradeable-PackagesAPT::Periodic::AutocleanInterval這三個設定項目。由於unattended-upgrades套件的20auto-upgrades檔案並未覆蓋掉Download-Upgradeable-PackagesAPT::Periodic::AutocleanInterval這兩個設定項目,因此有需要修改這兩個設定項目的話還是得編輯10periodic設定檔。

Ubuntu Server的手動更新

以下指令,可以用來更新套件庫:

sudo apt update

以下指令,可以用來更新所有套件:

sudo apt upgrade

以下指令,可以用來更新包含系統相關的所有套件(不建議在已經上線的伺服器上使用):

sudo apt full-upgrade

以下指令,可以列出所有目前可更新的套件:

sudo apt upgrade --just-print

以下指令,可以列出所有目前可更新的安全性套件:

sudo apt upgrade --just-print | awk 'tolower($4) ~ /.*security.*/ || tolower($5) ~ /.*security.*/ {print $2}' | sort | uniq

結合以上指令和apt install,以下指令,可以只更新安全性套件:

sudo apt install --only-upgrade $(sudo apt upgrade --just-print | awk 'tolower($4) ~ /.*security.*/ || tolower($5) ~ /.*security.*/ {print $2}' | sort | uniq)

apt install加上--only-upgrade參數可以避免直接安裝到新套件。

ubuntu-server-auto-upgrade