如何在Debian 10上从Source安装phpMyAdmin

phpMyAdmin是一个允许用户通过Web界面与MySQL(或MariaDB)数据库交互的应用程序。本教程介绍在Debian 10服务器上安装和保护phpMyAdmin的过程。

介绍

虽然许多用户需要像MariaDB这样的数据库管理系统的功能,但他们可能不会仅仅从MariaDB提示中与系统进行交互。

创建了phpMyAdmin ,以便用户可以通过Web界面与MariaDB进行交互。 在本指南中,我们将讨论如何安装和保护phpMyAdmin,以便您可以安全地使用它来管理Debian 10系统上的数据库。

先决条件

在开始使用本指南之前,您需要具备以下条件:

注意: MariaDB是社区开发的MySQL分支,尽管这两个程序密切相关,但它们并不是完全可互换的。 虽然phpMyAdmin专门用于管理MySQL数据库并在各种对话框中引用MySQL,但请放心,您的MariaDB安装将与phpMyAdmin一起正常工作。

最后,使用像phpMyAdmin这样的软件时有一些重要的安全注意事项,因为它:

  • 直接与MariaDB安装进行通信
  • 使用MariaDB凭据处理身份验证
  • 执行并返回任意SQL查询的结果

由于这些原因,并且因为它是一个广泛部署的PHP应用程序,经常以攻击为目标,所以不应该通过普通的HTTP连接在远程系统上运行phpMyAdmin。

如果您没有配置SSL / TLS证书的现有域,则可以按照本指南使用Debian 10上的Let's Encrypt来保护Apache以设置一个。 这将要求您注册域名为服务器创建DNS记录 ,以及设置Apache虚拟主机

完成这些步骤后,您就可以开始使用本指南了。

在安装和配置phpMyAdmin之前, 官方文档建议您在服务器上安装一些PHP扩展,以启用某些功能并提高性能。

如果你遵循先决条件LAMP教程 ,那么这些模块中的一些将与php包一起安装。 但是,建议您也安装这些软件包:

  • php-mbstring :一个PHP扩展,用于管理非ASCII字符串并将字符串转换为不同的编码
  • php-zip :支持将.zip文件上传到phpMyAdmin的PHP模块
  • php-gd :另一个PHP模块,这个模块支持GD图形库

首先,如果您最近没有这样做,请更新服务器的软件包索引:

sudo apt update

然后使用apt下拉文件并将其安装在您的系统上:

sudo apt install php-mbstring php-zip php-gd

接下来,我们可以安装phpMyAdmin。 在撰写本文时,默认的Debian存储库不提供phpMyAdmin,因此您需要从phpMyAdmin站点将源代码下载到您的服务器。

为此,请导航至phpMyAdmin下载页面 ,向下滚动至包含最新稳定版本下载链接的表格,然后复制以tar.gz结尾的下载链接。 此链接指向称为tarball的归档文件,在解压缩后,将在您的系统上创建许多文件。 在撰写本文时,最新版本是4.9.0.1版。

注意:在此下载页面上,您会注意到有标记为all-languagesenglish下载链接。 all-languages链接将下载一个版本的phpMyAdmin,允许您选择72种可用语言中的一种,而english链接只允许您使用英语的phpMyAdmin。

本指南将使用all-languages包来说明如何安装phpMyAdmin,但如果您打算使用英语的phpMyAdmin,则可以安装english包。 请务必在以下命令中根据需要替换链接和文件名。

使用刚刚复制的下载链接替换以下wget命令中的链接,然后按ENTER 这将运行命令并将tarball下载到您的服务器:

wget https://files.phpmyadmin.net/phpMyAdmin/4.9.0.1/phpMyAdmin-4.9.0.1-all-languages.tar.gz

然后解压缩tarball:

tar xvf phpMyAdmin-4.9.0.1-all-languages.tar.gz

这将在服务器上的名为phpMyAdmin- 4.9.0.1 - all-languages的父目录下创建许多新文件和目录phpMyAdmin- 4.9.0.1 - all-languages

然后运行以下命令。 这将把phpMyAdmin- 4.9.0.1 - all-languages目录及其所有子目录移动到/usr/share/目录,这是phpMyAdmin默认希望查找其配置文件的位置。 它还会将目录重命名为phpmyadmin

sudo mv phpMyAdmin-4.9.0.1-all-languages/ /usr/share/phpmyadmin

有了这个,您已经安装了phpMyAdmin,但是为了能够通过Web浏览器访问phpMyAdmin,您必须进行许多配置更改。

第2步 - 手动配置phpMyAdmin

当使用软件包管理器安装phpMyAdmin时,就像在Ubuntu环境中一样,phpMyAdmin默认为“零配置”模式,该模式会自动执行多个操作来设置程序。 因为我们在本指南中从源代码安装了它,所以我们需要手动执行这些步骤。

首先,创建一个phpMyAdmin将存储其临时文件的新目录:

sudo mkdir -p /var/lib/phpmyadmin/tmp

设置www-data - 像Apache这样的Web服务器默认使用的Linux用户配置文件,用于Ubuntu和Debian系统中的正常操作 - 作为此目录的所有者:

sudo chown -R www-data:www-data /var/lib/phpmyadmin

您之前提取的文件包含一个示例配置文件,您可以将其用作基本配置文件。 制作此文件的副本,将其保留在/usr/share/phpmyadmin目录中,并将其重命名为config.inc.php

sudo cp /usr/share/phpmyadmin/config.sample.inc.php /usr/share/phpmyadmin/config.inc.php

使用首选文本编辑器打开此文件。 在这里,我们将使用nano

sudo nano /usr/share/phpmyadmin/config.inc.php

phpMyAdmin默认使用cookie身份验证方法,允许您在cookie的帮助下以任何有效的MariaDB用户身份登录phpMyAdmin。 在此方法中,MariaDB用户密码使用高级加密标准(AES)算法在临时cookie中进行存储和加密。

从历史上看,phpMyAdmin为此目的使用了Blowfish密码 ,这仍然反映在其配置文件中。 向下滚动到以$cfg['blowfish_secret']开头的行。 它看起来像这样:

/usr/share/phpmyadmin/config.inc.php
. . .
$cfg['blowfish_secret'] = ''; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
. . .

在单引号之间,输入一个包含32个随机字符的字符串。 这不是您需要记住的密码短语,它将仅由AES算法在内部使用:

/usr/share/phpmyadmin/config.inc.php
. . .
$cfg['blowfish_secret'] = 'STRINGOFTHIRTYTWORANDOMCHARACTERS'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
. . .

注意:如果您在此处输入的密码长度短于32个字符,则会导致加密的Cookie安全性降低。 但是,输入超过32个字符的字符串不会造成任何伤害。

要生成真正随机的字符串,您可以安装并使用pwgen程序:

sudo apt install pwgen

默认情况下, pwgen创建易于发音但pwgen较低的安全密码。 但是,通过包含-s标志(如以下命令中所示),您可以创建完全随机,难以记忆的密码。 注意这个命令的最后两个参数: 32 ,它指示密码字符串pwgen将生成多长时间; 1告诉pwgen它应该生成多少个字符串:

pwgen -s 32 1

接下来,向下滚动到注释读数/* User used to manipulate with storage */ 本节包含一些定义名为pma的MariaDB数据库用户的指令,该用户在phpMyAdmin中执行某些管理任务。 根据官方文档 ,在只有一个用户访问phpMyAdmin的情况下,不需要此特殊用户帐户,但建议在多用户方案中使用。

通过删除前面的斜杠取消注释controlusercontroluser指令。 然后更新controlpass指令以指向您选择的安全密码。 如果不这样做,默认密码将保留在原位,未知用户可以通过phpMyAdmin界面轻松访问您的数据库。

进行这些更改后,文件的此部分将如下所示:

/usr/share/phpmyadmin/config.inc.php
. . .
/* User used to manipulate with storage */
// $cfg['Servers'][$i]['controlhost'] = '';
// $cfg['Servers'][$i]['controlport'] = '';
$cfg['Servers'][$i]['controluser'] = 'pma';
$cfg['Servers'][$i]['controlpass'] = 'password';
. . .

在本节下面,您将找到另一个以注释读取/* Storage database and tables */开头的部分。 本节包含许多定义phpMyAdmin配置存储的指令,数据库以及管理pma数据库用户使用的几个表。 这些表在phpMyAdmin中启用了许多功能,包括书签,注释,PDF生成等。

通过删除每行开头的斜杠来取消注释此部分中的每一行,使其如下所示:

/usr/share/phpmyadmin/config.inc.php
. . .
/* Storage database and tables */
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
$cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';
$cfg['Servers'][$i]['relation'] = 'pma__relation';
$cfg['Servers'][$i]['table_info'] = 'pma__table_info';
$cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';
$cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';
$cfg['Servers'][$i]['column_info'] = 'pma__column_info';
$cfg['Servers'][$i]['history'] = 'pma__history';
$cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';
$cfg['Servers'][$i]['tracking'] = 'pma__tracking';
$cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
$cfg['Servers'][$i]['recent'] = 'pma__recent';
$cfg['Servers'][$i]['favorite'] = 'pma__favorite';
$cfg['Servers'][$i]['users'] = 'pma__users';
$cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';
$cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';
$cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';
$cfg['Servers'][$i]['central_columns'] = 'pma__central_columns';
$cfg['Servers'][$i]['designer_settings'] = 'pma__designer_settings';
$cfg['Servers'][$i]['export_templates'] = 'pma__export_templates';
. . .

这些表尚不存在,但我们很快就会创建它们。

最后,向下滚动到文件的底部并添加以下行。 这将配置phpMyAdmin以使用您之前创建的/var/lib/phpmyadmin/tmp目录作为其临时目录。 phpMyAdmin将使用此临时目录作为模板缓存,允许更快的页面加载:

/usr/share/phpmyadmin/config.inc.php
. . .
$cfg['TempDir'] = '/var/lib/phpmyadmin/tmp';

添加此行后保存并关闭文件。 如果您使用nano ,可以按CTRL + XY ,然后按ENTER

接下来,您需要创建phpMyAdmin存储数据库和表。 当您在上一步中安装phpMyAdmin时,它附带了一个名为create_tables.sql的文件。 此SQL文件包含创建配置存储数据库所需的所有命令以及phpMyAdmin需要正常运行的表。

运行以下命令以使用create_tables.sql文件创建配置存储数据库和表:

sudo mariadb < /usr/share/phpmyadmin/sql/create_tables.sql

之后,您需要创建管理pma用户。 打开MariaDB提示符:

sudo mariadb

从提示符处,运行以下命令以创建pma用户并为其授予适当的权限。 请务必更改password以与config.inc.php文件中定义的密码一致:

GRANT SELECT, INSERT, UPDATE, DELETE ON phpmyadmin.* TO 'pma'@'localhost' IDENTIFIED BY 'password';

如果还没有创建一个,您还应该创建一个常规MariaDB用户,以便通过phpMyAdmin管理数据库,因为建议您使用除pma用户之外的其他帐户登录。 您可以使用此命令创建具有数据库中所有表的权限的用户,以及添加,更改和删除用户权限的权限。 无论您为此用户分配什么权限,请务必为其提供强密码:

GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

然后,退出MariaDB shell:

exit

phpMyAdmin现已在您的服务器上完全安装和配置。 但是,您的Apache服务器还不知道如何提供应用程序。 要解决此问题,我们将为其创建一个Apache配置文件。

第3步 - 配置Apache以服务phpMyAdmin

从默认存储库安装phpMyAdmin时,安装过程会自动创建Apache配置文件并将其放在/etc/apache2/conf-enabled/目录中。 因为我们从源代码安装了phpMyAdmin,所以我们需要手动创建并启用此文件。

/etc/apache2/conf-available/目录中创建一个名为phpmyadmin.conf的文件:

sudo nano /etc/apache2/conf-available/phpmyadmin.conf

然后将以下内容添加到该文件中

/etc/apache2/conf-available/phpmyadmin.conf
# phpMyAdmin default Apache configuration

Alias /phpmyadmin /usr/share/phpmyadmin

<Directory /usr/share/phpmyadmin>
    Options SymLinksIfOwnerMatch
    DirectoryIndex index.php

    <IfModule mod_php5.c>
        <IfModule mod_mime.c>
            AddType application/x-httpd-php .php
        </IfModule>
        <FilesMatch ".+\.php$">
            SetHandler application/x-httpd-php
        </FilesMatch>

        php_value include_path .
        php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
        php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
        php_admin_value mbstring.func_overload 0
    </IfModule>
    <IfModule mod_php.c>
        <IfModule mod_mime.c>
            AddType application/x-httpd-php .php
        </IfModule>
        <FilesMatch ".+\.php$">
            SetHandler application/x-httpd-php
        </FilesMatch>

        php_value include_path .
        php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
        php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
        php_admin_value mbstring.func_overload 0
    </IfModule>

</Directory>

# Authorize for setup
<Directory /usr/share/phpmyadmin/setup>
    <IfModule mod_authz_core.c>
        <IfModule mod_authn_file.c>
            AuthType Basic
            AuthName "phpMyAdmin Setup"
            AuthUserFile /etc/phpmyadmin/htpasswd.setup
        </IfModule>
        Require valid-user
    </IfModule>
</Directory>

# Disallow web access to directories that don't need it
<Directory /usr/share/phpmyadmin/templates>
    Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/libraries>
    Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/setup/lib>
    Require all denied
</Directory>

这是在Ubuntu安装中找到的默认phpMyAdmin Apache配置文件,尽管它也适用于Debian设置。

保存并关闭该文件,然后键入以下命令启用它:

sudo a2enconf phpmyadmin.conf

然后重新加载apache2服务以使配置更改生效:

sudo systemctl reload apache2

之后,您将能够通过在Web浏览器中导航到以下URL来访问phpMyAdmin登录屏幕:

https://your_domain/phpmyadmin

您将看到以下登录屏幕:

phpMyAdmin登录界面

使用您配置的MariaDB用户名和密码登录界面。 登录后,您将看到用户界面,如下所示:

phpMyAdmin用户界面

既然您已经能够与phpMyAdmin进行连接和交互,那么剩下要做的就是强化系统的安全性以保护其免受攻击者的攻击。

第4步 - 保护您的phpMyAdmin实例

由于它无处不在,phpMyAdmin是攻击者的热门目标,你应该格外小心,以防止未经授权的访问。 最简单的方法之一是使用Apache内置的.htaccess身份验证和授权功能将网关放在整个应用程序的前面。

要执行此操作,必须首先通过编辑Apache配置文件来启用.htaccess文件覆盖。

编辑已放置在Apache配置目录中的链接文件:

sudo nano /etc/apache2/conf-available/phpmyadmin.conf

在配置文件的<Directory /usr/share/phpmyadmin>部分中添加AllowOverride All指令,如下所示:

/etc/apache2/conf-available/phpmyadmin.conf
<Directory /usr/share/phpmyadmin>
    Options FollowSymLinks
    DirectoryIndex index.php
    AllowOverride All

    <IfModule mod_php5.c>
    . . .

添加此行后,保存并关闭该文件。

要实现您所做的更改,请重新启动Apache:

sudo systemctl restart apache2

现在您已经为您的应用程序启用了.htaccess ,您需要创建一个实际实现某些安全性。

为了使其成功,必须在应用程序目录中创建该文件。 您可以创建必要的文件并使用root权限在文本编辑器中打开它,方法是输入:

sudo nano /usr/share/phpmyadmin/.htaccess

在此文件中,输入以下内容:

/usr/share/phpmyadmin/.htaccess
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /usr/share/phpmyadmin/.htpasswd
Require valid-user

以下是每条线的含义:

  • AuthType Basic :此行指定要实现的身份验证类型。 此类型将使用密码文件实现密码身份验证。
  • AuthName :设置验证对话框的消息。 您应该保持这种通用性,以便未经授权的用户不会获得有关受保护内容的任何信息。
  • AuthUserFile :设置将用于身份验证的密码文件的位置。 这应该在正在提供的目录之外。 我们将很快创建此文件。
  • Require valid-user :这指定只有经过身份验证的用户才能访问此资源。 这实际上阻止了未经授权的用户进入。

完成后,保存并关闭文件。

您为密码文件选择的位置是/usr/share/phpmyadmin/.htpasswd 您现在可以创建此文件并使用htpasswd实用程序将初始用户传递给它:

sudo htpasswd -c /usr/share/phpmyadmin/.htpasswd username

系统将提示您为正在创建的用户选择并确认密码。 然后,使用您输入的散列密码创建文件。

如果要输入其他用户,则需要在没有 -c标志的情况下执行此操作,如下所示:

sudo htpasswd /etc/phpmyadmin/.htpasswd additionaluser

现在,当您访问phpMyAdmin子目录时,系统将提示您输入刚刚配置的其他帐户名和密码:

https://your_domain_or_IP/phpmyadmin

phpMyAdmin apache密码

进入Apache身份验证后,您将进入常规phpMyAdmin身份验证页面以输入您的MariaDB凭据。 此设置添加了额外的安全层,这是可取的,因为phpMyAdmin过去曾遭受过漏洞攻击。

结论

您现在应该已经配置了phpMyAdmin并准备好在Debian 10服务器上使用。 使用此界面,您可以轻松创建数据库,用户,表等,并执行常规操作,如删除和修改结构和数据。