[教學][Ubuntu 架站] 在 Ubuntu 22.04 上安裝 phpMyAdmin(Nginx)

前言

雖然很多使用者需要像 MySQL 這樣的資料庫管理系統的功能,但他們可能不太習慣僅透過 MySQL 命令行與系統互動。

phpMyAdmin 的存在是為了讓使用者透過網頁界面與 MySQL 進行互動。在本指南中,我們將討論如何安裝和保護 phpMyAdmin,以便您可以安全地在 Ubuntu 22.04 系統上使用它來管理您的資料庫。


預先準備

在使用 phpMyAdmin 這類軟體時,有一些重要的安全注意事項,因為它:

  • 直接與您的 MySQL 安裝進行通信。
  • 使用 MySQL 憑證進行身份驗證。
  • 執行並返回任意 SQL 查詢的結果。

基於這些理由,而且因為phpMyAdmin是一個廣泛部署的PHP應用程式,經常成為攻擊目標,所以您絕對不應該在遠端系統上使用純粹的HTTP連線來運行phpMyAdmin。


1. 安裝 phpMyAdmin

先從更新軟件包(Package )並在 Ubuntu 22.04 上安裝 phpMyAdmin 開始。下面我們有兩個由 && 分隔的命令。第一個命令將更新軟件包列表以確保可獲得 phpMyAdmin 的最新版本和依賴項。然後第二個命令將下載並安裝 phpMyAdmin。

$ sudo apt update && sudo apt install phpmyadmin

在安裝過程中,您將被提示選擇要配置的網頁伺服器(可以選擇 Apache 或 Lighttpd)。phpMyAdmin 可以在安裝時自動進行一些配置更改,以確保與這兩種網頁伺服器正確配合使用。但是,由於您使用 Nginx 作為網頁伺服器,您不應該選擇這兩個選項。相反,按 TAB 鍵來突顯<Confirm>,然後按 ENTER 鍵繼續安裝過程。

接下來,您會被問及是否要使用 dbconfig-common 來配置應用程式的資料庫。選擇<Yes>。這將設置內部資料庫以及 phpMyAdmin 的管理使用者。您將被要求為 phpmyadmin MySQL 使用者定義一個新的密碼,但因為這不是您需要記住的密碼,您可以將其留空,讓 phpMyAdmin 隨機生成一個密碼。

假設您按照前置步驟 LEMP stack 教學的第 2 步安裝了 MySQL,您可能已經決定啟用密碼驗證插件。截至目前為止,啟用此組件將在 phpMyAdmin 安裝過程嘗試為 phpmyadmin 使用者設置密碼時觸發錯誤:

為了解決這個問題,選擇‘abort’選項以停止安裝過程。然後,打開您的 MySQL 命令行:

$ sudo mysql

或者,如果你為 root MySQL 使用者啟用了密碼驗證,運行以下命令,然後在提示時輸入您的密碼:

$ mysql -u root -p

在 MySQL 命令行處,執行以下命令以停用驗證密碼組件。請注意,這實際上不會卸載它,只是停止該組件在您的MySQL伺服器上加載:

mysql> UNINSTALL COMPONENT "file://component_validate_password";

接著,您可以關閉 MySQL 客戶端:

mysql> exit

然後再次嘗試安裝 phpmyadmin 套件,它應該能夠正常運作:

$ sudo apt install phpmyadmin

安裝完成 phpMyAdmin 後,您可以再次使用 sudo mysql 或 mysql -u root -p 打開 MySQL 命令行,然後運行以下命令重新啟用驗證密碼組件:

mysql> INSTALL COMPONENT "file://component_validate_password";

當 apt install 命令完成後,phpMyAdmin 將完全安裝好了。但是,為了讓 Nginx 網頁伺服器正確找到並提供 phpMyAdmin 檔案,您需要從安裝檔案到 Nginx 的文件根目錄之間創建一個符號連結。如果您遵循了前置的 LEMP stack 教學,您的 Nginx 安裝的文件根目錄位於/var/www/your_domain/。

$ sudo ln -s /usr/share/phpmyadmin /var/www/your_domain/html/phpmyadmin

範例
$ sudo ln -s /usr/share/phpmyadmin /var/www/test3.ui-code.com/html/phpmyadmin

你的 phpMyAdmin 安裝現在已經可以使用了。要訪問介面,請在你的網頁瀏覽器中前往你伺服器的網域名稱或公共IP地址,然後加上 /phpmyadmin:

https://server_domain_or_IP/phpmyadmin

範例
https://test3.ui-code.com/phpmyadmin

如前所提到的,phpMyAdmin 使用 MySQL 憑證進行身份驗證。這意味著要登入 phpMyAdmin,您需要使用通常用來透過命令列或 API 連接到資料庫的相同使用者名稱和密碼。

在這個階段,你的 phpMyAdmin 安裝已經完全運作正常。但是,通過安裝一個網頁介面,您已經將你的 MySQL 資料庫伺服器暴露給了外部世界。由於 phpMyAdmin 的普及,以及它可能提供對大量敏感數據的訪問,這樣的安裝常常成為攻擊的目標。在這個指南的後續部分,我們將介紹幾種不同的方法,可以讓你的 phpMyAdmin 安裝更加安全。


2. 修改 phpMyAdmin 的預設位置

保護你的 phpMyAdmin 安裝的一種方法是使它更難找到。機器人會掃描常見的路徑,比如 /phpmyadmin、/pma、/admin、/mysql 等類似的名稱。將介面的 URL 從 /phpmyadmin 更改為非標準的名稱,將使自動化腳本更難找到您的 phpMyAdmin 安裝並嘗試暴力攻擊。

在上一步中,你在 Nginx 的網頁文件根目錄中創建了一個符號連結,指向實際的 phpMyAdmin 應用程式文件所在的 /usr/share/phpmyadmin。你可以重新命名此符號連結以更改 phpMyAdmin 的介面 URL。

請前往 Nginx 文件根目錄:

$ cd /var/www/your_domain/html

範例
cd /var/www/test3.ui-code.com/html

然後執行以下的 ls 命令,以列出文件根目錄中的檔案,以更清楚了解你將進行的變更。此命令包括了 -l 選項,它告訴命令使用”長列表”格式。這將指示 ls 返回比通常更多的資訊:

$ ls -l

你的輸出將包含如下:

...

lrwxrwxrwx 1 root          root           21 Sep  7 08:46 phpmyadmin -> /usr/share/phpmyadmin

...

這一行表示你在這個目錄中有一個名為 phpmyadmin 的符號連結。你可以將這個連結名稱更改為任何你喜歡的名稱,這將相應地更改你訪問 phpMyAdmin 的 URL。這有助於將端點遠離執行常見端點名稱的機器人的視線。

選擇一個可以隱藏端點用途的名稱。本指南將端點命名為/uihidden,並在整個示例中使用此名稱,但你可以選擇另一個名稱。

使用 mv 命令重新命名這個符號連結:

$ sudo mv phpmyadmin uihidden

執行此命令後,再次執行 ls -l 命令,以確認符號連結已經被正確重新命名:

$ ls -l

這一次,輸出將顯示符號連結的清單已經被更新為它的新名稱:

...

lrwxrwxrwx 1 root          root           21 Sep  7 08:46 uihidden -> /usr/share/phpmyadmin

...

現在,當你前往之前用來訪問 phpMyAdmin 的 URL 時,您將收到一個 404 錯誤:

https://server_domain_or_IP/phpmyadmin

範例
https://test3.ui-code.com/phpmyadmin

通過隱藏 phpMyAdmin 在伺服器上的真實位置,您正在保護其介面免受自動掃描和手動暴力攻擊的威脅。


3. 禁用根用戶登錄

在 MySQL 以及常規的 Linux 系統中,根帳戶是一個特殊的管理帳戶,具有對系統的無限制訪問權限。除了作為特權帳戶外,它還是一個已知的登錄名稱,這使得它成為暴力攻擊的明顯目標。為了最小化這些風險,這一步將概述如何配置phpMyAdmin以拒絕來自根MySQL使用者的任何登錄嘗試。這樣,即使您提供了根使用者的有效憑證,您仍然會收到”拒絕訪問!”的錯誤,並且無法登錄。

因為你選擇了 dbconfig-common 來配置和存儲 phpMyAdmin 的設置,所以應用程式的默認配置目前存儲在你的 MySQL 數據庫中。你需要在 phpMyAdmin 的配置目錄中創建一個新的 config.inc.php 文件,以定義你的自定義設置。儘管 phpMyAdmin 的 PHP 腳本位於 /usr/share/phpmyadmin 目錄中,但應用程式的配置文件位於 /etc/phpmyadmin 中。

在 /etc/phpmyadmin/conf.d 目錄中創建一個新的自定義設置文件,並將其命名為 pma_secure.php:

$ sudo nano /etc/phpmyadmin/conf.d/pma_secure.php

接著,將以下內容添加到新文件中:

<?php

# PhpMyAdmin Settings
# This should be set to a random string of at least 32 chars
$cfg['blowfish_secret'] = 'CHANGE_THIS_TO_A_STRING_OF_32_RANDOM_CHARACTERS';

$i=0;
$i++;

$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
$cfg['Servers'][$i]['AllowRoot'] = false;

?>

通過包含 AllowNoPasswordAllowRoot 指令並將它們都設置為 false,這個配置文件禁用了無密碼登錄和 root MySQL 使用者登錄。

請注意,auth_type 設置配置 phpMyAdmin 使用 cookie 身份驗證方法。phpMyAdmin 默認使用 cookie 身份驗證方法,它允許你使用 cookie 的幫助以任何有效的 MySQL 使用者身份登錄到 phpMyAdmin。使用此方法,MySQL 使用者密碼將儲存並加密為 Advanced Encryption Standard(AES)算法在一個臨時的 cookie 中。

從歷史上看,phpMyAdmin 使用的是 Blowfish 算法來完成這個目的。然而,它仍然尋找一個名為 blowfish_secret 的指令,它指向由 AES 算法內部使用的口令。這不是您需要記住的密碼,所以任何包含至少 32 個隨機字符的字符串都可以在這裡使用。

將 ‘CHANGE_THIS_TO_A_STRING_OF_32_RANDOM_CHARACTERS’ 這一行更新為一個包含至少32個字符的隨機字符串。

注意:如果您在此處輸入的口令少於32個字符長,則加密的cookie將不夠安全。然而,輸入超過32個字符的字符串不會造成任何損害。

要生成一個真正隨機的字符字符串,您可以使用 APT 安裝並使用 pwgen 程序:

$ sudo apt install pwgen

預設情況下,pwgen 會創建容易發音但安全性較低的密碼。不過,通過包含 -s 旗標,就像以下命令一樣,你可以創建一個完全隨機、難以記住的密碼。請注意這個命令的最後兩個參數:32,它決定了pwgen將生成的密碼字符串的長度;以及1,它告訴pwgen它應該生成多少個字符串:

$ pwgen -s 32 1

複製這個命令的輸出結果,然後將它添加到pma_secure.php文件中,替換 ‘CHANGE_THIS_TO_A_STRING_OF_32_RANDOM_CHARACTERS’ 。

編輯完成後,請保存並關閉文件。如果您使用的是 nano,可以按下 CTRL + X,然後按 Y 確認更改,再按 ENTER 返回到 bash 提示符。

更改將自動應用。如果您現在重新加載登錄頁面並嘗試以 root 身份登錄,您將收到” 存取遭拒!”的錯誤:

現在,已經禁止使用 root MySQL 使用者在你的 phpMyAdmin 安裝中進行登錄。這項安全措施將阻止暴力攻擊腳本嘗試猜測您伺服器上根數據庫使用者的密碼。此外,它將強制使用權限較低的 MySQL 帳戶來訪問 phpMyAdmin 的網頁介面,這本身就是一個重要的安全實踐。


4. 建立一個身份驗證閘道(Authentication Gateway)

將你的 phpMyAdmin 安裝隱藏在不尋常的位置可能會規避一些掃描網絡的自動機器人,但對於針對性攻擊是無效的。為了更好地保護一個有限訪問權限的網絡應用程式,通常更有效的方法是在攻擊者甚至無法到達應用程式之前停止他們。這樣,他們將無法使用通用的漏洞和暴力攻擊來猜測訪問憑證。

特別是對於 phpMyAdmin 這種情況,保持登錄介面的安全性更加重要。如果對外開放,您為攻擊者提供了一個猜測你數據庫憑證的暴力攻擊平台。

這一步將概述如何向你的 phpMyAdmin 安裝添加一個額外的身份驗證層,以增加 MySQL 數據庫的安全性。大多數網頁伺服器,包括 Nginx,在本地提供此功能。通過完成此步驟,嘗試訪問 phpMyAdmin 安裝的登錄畫面的任何人都必須首先通過輸入有效的用戶名和密碼來經過 HTTP 身份驗證提示。

為了設置這個,你首先需要創建一個密碼文件來存儲身份驗證憑證。Nginx 要求使用 crypt() 函數加密密碼。OpenSSL 套件,應該在你的 Ubuntu 伺服器上默認安裝,包括這個功能。

要創建一個加密密碼,輸入:

$ openssl passwd

你將被要求輸入並確認你希望使用的密碼。然後,該工具將顯示一個加密版本的密碼,類似於以下內容:

Password: 
Verifying - Password: 
$1$TyyNhJHg$..syFagsWfD6SGAfE3b0e.

複製這個值,因為你將需要將它包含在您即將創建的身份驗證文件中。

現在,創建一個身份驗證文件。根據本指南的目的,我們將稱此文件為 pma_pass,並將其放在 Nginx 配置目錄中:

$ sudo nano /etc/nginx/pma_pass

在這個文件中,指定您想使用的用戶名,然後加上冒號(:),然後是你從openssl passwd工具中獲得的密碼的加密版本。

在此示例中,用戶名稱為 uicode,但你可以選擇任何你喜歡的用戶名。這不需要是你的 Ubuntu 伺服器上現有用戶配置文件的名稱,也不需要是 MySQL 用戶的名稱。

在添加了你選擇的用戶名和你之前複製的加密密碼之後,文件將如下所示:

uicode:$1$TyyNhJHg$..syFagsWfD6SGAfE3b0e.

編輯完成後,請保存並關閉文件。

接下來,你需要修改 Nginx 配置文件。再次強調,本指南遵循先決條件 LEMP 教程中確立的慣例,因此以下示例中使用的配置文件是 /etc/nginx/sites-available/your_domain。請確保你使用與您目前的 phpMyAdmin 安裝所在的網絡位置相關的Nginx配置文件。

打開你首選的文本編輯器中的 Nginx 配置文件以開始操作:

sudo nano /etc/nginx/sites-available/your_domain

範例
sudo nano /etc/nginx/sites-available/test3.ui-code.com


找到伺服器區塊以及其中的位置 / 部分。您需要在位置 / 部分下方創建一個新的位置部分,以匹配伺服器上 phpMyAdmin 的當前路徑。

請回想,在本指南的第 2 步中,你通過重命名符號連結(在我們的示例中是uihidden)更改了 phpMyAdmin 位置的名稱。在這裡,您需要輸入您為此符號連結使用的名稱。你不需要包含完整的文件路徑,只需相對於 Nginx 文檔根目錄的符號連結名稱即可:

server {
        . . .

        location / {
                try_files $uri $uri/ =404;
        }

        location ^~ /uihidden {

        }

        . . .
}

在這個區塊內,設置兩個指令:auth_basic,它定義了將顯示在身份驗證提示上的消息,以及auth_basic_user_file,指向你剛創建的身份驗證文件。將這兩個指令都添加到新的位置部分中:

server {
        . . .
        location / {
                try_files $uri $uri/ =404;
        }

        location ^~ /uihidden {
                auth_basic "Admin Login";
                auth_basic_user_file /etc/nginx/pma_pass;
        }
        . . .
}

最後,請注意此區塊在新位置定義之前有一個 ^〜 選擇器。這是為了確保Nginx在匹配 PHP 文件的規則時不會繞過你的訪問規則,通常這些文件的定義是正則表達式,以捕獲所有 .php 文件。在 Nginx 配置文件中,正則表達式定義優先於標準位置定義。這意味著如果我們不在位置開頭使用 ^〜 選擇器,用戶仍然可以通過在瀏覽器中導航到 http://server_domain_or_ip/uihidden/index.php 來繞過身份驗證提示。

位置定義的開頭的 ^〜 選擇器告訴 Nginx 在找到此位置的匹配時忽略其他匹配。這意味著 /uihidden/ 內的任何子目錄或文件都將與此規則匹配。然而,由於使用 ^〜 選擇器的結果將跳過解析 PHP 文件的定義,因此我們需要在 /uihidden 定義內包含一個新的 PHP 位置區塊。這將確保此位置內的 PHP 文件被正確解析;否則它們將作為下載內容發送到瀏覽器。

在你剛添加的位置區塊內,添加以下突出顯示的行:

server {
        . . .

        location / {
                try_files $uri $uri/ =404;
        }

        location ^~ /uihidden/ {
                auth_basic "Admin Login";
                auth_basic_user_file /etc/nginx/pma_pass;

                location ~ \.php$ {
                        include snippets/fastcgi-php.conf;
                        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
                }
        }
    . . .
}

請記得將 uihidden 替換為實際可以找到 phpMyAdmin 的路徑。您還應該仔細檢查您的 PHP-FPM 套接字文件的位置,這將根據您當前安裝的 PHP 版本而變化。在本示例中,我們使用的是 php8.1-fpm.sock,這對於PHP 8.1是有效的,這個版本是通過默認的 APT 存儲庫在Ubuntu 22.04上安裝的。

完成後,保存並關閉文件。要檢查配置文件是否有效,執行以下命令:

$ sudo nginx -t

以下輸出表示配置文件的語法是有效的:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

要啟用新的身份驗證閘道,重新載入 Nginx:

$ sudo systemctl reload nginx

現在,當你在網頁瀏覽器中訪問 phpMyAdmin 的 URL 時,將會提示您輸入 pma_pass 文件中添加的用戶名和密碼:

https://server_domain_or_IP/your_hidden_link

範例
https://test3.ui-code.com/uihidden
http://35.229.234.157/uihidden

輸入你的憑證後,你將進入標準的 phpMyAdmin 登錄頁面。


結論

透過本教程,你在運行 Nginx 作為 We b伺服器的 Ubuntu 22.04 上安裝了 phpMyAdmin。你還學習了一些方法來保護 Ubuntu 上的 phpMyAdmin 安裝,例如停用根用戶登錄、建立額外的身份驗證層。

完成本教程後,你可以通過一個相當安全的 Web 界面來管理你的 MySQL 數據庫。這個用戶界面公開了大部分可通過 MySQL 命令行使用的功能。你可以瀏覽數據庫,執行查詢,以及創建新的數據集和結構。

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *