اطلاعیه

بستن
هنوز اطلاعیه ای در دست نیست.

بررسی احراز هویت در MariaDB 10.04

بستن
X
 
  • فیلتر کردن
  • زمان
  • نمایش
Clear All
پست های جدید

    بررسی احراز هویت در MariaDB 10.04

    ورژن 10.4 سرویس دیتابیس MariaDB ، تغییرات زیادی در مبحث امنیت دیتابیس داشته است. بعضی از این موارد تنها درباره بهینه سازی (مانند MDEV-15649)، بعضی دیگر در راستای بهبود فیچرهای موجود (MDEV-15473, MDEV-7598) یا آسان سازی (MDEV-12835, MDEV-16266) و بعضی دیگر درحقیقت ابزارهای سازگار با مای اسکیول (که توسط کاربران درخواست شده اند (MDEV-7597, MDEV-13095) میباشند.
    غیرفعال کردن لاگین بدون پسورد در mariadb





    اما اولین چیزی که هر کاربر دیتابیس MariaDB، انجام میدهد، (خواه یک کاربر با تجربه باشد و یا یک مبتدی) این است که قبل از اجرای هر گونه عملیات SQL در سرور Login کند و در دیتابیس احراز هویت (Authenticating) شود. MariaDB 10.04 در این عملیات نیز تغییراتی ایجاد کرده اگر شما یک کاربر جدید باشید، متوجه خواهید شد سرور MariaDB آسانتر و قابل درک تر میباشد و همچنین در MariaDB دردسر کمتری روی پسورد خواهید داشت. اما اگر شما مدت بیشتری است که با MariaDB کار میکنید، ممکن است هرگونه تغییر رفتار جدیدی در سرویس در شما احساس گیجی به وجود بیاورد. در این مقاله ما قصد داریم آنچه که در سرور MariaDB تغییر کرده و همچنین کاربردهای موجود MariaDB و نحوه غیرفعال کردن لاگین یوزر root بدون پسورد به MariaDB را برای شما شرح دهیم.



    به طور خلاصه

    عملیات ذخیره پسورد تغییر کرده است. تمام اطلاعات مربوط به اکانت ها، پسوردها و Global Privileges (سطوح دسترسی) درحال حاضر در جدول mysql.global_priv ذخیره میشوند. اما چه بر سر جدول mysql.user آمده است؟ این جدول همچنان وجود دارد و دقیقا شامل ستون های موجود در ورژن قبل میباشد اما در ورژن جدید در حقیقت نمایی از جدول mysql.global_priv میباشد و اگر شما ابزاری برای آنالیز جدول mysql.user دارید باید همانند ورژن قبل، روی ورژن جدید هم کار کند.

    در ورژن جدید MariaDB میتوانیم بیشتر از یک روش احراز هویت، به ازای اکانت مشخص کنیم. همه این متدها میتوانند در کنار هم و به عنوان جایگزین هم کار کنند. به عنوان مثال یک DBA (مدیر دیتابیس) ممکن است که کاربران خود را به پلاگین امن تر پسورد ed25519 منتقل کند اما متد قدیمی SHA1 را همچنان برای جایگزینی برای روش اول نگه دارد.

    عملیات احراز هویت پیش فرض در ورژن جدید MariaDB، در حال حاضر امنیت بیشتری دارد. امکان لاگین به مای اسکیول برای اکانت Root باز شده و اسکریپت نصب، دیگر پیغام "PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER !" (لطفا به خاطر داشته باشید که یک پسورد برای کاربر root دیتابیس MariaDB تعریف کنید!) را نمایش نمیدهد زیرا اکانت root به صورت اتوماتیک با امنیت بسیار ایجاد شده است.


    همچنین توصیه میشود مطالعه کنید :

    آموزش دستورات پایه ای MySQL/MariaDB (بخش اول)

    آموزش نصب MariaDB 10.X در Debian - Ubuntu - CentOS - RedHat

    دستورات Backup / Restore و Import / Export دیتابیس MySQL/MariaDB

    15 ترفند مفید برای بهینه سازی و بهبود عملکرد MySQL/MariaDB

    مدیریت سطوح دسترسی کاربران به دیتابیس MySQL/MariaDB



    جزئیات

    عموما یک MariaDB تازه نصب شده دارای دو یوزر با بالاترین سطح دسترسی میباشد (root و همچنین کاربر در سطح سیستم عامل) که مالک دایرکتوری اطلاعات میباشد که عموما کاربر mysql است. این دو کاربر از طریق کوئری های زیر ایجاد میشوند.
    کد PHP:
    CREATE USER root@localhost IDENTIFIED VIA unix_socket OR mysql_native_password USING 'invalid'
    CREATE USER mysql@localhost IDENTIFIED VIA unix_socket OR mysql_native_password USING 'invalid' 
    استفاده از unix_socket به این معناست که اگر شما کاربر root سیستم عامل باشید شما میتوانید با عنوان root@locahost بدون وارد کردن پسورد به MariaDB لاگین شوید. این تکنیک برای اولین بار توسط Otto Kekäläinen در پکیج های MariaDB در Debian (که با ورژن MariaDB 10 شروع شد) ابداع شد. این موضوع بر اساس یک حقیقت ساده پایه گذاری شده است که سوال پرسیدن از root سیستم برای وارد کردن پسورد هیچگونه امنیت اضافه ای را به همراه نخواهد داشت، به هر حال کاربر root دسترسی کامل به همه فایل های دیتا و کل حافظه در حال پردازش را دارد اما نپرسیدن یک پسورد به این معناست که دیگر هیچ پسورد root ی وجود ندارد که بخواهید آنرا فراموش کنید (با مقالات بیشماری که تحت عنوان "نحوه ریست کردن پسورد root دیتابیس MariaDB" هستند خداحافظی میکنیم) و درحقیقت کاربر root سیستم چون دسترسی کامل به کل سیستم دارد دیگر نیاز نیست که از او بخواهیم پسورد برای لاگین به دیتابیس وارد کند. همچنین اگر بخواهید هر گونه اسکریپتی برای کار با MySQL/MariaDB بنویسید دیگر نیاز نیست که پسورد root را به صورت Plain-Text (متن ساده) در اسکریپت ذخیره کنید. (با کاربر debian-sys-maint خداحافظی مکنیم).

    اما هنوز یکسری از کاربران اعتراض میکنند آنها میخواهند به root دیتابیس MariaDB بدون استفاده از sudo لاگین کنند (یعنی بدون دسترسی root و با هر یوزر معمولی دیگری در سیستم عامل). و این دلیلی است برای اینکه چرا در ورژن 10.4 کاربر root یک روش احراز هویت ثانویه دارد (پسورد قراردادی MariaDB که به صورت پیش فرض غیرفعال است) . "عبارت invalid" در حقیقت یعنی یک پسورد hash شده معتبر نیست اما ادمین میتواند پسورد را با عبارت ساده SET PASSWORD تعریف کند. و همچنان دسترسی بدون پسورد از طریق sudo را نیز نگه دارد.

    و اما اگر شما MariaDB را به صورت local نصب کرده باشید چه! به طور مثال از طریق source؟ شما قطعا نمیخواهید که sudo قادر به لاگین باشد و این دلیلی است که MariaDB یک یوزر ثانویه ایجاد کرده است که دارای دسترسی بالا با نام یکسان به عنوان یک کاربر سیستمی که دایرکتوری اطلاعات متعلق به آن است میباشد. در نصب به صورت لوکال این کاربر همان کاربری است که MariaDB را نصب کرده که او به صورت اتوماتیک دسترسی راحت و بدون پسورد (مانند root) را خواهد داشت، به این دلیل که با توجه به اینکه سرویس با این یوزر نصب شده مالکیت تمام فایل ها متعلق به این یوزر است.

    حتی اگر MariaDB به صورت system-wide نصب شده باشد شما ممکن است نخواهید که اسکریپت مربوط به نگهداری دیتابیس خود را با یوزر root سیستم اجرا کنید. اکنون شما میتوانید آنها را با کاربر MySQL سیستم اجرا کنید. و این را هم بدانید که آنها هرگز کل سیستم شما را خراب نمیکنند حتی اگر در اسکریپت شل تان اشتباه تایپی داشته باشید.



    Cookbook

    شما ممکن است با خود بگوید که : بسیار عالی! اما من یک ادمین دیتابیس MariaDB هستم و حتی میتوانم در خواب هم کوئری اسکیول بنویسم و از این به بعد آیا نیاز هست که کار متفاوتی انجام دهم؟ متاسفانه باید بگوییم، بله.

    بعد از نصب MariaDB به صورت system-wide اولین چیزی که شما عادت دارید انجام دهید لاگین به اکانت محافظت نشده root در دیتابیس و سپس امن کردن آن که در حقیقت تعریف پسورد برای root دیتابیس است، میباشد.
    کد PHP:
    sudo dnf install MariaDB-server
    mysql -uroot
    ...
    MariaDBset password password("XH4VmT3_jt"); 
    این کار در حال حاضر نه تنها غیر ضروری است بلکه به آسانی کار نخواهد کرد - هیچ اکانت root محافظت نشده ای وجود ندارد. برای لاگین کردن با کاربر root از دستورات زیر استفاده کنید.
    کد PHP:
    sudo dnf install MariaDB-server
    sudo mysql 
    توجه کنید که این بدان معناست که شما از طریق سوکت unix متصل شده اید و نه از طریق TCP. اگر شما باید protocol=tcp را در فایل /etc/my.cnf داشته باشید، دستور sudo mysql --protocol=socket را برای اتصال از طریق tcp را استفاده کنید.

    بعد از نصب MariaDB به صورت لوکال شما همچنان برای اتصال به اکانت root محافظت نشده از mysql -uroot استفاده میکنید. در صورتیکه فقط mysql را بدون مشخص کردن یک username استفاده کنید نیز کار خواهد کرد.

    آیا شما میخواهید که همچنان با پسورد به دیتابیس MariaDB خود login کنید و دیگر نیازی به احراز هویت از طریق unix_socket ندارید؟

    برای غیرفعال کردن اتصال به MariaDB بدون Password دستور زیر را اجرا کنید :
    کد PHP:
    ALTER USER root@localhost IDENTIFIED VIA mysql_native_password USING PASSWORD("verysecret"); 
    در صورتیکه پسورد root خود را فراموش کردید، مشکلی نیست. شما هنوز میتوانید با استفاده از sudo وصل شوید و پسورد را تغییر دهید. و اما اگر احراز هویت unix_socket را حذف کرده باشید چه؟ در چنین شرایطی همانند زیر عمل کنید :

    1 - دیتابیس MariaDB را با استفاده از --skip-grant-tables ریست کنید
    2 - به سرور محافظت نشده لاگین کنید
    3 - دستور FLUSH PRIVILEGES را اجرا کنید. (دقت کنید که در ورژن های قبل از 10.04 این مرحله آخرین مرحله است و نیاز نیست مرحله 4 را انجام دهید)
    4 - دستور SET PASSWORD FOR root@localhost را برای تغییر پسورد root اجرا کنید.


    آیا می خواهید داخل جدول privilege را بررسی کنید؟ جدول قدیمی mysql.user هنوز وجود دارد، شما می توانید مانند قبل از آن Select بگیرید، اگر چه دیگر نمی توانید آن را update کنید. آیا این جدول پلاگین های احراز هویت جایگزین را نشان نمی دهد؟ بله. و این یکی از دلایل سوئیچینگ به جدول mysql.global_priv بوده است - قوانین پیچیده احراز هویت در ساختار سلب یک جدول رابطه ای نمی گنجد. اما البته که شما می توانید از جدول جدید نیز Select بگیرید. مثلاً با دستور :
    کد PHP:
    select concat(user'@'host' => 'json_detailed(priv)) from mysql.global_priv

    همچنین توصیه میشود مطالعه کنید :

    5 روش برای امنیت و نگهداری سرورهای لینوکس


    به خاطر داشته باشید که بهترین راه برای نگهداری به شیوه امن از پسوردتان داشتن تنها یک پسورد نیست.
    آخرین ویرایش توسط Habili; در تاریخ/ساعت 06-01-2021, 02:31 PM.

    #2
    برای غیر فعال کردن لاگین بدون پسورد در MariaDB 10.3 از دستورات زیر استفاده کنید :
    کد PHP:
    MariaDB [(none)]> SELECT hostuserpasswordplugin FROM mysql.user LIMIT 0,1;

    SET PASSWORD FOR 'root'@'localhost' PASSWORD('MyNewPass');
    UPDATE mysql.user SET plugin '' WHERE user 'root' AND host 'localhost';
    FLUSH PRIVILEGES

    کامنت

    درباره انجمن منطقه لینوکسی ها

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

    شبکه های اجتماعی
    در حال انجام ...
    X