Mae HestiaCP yn darparu defnydd awtomataidd un clic o'r sgript Adminer (gan gynnwys dilysiad Nginx + amddiffyniad deuol Fail2Ban).

Stopiwch osod Adminer â llaw! Gall un sgript drin y cyfluniad diogelwch cyfan.

Ychydig ddiwrnodau yn ôl, cwynodd ffrind i mi, sydd hefyd yn gweithio ym maes gweinyddu systemau, ei fod yn cymryd y rhan fwyaf o'r dydd iddo osod Adminer ar ei weinydd. Nid yw Adminer ei hun yn anodd i'w osod; dim ond ffeil PHP ydyw, gallwch chi ei thaflu i fyny a bydd yn gweithio. Ond y broblem yw, ni allwch chi daflu ffeil PHP i fyny a rhoi'r gorau iddi.

Mae angen i chi ffurfweddu is-barthau, llwytho ategion, sefydlu dilysiad Nginx, a ffurfweddu Fail2Ban i atal ymosodiadau grym brwd. Nid yw pob cam yn gymhleth, ond gyda'i gilydd maent yn ffurfio criw o orchmynion a ffeiliau ffurfweddu dameidiog.

Yr hyn sy'n fwy blino fyth yw bod ffurfweddiadau sy'n gysylltiedig â diogelwch fel dilysu a waliau tân yn arbennig o dueddol o gael gwallau. Gall amheuaeth fach ddatgelu'r rhyngwyneb rheoli cronfa ddata i'r rhyngrwyd cyhoeddus, gan ei gwneud yn hygyrch i unrhyw un.

Chwarddais ar y pryd oherwydd fy mod i wedi bod yn gwneud yr un peth o'r blaen. Yn ddiweddarach, allwn i ddim ei ddioddef mwyach, felly ysgrifennais sgript defnyddio un clic i awtomeiddio'r holl gamau hyn.

Mae HestiaCP yn darparu defnydd awtomataidd un clic o'r sgript Adminer (gan gynnwys dilysiad Nginx + amddiffyniad deuol Fail2Ban).

Pam na ddefnyddiwchphpMyAdmin

Efallai y byddwch chi'n gofyn, pam na ddefnyddiwch chi phpMyAdmin, sy'n fwy prif ffrwd?

Yn wir, mae gan phpMyAdmin fwy o ddefnyddwyr a chymuned fwy. Ond dw i'n meddwl bod Adminer yn gwneud gwaith gwell mewn rhai meysydd.

Yn gyntaf, mae'n ysgafn; dim ond un ffeil PHP yw Adminer, tra bod phpMyAdmin yn griw cyfan o ffeiliau. Yn ail, mae'n ddiogel; athroniaeth ddylunio Adminer yw "heb ymddiriedaeth yn ddiofyn," sy'n golygu bod angen i chi ffurfweddu gwybodaeth cysylltu yn benodol i weithredu'r gronfa ddata.

Agwedd arall yw perfformiad; mae Adminer yn sylweddol gyflymach na phpMyAdmin wrth drin cronfeydd data mawr.

Wrth gwrs, nid yw'r un o'r rhain yn bethau pwysicaf. Y peth pwysicaf yw bod y sgript hon yn golygu nad oes rhaid i mi ffurfweddu'r pethau hynny sy'n gysylltiedig â diogelwch â llaw mwyach.

Beth yn union wnaeth y sgript?

Mae'r syniad y tu ôl i'r sgript hon yn eithaf syml mewn gwirionedd: awtomeiddio'r holl gamau rydych chi fel arfer yn eu gwneud â llaw.

Ar gyfer mewnbwn rhyngweithiol, bydd y sgript yn gofyn ychydig o gwestiynau i chi: enw defnyddiwr HestiaCP , enw parth, enw defnyddiwr dilysu, a chyfrinair. Dim ond angen i chi nodi'r rhain, a bydd y sgript yn ymdrin â'r gweddill.

Mae'r sgript yn creu cyfeiriadur gwraidd y we yn awtomatig, yn gwirio a yw apache2-utils (a ddefnyddir i gynhyrchu ffeiliau cyfrinair) a'r amgylchedd PHP wedi'u gosod, ac yn trin creu cyfeiriaduron a gosod dibyniaethau.

Wrth lawrlwytho Adminer, mae'r sgript yn ceisio lawrlwytho'r fersiwn ddiweddaraf o'r storfa swyddogol yn gyntaf. Os nad yw'r storfa swyddogol ar gael, mae'n newid yn awtomatig i'r storfa GitHub Releases sefydlog. Dw i'n meddwl bod hyn yn eithaf pwysig, gan y gall y storfa swyddogol fod yn ansefydlog weithiau; dw i wedi dod ar draws terfynau amser cysylltu o'r blaen.

O ran lawrlwythiadau ategion, bydd y sgript yn lawrlwytho tri ategyn craidd: plugin.php yw'r llwythwr ategion, defnyddir fc-sqlite-connection-without-credentials.php i drin cysylltiadau di-gyfrinair, ac mae login-password-less.php yn cefnogi mewngofnodi hash cyfrinair.

O ran cynhyrchu hash cyfrinair ac index.php, mae manylyn bach: mae'r sgript yn defnyddio getenv() i adfer y cyfrinair yn lle defnyddio $_ENV yn uniongyrchol. Mae hyn yn osgoi problem ffurfweddu php.ini sy'n achosi i'r cyfrifiad hash fod yn wag. Fe wnes i ddod ar draws y perygl hwn fy hun a threuliais amser hir yn darganfod nad oedd y cwmpas 'E' wedi'i alluogi yn php.ini.

Ar gyfer ffurfweddu dilysiad Nginx, mae'r sgript yn defnyddio mecanwaith cynnwys brodorol HestiaCP yn lle addasu prif ffeil ffurfweddu Nginx yn uniongyrchol. Mantais y dull hwn yw na fydd dilysu'n methu hyd yn oed os byddwch chi'n ailadeiladu ffurfweddiad y parth.

Yn y ffurfweddiad Fail2Ban, mae'r sgript yn creu rheol hidlo i fonitro gwallau 401. Os bydd IP yn methu â mewngofnodi 3 gwaith o fewn 10 munud, bydd yn cael ei rwystro am 1 awr.

O ran atgyweirio caniatâd ac ail-lwytho gwasanaethau, bydd y sgript yn gosod y caniatâd ffeiliau cywir yn awtomatig ac yn ail-lwytho PHP-FPM, Nginx, a Fail2Ban.

Rydw i o ddifrif ynglŷn â diogelwch.

A dweud y gwir, diogelwch offer rheoli cronfeydd data yw'r peth rwy'n poeni fwyaf amdano.

Meddyliwch amdano, gall y gweinyddwr drin yr holl gronfeydd data ar eich gweinydd yn uniongyrchol. Os yw'n agored i'r rhyngrwyd cyhoeddus a bod rhywun yn ei sganio, byddai'r canlyniadau'n annirnadwy.

Mae gan y sgript hon amddiffyniad triphlyg.

Yr haen gyntaf yw Awdurdodiad Sylfaenol HTTP Nginx. Pan fyddwch chi'n cyrchu Adminer, bydd eich porwr yn dangos blwch deialog yn gofyn i chi nodi eich enw defnyddiwr a'ch cyfrinair. Dim ond ar ôl nodi'r wybodaeth gywir y byddwch chi'n gweld tudalen mewngofnodi'r Adminer.

Yr ail haen yw mewngofnodi hash cyfrinair y Gweinyddwr ei hun. Ffurfiais hashio cyfrinair yn index.php, felly hyd yn oed os yw rhywun yn osgoi dilysiad Nginx, ni fyddant yn gwybod cyfrinair mewngofnodi'r Gweinyddwr.

Y drydedd haen yw amddiffyniad grym brwd Fail2Ban. Os bydd rhywun yn ceisio defnyddio'ch cyfrinair yn grym brwd, bydd Fail2Ban yn rhwystro eu cyfeiriad IP yn awtomatig.

Gyda'r tair haen hyn o amddiffyniad wedi'u cyfuno, gallwch chi roi Gweinyddwr ar y rhyngrwyd cyhoeddus gyda thawelwch meddwl.

Gweithrediad un clic, mae'n un clic mewn gwirionedd.

Mae'r broses leoli yn hynod o syml.

#!/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 "=================================================="

Sut i redeg y sgript: Rhowch ganiatâd gweithredu i'r sgript:

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

Rhedeg y sgript gan ddefnyddio sudo:

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

Rhowch y wybodaeth ffurfweddu fel y gofynnir:

  • Rhowch eich enw defnyddiwr HestiaCP (e.e., admin).
  • Rhowch yr is-barth llawn sydd wedi'i baratoi (e.e., adminer.example.com).
  • Rhowch eich cyfrinair diogelwch (e.e., MySuperPassword123)

Bydd y sgript yn cwblhau'r broses ffurfweddu gyfan yn awtomatig heb adael unrhyw beth allan.

Mae'r broses gyfan yn cymryd tua un neu ddau funud. Bydd y sgript yn trin popeth yn awtomatig, ac nid oes angen i chi weithredu unrhyw orchmynion â llaw.

Ar ôl i chi orffen, gallwch gael mynediad i'r Adminer drwy https://yourdomain/index.php

Rhai cwestiynau y gallech fod yn bryderus amdanynt

Efallai y bydd rhai ffrindiau'n gofyn, a yw'r sgript hon yn cefnogi sawl fersiwn o PHP?

Ydy, mae'n cael ei gefnogi. Bydd y sgript yn canfod pob gwasanaeth PHP-FPM sy'n rhedeg ar y system yn awtomatig ac yn eu hail-lwytho un wrth un. Felly mae'n gweithio'n iawn p'un a ydych chi'n defnyddio PHP 7.4 neu PHP 8.2.

Efallai y bydd rhai ffrindiau’n gofyn, beth os ydw i eisiau newid fy nghyfrinair?

Mae'n syml iawn; ail-redeg y sgript. Bydd y sgript yn adfywio'r hash cyfrinair, yn ail-gyflunio dilysiad Nginx, ac yn ail-gyflunio Fail2Ban. Bydd yr hen gyfluniad yn cael ei drosysgrifennu.

Beth os ydw i eisiau ei ddadosod?

Gallwch ddileu cyfeiriadur gwraidd y we, ffeil cyfrinair, a chyfluniad Fail2Ban â llaw. Ni fydd y sgript yn gadael unrhyw olion eraill ar y system.

Ysgrifennwch ar y diwedd

Rydw i bob amser wedi teimlo na ddylai gweithrediadau a chynnal a chadw fod mor gymhleth.

Gellir awtomeiddio llawer o dasgau â llaw gan ddefnyddio sgriptiau. Mae hyn yn caniatáu ichi dreulio'ch amser ar bethau pwysicach, fel optimeiddio perfformiad gweinydd, monitro statws cymwysiadau, ac ymchwilio i dechnolegau newydd.

Mae hyn yn fy atgoffa o stori hanesyddol. Yn y 1880au, dechreuodd trydan ledaenu yn yr Unol Daleithiau. Gwariodd llawer o berchnogion ffatrïoedd lawer o arian i brynu generaduron a moduron trydan a'u gosod yn eu ffatrïoedd. Fodd bynnag, ar ôl eu gosod, canfu llawer nad oedd effeithlonrwydd cynhyrchu wedi gwella'n sylweddol. Roedd hyn oherwydd mai dim ond peiriannau stêm oeddent wedi'u disodli â moduron trydan, ond arhosodd cynllun, prosesau a dulliau rheoli cyffredinol y ffatri yr un fath.

Y rhai a elwodd yn wirioneddol o'r ffyniant trydan oedd y cyntaf i ddeall beth oedd trydan yn ei olygu mewn gwirionedd. Fe wnaethant ailgynllunio llinellau cynhyrchu, ailstrwythuro gweithdai, ac aildrefnu'r ffordd y gweithredodd gweithwyr.

Mae'r un peth yn berthnasol i awtomeiddio gweithrediadau a chynnal a chadw. Mae llawer o bobl yn gwybod y gellir defnyddio sgriptiau, ond maen nhw'n dal i ffafrio gweithrediad â llaw, yn union fel y perchnogion ffatrïoedd hynny yn y gorffennol a oedd yn gwybod am foduron trydan ond a oedd yn dal i ddefnyddio meddylfryd peiriannau stêm i'w defnyddio. Nid yw sgriptiau i fod i ddisodli eich barn, ond i awtomeiddio tasgau ailadroddus, mecanyddol, a thueddol o wneud gwallau, gan ganiatáu ichi ganolbwyntio eich egni ar yr hyn sydd wir angen meddwl amdano.

Dyma sut y daeth y sgript hon i fodolaeth. Datrysodd bwynt poen i mi, a gobeithio y gall eich helpu chi hefyd.

Os ydych chi'n defnyddio HestiaCP ac Adminer, efallai yr hoffech chi roi cynnig ar y sgript hon. Gallai arbed llawer o amser i chi.

Gan eich bod wedi darllen hyd yma, os oeddech chi'n ei chael hi'n ddefnyddiol, hoffwch a rhannwch hi. Os ydych chi eisiau derbyn diweddariadau yn gyntaf, gallwch chi fy nilyn i hefyd!

Diolch am ddarllen fy erthygl. Hwyl fawr.

发表 评论

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

Sgroliwch i'r brig