زیرساخت ابری هایو

نصب MySQL در Ubuntu 20.04

فهرست مطالب

MySQL یک نرم افزار متن باز رایگان برای مدیریت دیتابیس هست، که بطور معمول به عنوان بخشی از اِستک محبوب LAMP (Linux, Apache, MySQL, PHP) نصب میشه.

در این آموزش میخوایم یاد بگیریم که چطور میتونید MySQL 8.0 رو روی Ubuntu 20.04 نصب کنیم.

با نصب کامل MySQL شما یک سیستم مدیریت دیتابیس عالی خواهید داشت که میتونید وب سایت بعدی خودتون رو با اون راه اندازی کنید.

پیش‌نیازها

برای ادامه این آموزش شما نیاز دارید که سرور اوبونتو 20.04 خود رو با یک کاربری غیر root و فایروال UFW تنظیم کرده باشید.

اگر هنوز اینکارها رو انجام ندادید آموزش راه اندازی اولیه سرور Ubuntu 20.04 رو ببینید و انجام بدید.

نصب MySQL در اوبونتو

در اوبونتو 20.04 شنا میتونید با کمک پکیج های APT اقدام به نصب MySQL کنید. در حال حاضر که این آموزش درحال نوشتن هست نسخه 8.0.27 MySQL  روی ریپوزیتوری پیشفرض ubuntu در دسترس هست.

برای نصب، اگر قبلا آپدیت انجام ندادید اول یکبار دستور آپدیت رو اجرا کنید

sudo apt update

حالا پکیج mysql-server رو نصب کنید:

sudo apt install mysql-server

این دستور MySQL رو نصب میکنه، اما حین نصب تنظیمات مربوط به رمز و باقی تنظیمات مهم دیگه رو نداره.

باتوجه به اینکه انجام ندادن این تنظیمات MySQL شما رو غیر امن میکنه ما باید دستورالعمل های زیر رو انجام بدیم.

تنظیم کردن MySQL در Ubuntu

برای MySQL تازه نصب شده، لازم هست DBMS هایی شامل چند اسکریپت امنیتی رو اجرا کنیم. این اسکریپت ها چند تنظیم غیر امن پیشفرض مثل remote login root و sample users رو تغییر میده و سیستم رو امن تر میکنه.

اسکریپت امنیتی رو با دستور زیر اجرا کنید:

sudo mysql_secure_installation

این دستور چند درخواست رو برای شما میاره تا شما بتونید تغییراتی در تنظیمات امن سازی MySQL خودتون داشته باشید.

اولین درخواست از شما میپرسه که میخواید افزونه تایید رمز (Validate password) رو تنظیم کنید، که برای تست قوی بودن رمز هرکاربر جدید برای MySQL قبل از تایید کردن کاربر، کاربرد داره.

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

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

خروجی ترمینال شما در این لحظه همچین چیزی باید باشه:

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: Y

There are three levels of password validation policy:

LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:
2

بعد از درخواست اول که برای نصب افزونه تایید رمز بود، درخواست بعدی برای تنظیم کردن یک رمز برای کاربر root در MySQL هست.

رمز رو وارد کرده و بعد تاییدش کنید:

Please set the password for root here.

New password:

Re-enter new password:

دقت داشته باشید باتوجه به اینکه ما برای اکانت روت در mysql رمز تعریف کردیم اما هنوز برای این کاربر تنظیمی انجام نشده که با ورود رمز بتونه اتصال به mysql رو تایید کنه. یعنی بدون رمز میتونه وصل بشه!

اگر شما افزونه Validate Password رو نصب کردید، پیامی مبنی بر قوی بودن رمز جدید دریافت خواهید کرد. بعد اسکریپت از شما میخواد که اگر از قوی بودن این رمز راضی هستید با همین ادامه بدید اگر نه رمز جدیدی که قویتر باشه رو وارد کنید.

با این فرض که شما از قدرت رمز فعلی راضی هستید و میخواید ادامه بدید باید حرف Y رو وارید کنیم تا اسکریپت کارش رو ادامه بده:

Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y

از اینجا به بعد شما میتونید با وارد کردن Y یا زدن دکمه ENTER باقی درخواست ها رو هم درحالت پیشفرض خودشون تایید کنید.

این موارد کاربر های ناشناس رو حذف میکنه و دیتابیس رو تست میکنه، دسترسی از راه دور برای کاربر روت رو غیرفعال میکنه و این قوانین جدید رو روی MySQL اعمال میکنه.

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

حالا شما میتونید برید سراغ ساخت یک اکانت (کاربری) اختصاصی جدید برای MySQL.

ساخت یوزر MySQL اختصاصی و دادن دسترسی های لازم به یوزر

حین نصب، MySQL یک کاربر root ایجاد میکنه تا شما بتونید دیتابیس های خودتون رو مدیریت کنید. این کاربر تمام دسترسی های موجود در سرور MySQL رو داره، یعنی امکان مدیریت تمام دیتابیس ها، جداول، کاربران و … رو داره.

به همین خاطر بهتره که از این اکانت فقط برای موارد خیلی ضروری مدیریتی استفاده کنیم و تا جای ممکن استفاده از کاربر root رو برای امنیت بیشتر کمتر کنیم.

تو این بخش از آموزش یاد میگیریم که چطوری با کمک یوزر root در MySQL بتونیم یک یوزر جدید بسازیم و دسترسی های لازم رو بهش بدیم.

در سیستم های ubuntu ای که MySQL 5.7 و نسخه های بعدی رو استفاده میکنن، کاربر روت MySQL تنظیم شده که با افزونه auth_socket بصورت پیشفرض تایید بشه تا با پسورد.

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

sudo mysql

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

برای داشتن دسترسی کامل در این حالت شما باید با کمک دستور زیر به MySQL وصل بشید:

mysql -u root -p

وقتی به MySQL دسترسی پیدا کردید شما میتونید با کمک دستور CREATE USER کاربر جدید رو ایجاد کنید.

سینتکس معمول این دستور به شکل زیر هست:

CREATE USER 'username'@'host' IDENTIFIED WITH authentication_plugin BY 'password';

بعد از CREATE USER ، شما باید یک نام کاربری تعریف کنید که بعدش علامت @ اومده و بعد نام هاستی که کاربر قراره بهش وصل بشه.

اگر برنامه دارید که کاربرتون بصورت لوکال و از طریق سرور ابونتو فقط دسترسی داشته باشه هاست رو روی localhost تنظیم کنید. گذاشتن علامت نقل و قول تکی (کوتیشن یا ‘ ) معمولا ضروری نیست اما برای جلوگیری از خطاهای معمول بهتره استفاده بشه.

در ادامه دستور ما میتونید افزونه تایید هویت کاربر رو تایید کنیم که MySQL با چه روشی کاربر رو تایید کنه. برای این مورد چندین حالت برای استفاده دارید مثلا auth_socket که قبلا بهش اشاره کرده بودیم امنیت خوبی رو بدون وارد کردن رمز برای دسترسی به دیتابیس رو اعمال میکنه.

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

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

این افزونه برای کاربرانی که میخوان از قابلیت ورود رمز استفاده کنند و همچنان ویژگی های امنیتی رو هم داشته باشن مناسبه.

نهایتا با اجرای دسترو زیر یک کاربر جدید با اهراز هویت caching_sha2_password ساخته میشه. 

دقت داشته باشید که به جای عبارت hadi و password نام کاربری و رمز خودتون رو بنویسید.

CREATE USER 'hadi'@'localhost' IDENTIFIED BY 'password';

نکته: یه مشکلی گزارش شده که در بعضی از نسخه های PHP افزونه caching_sha2_password مشکلاتی رو ایجاد کرده. اگر شما برنامه دارید که با کمک نرم افزارهای php دیتابیس تون رو مدیریت کنید، مثلا با phpMyAdmin، بهتره که کاربرتون رو با افزونه های قدیمی تری مثل mysql_native_password بسازید که همچنان امن بمونید:

CREATE USER 'hadi'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

اگر مطمئن نیستید شما میتونید با همون افزونه caching_sha2_plugin کاربرتون رو بسازید و بعد با دستور ALTER تغییرش بدید:

ALTER USER 'hadi'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

 

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

GRANT PRIVILEGE ON database.table TO 'username'@'host';

عبارت PRIVILEGE در این مثال کارهایی که کاربر می تونه روی دیتابیس ی جداول انجام بده رو مشخص میکنه.

شما میتونید چندین دسترسی مختلف رو به یک یوزر در یک دستور بدید، کافی هر سطح دسترسی رو با کاما ( , ) جدا کنید.

همچنین شما میتونید دسترسی ها رو با وارد کردن * به تمام دیتابیس ها و جداول اعمال کنید. در SQL علامت ستاره یک کارکتر ویژه هست که به منظور “همه” استفاده میشه.

نهایتا با دستور زیر شما میتونید دسترسی های ساخت (CREATE)، تغییر (ALTER) و حذف دیتابیس یا جداول (DROP)، همچنین امکان وارد کردن (INSERT)، آپدیت کردن (UPDATE) و حذف کردن (DELETE) اطلاعات رو از هر جدولی بر روی سرور داشته باشید.

همچنین میتونید امکان انتخاب کردن (SELECT)، تعریف کلید خارجی (REFERENCES) و یا اجرای عمل Flush رو با دسترسی Reload داشته باشید.

هرچند که در نهایت شما میتونید هر دسترسی که دوست دارید رو به کاربر مورد نظرتون بدید و میتونید کاربر های متعددی هم برای دسترسی های مختلف ایجاد کنید.

شما میتونید لیست کامل دسترسی ها رو در مستندات رسمی MySQL پیدا کنید.

دستور GRANT رو اجرا کنید، به جای hadi یوزر نیم خودتون رو بنویسید تا این دسترسی ها رو به کاربر جدید بدید:

GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'hadi'@'localhost' WITH GRANT OPTION;

دقت داشته باشید که این دستور شامل WITH GRANT OPTION هست که یعنی این کاربر میتونه هر دسترسی که خودش داره رو به دیگران هم بده.

هشدار: برخی از افراد شاید بخوان دسترسی ALL PRIVILEGES یعنی دسترسی کامل رو به یوزر خاصی بدن، این دسترسی در سطح مدیر کل (superuser) هست که دستور اون به شکل زیر هست:

GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;

این نوع سطح دسترسی نباید به آسانی ارائه بشه. قاعدتا شخصی با این دسترسی ها میتونه به تمام دیتابیس های موجود در سرور دسترسی کامل داشته باشه، که مطمئنا در پروژه های بزرگ یا چند پروژه در یک سرور منطقی بنظر نمیاد.

 

در ادامه، خوبه که به عنوان تمرین هم که شده دستور FLUSH PRIVILEGES رو اجرا کنید.

این دستور مموری سرور از کَش دستورات CREATE USER و GRANT رو خالی میکنه:

FLUSH PRIVILEGES;

در آخر با دستور زیر میتونید از محیط MySQL خارج بشید:

exit

در آینده برای ورود مجدد به MySQL، باید از دستور زیر استفاده کنید:

mysql -u hadi -p

عبارت p- باعث میشه تا MySQL پسورد یوزر وارد شده رو برای تایید هویت شما دریافت کنه.

تست MySQL در Ubuntu

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

systemctl status mysql.service

خروجی چیزی مشابه به این خواهد بود:

● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2020-04-21 12:56:48 UTC; 6min ago
Main PID: 10382 (mysqld)
Status: "Server is operational"
Tasks: 39 (limit: 1137)
Memory: 370.0M
CGroup: /system.slice/mysql.service
└─10382 /usr/sbin/mysqld

اگر MySQL هنوز اجرا نشده میتونید با دستور sudo systemctl start mysql اجراش کنید.

 

سخن آخر

حالا شما MySQL خودتون رو با تنظیمات اولیه نصب و روی سرور راه اندازی کردید. در آینده آموزش های بیشتری برای استفاده از MySQL در اِستَک و پروژه های مختلف منتشر خواهیم کرد.

اما اگر سوالی براتون باقی مونده حتما از قسمت نظرات با ما در ارتباط باشید.

 

فراموش نکنید برای خرید سرور ابری و یا خرید هاست میتونید به زیرساخت ابری هایو اعتماد کنید.

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

نشانی ایمیل شما منتشر نخواهد شد.

درخواست دمو رایگان
نکته مهم: درحال حاضر تمام خدمات و سرویس های هایو فقط به اشخاص حقوقی ارائه می شود.