Gavin的小屋

一名程序员的分享

← 返回首页

PHPMyAdmin 安全部署与配置教程

背景

博主在工作中遇到一种情况要连接数据库查数。数据库在阿里云,有IP限制。但是,博主的办公地点没有固定IP,每次连接数据库都需要运维添加白名单,非常麻烦。因为之前使用过PHPMyAdmin,一个web端的数据库客户端。服务器的IP是固定的。于是一个想法应用而生,通过部署PHPMyAdmin连接数据库,同时把部署PHPMyAdmin的服务器IP提供给运维。这样我就可以通过浏览器查数据库。但是,有一个大问题。安全问题怎么保证,因为IP白名单本质也是为了保证安全。如何在保证安全的前提下使用PHPMyAdmin连接数据库?

叠甲:本文档是以一个普通JAVA程序员的角度来做的安全措施,如果有任何不对的或者不合理的方式,请指正。文档中IP和域名均是假的。不存在泄露情况。

概述

本文档记录了通过 Docker Compose 部署 PHPMyAdmin 并配置安全访问的完整过程,包括自定义路径访问、身份认证、禁止搜索引擎索引等关键安全措施。

环境信息

  • 服务器地址:42.36.74.14
  • 访问端口:7022
  • 部署目录:/opt/phpMyAdmin
  • 数据库:阿里云 RDS MySQL(php-pro.rds.aliyuncs.com:3306

部署文件结构

/opt/phpMyAdmin/
├── apache-auth.conf      # Apache 认证与路径配置
├── docker-compose.yml    # Docker 服务配置
├── .htpasswd             # 密码文件(HTTP Basic 认证)
├── mysql_phpmyadmin.tar  # 镜像备份文件
└── robots.txt            # 搜索引擎索引控制

详细部署步骤

1. 创建部署目录

mkdir -p /opt/phpMyAdmin && cd /opt/phpMyAdmin

2. 编写 Docker Compose 配置

创建 docker-compose.yml 文件:

version: '2.2'

services:
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    restart: always
    ports:
      - "7022:80"  # 映射到非标准端口,降低暴露风险
    environment:
      PMA_HOST: php-pro.rds.aliyuncs.com  # 阿里云 RDS 地址
      PMA_PORT: 3306
      PMA_USER: phy_test
      PMA_PASSWORD: TXQWTs6X6u44SW7kQbcK  # 数据库访问密码
    volumes:
      - ./apache-auth.conf:/etc/apache2/conf-enabled/auth.conf  # 挂载认证配置
      - ./.htpasswd:/etc/apache2/.htpasswd  # 挂载密码文件
      - ./robots.txt:/var/www/html/robots.txt  # 防止搜索引擎索引
    networks:
      - default

networks:
  default:

3. 创建 HTTP 认证密码文件

HTTP Basic 认证是通过用户名和密码验证用户身份的简易方式,其核心是将密码加密存储在 .htpasswd 文件中,Apache 会在用户访问受保护路径时验证该文件。以下是详细步骤:

3.1 安装 apache2-utils 工具

htpasswd 是 Apache 提供的密码文件管理工具,包含在 apache2-utils 包中,需先安装:

安装命令(适用于 Debian/Ubuntu 系统):

apt-get update && apt-get install -y apache2-utils

原理说明:

  • apache2-utils 是 Apache 服务器的辅助工具集,htpasswd 是其中用于生成和管理 HTTP 基本认证密码文件的工具。
  • 该工具会将密码通过加密算法(如 bcrypt、MD5 等)处理后存储,避免明文泄露风险(本次使用更安全的 bcrypt 算法)。

3.2 生成 .htpasswd 文件并添加用户

首次创建文件并添加用户(-c 选项):

htpasswd -Bc .htpasswd 用户名
  • 参数说明

    • -c:创建新的 .htpasswd 文件(仅首次使用,再次使用会覆盖现有文件)。
    • -B:使用 bcrypt 算法加密密码(目前最安全的算法之一,比默认的 MD5 更难破解)。
    • .htpasswd:密码文件的名称(需与 apache-auth.confAuthUserFile 配置的路径一致)。
    • 用户名:自定义登录用户名(如 pma_admin)。
  • 执行后交互: 输入两次密码(需牢记),工具会自动生成加密后的记录并写入 .htpasswd 文件。

    示例:

    root@phy3-pro-4:/opt/phpMyAdmin# htpasswd -Bc .htpasswd pma_admin
    New password:  # 输入密码(如 Abc123!@#)
    Re-type new password:  # 再次输入密码
    Adding password for user pma_admin
    

后续添加用户(不加 -c 选项):

若需添加第二个用户(如 db_editor),避免覆盖现有文件,需省略 -c

htpasswd -B .htpasswd 新用户名

示例:

root@phy3-pro-4:/opt/phpMyAdmin# htpasswd -B .htpasswd db_editor
New password:  # 输入新用户密码
Re-type new password:
Adding password for user db_editor

3.3 验证密码文件

生成后可查看 .htpasswd 文件内容(加密后的记录):

cat .htpasswd

示例输出(本次实际配置):

tkdWBFeFMZ:$apr1$L1Vd1/so$PdiRmQqz8m6nSU5KTCH7C1
8G3W6kxJmNkjynZBGuFPkTfsU4jFfu:$apr1$MvkfrWGO$uCDHsPqYd36WG.dBnY9Yn0
  • 格式为 用户名:加密密码,每个用户一行。
  • 加密后的密码无法逆向解密,确保即使文件泄露,密码也不会直接暴露。

3.4 关键注意事项

  1. 文件路径一致性.htpasswd 文件需放在 apache-auth.confAuthUserFile 配置的路径(本次为 /etc/apache2/.htpasswd),通过 Docker 挂载实现:

    volumes:
      - ./.htpasswd:/etc/apache2/.htpasswd  # 宿主机文件挂载到容器内指定路径
    
   
2. **密码强度要求**: 
   建议密码长度 ≥12 位,包含大小写字母、数字和特殊字符(如 `P@ssw0rd!2024`),降低暴力破解风险。

3. **权限控制**: 
   `.htpasswd` 文件权限建议设置为 `600`(仅 root 可读),避免其他用户获取:
   
   ```bash
   chmod 600 .htpasswd

通过以上步骤,即可完成 HTTP 基本认证的密码配置,确保只有授权用户能通过自定义路径访问 phpMyAdmin。

4. 配置 Apache 访问控制

创建 apache-auth.conf 文件,实现自定义路径访问、身份认证、根路径禁止访问及允许搜索引擎规则文件访问。该配置文件通过 Apache 服务器规则 增强 phpMyAdmin 的安全性,以下是详细解析:

4.1 配置文件核心目标

该配置文件用于通过 Apache 服务器规则 增强 phpMyAdmin 的安全性,主要实现以下目标:

  1. 隐藏 phpMyAdmin 默认访问路径,通过自定义路径访问
  2. 强制身份认证(用户名+密码)才能访问
  3. 限制无关路径的访问,防止未授权访问
  4. 允许搜索引擎规则文件(robots.txt)正常生效

4.2 配置项逐行解析

4.2.1 自定义路径映射(Alias 指令)
Alias /MYPRVeUskfF7SDBpQp/ /var/www/html/
  • 作用:将 URL 路径 /MYPRVeUskfF7SDBpQp/ 映射到容器内的实际文件路径 /var/www/html/(phpMyAdmin 程序的存放目录)。
  • 为什么需要: 隐藏 phpMyAdmin 的默认路径(如 /phpmyadmin),通过随机字符串路径(/MYPRVeUskfF7SDBpQp/)减少被恶意扫描的风险,提升安全性。
4.2.2 自定义路径的身份认证配置
<Location /MYPRVeUskfF7SDBpQp/>
    AuthType Basic
    AuthName "phpMyAdmin Login"
    AuthUserFile /etc/apache2/.htpasswd
    Require valid-user
</Location>
  • 作用:对自定义路径 /MYPRVeUskfF7SDBpQp/ 启用身份认证,只有输入正确用户名和密码的用户才能访问。
  • 关键指令解释
    • AuthType Basic:使用 HTTP 基本认证(最简单的用户名密码验证方式)。
    • AuthName "phpMyAdmin Login":浏览器弹出登录框时显示的提示文字(如“phpMyAdmin Login”)。
    • AuthUserFile /etc/apache2/.htpasswd:指定存储用户名和加密密码的文件路径(对应本地挂载的 .htpasswd 文件)。
    • Require valid-user:要求必须是 .htpasswd 文件中存在的合法用户才能访问。
4.2.3 允许访问 robots.txt(例外规则)
<Location /robots.txt>
    Require all granted
</Location>
  • 作用:允许所有用户(包括搜索引擎爬虫)访问 /robots.txt 文件。
  • 为什么需要robots.txt 用于告诉搜索引擎哪些路径禁止爬取(如 Disallow: /MYPRVeUskfF7SDBpQp/),需要让搜索引擎能正常读取该文件,否则可能导致敏感路径被爬虫收录。
4.2.4 拒绝根路径下的无关访问
<LocationMatch "^/(?!MYPRVeUskfF7SDBpQp/|robots\.txt$)">
    Require all denied
</LocationMatch>
  • 作用:禁止通过除自定义路径(/MYPRVeUskfF7SDBpQp/)和 robots.txt 之外的任何根路径访问。
  • 正则表达式解释^/(?!MYPRVeUskfF7SDBpQp/|robots\.txt$) 是一个“负向前瞻”规则,匹配所有 不满足以下条件 的路径:
    • /MYPRVeUskfF7SDBpQp/ 开头(自定义访问路径)
    • 正好是 /robots.txt(搜索引擎规则文件)
  • 效果:彻底阻断通过默认路径(如 //index.php)直接访问 phpMyAdmin 的可能,仅保留安全的访问入口。
4.2.5 目录基础权限配置
<Directory /var/www/html>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>
  • 作用:配置 phpMyAdmin 程序所在目录(/var/www/html)的基础访问权限。
  • 关键指令解释
    • Options Indexes FollowSymLinks
      • Indexes:允许目录浏览(若没有默认首页,可显示文件列表);
      • FollowSymLinks:允许 Apache 跟随目录中的符号链接。
    • AllowOverride All:允许目录下的 .htaccess 文件(若存在)覆盖当前配置(增强灵活性)。
    • Require all granted:允许所有请求访问该目录(前提是通过了前面的路径和认证限制)。

4.3 Apache 基础概念补充(针对新手)

  1. Alias 与路径映射: Apache 中,Alias 用于将 URL 路径(如 /xxx)映射到服务器本地的文件系统路径(如 /var/www/html),用户访问 URL 路径时,实际访问的是映射后的本地路径。

  2. LocationDirectory 的区别

    • Location:针对 URL 路径 配置(如 /MYPRVeUskfF7SDBpQp/),不管文件实际存在哪里,只要访问该 URL 就生效。
    • Directory:针对 文件系统路径 配置(如 /var/www/html),作用于服务器上的实际目录。
  3. 身份认证(Basic Auth)原理: 当用户访问受保护的路径时,Apache 会弹出登录框,用户输入的用户名和密码会被加密后发送到服务器,服务器与 .htpasswd 文件中的加密密码比对,一致则允许访问。

4.4 配置生效方式(结合 Docker)

docker-compose.yml 中,通过 volumes 配置将本地的 apache-auth.conf 挂载到容器内的 Apache 配置目录:

volumes:
  - ./apache-auth.conf:/etc/apache2/conf-enabled/auth.conf
  • 容器内的 Apache 会自动加载 /etc/apache2/conf-enabled/ 目录下的配置文件,因此本地的 apache-auth.conf 规则会被 Apache 应用,实现上述访问控制。

4.5 总结

该配置文件通过 “路径隐藏+身份认证+访问限制” 三重机制,大幅提升了 phpMyAdmin 的安全性:

  1. 仅允许通过随机自定义路径访问,隐藏默认入口;
  2. 强制用户名密码验证,阻止未授权用户;
  3. 阻断无关路径访问,仅开放必要资源(自定义路径和 robots.txt);
  4. 同时兼容搜索引擎规则,避免敏感路径被收录。

5. 配置搜索引擎索引控制

创建 robots.txt 文件,禁止搜索引擎索引敏感路径:

User-agent: *
Disallow: /MYPRVeUskfF7SDBpQp/  # 禁止索引自定义访问路径
Disallow: /index.php         # 禁止索引根目录下的入口文件

6. 启动服务

docker-compose up -d

7. 验证容器状态

docker ps | grep phpmyadmin

预期输出:

b7bd7e0fe07d   phpmyadmin/phpmyadmin   "/docker-entrypoint.…"   11 hours ago   Up 11 hours   0.0.0.0:7022->80/tcp   phpmyadmin

安全验证

访问地址预期结果验证目的
http://42.36.74.14:7022/403 Forbidden根路径禁止访问
http://42.36.74.14:7022/index.php403 Forbidden根目录文件禁止访问
http://42.36.74.14:7022/MYPRVeUskfF7SDBpQp/弹出认证对话框自定义路径需认证
http://42.36.74.14:7022/robots.txt显示规则内容搜索引擎可读取规则

关键安全措施

  1. 路径隐藏:通过自定义路径 /MYPRVeUskfF7SDBpQp/ 替代默认根路径,降低被扫描风险
  2. 身份认证:使用 HTTP Basic 认证,确保仅授权用户可访问
  3. 访问控制:严格禁止根路径及根目录下文件的直接访问
  4. 搜索引擎屏蔽:通过 robots.txt 防止敏感路径被索引
  5. 端口防护:使用非标准端口(7022),减少常规扫描发现概率

其他建议

  1. 定期更换认证密码:htpasswd -B .htpasswd 用户名
  2. 备份配置文件:cp -r /opt/phpMyAdmin /opt/phpMyAdmin_backup
  3. 监控访问日志:docker exec -it phpmyadmin tail -f /var/log/apache2/access.log

评论

评论列表