HestiaCP Administrator skriptini bir marta bosish orqali avtomatlashtirilgan joylashtirishni ta'minlaydi (shu jumladan Nginx autentifikatsiyasi + Fail2Ban ikki tomonlama himoyasi).

Adminerni qo'lda o'rnatishni to'xtating! Bitta skript butun xavfsizlik konfiguratsiyasini boshqarishi mumkin.

Bir necha kun oldin, tizim ma'muriyatida ishlaydigan bir do'stim menga Adminerni serveriga o'rnatish uchun kunning ko'p qismini sarflashidan shikoyat qildi. Gap Adminerni o'rnatish qiyin emas; bu shunchaki PHP fayli, uni shunchaki tashlab yuborishingiz mumkin va u ishlaydi. Lekin muammo shundaki, siz shunchaki PHP faylini tashlab, uni bir kunga chaqira olmaysiz.

Brute-force hujumlarining oldini olish uchun siz subdomenlarni sozlashingiz, plaginlarni yuklashingiz, Nginx autentifikatsiyasini o'rnatishingiz va Fail2Ban-ni sozlashingiz kerak . Har bir qadam murakkab emas, lekin ular birgalikda bir nechta parchalangan buyruqlar va konfiguratsiya fayllarini hosil qiladi.

Bundan ham zerikarlisi shundaki, autentifikatsiya va xavfsizlik devorlari kabi xavfsizlik bilan bog'liq konfiguratsiyalar xatolarga moyil. Kichik bir xato ma'lumotlar bazasini boshqarish interfeysini ommaviy internetga chiqarishi va uni hamma uchun ochiq qilishi mumkin.

O'shanda kuldim, chunki ilgari ham shunday qilgan edim. Keyinchalik, bunga chiday olmadim, shuning uchun barcha bosqichlarni avtomatlashtirish uchun bir marta bosish orqali joylashtirish skriptini yozdim.

HestiaCP Administrator skriptini bir marta bosish orqali avtomatlashtirilgan joylashtirishni ta'minlaydi (shu jumladan Nginx autentifikatsiyasi + Fail2Ban ikki tomonlama himoyasi).

Nima uchun foydalanmaslik kerakphpMyAdmin

Siz so'rashingiz mumkin, nega ko'proq mashhur bo'lgan phpMyAdmin dan foydalanmasligingiz kerak?

Darhaqiqat, phpMyAdmin ko'proq foydalanuvchilarga va kengroq hamjamiyatga ega. Lekin menimcha, Adminer bir nechta sohalarda yaxshiroq ishlaydi.

Birinchidan, u yengil; Adminer faqat bitta PHP fayli, phpMyAdmin esa bir nechta fayllardan iborat. Ikkinchidan, u xavfsiz; Adminerning dizayn falsafasi "sukut bo'yicha ishonchsiz", ya'ni ma'lumotlar bazasini boshqarish uchun ulanish ma'lumotlarini aniq sozlashingiz kerak.

Yana bir jihat - bu samaradorlik; Administrator katta ma'lumotlar bazalari bilan ishlashda phpMyAdmin-ga qaraganda ancha tezroq.

Albatta, bularning hech biri eng muhim narsalar emas. Eng muhimi shundaki, bu skript endi xavfsizlik bilan bog'liq narsalarni qo'lda sozlashim shart emasligini anglatadi.

Ssenariy aniq nima qildi?

Ushbu skriptning g'oyasi aslida juda oddiy: odatda qo'lda bajaradigan barcha bosqichlarni avtomatlashtirish.

Interaktiv kiritish uchun skript sizdan bir nechta savollarni so'raydi: HestiaCP foydalanuvchi nomi, domen nomi, autentifikatsiya foydalanuvchi nomi va parol. Siz faqat bularni kiritishingiz kerak va skript qolganlarini hal qiladi.

Skript avtomatik ravishda veb-ildiz katalogini yaratadi, apache2-utils (parol fayllarini yaratish uchun ishlatiladi) va PHP muhiti o'rnatilganligini tekshiradi va katalog yaratish va qaramlikni o'rnatishni amalga oshiradi.

Adminerni yuklab olayotganda, skript avval rasmiy ombordan eng so'nggi versiyani yuklab olishga harakat qiladi. Agar rasmiy ombor mavjud bo'lmasa, u avtomatik ravishda barqaror GitHub Releases omboriga o'tadi. Menimcha, bu juda muhim, chunki rasmiy ombor ba'zan beqaror bo'lishi mumkin; Men ilgari ulanish vaqti tugashiga duch kelganman.

Plaginlarni yuklab olish haqida gap ketganda, skript uchta asosiy plaginni yuklab oladi: plugin.php plagin yuklovchisi, fc-sqlite-connection-without-credentials.php parolsiz ulanishlarni boshqarish uchun ishlatiladi va login-password-less.php parol xeshini qo'llab-quvvatlaydi.

Parol xeshini yaratish va index.php ga kelsak, kichik bir tafsilot bor: skript parolni olish uchun $_ENV dan to'g'ridan-to'g'ri foydalanish o'rniga getenv() dan foydalanadi. Bu xesh hisobining bo'sh bo'lishiga olib keladigan php.ini konfiguratsiyasidagi muammoning oldini oladi. Men o'zim ham bu muammoga duch keldim va php.ini da 'E' diapazoni yoqilmaganligini aniqlash uchun uzoq vaqt sarfladim.

Nginx autentifikatsiyasini sozlash uchun skript Nginx asosiy konfiguratsiya faylini to'g'ridan-to'g'ri o'zgartirish o'rniga HestiaCP ning mahalliy include mexanizmidan foydalanadi. Ushbu yondashuvning afzalligi shundaki, domen konfiguratsiyasini qayta tiklasangiz ham autentifikatsiya muvaffaqiyatsiz bo'lmaydi.

Fail2Ban konfiguratsiyasida skript 401 xatolarini kuzatish uchun filtrlash qoidasini yaratadi. Agar IP 10 daqiqa ichida 3 marta tizimga kira olmasa, u 1 soat davomida bloklanadi.

Ruxsatnomalarni ta'mirlash va xizmatni qayta yuklash haqida gap ketganda, skript avtomatik ravishda to'g'ri fayl ruxsatnomalarini o'rnatadi va PHP-FPM, Nginx va Fail2Ban-ni qayta yuklaydi.

Men xavfsizlikka jiddiy qarayman.

Rostini aytsam, ma'lumotlar bazasini boshqarish vositalarining xavfsizligi meni eng ko'p qiziqtiradigan narsa.

Bir o'ylab ko'ring, administrator serveringizdagi barcha ma'lumotlar bazalarini to'g'ridan-to'g'ri boshqarishi mumkin. Agar u ommaviy internetga chiqarilsa va kimdir uni skanerlasa, oqibatlari tasavvur qilib bo'lmaydi.

Ushbu skript uch karra himoyaga ega.

Birinchi qavat Nginx'ning HTTP Basic Auth. Administratorga kirganingizda, brauzeringiz foydalanuvchi nomingiz va parolingizni kiritishingizni so'raydigan dialog oynasini ochadi. Faqat to'g'ri ma'lumotlarni kiritgandan keyingina Administrator kirish sahifasini ko'rishingiz mumkin.

Ikkinchi qatlam - bu administratorning o'z parolini xeshlash orqali kirishi. Men index.php faylida parolni xeshlashni sozladim, shuning uchun kimdir Nginx autentifikatsiyasini chetlab o'tsa ham, ular administratorning kirish parolini bilishmaydi.

Uchinchi qatlam - Fail2Ban'ning qo'pol kuch ishlatishdan himoyasi. Agar kimdir sizning parolingizni qo'pol kuch ishlatishga harakat qilsa, Fail2Ban ularning IP manzilini avtomatik ravishda bloklaydi.

Ushbu uchta himoya qatlami birlashtirilganda, siz Administratorni xotirjamlik bilan ommaviy internetga qo'yishingiz mumkin.

Bir marta bosish bilan amalga oshiriladigan operatsiya, aslida bu bitta bosish.

Joylashtirish jarayoni juda oddiy.

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

Skriptni qanday ishga tushirish kerak: Skriptga bajarish uchun ruxsat bering:

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

Skriptni sudo yordamida ishga tushiring:

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

So'ralganda konfiguratsiya ma'lumotlarini kiriting:

  • HestiaCP foydalanuvchi nomingizni kiriting (masalan, admin).
  • Tayyorlangan to'liq subdomenni kiriting (masalan, adminer.example.com).
  • Xavfsizlik parolingizni kiriting (masalan, MySuperPassword123)

Skript hech narsani qoldirmasdan butun konfiguratsiya jarayonini avtomatik ravishda yakunlaydi.

Butun jarayon taxminan bir yoki ikki daqiqa davom etadi. Skript hamma narsani avtomatik ravishda bajaradi va siz hech qanday buyruqlarni qo'lda bajarishingiz shart emas.

Tugatganingizdan so'ng, siz https://yourdomain/index.php orqali Administratorga kirishingiz mumkin

Sizni tashvishga solishi mumkin bo'lgan ba'zi savollar

Ba'zi do'stlar so'rashlari mumkin, bu skript bir nechta PHP versiyalarini qo'llab-quvvatlaydimi?

Ha, u qo'llab-quvvatlanadi. Skript tizimda ishlayotgan barcha PHP-FPM xizmatlarini avtomatik ravishda aniqlaydi va ularni birma-bir qayta yuklaydi. Shunday qilib, siz PHP 7.4 yoki PHP 8.2 dan foydalanayotgan bo'lsangiz ham, u yaxshi ishlaydi.

Ba'zi do'stlarim, agar parolimni o'zgartirmoqchi bo'lsam nima bo'ladi, deb so'rashlari mumkin.

Bu juda oddiy; shunchaki skriptni qayta ishga tushiring. Skript parol xeshini qayta yaratadi, Nginx autentifikatsiyasini qayta sozlaydi va Fail2Banni qayta sozlaydi. Eski konfiguratsiya ustidan yoziladi.

Agar uni o'chirib tashlamoqchi bo'lsam-chi?

Siz shunchaki veb-ildiz katalogini, parol faylini va Fail2Ban konfiguratsiyasini qo'lda o'chirishingiz mumkin. Skript tizimda boshqa hech qanday iz qoldirmaydi.

Oxirida yozing

Men har doim operatsiyalar va texnik xizmat ko'rsatish unchalik murakkab bo'lmasligi kerak deb o'ylaganman.

Ko'pgina qo'lda bajariladigan vazifalar aslida skriptlar yordamida avtomatlashtirilishi mumkin. Bu sizga vaqtingizni server ish faoliyatini optimallashtirish, dastur holatini kuzatish va yangi texnologiyalarni tadqiq qilish kabi muhimroq narsalarga sarflash imkonini beradi.

Bu menga tarixiy bir voqeani eslatadi. 1880-yillarda Qo'shma Shtatlarda elektr energiyasi tarqala boshladi. Ko'pgina zavod egalari generatorlar va elektr motorlarini sotib olish uchun ko'p pul sarfladilar va ularni o'z zavodlariga o'rnatdilar. Biroq, o'rnatishdan so'ng, ko'pchilik ishlab chiqarish samaradorligi sezilarli darajada yaxshilanmaganligini aniqladi. Buning sababi, ular faqat bug 'dvigatellarini elektr motorlari bilan almashtirganliklari, ammo zavodning umumiy joylashuvi, jarayonlari va boshqaruv usullari o'zgarishsiz qolganligi edi.

Elektr energiyasi bumidan chinakam foyda ko'rganlar elektr energiyasi aslida nimani anglatishini birinchi bo'lib angladilar. Ular ishlab chiqarish liniyalarini qayta loyihalashtirdilar, ustaxonalarni qayta tuzdilar va ishchilarning ishlash usulini qayta tashkil etdilar.

Xuddi shu narsa operatsiyalar va texnik xizmat ko'rsatishni avtomatlashtirishga ham tegishli. Ko'p odamlar skriptlardan foydalanish mumkinligini bilishadi, lekin ular hali ham qo'lda boshqarishni afzal ko'rishadi, xuddi o'tmishdagi zavod egalari kabi, ular elektr motorlari haqida bilishgan, ammo baribir ulardan foydalanish uchun bug 'dvigatellarining fikrlash tarzidan foydalanishgan. Skriptlar sizning fikringizni almashtirish uchun emas, balki takroriy, mexanik va xatolarga moyil vazifalarni avtomatlashtirish uchun mo'ljallangan bo'lib, sizga energiyangizni chindan ham fikrlashni talab qiladigan narsalarga qaratish imkonini beradi.

Bu ssenariy mana shunday paydo bo'ldi. Bu men uchun bir muammoni hal qildi va umid qilamanki, sizga ham yordam beradi.

Agar siz HestiaCP va Adminerdan foydalanayotgan bo'lsangiz, ushbu skriptni sinab ko'rishingiz mumkin. Bu sizga ko'p vaqtni tejashga yordam beradi.

Siz shu yergacha o'qiganingiz uchun, agar foydali bo'lgan bo'lsa, iltimos, layk bosing va ulashing. Agar birinchi bo'lib yangiliklardan xabardor bo'lishni istasangiz, meni kuzatib borishingiz ham mumkin!

Maqolamni o'qiganingiz uchun tashakkur. Keyingi safar ko'rishguncha.

发表 评论

língíngíngíngíngíngíngíngíngíngíngíngíngín *​​

Top o'ting