HestiaCP ermöglicht die automatisierte Bereitstellung des Adminer-Skripts mit nur einem Klick (einschließlich Nginx-Authentifizierung und doppeltem Schutz durch Fail2Ban).

Die manuelle Installation von Adminer gehört der Vergangenheit an! Ein einziges Skript kann die gesamte Sicherheitskonfiguration übernehmen.

Vor ein paar Tagen beklagte sich ein Freund von mir, der ebenfalls in der Systemadministration arbeitet, dass er fast den ganzen Tag für die Installation von Adminer auf seinem Server benötigt. Dabei ist Adminer selbst gar nicht so schwer zu installieren; es ist ja nur eine PHP-Datei, die man einfach hochladen kann und die dann funktioniert. Das Problem ist nur: Man kann eben nicht einfach eine PHP-Datei hochladen und die Sache damit erledigt haben.

Sie müssen Subdomains konfigurieren, Plugins laden, die Nginx-Authentifizierung einrichten und Fail2Ban konfigurieren, um Brute-Force-Angriffe zu verhindern. Jeder einzelne Schritt ist nicht kompliziert, aber zusammen ergeben sie eine Reihe fragmentierter Befehle und Konfigurationsdateien.

Besonders ärgerlich ist, dass sicherheitsrelevante Konfigurationen wie Authentifizierung und Firewalls besonders fehleranfällig sind. Ein kleiner Fehler kann die Datenbankverwaltungsschnittstelle im öffentlichen Internet zugänglich machen und sie somit für jedermann einsehbar machen.

Ich habe damals gelacht, weil ich das vorher genauso gemacht hatte. Später hielt ich es nicht mehr aus und schrieb deshalb ein Skript für die Ein-Klick-Bereitstellung, um all diese Schritte zu automatisieren.

HestiaCP ermöglicht die automatisierte Bereitstellung des Adminer-Skripts mit nur einem Klick (einschließlich Nginx-Authentifizierung und doppeltem Schutz durch Fail2Ban).

Warum nicht nutzen?phpMyAdmin

Man könnte sich fragen, warum man nicht phpMyAdmin verwendet, das doch viel verbreiteter ist.

Tatsächlich hat phpMyAdmin mehr Nutzer und eine größere Community. Ich denke aber, dass Adminer in einigen Bereichen besser abschneidet.

Erstens ist es ressourcenschonend; Adminer besteht nur aus einer einzigen PHP-Datei, während phpMyAdmin aus einer Vielzahl von Dateien besteht. Zweitens ist es sicher; Adminers Designphilosophie lautet „standardmäßig nicht vertrauenswürdig“, was bedeutet, dass Sie die Verbindungsinformationen für den Datenbankzugriff explizit konfigurieren müssen.

Ein weiterer Aspekt ist die Leistung; Adminer ist bei der Verarbeitung großer Datenbanken deutlich schneller als phpMyAdmin.

Natürlich ist das alles nicht das Wichtigste. Am wichtigsten ist, dass ich dank dieses Skripts die sicherheitsrelevanten Einstellungen nicht mehr manuell konfigurieren muss.

Was genau bewirkte das Drehbuch?

Die Idee hinter diesem Skript ist eigentlich ganz einfach: alle Schritte zu automatisieren, die Sie normalerweise manuell ausführen.

Für die interaktive Eingabe stellt Ihnen das Skript einige Fragen: HestiaCP -Benutzername, Domänenname, Authentifizierungsbenutzername und Passwort. Sie müssen nur diese eingeben, den Rest erledigt das Skript.

Das Skript erstellt automatisch das Web-Root-Verzeichnis, prüft, ob apache2-utils (wird zum Generieren von Passwortdateien verwendet) und die PHP-Umgebung installiert sind, und kümmert sich um die Verzeichniserstellung und die Installation der Abhängigkeiten.

Beim Herunterladen von Adminer versucht das Skript zunächst, die neueste Version aus dem offiziellen Repository herunterzuladen. Ist dieses nicht verfügbar, wechselt es automatisch zum stabilen GitHub-Releases-Repository. Ich halte das für sehr wichtig, da das offizielle Repository mitunter instabil sein kann; ich hatte bereits Verbindungsabbrüche.

Bezüglich der Plugin-Downloads lädt das Skript drei Kern-Plugins herunter: plugin.php ist der Plugin-Loader, fc-sqlite-connection-without-credentials.php wird zur Handhabung passwortloser Verbindungen verwendet und login-password-less.php unterstützt die Anmeldung mit Passwort-Hash.

Bezüglich der Passwort-Hash-Generierung und der index.php gibt es eine kleine Besonderheit: Das Skript verwendet getenv(), um das Passwort abzurufen, anstatt direkt $_ENV zu verwenden. Dadurch wird ein Konfigurationsproblem in der php.ini vermieden, das dazu führen könnte, dass die Hash-Berechnung leer ist. Ich bin selbst auf diese Falle gestoßen und habe lange gebraucht, um herauszufinden, dass der 'E'-Bereich in der php.ini nicht aktiviert war.

Zur Konfiguration der Nginx-Authentifizierung nutzt das Skript den nativen Include-Mechanismus von HestiaCP, anstatt die Nginx-Hauptkonfigurationsdatei direkt zu bearbeiten. Der Vorteil dieses Ansatzes besteht darin, dass die Authentifizierung auch dann nicht fehlschlägt, wenn die Domainkonfiguration neu erstellt wird.

In der Fail2Ban-Konfiguration erstellt das Skript eine Filterregel zur Überwachung von 401-Fehlern. Wenn sich eine IP-Adresse innerhalb von 10 Minuten dreimal nicht anmelden kann, wird sie für eine Stunde gesperrt.

Bezüglich der Reparatur von Berechtigungen und dem Neuladen von Diensten wird das Skript automatisch die korrekten Dateiberechtigungen setzen und PHP-FPM, Nginx und Fail2Ban neu laden.

Mir ist Sicherheit sehr wichtig.

Ehrlich gesagt, ist mir die Sicherheit von Datenbankverwaltungstools am wichtigsten.

Überlegen Sie mal: Der Administrator kann alle Datenbanken auf Ihrem Server direkt manipulieren. Wenn diese im öffentlichen Internet zugänglich wären und jemand sie scannen würde, wären die Folgen unvorstellbar.

Dieses Skript verfügt über dreifachen Schutz.

Die erste Ebene ist die HTTP-Basisauthentifizierung von Nginx. Wenn Sie auf Adminer zugreifen, erscheint in Ihrem Browser ein Dialogfeld, in dem Sie Ihren Benutzernamen und Ihr Passwort eingeben müssen. Erst nach Eingabe der korrekten Daten wird Ihnen die Adminer-Anmeldeseite angezeigt.

Die zweite Sicherheitsebene ist der Passwort-Hash des Administrators. Ich habe das Passwort-Hashing in der index.php konfiguriert, sodass selbst bei Umgehung der Nginx-Authentifizierung niemand das Administratorpasswort kennt.

Die dritte Schutzebene ist der Brute-Force-Schutz von Fail2Ban. Wenn jemand versucht, Ihr Passwort per Brute-Force-Angriff zu knacken, blockiert Fail2Ban automatisch dessen IP-Adresse.

Durch die Kombination dieser drei Schutzebenen können Sie Administrator im Grunde bedenkenlos im öffentlichen Internet einsetzen.

Ein-Klick-Bedienung, es ist wirklich nur ein Klick.

Der Bereitstellungsprozess ist denkbar einfach.

#!/bin/bash
# ==============================================================================
# Adminer + 插件 + Nginx Auth + Fail2Ban 一键自动化部署脚本 (HestiaCP 完美版)
# ==============================================================================

set -e

# 必须以 root 权限运行
if [ "$EUID" -ne 0 ]; then
echo "❌ 错误:请使用 root 或 sudo 运行此脚本!"
exit 1
fi

# ------------------------------------------------------------------------------
# 1. 交互式输入配置参数
# ------------------------------------------------------------------------------
read -p "请输入 HestiaCP 用户名 [默认: admin]: " HESTIA_USER
HESTIA_USER=${HESTIA_USER:-admin}

read -p "请输入 Adminer 部署域名 [例如: adminer.example.com]: " DOMAIN
if [ -z "$DOMAIN" ]; then
echo "❌ 错误:域名不能为空!"
exit 1
fi

read -p "请输入 Nginx 网页认证用户名 [默认: adminuser]: " AUTH_USER
AUTH_USER=${AUTH_USER:-adminuser}

read -sp "请输入防护密码 (用于 Nginx 认证与 Adminer 登录): " AUTH_PASS
echo ""
if [ -z "$AUTH_PASS" ]; then
echo "❌ 错误:密码不能为空!"
exit 1
fi

# 核心路径变量定义
WEBROOT="/home/$HESTIA_USER/web/$DOMAIN/public_html"
ADMINER_FILE="$WEBROOT/adminer.php"
PLUGIN_DIR="$WEBROOT/plugins"
HTPASSWD_FILE="/etc/nginx/.htpasswd-$DOMAIN"

echo -e "\n🚀 开始部署 Adminer 到域名: $DOMAIN ..."

# ------------------------------------------------------------------------------
# 2. 创建目录与安装基础依赖
# ------------------------------------------------------------------------------
if [ ! -d "$WEBROOT" ]; then
echo "📁 创建 Web 根目录: $WEBROOT"
mkdir -p "$WEBROOT"
fi
mkdir -p "$PLUGIN_DIR"

echo "🔍 检查基础依赖环境..."
if ! command -v htpasswd >/dev/null 2>&1; then
echo "📦 安装 apache2-utils 工具包..."
apt-get update -qq && apt-get install -y -qq apache2-utils
fi

if ! command -v php >/dev/null 2>&1; then
echo "❌ 错误:未检测到系统的 PHP 环境!"
exit 1
fi

# ------------------------------------------------------------------------------
# 3. 安全下载 Adminer 核心程序
# ------------------------------------------------------------------------------
echo "📥 正在下载最新版 Adminer..."
curl -sL -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)" \
-o "$ADMINER_FILE" "https://www.adminer.org/latest.php"

# 校验下载有效性
if ! grep -q "<?php" "$ADMINER_FILE"; then
echo "⚠️ 官方源连接异常,正在切换至 GitHub Releases 稳定源..."
curl -sL -o "$ADMINER_FILE" \
"https://github.com/vrana/adminer/releases/download/v4.8.1/adminer-4.8.1.php"
fi

# ------------------------------------------------------------------------------
# 4. 下载官方核心插件与加载器
# ------------------------------------------------------------------------------
echo "🧩 正在下载插件组件..."
curl -sL -o "$PLUGIN_DIR/plugin.php" \
https://raw.githubusercontent.com/vrana/adminer/master/plugins/plugin.php

curl -sL -o "$PLUGIN_DIR/fc-sqlite-connection-without-credentials.php" \
https://raw.githubusercontent.com/vrana/adminer/master/plugins/fc-sqlite-connection-without-credentials.php

curl -sL -o "$PLUGIN_DIR/login-password-less.php" \
https://raw.githubusercontent.com/vrana/adminer/master/plugins/login-password-less.php

# ------------------------------------------------------------------------------
# 5. 安全生成密码 Hash 并构建入口文件 index.php
# ------------------------------------------------------------------------------
echo "⚙️ 生成密码 Hash 与 index.php 配置..."
# 使用 getenv() 替代 $_ENV,防止 php.ini 未开启 E 作用域导致 Hash 计算为空
HASHED_PASSWORD=$(AUTH_PASS="$AUTH_PASS" php -r 'echo password_hash(getenv("AUTH_PASS"), PASSWORD_DEFAULT);')

cat > "$WEBROOT/index.php" <<EOF
<?php
function adminer_object() {
include_once "./plugins/plugin.php";
include_once "./plugins/fc-sqlite-connection-without-credentials.php";
include_once "./plugins/login-password-less.php";

return new AdminerPlugin([
new AdminerFCSqliteConnectionWithoutCredentials(),
new AdminerLoginPasswordLess('$HASHED_PASSWORD'),
]);
}
include "./adminer.php";
EOF

# ------------------------------------------------------------------------------
# 6. 配置 Nginx 基础认证 (完全依赖 HestiaCP 原生 Include 机制)
# ------------------------------------------------------------------------------
echo "🔒 配置 Nginx HTTP Basic Auth..."
htpasswd -b -c "$HTPASSWD_FILE" "$AUTH_USER" "$AUTH_PASS"
chmod 644 "$HTPASSWD_FILE"

HESTIA_CONF_DIR="/home/$HESTIA_USER/conf/web/$DOMAIN"
if [ -d "$HESTIA_CONF_DIR" ]; then
# HestiaCP 原生包含文件名格式:nginx.conf_* 与 nginx.ssl.conf_*
# 这样无需 sed 修改主配置文件,重建域名配置时也不会失效
cat > "$HESTIA_CONF_DIR/nginx.conf_adminer" <<EOF
auth_basic "Restricted Adminer Access";
auth_basic_user_file $HTPASSWD_FILE;
EOF

cat > "$HESTIA_CONF_DIR/nginx.ssl.conf_adminer" <<EOF
auth_basic "Restricted Adminer Access";
auth_basic_user_file $HTPASSWD_FILE;
EOF
fi

# ------------------------------------------------------------------------------
# 7. 配置 Fail2Ban 防护规则
# ------------------------------------------------------------------------------
echo "🛡️ 配置 Fail2Ban 规则..."
cat > /etc/fail2ban/filter.d/nginx-adminer.conf <<'EOF'
[Definition]
failregex = ^<HOST> - .* "GET /.* HTTP/.*" 401
ignoreregex =
EOF

cat > /etc/fail2ban/jail.d/nginx-adminer.conf <<EOF
[nginx-adminer]
enabled = true
filter = nginx-adminer
port = http,https
logpath = /var/log/nginx/domains/$DOMAIN.log
maxretry = 3
findtime = 600
bantime = 3600
EOF

# ------------------------------------------------------------------------------
# 8. 修复权限、刷新缓存与重载服务
# ------------------------------------------------------------------------------
echo "🧹 修复权限并重载服务..."
chown -R $HESTIA_USER:$HESTIA_USER "$WEBROOT"
find "$WEBROOT" -type d -exec chmod 755 {} +
find "$WEBROOT" -type f -exec chmod 644 {} +

# 平滑重载 PHP-FPM(兼容多版本 PHP 环境)
for service in $(systemctl list-units --type=service --state=running --no-legend | awk '{print $1}' | grep -E 'php.*fpm'); do
systemctl reload "$service" || true
done

# 重载 Web 与防护服务
nginx -t && systemctl reload nginx
if systemctl is-active --quiet fail2ban; then
systemctl restart fail2ban
fi

echo -e "\n=================================================="
echo -e "✅ Adminer 一键部署成功!"
echo -e "--------------------------------------------------"
echo -e "🌐 访问地址 : https://$DOMAIN/index.php"
echo -e "👤 Nginx 认证账号 : $AUTH_USER"
echo -e "🔑 Nginx 认证密码 : [你输入的防护密码]"
echo -e "--------------------------------------------------"
echo -e "💡 Adminer 登录说明:"
echo -e " 数据库用户名填写:root(或你的数据库账号)"
echo -e " 数据库密码填写:[你输入的防护密码]"
echo -e "=================================================="

So führen Sie das Skript aus: Erteilen Sie dem Skript Ausführungsberechtigungen:

sudo chmod +x /usr/local/bin/deploy-adminer.sh 

Führe das Skript mit sudo aus:

sudo /usr/local/bin/deploy-adminer.sh 

Geben Sie die Konfigurationsinformationen wie aufgefordert ein:

  • Geben Sie Ihren HestiaCP-Benutzernamen ein (z. B. admin).
  • Geben Sie die vorbereitete vollständige Subdomain ein (z. B. adminer.example.com).
  • Geben Sie Ihr Sicherheitspasswort ein (z. B. MySuperPassword123).

Das Skript führt den gesamten Konfigurationsprozess automatisch durch und lässt dabei nichts aus.

Der gesamte Vorgang dauert etwa ein bis zwei Minuten. Das Skript erledigt alles automatisch, Sie müssen keine Befehle manuell ausführen.

Nach Abschluss der Installation können Sie Adminer über https://yourdomain/index.php aufrufen.

Einige Fragen, die Ihnen möglicherweise Sorgen bereiten

Manche Freunde fragen sich vielleicht, ob dieses Skript mehrere PHP-Versionen unterstützt.

Ja, das wird unterstützt. Das Skript erkennt automatisch alle auf dem System laufenden PHP-FPM-Dienste und lädt sie nacheinander neu. Es funktioniert also einwandfrei, egal ob Sie PHP 7.4 oder PHP 8.2 verwenden.

Manche Freunde fragen sich vielleicht: Was ist, wenn ich mein Passwort ändern möchte?

Es ist ganz einfach: Führen Sie das Skript einfach erneut aus. Das Skript generiert den Passwort-Hash neu, konfiguriert die Nginx-Authentifizierung neu und richtet Fail2Ban neu ein. Die alte Konfiguration wird überschrieben.

Was ist, wenn ich es deinstallieren möchte?

Sie können das Web-Root-Verzeichnis, die Passwortdatei und die Fail2Ban-Konfiguration einfach manuell löschen. Das Skript hinterlässt keine weiteren Spuren auf dem System.

Schreiben Sie am Ende

Ich war schon immer der Meinung, dass Betrieb und Wartung nicht so kompliziert sein sollten.

Viele manuelle Aufgaben lassen sich mithilfe von Skripten automatisieren. Dadurch haben Sie mehr Zeit für wichtigere Dinge, wie die Optimierung der Serverleistung, die Überwachung des Anwendungsstatus und die Erforschung neuer Technologien.

Das erinnert mich an eine historische Geschichte. In den 1880er Jahren begann sich die Elektrizität in den Vereinigten Staaten auszubreiten. Viele Fabrikbesitzer investierten viel Geld in Generatoren und Elektromotoren und installierten diese in ihren Fabriken. Nach der Installation stellten viele jedoch fest, dass sich die Produktionseffizienz nicht wesentlich verbessert hatte. Der Grund dafür war, dass sie zwar Dampfmaschinen durch Elektromotoren ersetzt hatten, die Gesamtstruktur, die Prozesse und die Managementmethoden der Fabrik aber unverändert geblieben waren.

Diejenigen, die wirklich vom Elektrizitätsboom profitierten, waren die ersten, die verstanden, was Elektrizität wirklich bedeutete. Sie gestalteten Produktionslinien um, restrukturierten Werkstätten und veränderten die Arbeitsweise der Arbeiter.

Dasselbe gilt für die Automatisierung von Betrieb und Instandhaltung. Viele wissen zwar, dass Skripte eingesetzt werden können, bevorzugen aber dennoch die manuelle Bedienung – ähnlich wie jene Fabrikbesitzer früherer Zeiten, die zwar Elektromotoren kannten, aber immer noch mit der Denkweise von Dampfmaschinen arbeiteten. Skripte sollen nicht Ihr Urteilsvermögen ersetzen, sondern repetitive, mechanische und fehleranfällige Aufgaben automatisieren, damit Sie Ihre Energie auf das konzentrieren können, was wirklich strategisches Denken erfordert.

So ist dieses Skript entstanden. Es hat ein Problem für mich gelöst, und ich hoffe, es kann auch Ihnen helfen.

Wenn Sie HestiaCP und Adminer verwenden, sollten Sie dieses Skript einmal ausprobieren. Es könnte Ihnen viel Zeit sparen.

Da du bis hierher gelesen hast: Wenn dir der Beitrag gefallen hat, teile ihn bitte. Wenn du als Erster über Neuigkeiten informiert werden möchtest, kannst du mir auch folgen!

Vielen Dank fürs Lesen meines Artikels. Bis zum nächsten Mal.

Hoffentlich ist Ihnen der Artikel „HestiaCP One-Click Automated Deployment Adminer Script (Including Nginx Authentication + Fail2Ban Dual Protection)“, der auf Chen Weiliangs Blog ( https://www.chenweiliang.com/ ) veröffentlicht wurde, hilfreich.

Sie können den Link zu diesem Artikel gerne teilen: https://www.chenweiliang.com/cwl-34395.html

Um weitere versteckte Tricks freizuschalten🔑, treten Sie unserem Telegram-Kanal bei!

Teilen und liken, wenn es Ihnen gefällt! Ihre Shares und Likes sind unsere ständige Motivation!

 

发表 评论

您的邮箱地址不会被公开.必填项已用*标注

Nach oben scrollen