نصب phpMyAdmin در CentOS 7 و ایمن سازی آن
این را اول بخوانید: اگر با جستوجوی «نصب phpMyAdmin در CentOS 7» به اینجا رسیدهاید، خبر مهمی هست. CentOS 7 در ۳۰ ژوئن ۲۰۲۴ به پایان عمر پشتیبانی رسید، مخازن بستههای آن از آینههای اصلی به بایگانی منتقل شد و امروز روی یک نصب استاندارد، حتی نخستین دستور نصب هم با خطای دسترسی به مخزن متوقف میشود. خط تولید CentOS Linux دیگر وجود ندارد.
مشکل به همینجا ختم نمیشود. حتی اگر به هر ترفندی CentOS 7 را وادار به نصب کنید، دو مانع دیگر سر راهتان است که در ادامه دقیق توضیح میدهم: بستهی phpMyAdmin دیگر در مخزن EPEL نسل جدید نیست، و دستورهای دسترسی Apache که در آموزشهای قدیمی آمده، در نسخهی امروزی Apache اصلاً معتبر نیستند و باعث میشوند وب سرور بالا نیاید.
به همین دلیل این مقاله به طور کامل بازنویسی شده و هدف آن AlmaLinux 9 است؛ توزیع رایگان و سازگار با Red Hat که مقصد طبیعی مهاجرت کاربران CentOS به شمار میرود. همهی دستورها با dnf نوشته شدهاند. همین مراحل روی Rocky Linux 9 هم بدون تغییر کار میکند.
phpMyAdmin چیست؟
phpMyAdmin یک ابزار متنباز و مبتنی بر PHP برای مدیریت سرورهای MySQL و MariaDB از طریق یک رابط وب است. با آن میتوانید پایگاه داده بسازید، جدولها را ببینید و ویرایش کنید، پرسوجوهای SQL اجرا کنید، کاربران و دسترسیها را مدیریت کنید و از دادهها خروجی بگیرید یا آنها را وارد کنید.
سیستمهای مدیریت پایگاه داده مانند MySQL و MariaDB زیربنای بخش بزرگی از وبسایتها و برنامههای کاربردی هستند، اما کار کردن با آنها فقط از طریق خط فرمان برای همه راحت نیست. پروژهی phpMyAdmin دقیقاً برای پر کردن همین شکاف ساخته شد.

چرا آموزشهای قدیمی امروز شکست میخورند؟
سه تفاوت بنیادی بین دنیای CentOS 7 و امروز وجود دارد. اگر آنها را ندانید، ساعتها وقت صرف عیبیابی میکنید.
یک: phpMyAdmin دیگر در EPEL نیست
آموزشهای قدیمی میگفتند مخزن EPEL را اضافه کنید و بعد با یک دستور ساده بسته را نصب کنید. این روش امروز جواب نمیدهد؛ بستهی phpMyAdmin نه در مخازن پایهی AlmaLinux 9 هست و نه در EPEL نسل نهم. بنابراین باید یا آن را دستی از سایت رسمی نصب کنید یا از مخزن شخص ثالث Remi استفاده کنید. هر دو راه را در ادامه توضیح میدهم.
دو: دستورهای Apache 2.2 دیگر معتبر نیستند
در آموزشهای قدیمی خطوطی مثل Allow from و Order allow,deny دیده میشد. اینها مربوط به Apache 2.2 هستند و در Apache 2.4 که روی AlmaLinux 9 نصب میشود، ماژول مربوط به آنها به صورت پیشفرض بارگذاری نمیشود. نتیجه این است که اگر آن خطوط را در فایل پیکربندی بگذارید، Apache با خطای نحوی بالا نمیآید و کل سایتهای سرور از دسترس خارج میشوند. امروز فقط دستور Require معتبر است.
سه: ماژول mod_php حذف شده است
در CentOS 7، وب سرور کد PHP را با ماژول داخلی mod_php اجرا میکرد. در AlmaLinux 8 و ۹ این ماژول حذف شده و PHP به صورت سرویس مستقل php-fpm اجرا میشود. اگر آن سرویس فعال نباشد، به جای اجرای phpMyAdmin، مرورگر کد خام PHP را دانلود میکند یا صفحهی سفید نشان میدهد.
پیشنیازها
- سروری با AlmaLinux 9 و دسترسی SSH با کاربر
rootیا کاربری با اجازهیsudo. - بستهی LAMP یعنی Apache، MariaDB و PHP نصب و فعال باشد. اگر هنوز این کار را نکردهاید، آموزش بهروز نصب LAMP را که برای AlmaLinux 9 بازنویسی شده دنبال کنید.
- ترجیحاً یک دامنه یا زیردامنه که به سرور اشاره کند، تا بتوانید گواهی SSL بگیرید. کار کردن با phpMyAdmin روی اتصال رمزنگارینشده اشتباه جدی است.
اگر ترجیح میدهید این پیکربندیها را خودتان انجام ندهید، روی سرور مجازی مدیریتشده این کارها بر عهدهی تیم پشتیبانی است.
مرحلهی صفر: افزونههای PHP مورد نیاز
phpMyAdmin برای کار کردن به چند افزونهی PHP نیاز دارد. توجه کنید که بستهی قدیمی php-mysql در این نسل وجود ندارد و جایگزین آن php-mysqlnd است:
sudo dnf install php-mysqlnd php-mbstring php-xml php-gd php-zip -y
سپس سرویسها را بازخوانی کنید:
sudo systemctl restart php-fpm
sudo systemctl restart httpd
برای اطمینان از اینکه افزونهها بارگذاری شدهاند:
php -m
روش اول: نصب دستی از سایت رسمی
این روش را توصیه میکنم، چون به هیچ مخزن شخص ثالثی وابسته نیست و همیشه آخرین نسخهی پایدار را به شما میدهد. نسخههای قدیمی phpMyAdmin آسیبپذیریهای شناختهشده دارند، پس همیشه از صفحهی دانلود رسمی نشانی آخرین نسخه را بردارید.
دانلود و استخراج
ابتدا به مسیر موقت بروید و بسته را دریافت کنید. نشانی زیر همیشه به آخرین نسخهی چندزبانه اشاره میکند:
cd /tmp
curl -LO https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz
حالا بسته را باز کنید:
tar -xzf phpMyAdmin-latest-all-languages.tar.gz

پوشهی استخراجشده نام نسخه را در خود دارد. آن را به مسیر استاندارد منتقل کنید. با استفاده از الگوی زیر لازم نیست شمارهی نسخه را دستی تایپ کنید:
sudo mv /tmp/phpMyAdmin-*-all-languages /usr/share/phpMyAdmin
phpMyAdmin برای نگهداری فایلهای موقت به یک پوشهی قابل نوشتن نیاز دارد. آن را بسازید و مالکیتش را به کاربر وب سرور بدهید:
sudo mkdir -p /usr/share/phpMyAdmin/tmp
sudo chown -R apache:apache /usr/share/phpMyAdmin
sudo chmod 750 /usr/share/phpMyAdmin/tmp
ساخت فایل پیکربندی
فایل نمونه را کپی کنید تا فایل اصلی ساخته شود:
sudo cp /usr/share/phpMyAdmin/config.sample.inc.php /usr/share/phpMyAdmin/config.inc.php
حالا به یک رشتهی مخفی نیاز داریم که phpMyAdmin با آن کوکیهای نشست را رمزنگاری میکند. این رشته باید دقیقاً ۳۲ کاراکتر باشد. یک مقدار تصادفی بسازید:
openssl rand -base64 24
فایل پیکربندی را باز کنید:
sudo nano /usr/share/phpMyAdmin/config.inc.php
خطی که با $cfg['blowfish_secret'] شروع میشود را پیدا کنید و رشتهای که ساختید را داخل گیومهها بگذارید. سپس این دو خط را هم به انتهای فایل اضافه کنید تا مسیر موقت شناخته شود:
$cfg['TempDir'] = '/usr/share/phpMyAdmin/tmp';
$cfg['Servers'][$i]['host'] = 'localhost';
اگر این رشتهی مخفی را خالی بگذارید، phpMyAdmin در بالای صفحه هشدار میدهد و نشستهای شما امن نخواهند بود.
پیکربندی Apache
در نصب دستی، بر خلاف نصب از مخزن، فایل پیکربندی Apache به صورت خودکار ساخته نمیشود و باید خودتان آن را بنویسید:
sudo nano /etc/httpd/conf.d/phpMyAdmin.conf
محتوای زیر را در آن قرار دهید. دقت کنید که در این پیکربندی فقط از دستور Require استفاده شده و هیچ خبری از دستورهای منسوخ Apache 2.2 نیست. مقدار نمونه را با آیپی واقعی رایانهی خودتان جایگزین کنید:
Alias /phpMyAdmin /usr/share/phpMyAdmin
Alias /phpmyadmin /usr/share/phpMyAdmin
<Directory /usr/share/phpMyAdmin/>
AddDefaultCharset UTF-8
Options -Indexes
AllowOverride All
Require ip YOUR_WORKSTATION_IP
</Directory>
<Directory /usr/share/phpMyAdmin/tmp/>
Require all denied
</Directory>
بلوک دوم مهم است و در آموزشهای قدیمی نبود: پوشهی موقت نباید از طریق وب قابل دسترسی باشد.

آیپی خودتان را چطور پیدا کنید؟
برای پر کردن مقدار بالا باید آیپی عمومی رایانهای که با آن به سرور وصل میشوید را بدانید. توجه کنید این آیپی سرور شما نیست، بلکه آیپی خودتان است. کافی است در موتور جستوجو عبارت مربوط به نمایش آیپی را بنویسید تا نشانتان دهد. فقط حواستان باشد در آن لحظه به هیچ سرویسی که آیپی شما را تغییر میدهد متصل نباشید، وگرنه مقدار اشتباهی ثبت میکنید و خودتان را بیرون میگذارید.
اگر آیپی شما ثابت نیست و مدام تغییر میکند، به جای Require ip میتوانید موقتاً از Require all granted استفاده کنید، اما در آن صورت حتماً باید لایهی احراز هویتی که در بخش امنسازی توضیح میدهم را اضافه کنید.
تنظیم SELinux
روی AlmaLinux 9 سازوکار SELinux به صورت پیشفرض فعال است. چون فایلها را دستی جابهجا کردهایم، برچسبهایشان درست نیست و Apache اجازهی خواندنشان را ندارد. برچسبها را اصلاح کنید:
sudo restorecon -Rv /usr/share/phpMyAdmin
و به پوشهی موقت اجازهی نوشتن بدهید:
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/usr/share/phpMyAdmin/tmp(/.*)?"
sudo restorecon -Rv /usr/share/phpMyAdmin/tmp
همچنین برای اینکه PHP بتواند به پایگاه داده وصل شود، این گزینه باید فعال باشد:
sudo setsebool -P httpd_can_network_connect_db 1
خاموش کردن کامل SELinux راهحل نیست؛ آن کار یک لایهی دفاعی واقعی را حذف میکند، مخصوصاً روی ابزاری مثل phpMyAdmin که هدف دائمی حملات است.
در پایان، پیکربندی را بررسی و سرویس را بازخوانی کنید:
sudo apachectl configtest
sudo systemctl restart httpd
روش دوم: نصب از مخزن Remi
اگر ترجیح میدهید بهروزرسانیها از طریق مدیر بسته انجام شود، میتوانید از مخزن Remi استفاده کنید که برای توزیعهای سازگار با Red Hat بستههای PHP و phpMyAdmin ارائه میدهد. ابتدا مخزن EPEL و سپس Remi را اضافه کنید:
sudo dnf install epel-release -y
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm -y
سپس بسته را نصب کنید:
sudo dnf install phpMyAdmin -y
در این روش فایل /etc/httpd/conf.d/phpMyAdmin.conf به صورت خودکار ساخته میشود، اما همچنان باید آن را باز کنید و بخش Require را مطابق توضیحات بالا به آیپی خودتان محدود کنید. توجه داشته باشید که Remi یک مخزن شخص ثالث است و ممکن است بستههای PHP سیستم را هم جایگزین کند؛ اگر روی سرور عملیاتی کار میکنید، این نکته را در نظر بگیرید.
ورود به phpMyAdmin
حالا در مرورگر به نشانی زیر بروید و بخش نمونه را با دامنه یا آیپی سرور خودتان جایگزین کنید:
http://SERVER_DOMAIN_OR_IP/phpmyadmin

برای ورود از نام کاربری و رمز عبور MariaDB خود استفاده کنید.
یک نکتهی مهم که با نسخههای امروزی MariaDB فرق کرده است: در آموزشهای قدیمی توصیه میشد با کاربر root پایگاه داده وارد شوید. امروز کاربر root پایگاه داده به صورت پیشفرض با روش unix_socket احراز هویت میشود، یعنی اصلاً رمزی ندارد و فقط از خط فرمان سرور قابل استفاده است. بنابراین ورود root از طریق وب کار نمیکند و این اتفاق خوبی است. به جای آن یک کاربر مدیریتی جداگانه بسازید:
sudo mariadb
و داخل کنسول:
CREATE USER 'pmaadmin'@'localhost' IDENTIFIED BY 'YOUR_STRONG_PASSWORD';
GRANT ALL PRIVILEGES ON *.* TO 'pmaadmin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;
حالا با همین کاربر وارد شوید. داشبورد phpMyAdmin به شکل زیر خواهد بود:

امنسازی phpMyAdmin
با نصب یک رابط وب روی پایگاه داده، عملاً درِ خانهی دادههایتان را به اینترنت باز کردهاید. به دلیل محبوبیت phpMyAdmin و ارزش دادههایی که پشت آن است، رباتها به صورت خودکار و شبانهروزی مسیرهای رایج آن را روی همهی آیپیها امتحان میکنند. دو راهبرد اصلی برای کاهش این خطر داریم که هر دو را اجرا میکنیم.
راهبرد اول: تغییر مسیر دسترسی
فایل پیکربندی از یک نام مستعار برای اشاره به محل فایلها استفاده میکند. با تغییر آن، مسیر پیشفرضی که رباتها میشناسند از کار میافتد. فایل را باز کنید:
sudo nano /etc/httpd/conf.d/phpMyAdmin.conf
در بالای فایل این دو خط را میبینید:
Alias /phpMyAdmin /usr/share/phpMyAdmin
Alias /phpmyadmin /usr/share/phpMyAdmin
هر دو را حذف کنید و به جایشان یک نام مستعار دلخواه بگذارید. نامی انتخاب کنید که به راحتی حدس زده نشود و ربطی به نام دامنهی شما نداشته باشد:
Alias /nothingtosee /usr/share/phpMyAdmin

نکتهای که در آموزش قدیمی درست منتقل نشده بود: اگر خطوط قبلی را نگه دارید و فقط یک خط جدید اضافه کنید، هیچ امنیتی اضافه نکردهاید، چون مسیر قدیمی هم همچنان کار میکند. باید آنها را پاک کنید.
فایل را ذخیره کنید و سرویس را بازخوانی کنید:
sudo systemctl restart httpd
حالا مراجعه به مسیر قدیمی با خطای ۴۰۴ روبهرو میشود:
http://SERVER_DOMAIN_OR_IP/phpmyadmin

و رابط شما در نشانی تازه در دسترس است:
http://SERVER_DOMAIN_OR_IP/nothingtosee
راهبرد دوم: دروازهی احراز هویت پیش از صفحهی ورود
ویژگی بعدی، یک لایهی احراز هویت در سطح وب سرور است که پیش از آنکه کاربر حتی صفحهی ورود phpMyAdmin را ببیند، از او نام کاربری و رمز میخواهد. این کار حملات حدس رمز را از خود برنامه دور نگه میدارد.
گام اول: ساخت فایل رمز عبور
ابزار htpasswd بخشی از بستهی ابزارهای Apache است. اگر آن را ندارید نصبش کنید:
sudo dnf install httpd-tools -y
حالا فایل رمز را در مسیری خارج از پوشهای که وب سرور ارائه میدهد بسازید. سوییچ -c یعنی فایل را از نو بساز، پس فقط بار اول از آن استفاده کنید:
sudo htpasswd -c /etc/httpd/pma_pass myuser

از شما خواسته میشود رمزی وارد و تکرار کنید. برای افزودن کاربران بعدی، همان دستور را بدون سوییچ -c اجرا کنید، وگرنه فایل قبلی پاک میشود و کاربران قبلی را از دست میدهید:
sudo htpasswd /etc/httpd/pma_pass seconduser
دسترسی فایل را هم محدود کنید تا فقط وب سرور بتواند آن را بخواند:
sudo chown root:apache /etc/httpd/pma_pass
sudo chmod 640 /etc/httpd/pma_pass
گام دوم: معرفی فایل رمز به Apache
دو راه دارید. سادهترین و مطمئنترین راه این است که قوانین را مستقیم در همان فایل پیکربندی بگذارید. فایل را باز کنید:
sudo nano /etc/httpd/conf.d/phpMyAdmin.conf
و بلوک دایرکتوری را به این شکل کامل کنید:

<Directory /usr/share/phpMyAdmin/>
AddDefaultCharset UTF-8
Options -Indexes
AllowOverride All
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /etc/httpd/pma_pass
Require valid-user
</Directory>
معنای هر خط را با هم مرور کنیم:
AuthType Basicنوع احراز هویت را مشخص میکند و از یک فایل رمز عبور استفاده میکند.AuthNameپیامی است که در کادر ورود نمایش داده میشود. آن را عمومی و بینشانه بگذارید تا کسی نفهمد پشت آن چه چیزی محافظت میشود.AuthUserFileمسیر فایل رمز عبور را تعیین میکند و این مسیر باید بیرون از پوشههای قابل دسترسی از وب باشد.Require valid-userیعنی فقط کاربران معتبر این فایل اجازهی عبور دارند.
اگر بخواهید همزمان هم آیپی را محدود کنید و هم رمز بخواهید، از این ترکیب استفاده کنید که هر دو شرط را الزامی میکند:
<RequireAll>
Require ip YOUR_WORKSTATION_IP
Require valid-user
</RequireAll>
روش جایگزین با فایل htaccess
اگر ترجیح میدهید تنظیمات را در خود پوشه نگه دارید، چون بالاتر AllowOverride All را فعال کردهایم، میتوانید فایلی به این نام بسازید:
sudo nano /usr/share/phpMyAdmin/.htaccess
و این محتوا را در آن بگذارید:
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /etc/httpd/pma_pass
Require valid-user

در هر دو حالت، پیکربندی را بررسی و سرویس را بازخوانی کنید:
sudo apachectl configtest
sudo systemctl restart httpd
حالا با مراجعه به نشانی جدید، ابتدا کادر درخواست رمز عبور را میبینید و تنها پس از عبور از آن به صفحهی ورود phpMyAdmin میرسید:


بدون HTTPS همهی کارهای بالا بیاثر است
این بخش در آموزش قدیمی نبود و مهمترین نکتهی این مقاله است. احراز هویت پایهای که ساختیم، نام کاربری و رمز را به شکلی میفرستد که روی اتصال رمزنگارینشده به سادگی قابل خواندن است. همین موضوع دربارهی رمز پایگاه دادهای که در صفحهی ورود phpMyAdmin وارد میکنید هم صدق میکند. بنابراین پیش از آنکه حتی یک بار وارد شوید، گواهی نصب کنید:
sudo dnf install certbot python3-certbot-apache -y
sudo certbot --apache

پس از فعال شدن گواهی، همیشه از نشانی امن استفاده کنید:
https://SERVER_DOMAIN/nothingtosee
برای دامنههای تجاری و فروشگاهی که به اعتبارسنجی سازمانی نیاز دارند، انواع گواهی SSL در دسترس است.
امنترین گزینه: اصلاً آن را روی اینترنت باز نکنید
اگر میخواهید نگرانی را از ریشه حذف کنید، بهترین کار این است که phpMyAdmin را فقط روی localhost در دسترس بگذارید و هر بار از طریق تونل SSH به آن وصل شوید. در این حالت هیچ رباتی در اینترنت حتی نمیداند چنین چیزی روی سرور شما وجود دارد.
در فایل پیکربندی، دسترسی را به سرور محدود کنید:
Require ip 127.0.0.1
و بعد روی رایانهی خودتان این دستور را اجرا کنید تا پورت ۸۰ سرور به پورت ۸۰۸۰ رایانهی شما وصل شود:
ssh -L 8080:127.0.0.1:80 user@SERVER_IP
حالا در مرورگر خودتان این نشانی را باز کنید:
http://127.0.0.1:8080/nothingtosee
تا وقتی تونل SSH برقرار است دسترسی دارید و به محض بستن آن، در کاملاً بسته میشود. برای سرورهایی که دادههای حساس دارند، این روش را به هر روش دیگری ترجیح دهید. اگر زیرساخت شما در مرکز داده مستقر است و به سطح بالاتری از کنترل نیاز دارید، سرویس کولوکیشن گزینهی مناسبی است.
عیبیابی مشکلات رایج
- مرورگر به جای اجرا، فایل PHP را دانلود میکند: سرویس
php-fpmاجرا نیست. باsudo systemctl enable --now php-fpmآن را فعال کنید. - خطای دسترسی ممنوع با وجود درست بودن آیپی: معمولاً برچسبهای SELinux است. دستور
sudo restorecon -Rv /usr/share/phpMyAdminرا اجرا کنید. - هشدار دربارهی رشتهی مخفی در بالای صفحه: مقدار
blowfish_secretرا تنظیم نکردهاید یا طول آن ۳۲ کاراکتر نیست. - Apache بالا نمیآید: به احتمال زیاد خطوط منسوخ
Allow fromیاOrderرا کپی کردهاید. باsudo apachectl configtestخطای دقیق را ببینید. - ورود با کاربر root پایگاه داده کار نمیکند: این رفتار درست است؛ یک کاربر جداگانه بسازید.
جمعبندی
شما phpMyAdmin را روی یک سیستم عامل پشتیبانیشده نصب کردید، مسیر دسترسیاش را تغییر دادید، پیش از آن یک دروازهی احراز هویت گذاشتید، ارتباط را رمزنگاری کردید و در صورت تمایل آن را کاملاً از دید اینترنت پنهان کردید. حالا میتوانید پایگاه دادهها را ببینید، پرسوجو اجرا کنید و ساختارهای تازه بسازید، بدون اینکه سرورتان را در معرض خطر بگذارید.
برای نگه داشتن امنیت در بلندمدت، phpMyAdmin را همیشه بهروز نگه دارید و اگر سرور شما میزبان چند سایت است، افزودن یک اسکنر بدافزار مانند لایسنس CXS را در نظر بگیرید. اگر هم نمیخواهید درگیر مدیریت این ابزارها شوید، هاست لینوکس ایران این امکانات را از پیش پیکربندیشده در اختیارتان میگذارد.
اطلاعات بیشتر دربارهی مخزن EPEL را میتوانید در صفحهی رسمی آن ببینید.
روی کمک ما حساب کنید
در هر مرحله از نصب phpMyAdmin با هر مشکلی برخورد کردید، هر تلاش ناموفقی داشتید یا هر جا نیاز به کمک داشتید، آنلاین سرور پشتیبان شماست و میتوانید از اینجا کمک بگیرید.
ارسال نظر