Debian 12安装phpMyAdmin记录

发布时间 2023-07-08 02:45:40作者: S_梦痕

使用apt install phpmyadmin总会报错AH01071: Got error 'PHP message: PHP Fatal error: Uncaught Error: Call to undefined function Symfony\\Component\\DependencyInjection\\array_is_list() 。查询资料显示array_is_list()是PHP8.1的特性,但phpMyAdmin官方明确5.2.1版本支持PHP7.4及以上。因此尝试源码安装

# 运行环境
Debian 12 + apache2.4 + php8.0 + mysql5.7

1. 源码包下载

# 1. 下载
cd ~
mkdir download
cd download
wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.tar.gz

# 2. 解压
tar -zxvf phpMyAdmin-5.2.1-all-languages.tar.gz

# 3. 复制文件夹到指定目录(apt安装会将其安到/usr/share/phpmyadmin)
sudo mv phpMyAdmin-5.2.1-all-languages.tar.gz /usr/share/phpmyadmin

2. 在MySQL中创建超级用户

# 登录mysql
mysql -u root -p

# 1. 添加用户pma(配置文件时用)
#  % 符号告诉MySQL允许该用户从远程的任何地方登录。如果你想提高安全性,你可以用一个IP地址来代替它。密码更换为自己的
CREATE USER 'pma'@'%' IDENTIFIED BY 'password_here';

# 2. 赋予超级用户权限
GRANT ALL PRIVILEGES ON *.* TO 'pma'@'%' WITH GRANT OPTION;

3. 创建临时文件夹

sudo mkdir -p /var/lib/phpmyadmin/tmp
# 将www-data(Apache 等 Web 服务器默认用于 Ubuntu 和 Debian 系统中的正常操作的 Linux 用户配置文件)设置为该目录的所有者
sudo chown -R www-data:www-data /var/lib/phpmyadmin

4. PHPMyAdmin配置

# 1. 复制实例配置文件并重命名为config.inc.php
sudo cp /usr/share/phpmyadmin/config.sample.inc.php /usr/share/phpmyadmin/config.inc.php

# 2. 编辑配置
sudo vim /usr/share/phpmyadmin/config.inc.php

# 2.1 phpMyAdmincookie默认使用身份验证方法,它允许您在cookie的帮助下以任何有效的 MySQL 用户身份登录到 phpMyAdmin 。在这种方法中,MySQL 用户密码存储在临时 cookie 中,并使用高级加密标准 (AES) 算法进行加密。历史上,phpMyAdmin 曾为此使用Blowfish 密码,这仍然反映在其配置文件中。向下滚动到以 开头的行$cfg['blowfish_secret']
# 在''中输入一个32位的随机字符;shell中可使用pwgen -s 32 1命令创建,然后复制进来
$cfg['blowfish_secret'] = ''; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

# 2.2 配置/* User used to manipulate with storage */
## 在只有一个用户访问phpMyAdmin的情况下不需要这个特殊的用户帐户,但在多用户场景中推荐使用。通过删除前面的斜杠来取消对controluserandcontrolpass指令的注释。然后更新controlpass指令以指向您选择的安全密码。如果您不这样做,默认密码将保持不变,未知用户可以通过 phpMyAdmin 界面轻松访问您的数据库。
. . .
/* User used to manipulate with storage */
// $cfg['Servers'][$i]['controlhost'] = '';
// $cfg['Servers'][$i]['controlport'] = '';
$cfg['Servers'][$i]['controluser'] = 'pma';
$cfg['Servers'][$i]['controlpass'] = 'password';      // 密码为之前创建的用户密码
. . .

# 2.3 配置/* Storage database and tables */
## 本节包括许多定义phpMyAdmin 配置存储、数据库和管理pma数据库用户使用的几个表的指令。这些表启用了 phpMyAdmin 中的许多功能,包括书签、评论、PDF 生成等。取消本节参数的注释
. . .
/* 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';
. . .

# 2.4 配置临时文件路径
# 在配置文件末尾添加:
$cfg['TempDir'] = '/var/lib/phpmyadmin/tmp';

# 2.5 在MySQL中创建phpMyAdmin的数据库和表(储存其自身的配置)
sudo mysql -u root -p < /usr/share/phpmyadmin/sql/create_tables.sql

5. 配置Apache支持phpMyAdmin

# 1. 创建phpMyAdmin Apache2配置文件
sudo vim /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>



# 2. 启用phpMyAdmin配置文件
sudo a2enconf phpmyadmin.conf
sudo systemctl reload apache2

# 3.浏览器访问测试
http://<域名>/phpmyadmin

6. 安全性控制

phpMyAdmin 是攻击者的热门目标,您应该格外小心以防止未经授权的访问。

6.1 为phpMyAdmin设置别名

机器人和攻击者不断扫描web服务器,寻找默认的phpMyAdmin登录页面,因此建议您将URL更改为其他内容。
在本例中,我们将把它从example.com/phpmyadmin更改为 example.com/pmahidden

# 通过更改phpMyAdmin配置文件实现
sudo vim /etc/apache2/conf-available/phpmyadmin.conf
Alias pmahidden /usr/share/phpmyadmin

# 浏览器测试访问
http://<域名>/pmahidden
6.2 允许. htaccess 覆盖

使用 Apache 的内置.htaccess身份验证授权功能在整个应用程序前面放置一个网关。

# 1. 编辑 Apache 配置文件来启用文件覆盖的使用
sudo vim /etc/apache2/conf-available/phpmyadmin.conf
<Directory /usr/share/phpmyadmin>
    Options FollowSymLinks
    DirectoryIndex index.php
    AllowOverride All			# 新增

    <IfModule mod_php5.c>
    . . .
# 2. 重启Apache
sudo systemctl restart apache2

# 3. 设置 .htpasswd
## 在 phpMyAdmin 安装目录中创建一个新的 .htaccess 文件
sudo vim /usr/share/phpmyadmin/.htaccess
# >>>添加:
AuthType Basic	# 此行指定您正在实施的身份验证类型。此类型将使用密码文件实现密码认证
AuthName "Restricted Files"	# 这将设置身份验证对话框的消息。您应该保持这种通用性,以便未经授权的用户不会获得有关受保护内容的任何信息。
AuthUserFile /usr/share/phpmyadmin/.htpasswd	# 这设置将用于身份验证的密码文件的位置。这应该在正在提供服务的目录之外。我们很快就会创建这个文件。
Require valid-user	# 这指定只有经过身份验证的用户才能访问此资源。这实际上是阻止未经授权的用户进入。

# 4. 密码文件选择的位置是/usr/share/phpmyadmin/.htpasswd. 您现在可以创建此文件并将其传递给该htpasswd实用程序的初始用户
sudo htpasswd -c /usr/share/phpmyadmin/.htpasswd username
# 系统将提示您为正在创建的用户选择并确认密码。之后,将使用您输入的散列密码创建该文件。