امن سازی MySQL، چرا و چگونه؟

   
نام نویسنده:
|
دسته بندی:
|
پایگاه داده MySQL، یکی از محبوب ترین پایگاه های داده در اینترنت است که اغلب همراه با PHP استفاده می¬شود. در کنار مزیت های بسیار آن مانند استفاده راحت و کارآیی نسبتا بالای آن، MySQL، مکانیزم های ساده و موثری برای حفظ امنیت خود دارد.

 1. معرفی

پایگاه داده MySQL، یکی از محبوب ترین پایگاه های داده در اینترنت است که اغلب همراه با PHP استفاده می­شود. در کنار مزیت های بسیار آن مانند استفاده راحت و کارآیی نسبتا بالای آن، MySQL، مکانیزم های ساده و موثری برای حفظ امنیت خود دارد. متاسفانه، نصب پیشفرض این پایگاه داده، به ویژه رمز عبور root و آسیب پذیری بالقوه در برابر حملات، این پایگاه داده را، هدف راحتی برای حمله کنندگان قرار داده است.

در این مقاله، گام هایی اساسی برای امن سازی هرچه بیشتر پایگاه داده MySQL در برابر حملات محلی و نیز حملات از راه دور توضیح داده است.

2.1  قابلیت

در این آموزش، فرض بر این است که وب سرور آپاچی همراه با PHP نصب گردیده و در مسیر /chroot/httpd قرار گرفته است. علاوه بر آن چند نکته زیر را هم باید در نظر داشت:

  • پایگاه داده MySQL که تنها همراه با برنامه های PHP استفاده خواهد شد، باید بر روی همان host نصب گردد.
  • ابزارهای مدیریتی پیشفرض، مانند mysqladmin، mysql، mysqldump و غیره برای مدیریت پایگاه داده استفاده می شوند.
  • پشتیبان گیری راه دور از داده ها با استفاده از پروتکل SSH فراهم می شود.

3.1 پیش نیازهای امنیتی

به منظور دستیابی به سطح بالایی از امنیت، نصب و پیکربندی MySQL باید همراه با پیش نیازهای امنیتی زیر انجام گیرد:

  • پایگاه داده MySQL باید در یک محیط chroot اجرا گردد.
  • فرآیندهای MySQL باید تحت UID/GID که توسط فرآیندهای سیستمی دیگر استفاده نمی شوند، اجرا گردد.
  • تنها دسترسی محلی به MySQL اجازه داده می شود.
  • حساب کاربری ریشه (root) پایگاه داده MySQL باید به وسیله یک رمز عبور مشکل، محافظت شود.
  • حساب کاربری administrator تغییر نام می­یابد.
  • دسترسی های ناشناخته به پایگاه داده غیرفعال خواهد شد.
  • تمام پایگاه داده ها و جداول نمونه و مثال حذف خواهد شد.
  1. نصب MySQL

قبل از شروع امن سازی MySQL، باید نرم افزار را بر روی سرور نصب کنیم که با نصب یک گروه واحد و حساب کاربری بر روی سیستم عامل شروع می کنیم که به پایگاه داده MySQL اختصاص داده خواهد شد:

pw groupadd mysql
  

  pw useradd mysql -c "MySQL Server" -d /dev/null -g mysql -s /sbin/nologin

1.2 کامپایل MySQL

نرم افزار MySQL را در مسیر /usr/local/mysql کامپایل و نصب می­کنیم.

./configure --prefix=/usr/local/mysql --with-mysqld-user=mysql --with-unix-socket-path=/tmp/mysql.sock --with-mysqld-ldflags=-all-static
  

  make
  

  su
  

  make install
  

  strip /usr/local/mysql/libexec/mysqld
  

  scripts/mysql_install_db
  

  chown -R root /usr/local/mysql
  

  chown -R mysql /usr/local/mysql/var
  

  chgrp -R mysql /usr/local/mysql

در حالت کلی، فرآیند نصب سرور در راهنمای MySQL نوشته شده است. تنها تغییر، استفاده از پارامترهای اضافی است که در خط ./configure مشخص می­شود. مهمترین تفاوت استفاده از پارامترهای –with-mysqld-ldflags=-all-static می باشد که باعث می شود که سرور MySQL به صورت استاتیک اضافه گردد. این عمل فرآیند chroot کردن سرور را ساده می کند که در بخش 3 توضیح داده می شود. با توجه به پارامترهای دیگر، دستور make برای اجرای فرآیند پیش زمینه MySQL با امتیازات حساب mysql و ایجاد سوکت mysql.sock در مسیر /tmp ، به کار می رود.

2.2 کپی کردن فایل پیکربندی

بعد از اجرای دستورات بالا، باید فایل پیکربندی پیشفرض را مطابق با اندازه مورد انتظار پایگاه داده (کوچک، متوسط، بزرگ و خیلی بزرگ) کپی کنیم. برای مثال:

cp support-files/my-medium.cnf /etc/my.cnf
  

  chown root:sys /etc/my.cnf
  

  chmod 644 /etc/my.cnf

3.2 شروع سرور

در اینجا، MySQL به صورت کامل نصب شده است و برای اجرا آماده است. سرور MySQL را با اجرای دستور زیر می توان شروع کرد:

/usr/local/mysql/bin/mysqld_safe &

4.2 تست یک اتصال

برای آماده کردن یک اتصال به پایگاه داده به صورت زیر عمل کنید.

/usr/local/mysql/bin/mysql -u root mysql Welcome to the MySQL monitor.  Commands end with ; or \g. Your MySQL connection id is 2 to server version: 4.0.13-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> show databases; +----------+ | Database | +----------+ | mysql    | | test     | +----------+ 2 rows in set (0.00 sec) mysql> quit;

یک بار که اتصال به صورت موفقیت آمیز فراهم شد، می توانید پایگاه داده را خاموش کنید.

/usr/local/mysql/bin/mysqladmin -u root shutdown

و امن سازی نرم افزار را شروع کنید. به عبارت دیگر، باید اطلاعات ذخیره شده در فایل لاگ /usr/local/mysql/var/’hostname’.err را تحلیل کرده و دلیل بروز هر مشکل را حذف کنید.

3. chroot کردن سرور

 

اولین قدم امن سازی MySQL، آماده سازی محیط chroot شده است که در آن محیط، سرور MySQL اجرا خواهد شد.

3.1. سیستم عامل

سیستم عامل مورد استفاده در این مقاله، FreeBSD 4.7 می باشد. متدهایی که در اینجا استفاده می شود در سیستم عامل ها یونیکس و شبه یونیکس نیز استفاده می شود.

3.2. آماده سازی محیط chroot

به منظور آماده سازی محیط chroot، نیاز به ایجاد مسیرهای زیر می باشد:

mkdir -p /chroot/mysql/dev
  

  mkdir -p /chroot/mysql/etc
  

  mkdir -p /chroot/mysql/tmp
  

  mkdir -p /chroot/mysql/var/tmp
  

  mkdir -p /chroot/mysql/usr/local/mysql/libexec
  

  mkdir -p /chroot/mysql/usr/local/mysql/share/mysql/english

3.3 تنظیم حق دسترسی

برای دسترسی به مسیرهای بالا، دستورات زیر اجرا می شود:

chown -R root:sys /chroot/mysql
  

  chmod -R 755 /chroot/mysql
  

  chmod 1777 /chroot/mysql/tmp

4.3 کپی فایل ها

در مرحله بعد، فایل های زیر باید در مسیرهای جدید، کپی شوند.

cp /usr/local/mysql/libexec/mysqld /chroot/mysql/usr/local/mysql/libexec/
  

  cp /usr/local/mysql/share/mysql/english/errmsg.sys /chroot/mysql/usr/local/mysql/share/mysql/english/
  

  cp /etc/hosts /chroot/mysql/etc/
  

  cp /etc/host.conf /chroot/mysql/etc/
  

  cp /etc/resolv.conf /chroot/mysql/etc/
  

  cp /etc/group /chroot/mysql/etc/
  

  cp /etc/master.passwd /chroot/mysql/etc/passwords
  

  cp /etc/my.cnf /chroot/mysql/etc/

5.3 ایجاد رمزهای عبور و گروه ها

در دو فایل /chroot/mysql/etc/passwords و /chroot/mysql/etc/group باید تمام خطوط به جز حساب کاربر mysql و گروه حذف گردد. بعد از آن، باید پایگاه داده رمز عبور به صورت زیر ساخته شود.

cd /chroot/mysql/etc
  

  pwd_mkdb -d /chroot/mysql/etc passwords
  

  rm -rf /chroot/mysql/etc/master.passwd

6.3 بررسی های خاص

به منظوراستفاده از وب سرور آپاچی، باید فایل خاصی را در دایرکتوری مربوط به /dev یعنی دایرکتری /dev/null ایجاد کنیم:

ls -al /dev/null  crw-rw-rw-  1 root  sys    2,   2 Jun 21 18:31 /dev/null mknod /chroot/mysql/dev/null c 2 2 chown root:sys /chroot/mysql/dev/null chmod 666 /chroot/mysql/dev/null

همچنین باید پایگاه داده mysql را در طول نصب MySQL کپی کرده که شامل جداولی که حق اعطای مجوز (Grant) دارند، می شود.

cp -R /usr/local/mysql/var/ /chroot/mysql/usr/local/mysql/var
  

  chown -R mysql:mysql /chroot/mysql/usr/local/mysql/var

7.3 محلی سازی

اگر هر زبان دیگری به جز انگلیسی استفاده می شود، باید مجموعه کارکترهای مناسب آن زبان نیز در دایرکتوری /usr/local/mysql/share/mysql/charsets کپی شود.

8.3 تست پیکربندی

تا اینجا، پایگاه داده MySQL در یک محیط chroot اجرا می شود. می توان پایگاه داده را با دستور زیر تست کرد تا از درست کار کردن آن اطمینان یابیم.

chrootuid /chroot/mysql mysql /usr/local/mysql/libexec/mysqld &

اگر هر گونه خطایی وجود داشته باشد، باید از دستور truss یا دستوری شبیه آن مانند ktrace/kdump و غیره استفاده کرد که این دستورات کمک می کند تا خطا مشخص شده و برطرف گردد.

توجه داشته باشید که برای اجرای فرآیند mysqld، برنامه chrootuid بجای chroot، بخصوص در آپاچی یا PHP استفاده می شود. تفاوت اصلی در اینست که chrootuid، مالک اجرای فرآیند را تغییر می دهد. در مثال ما، mysqld در محیط chroot اجرا می شود ولی مالک فرآیند کاربر root نیست و کاربر mysql  می باشد. chrootuid بصورت پیشفرض در بسیاری از سیستم عامل ها نصب نمی شود و لازم است که به صورت دستی دانلود و نصب گردد.

4 پیکربندی سرور

گام بعدی، پیکربندی سرور پایگاه داده جهت رفع نیازهای امنیتی است. پس از نصب MySQL در حالت پیشفرض، فایل پیکربندی اصلی فایل /etc/my.cnf می باشد. ولی در اینجا، به دلیل اجرای سرور در محیط chroot، از دو فایل پیکربندی استفاده می کنیم: فایل /chroot/mysql/etc/my.cnf و فایل /etc/my.cnf. اولین فایل توسط سرور MySQL و فایل دیگر توسط ابزارهای MySQL استفاده خواهد شد (به طور مثال mysqladmin، mysql و mysqldump). در هر دو مورد، بعضی از پیکربندی های تغییر یافته لازم خواهد شد.

1.4 غیر فعال کردن دسترسی از راه دور

اولین تغییری که بر روی پورت tcp انجام می شود، تغییر آن به 3306 است که MySQL به صورت پیشفرض از آن استفاده می کند. زیر طبق فرضیات اولیه، پایگاه داده تنها توسط برنامه های PHP استفاده خواهد شد که ما می توانیم آزادانه انتظار در این پورت را غیر فعال کنیم. این امر امکان حمله به پایگاه داده MySQL را توسط اتصالات مستقیم TCP/IP از دیگر هاست ها، محدود خواهد کرد. ارتباط محلی همچنان از سمت سوکت mysql.sock کنار گذاشته خواهد شد. به منظور غیرفعال سازی گوش دادن بر روی پورت ذکر شده، پارامتر زیر باید به قسمت [mysqld] در /chroot/mysql/etc/my.cnf اضافه خواهد شد:

skip-networking

اگر، به دلایلی، دسترسی راه دور به پایگاه داده همچنان لازم باشد (مثلا پشتیبان گیری از داده ها از راه دور)، پروتکل SSH می تواند مانند زیر استفاده شود:

backuphost$ ssh mysqlserver /usr/local/mysql/bin/mysqldump -A > backup

2.4 بهبود امنیت محلی

تغییر بعدی، غیرفعال کردن استفاده از دستور LOAD DATA LOCAL INFILE است که به شما کمک می کند تا از دسترسی ناخواسته به فایل های محلی جلوگیری کنید. این اتفاق به خصوص زمانی می افتد که آسیب پذیری های جدیدی در SQL در برنامه های PHP پیدا شود.

برای انجام این کار، پارامتر زیر باید به بخش [mysqld] در فایل /chroot/mysql/etc/my.cnf اضافه شود:

set-variable = local-infile = 0

علاوه بر این، برای آسان کردن ابزار مدیریتی پایگاه داده، پارامتر زیر باید در بخش [client] در فایل /etc/my.cnf تغییر یابد:

socket = /chroot/mysql/tmp/mysql.sock

3.4 تغییر رمز عبور ادمین

یکی از مهمترین گام ها در امن سازی MySQL، تغییر رمز عبور ادمین پایگاه داده است که به صورت پیشفرض خالی می باشد. به منظور انجام چنین کاری، باید MySQL را به صورت زیر اجرا کنیم:

chrootuid /chroot/mysql mysql /usr/local/mysql/libexec/mysqld &

و پسورد را به صورت زیر تغییر دهیم:

/usr/local/mysql/bin/mysql -u root
  

  mysql> SET PASSWORD FOR root@localhost=PASSWORD('new_password');

4.4 حذف پایگاه داده های پیشفرض

بعد از تغییر رمز عبور، باید پایگاه داده نمونه، تمام حساب های کاربری به جز حساب کاربری root را حذف می کنیم:

  mysql> drop database test;  mysql> use mysql;  mysql> delete from db;  mysql> delete from user where not (host="localhost" and user="root");  mysql> flush privileges;

با این کار از ایجاد اتصالات ناشناخته و نامناسب به پایگاه داده جلوگیری می شود.

5.4 تغییر نام ادمین

همچنین توصیه می شود که نام حساب کاربری پیشفرض که root نام دارد، به نامی متفاوت و سخت تر تغییر یابد. ایجاد چنین تغییری حدس آن را سخت می سازد و از حملات بروت فرس به آن جلوگیری می کند، زیرا با این کار حمله کننده نه تنها باید رمز عبور را حدس بزند بلکه نام حساب کاربری هم برای او ناشناس است.

mysql> update user set user="mydbadmin" where user="root";
  

  mysql> flush privileges;

6.4 حذف سوابق

در نهایت، باید تمام محتویات فایل history پایگاه داده MySQL نیز حذف گردد (~/.mysql_history)، که در این فایل، تمامی دستورات SQL، علی الخصوص رمزهای عبور، ذخیره خواهند شد:

cat /dev/null > ~/.mysql_history

5 قدم های نهایی

حال می توان تمام پایگاه های داده و حساب های کاربری که توسط برنامه های PHP استفاده می شود، ایجاد کرد. باید تاکید کرد که این حساب های کاربری باید تنها حق دسترسی به پایگاه داده هایی که توسط برنامه های PHP استفاده می شود، داشته باشند. به ویژه، این حساب های کاربری نباید حق دسترسی به پایگاه داده mysql، و دیگر دستورات محافظت شده ادمین مانند FILE، GRANT، SHOW DATABASE، و غیره را داشته باشند.

در نهایت، باید یک پوسته اسکریپتی برای اجرای MySQL ایجاد شود. اسکریپت زیر یک نمونه برای انجام چنین کاری می باشد:

#!/bin/sh CHROOT_MYSQL=/chroot/mysql CHROOT_PHP=/chroot/httpd SOCKET=/tmp/mysql.sock MYSQLD=/usr/local/mysql/libexec/mysqld PIDFILE=/usr/local/mysql/var/`hostname`.pid CHROOTUID=/usr/local/sbin/chrootuid echo -n " mysql" case "$1" in start)         rm -rf ${CHROOT_PHP}/${SOCKET}         nohup ${CHROOTUID} ${CHROOT_MYSQL} mysql ${MYSQLD} >/dev/null 2>&1 &         sleep 5 && ln ${CHROOT_MYSQL}/${SOCKET} ${CHROOT_PHP}/${SOCKET}         ;; stop)         kill `cat ${CHROOT_MYSQL}/${PIDFILE}`         rm -rf ${CHROOT_MYSQL}/${SOCKET}         ;; *)         echo ""         echo "Usage: `basename $0` {start|stop}" >&2         exit 64         ;; esac exit 0

در سیستم FreeBSD، اسکریپت بالا باید در دایرکتوری /usr/local/etc/rc.d و با نام mysql.sh قرار گیرد.

 

 

 

منبع: symantec

اخبار مرتبط

دیگر اخبار نویسنده

ارسال نظر


شخصی سازی Close
شما در این صفحه قادر به شخصی سازی نمیباشید