一个运行在开放地址上的 Adminer 实例是丢失数据库最悄无声息的方式之一。有人部署这个单一 PHP 文件来检查一个表,URL 可以访问,文件就这样留在那里几个月,直到过时的副本变成攻击面。这就是本 Linux VPS 上 Adminer 安装指南为安全加固和部署运行分配同等篇幅的原因。
Adminer 是一个单一的 PHP 文件(完整版约 503 KB),支持 MySQL、MariaDB、PostgreSQL、SQLite 及其他多种数据库。部署极其简单,这恰恰是它经常被随意部署的原因。
您将在配有 Nginx 和 PHP-FPM 的现代 Ubuntu 或 Debian VPS 上安装它,添加 HTTP 认证、IP 允许列表和 Let's Encrypt HTTPS,最后给出一条明确规则:何时完全跳过公开设置,转而通过 SSH 隧道访问 Adminer。
TL;DR(太长不看版)
- Adminer 是您用以下命令下载到 webroot 的单一 PHP 文件:
wget下载到 webroot;Nginx 和 PHP-FPM 为其提供服务。 - 公开的 Adminer 实例需要三者全部具备:HTTP 认证层、IP 允许列表和 HTTPS。三者缺一不可。
- 对于最敏感的数据库,根本不要暴露 Adminer:将其绑定到
localhost并通过 SSH 隧道访问它。 - 更新只需一条命令:重新运行
wget下载命令。近期的安全版本发布使得保持更新成为真正的运维任务,而非可选项。
前提条件:安装前需要准备什么
本指南面向 Ubuntu 26.04 和 24.04 以及 Debian 13,并附有 Ubuntu 22.04 和 Debian 12 的兼容性说明。默认 PHP-FPM 版本:Ubuntu 26.04 为 8.5,Ubuntu 24.04 为 8.3,Debian 13 为 8.4,Debian 12 为 8.2,Ubuntu 22.04 为 8.1。
- 运行 Ubuntu 22.04、Ubuntu 24.04、Ubuntu 26.04、Debian 12 或 Debian 13 的 Linux VPS,以及一个拥有
sudo访问 - 数据库服务器(MySQL、MariaDB 或 PostgreSQL)已在运行,可在此 VPS 上,也可在 Adminer 能通过网络访问的服务器上。本指南不安装数据库,它安装的是您用来管理数据库的工具。
- 从操作系统支持的软件仓库安装 PHP-FPM。尽管 Adminer 的编译文件支持 PHP 5.3+,仍请使用上面列出的当前发行版提供版本,而不是安装过时的 PHP 版本。
- 对于公开 HTTPS 设置,您需要一个解析到 VPS 的主机名以及入站 TCP 端口 80 和 443 可用。 Certbot Nginx 工作流程 使用端口 80 上的 HTTP-01 验证。Let's Encrypt 现在支持 短期 IP 地址证书,但 Certbot 不会通过其 Nginx 工作流程自动安装它们,因此本指南使用主机名。
注意:本指南特意使用 Nginx。如果您使用 Apache,下载和安全加固逻辑仍然适用,但下方的服务器块配置不适用。
安装 Nginx 和 PHP-FPM
首先刷新软件包索引,然后安装 Nginx 和 PHP-FPM,以及服务器所需的 PHP 数据库扩展:
sudo apt update
sudo apt install -y nginx php-fpm php-mysql
对于 PostgreSQL 后端,安装 php-pgsql 替代或与之并用 php-mysql:
sudo apt install -y php-pgsql
确认 PHP-FPM 套接字存在:
ls /run/php/
将套接字文件名与上面列出的版本匹配,例如 php8.5-fpm.sock 在 Ubuntu 26.04 上, php8.3-fpm.sock 在 Ubuntu 24.04 上,或者 php8.4-fpm.sock 在 Debian 13 上。如果预期的套接字缺失,使用以下命令检查对应服务: systemctl status php8.5-fpm,替换 8.5 为您操作系统上安装的版本。
专业提示:套接字不匹配是出现
502 Bad Gateway。将fastcgi_pass与目录下的文件名/run/php/,确认对应的 PHP-FPM 服务正在运行,并检查/var/log/nginx/error.log如果错误仍然存在。
下载 Adminer
创建一个目录来存放 Adminer,然后将单一文件下载到其中。 latest.php URL 始终解析到当前稳定版本:
sudo mkdir -p /var/www/adminer
sudo wget -O /var/www/adminer/adminer.php https://www.adminer.org/latest.php
如果您只使用 MySQL 或 MariaDB,仅限 MySQL 的版本更小(约 406 KB),下载方式相同:
sudo wget -O /var/www/adminer/adminer.php https://www.adminer.org/latest-mysql.php
保持 Adminer 目录归 root 所有,同时授予 PHP-FPM 读取权限:
sudo chown -R root:root /var/www/adminer
sudo chmod 755 /var/www/adminer
sudo chmod 644 /var/www/adminer/adminer.php
You do not need to track the version number: the latest.php URL 意味着重新运行下载也是您的更新路径,维护部分会回到这个话题。
配置 Nginx 服务器块
创建一个服务器块来服务 Adminer 目录并传递 .php 请求传递到您之前确定的 PHP-FPM 套接字。打开新的站点文件:
sudo nano /etc/nginx/sites-available/adminer
粘贴以下内容,将 db.example.com 替换为已指向您 VPS 的主机名,并确认 fastcgi_pass 套接字与您的 PHP 版本匹配:
# /etc/nginx/sites-available/adminer
server {
listen 80;
server_name db.example.com;
root /var/www/adminer;
location = / {
return 302 /adminer.php;
}
location = /adminer.php {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location / {
return 404;
}
}
通过创建软链接到以下目录启用站点 sites-enabled,然后在不重载 Nginx 的情况下测试配置:
sudo ln -s /etc/nginx/sites-available/adminer /etc/nginx/sites-enabled/
sudo nginx -t
nginx -t 应报告语法有效且测试成功。尚不要重新加载 Nginx,因为站点还没有身份验证或 IP 限制。继续执行这两个强化步骤,IP 限制步骤在两项保护就位后执行首次重载。
锁定访问:身份验证、IP 限制和 HTTPS
公开的 Adminer 实例直接暴露在您的数据库凭据前,因此需要分层防御而非单一锁定。以下三层各司其职:HTTP 认证在 Web 服务器层拦截无密码的访问,IP 允许列表阻止来自未批准地址的连接,HTTPS 防止您输入的凭据以明文在网络上传输。三层全部添加,缺一不可。
添加 HTTP 基本认证
安装 htpasswd 实用程序,包含在 apache2-utils 包(Ubuntu 和 Debian):
sudo apt install -y apache2-utils
创建密码文件和用户(系统将提示您输入密码):
sudo htpasswd -B -C 10 -c /etc/nginx/.htpasswd adminuser
sudo chown root:www-data /etc/nginx/.htpasswd
sudo chmod 640 /etc/nginx/.htpasswd
将指令添加到 Adminer PHP 的精确位置,以保护 PHP 请求本身:
location = /adminer.php {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
两个指令均记录于 Nginx HTTP auth_basic 模块参考运行 sudo nginx -t 以验证配置,但暂不重新加载 Nginx;IP 允许列表将在下一步添加。不要通过明文 HTTP 提交 Basic Auth 凭据;等到下面启用 HTTPS 后再操作。
按 IP 地址限制访问
基本认证阻止未认证用户,但 Nginx 仍然接收来自所有来源的请求。将现有的 Adminer PHP 位置替换为以下组合块,使 IP 规则和 Basic Auth 指令保持在同一位置:
location = /adminer.php {
satisfy all;
allow 203.0.113.10;
allow 203.0.113.0/28;
deny all;
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
将示例地址替换为您实际的公共 IP 地址或受信任的网络范围。仅保留 allow 条目,删除未使用的示例。第一个条目展示单个地址,第二个展示 CIDR 范围。Nginx 返回 403 Forbidden 到与规则不匹配的地址 allow allow 规则。 Nginx 访问模块参考 记录指令语法。测试并重新加载 Nginx:
sudo nginx -t && sudo systemctl reload nginx
使用 Let's Encrypt 启用 HTTPS
将域名指向 VPS 后,安装 Certbot 及其 Nginx 插件,然后申请证书:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d db.example.com
Certbot 编辑您的服务器块以在端口 443 上提供 HTTPS 服务,并提供将 HTTP 重定向到 HTTPS;接受重定向。它还安装续期计时器,使证书在到期前自动续期。您可以使用以下命令确认续期路径: sudo certbot renew --dry-run,应该无错误完成。
现在访问 https://db.example.com/adminer.php 从允许的地址访问,并确认 Nginx 在 Adminer 加载之前请求 Basic Auth 凭据。
选择您的访问模式:公开 HTTPS 与 SSH 隧道
上述设置适用于需要从多台机器通过浏览器访问数据库,或者打开 SSH 会话不切实际的情况。这不是唯一的模式,对于敏感数据库来说也不是最具防御性的模式。
对于敏感部署,不要公开暴露 Adminer。 Adminer 官方安全指南 建议尽可能使其无法从公共互联网访问。如果您选择仅通过隧道访问,请将公开的 Nginx 服务器块替换为此仅限 loopback 的配置,并跳过公开 HTTPS 设置:
# /etc/nginx/sites-available/adminer
server {
listen 127.0.0.1:8080 default_server;
server_name _;
root /var/www/adminer;
location = / {
return 302 /adminer.php;
}
location = /adminer.php {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location / {
return 404;
}
}
测试并重新加载替换配置:
sudo nginx -t && sudo systemctl reload nginx
然后从您自己的机器打开隧道:
ssh -N -L 127.0.0.1:8080:127.0.0.1:8080 user@your-server-ip
隧道运行后,打开 http://127.0.0.1:8080/adminer.php。Nginx 仅通过 VPS 的 loopback 接口接受 Adminer 连接,而 SSH 通过其加密连接承载流量。这使用了 OpenSSH 本地转发文档.
当您需要从多台机器直接通过浏览器访问时,使用公开 HTTPS、Basic Auth 和 IP 允许列表设置。当不需要公开访问时,优先使用仅限 loopback 的 SSH 设置。
核心要点: 最安全的 Adminer 是永远无法从公共互联网访问的那个。
保持 Adminer 更新
被遗忘的实例是这里真正的风险,值得将其视为计划任务而非事后想法。更新 Adminer 是一条命令,与 wget 安装时使用的相同命令,因为 latest.php 始终获取当前版本:
sudo wget -O /var/www/adminer/adminer.php https://www.adminer.org/latest.php
这不是一个理论上的担忧。 Adminer 5.4.3(2026 年 7 月 9 日发布)在一个版本中解决了七个 GitHub 安全公告。之前关于 CVE-2026-25892 表明即使是 Adminer 的版本检查端点也可能变成未经身份验证的拒绝服务向量;该问题在 5.4.2 版本中已修复。过时的副本会积累公开记录的漏洞,因此更新它应该是例行维护。
注意:请使用当前上游 Adminer 正式版本。 AdminerEvo 仓库于 2025 年 1 月被归档 并非一个积极维护的替代方案。
在 VPS 上部署
如果您希望跳过手动步骤,Adminer 可在 Cloudzy 应用市场 在...上 Cloudzy Linux VPS。市场镜像使用 Apache、Basic Auth 和自签名证书,因此与上述 Nginx、IP 允许列表和 Let's Encrypt 组合不同。在输入生产数据库凭据之前,请检查这些安全差异。
Adminer 自身的资源占用可以忽略不计;数据库决定您的规模。根据数据库的数据和索引大小、查询负载、连接数、备份和预期增长来选择 CPU、内存和存储,而不是 Adminer 本身。
常见问题
在 VPS 上公开暴露 Adminer 安全吗?
单独来说不安全。如果必须公开 Adminer,请同时将其置于 HTTP Basic Authentication、IP 允许列表和 HTTPS 之后。这些控制措施可以降低风险,但不能消除公开暴露的风险。对于敏感数据库,请将 Adminer 绑定到 localhost 并通过 SSH 隧道访问它。
如何在不将 Adminer 暴露于互联网的情况下访问它?
配置上面显示的仅限 loopback 的 Nginx 服务器块,使 Adminer 监听在 127.0.0.1:8080创建一个指向它的 docker context,然后运行 ssh -N -L 127.0.0.1:8080:127.0.0.1:8080 user@your-server-ip 在您自己的机器上。打开 http://127.0.0.1:8080/adminer.php 在隧道运行时。
Adminer 能同时连接 PostgreSQL 和 MySQL 吗?
是的。Adminer 开箱支持 MySQL、MariaDB、PostgreSQL、SQLite、MS SQL 和 Oracle,通过插件还可支持更多数据库。为您的数据库安装对应的 PHP 扩展,例如 php-pgsql 用于 PostgreSQL,使 PHP 可以与其通信。
如何保持 Adminer 最新?
重新运行下载命令: sudo wget -O /var/www/adminer/adminer.php https://www.adminer.org/latest.php。那个 latest.php URL 始终返回当前稳定版本,因此这会用最新版本覆盖您的副本。最近的安全版本使这值得按计划执行,而不仅仅是在您记得时才执行。
我应该通过 apt 包安装 Adminer 还是直接下载?
直接下载单个文件。它能立即提供当前版本,并使更新变为一行命令,而发行包可能落后于官方版本。直接文件是相同的工具,到最新安全修复的路径更短。