منبع اصلی نوشتار زیر در این لینک قرار دارد

ایجاد کاربران در MySQL و اهدای مجوز به آنها

در MySQL می توانیم از CREATE USER یا بصورت مسقیم درج رکوردی در پایگاه داده mysql، کاربری را ایجاد کنیم. برای ایجاد کاربر، باید مجوز اجرای دستور CREATE USER یا مجوز INSERT در پایگاه داده mysql را داشته باشیم. با ایجاد هر کاربر یک رکورد به جدول user از دیتابیس mysql اضافه می شود و در صورتی که نام کاربری از قبل وجود داشته باشد، یک پیام خطا نشان داده می شود. ساختار کلی دستور به صورت زیر می باشد.

بطور مثال دستور زیر کاربری را ایجاد می کند به نام jeffrey که می تواند از ماشین محلی (همان ماشینی که MySQL روی آن نصب است، اتصال برقرار کند)

;’CREATE USER ‘jeffrey’@’localhost’ IDENTIFIED BY ‘mypass

توسط IDENTIFIED BY یک پسورد برای کاربر تنظیم می شود. در صورتی که بخواهید کاربر بدون پسورد به سرور لاگین کند، نباید IDENTIFIED BY را استفاده کنید. (که بسیار امنیت را کاهش می دهد. فرض کنید که به همین کاربر مجوز هایی سطح بالا، مثلن تغییرات در جداول پیش فرض خود MySQL داده باشید، هر کسی می تواند لاگین کند و سیستم را دچار صدمه و آسیب نماید)

;’CREATE USER ‘jeffrey’@’localhost

کاربر هایی که به فرمت دو مثال بالا ایجاد می شوند، تنها می توانند از همان ماشینی که MySQL روی آن نصب است، لاگین کنند. اگر می خواهید کاربر از هر ماشین دیگری درون شبکه ایی که MySQL نصب است، لاگین کند باید بجای localhost از علامت % استفاده کنید.

;’CREATE USER ‘amirnami’@’%’ IDENTIFIED BY ‘mypass

برای حذف کاربر از DROP USER استفاده کنید.

;DROP USER username@hostname

;DROP USER amirnami@localhost

در دستور های بالا مشکلاتی امنیتی وجود دارد. فرض کنید شما با نام کاربری خوتان (بطور مثال amirnami یا root) وارد سیستم لینوکسی تان شدید و با سرور MySQL ارتباط برقرار کردید و دستور هایی را نیز اجرا کرده اید (درون خود MySQL). تمامی این دستورات در فایلی به نام mysql_history. درون دایرکتوری خانگی شما بصورت Clear Text ذخیره می شود، یا اینکه در تمامی دستور های بالا پسورد انتخابی کاملن واضح است و به همین نحو در فایل mysql_history. ذخیره می شود. راهکار استفاده از تابع PASSWORD است، که یک رشته را بعنوان ورودی دریافت می کند و Hash شده آنرا باز می گرداند.

(PASSWORD (string

بطور مثال برای Hash رشته mypass از دستور زیر استفاده کنید.

;(‘SELECT PASSWORD(‘mypass

و سپس بصورت زیر استفاده کنید.

;’CREATE USER ‘amirnami’@’localhost’ IDENTIFIED BY PASSWORD ‘*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4

OR

;’CREATE USER ‘amirnami’@’%’ IDENTIFIED BY PASSWORD ‘*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4

توجه کنید که بعد از IDENTIFIED BY کلمه PASSWORD آورده شده است. و نکته دیگر اینکه، در MySQL های تحت یونیکس (مانند لینوکس و …) سیستم به بزرگی و کوچکی حروف به کاربرده شده در نام کاربری حساس است.

اهدای مجوز به کاربران

با استفاده از دستور GRANT مجوزی را به کاربر اهدا و با دستور REVOKE مجوزی را ازکاربر، بازپس می گیریم. فرمت کلی استفاده از دستور GRANT بصورت زیر است.

;’GRANT PRIVILEGE ON db_name.tbl_name TO user@’hostname

توجه کنید که وقتی می خواهید بر روی جدولی از پایگاه داده ای مجوزی به کاربر دهید نام جپایگاه داده سمت چپ و نام جدول سمت راست است و یک نقطه میان آنها قرار می گیرد. همچنین اگر می خواهید مجوز را روی تمامی جداول یک پایگاه داده به کاربر بدهید بصورت *.db_name استفاده کنید.

مثال ها

  • مثال زیر مجوز SELECT بر روی تمامی جدول های پایگاه داده ای به نام mydb داده می شود.

;’GRANT PRIVILEGE ON mydb.* TO ‘amirnami’@’localhost

  • مثال زیر مجوز SELECT و INSERT روی تمامی پایگاه داده ها و تمامی جداول آنها در سروری خاص داده می شود.

;’GRANT SELECT, INSERT ON *.* TO ‘someuser’@’somehost

  • اهدای تمامی مجوز ها (دستور زیر کاربر بصورت Admin می شود، چونکه تمامی مجوز ها از طریق کلمه ALL به آن داده شده است روی تمامی پایگاه های داده و تمامی جداول آن بر روی سروری خاص)

;’GRANT ALL ON *.* TO ‘someuser’@’somehost

  • اهدای تمامی مجوز ها روی تمامی جداول یک پایگاه داده خاص (در اینجا نام پایگاه داده mydb است)

;’GRANT ALL ON mydb.* TO ‘someuser’@’somehost

  • اهدای فقط مجوز های SELECT و INSERT روی تمامی جداول یک پایگاه داده خاص روی سروری خاص

;’GRANT SELECT, INSERT ON mydb.* TO ‘someuser’@’somehost

  • اهدای مجوز های SELECT,DELETE,INSERT,UPDATE به کاربری به نام amirnami بر هر کجا بر روی جدول tbl1 از پایگاه داده mydb

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

;’GRANT SELECT ON db_name.tbl_name TO username@’hostname’ IDENTIFIED BY ‘mypass

مثال ها

;’GRANT SELECT ON mydb.* TO user1@’localhost’ IDENTIFIED BY ‘mypass

;’GRANT SELECT, INSERT, DELETE ON mydb TO user1@’localhost’ IDENTIFIED BY ‘mypass

;’GRANT ALL ON mydb.* TO user1@localhost IDENTIFIED BY ‘mypass

سومین دستور بالا تمامی مجوز ها را روی تمامی جداول پایگاه داده mydb به کاربر user1 می دهد. پس از اجرای هر یک از دستور های بالا، باید دستور زیر را اجرا کنید.

;FLUSH PRIVILEGES

همچنین می توانید از GRANT USAGE برای ایجاد کاربران استفاده کنید. دستور زیر کاربری به نام user2 ایجاد می کند ولی چون از USAGE استفاده کردیم، فعلن مجوزی اهدا نمی کند و در آینده می توانید مجوز های لازم را بصورت GRANT PRIVILEGE که در بالا گفته شد، به کاربر اهدا کنید.

;’GRANT USAGE ON mydb.* TO ‘user2′@’localhost

;’GRANT USAGE ON *.* TO ‘user2′@’localhost

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

;’GRANT SELECT, DELETE, INSERT, UPDATE ON mydb.* TO ‘user2′@’localhost

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

mysql -u USERNAME -h HOSTNAME -p

OR

mysql -u USERNAME -h HOSTNAME -p DB_NAME

دومین دستور، یعنی کاربر مجوز روی یک یا چند پایگاه داده را دارد و می تواند برای ورود به پایگاه داده ای خاص از نام آنرا در انتهای دستور وارد کند. همچنین اگر از فرمت اول استفاده کرد، باید پس از ورود به سرور از دستوز USE برای انتخاب پایگاه داده مورد نظر استفاده کند.

;USE DB_NAME

بدست آوردن اطلاعات از مجوز ها

پایگاه داده information_schema که Dictionary های MySQL را نگه می دارد، اطلاعاتی از تمامی کاربران و مجوز های داده شده به آنها را تحت جدول USER_PRIVILEGES نگه می دارد. برای مشاهده محتویات جدول باید با کاربر root وارد شوید.

mysql -u root -p information_schema

OR

mysql -u root -p

ENTER_PASSWORD

;mysql> USE information_schema

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

;SELECT * FROM USER_PRIVILEGES

;”‘SELECT * FROM USER_PRIVILEGES WHERE GRANTEE=”‘username’@’hostname



برچسب ها : ,