در اين مقاله قصد داريم به بيان نکاتي در مورد کار کردن با کاربران لينوکس از ليست کاربران و جمع آوري اطلاعات در مورد آن‌ها گرفته تا اضافه و حذف کردن کاربران در لينوکس و تغيير رمز آن‌ها بپردازيم. در هر بخش فايل‌هاي استفاده شده براي نگهداري تنظيمات و دستورات کار با فايل‌ها را معرفي کرده و با ذکر مثال‌هايي به بررسي آن‌ها خواهيم پرداخت.

دو فايلي که براي نگهداري اطلاعات کاربران و همچنين رمز آن‌ها (به صورت کد شده)‌استفاده مي‌شوند، يکي etc/passwd‌/ بوده که اطلاعات کاربران از جمله نام کاربر، آدرس home آن، shell‌ پيش فرض کاربر را نگهداري مي‌کند. در نسخه‌هاي قديمي لينوکس رمز کاربر نيز در اين فايل نگهداري مي‌شد ولي در نسخه‌هايي که الان استفاده مي‌شود، فيلد دوم اين فايل x بوده و بيانگر اين نکته است که اطلاعات رمز کاربر در فايل ديگري نگهداري مي‌شود. اين فايل etc/shadow/ مي‌باشد که کد رمز به همراه اطلاعات ديگري از جمله آخرين باري که رمز کاربر تغيير کرده، مدت زماني که رمز مي‌تواند استفاده شود و بعد از آن بايد تغيير کند، حداقل مدت زمان نگهداري رمز در آن نگهداري مي‌شود. در اين فايل‌ها هر سطر بيانگر اطلاعات يک کاربر مي‌باشد. هر سطر به ستون‌هايي تقسيم مي‌شود که با : از يکديگر جدا شده و هر ستون اطلاعات خاصي در مورد کاربر را در خود نگه مي‌دارد. براي مشاهده کردن اطلاعات اين دو فايل مي‌توان به صفحه‌ي ۵ از manual لينوکس مراجعه نمود.

man 5 passwd

man 5 shadow

به عنوان مثال اگر خط اول فايل passwd‌ را مشاهده کنيم و با اطلاعات مشاهده شده در manual مقايسه کنيم به اطلاعات زير خواهيم رسيد.

passwd_line1

محيط shell : مسير home‌ : اطلاعات تکميلي : شناسه‌گروه : شناسه‌کاربر : کد رمز : نام‌کاربر

همچنين با مشاهده کردن خط اول فايل shadow مي‌توان اطلاعاتي در مورد رمز کاربر بدست آورد که از چپ به راست برخي آن‌ها به صورت زير مي‌باشند.

shadow_line1

….. حداکثر طول عمر رمز :‌ حداقل طول عمر رمز : زمان آخرين تغيير رمز : کد رمز : نام کاربر

در عکس‌هاي مربوط به دو فايل معرفي شده چند نکته حائز اهميت است. اولين نکته اينکه زمان آخرين تغيير رمز کاربر به صورت يک عدد بيان شده است و نه به صورت يک تاريخ کامل. اين عدد تعداد روز گذشته از ۱ ژانويه سال ۱۹۷۰ را مشخص مي‌کند و با محاسبه زماني که از اين تاريخ مي‌گذرد مي‌توان به تاريخ دقيق تغيير رمز پي برد.

نکته‌ي بعدي مربوط به نوع کاربران و مجوز‌هاي آن‌ها در لينوکس مي‌باشد. اگر به دستوراتي که براي نمايش خط اول فايل‌ها استفاده شده‌اند دقت نماييد متوجه خواهيد شد که براي نمايش اطلاعات از فايل shadow از دستور sudo استفاده شده است. در صورت استفاده از sudo‌ در ابتداي اجراي دستور، آن دستور با مجوزهاي کاربر root اجرا مي‌شود که در لينوکس مدير سيستم بوده و توانايي اجراي هر دستوري و اعمال هر تغييري در سيستم را دارد. کاربران عادي توانايي اجراي دستوراتي که تغييري در سيستم بوجود مي‌آورند و يا حتي دسترسي و خواندن اطلاعات فايل‌هايي که مالک آن‌ها کاربر root مي‌باشد را ندارند. اما در شرايطي که کاربري عضو گروه sudo باشد (يا اجازه‌ي استفاده از دستورات براي آن در فايل etc/sudoers/ تنظيم شده باشد) مي‌تواند مجوز‌هاي خود را بالاتر برده و به استفاده از دستوري بپردازد که در شرايط عادي امکان استفاده از آن را ندارد. عضويت در گروه sudo (که البته براي آن تنظيمي در فايل etc/sudoers‌/ انجام گرفته که کار ساده‌تر شده و با عضويت در يک گروه بجاي تغيير در فايل امکان استفاده از مجوزهاي root فراهم شود) توانايي استفاده از دستور sudo‌ را به کاربران خواهد داد که command نوشته شده را با مجوز‌هاي root اجرا خواهد نمود.

اکنون که فلسفه‌ي استفاده از sudo‌ را متوجه شديم به بررسي مجوز‌هاي دو فايل و مقايسه‌ي آن‌ها با يکديگر مي‌پردازيم که دليل نياز به استفاده از sudo براي خواندن محتويات فايل shadow را متوجه شويم.

ls_l

در خروجي ls -l‌ ستون‌هاي نمايش داده شده (از چپ به راست) به ترتيب مجوز‌هاي فايل، تعداد لينک‌ها، کاربر مالک فايل، گروه‌ مالک فايل، اندازه‌ي فايل به بايت، زمان آخرين تغيير فايل و در نهايت نام فايل آورده مي‌شود.

مجوز‌هاي فايل (به همراه نوع فايل) يک رشته‌ي ۱۰ کاراکتري مي‌باشد که اولين کاراکتر آن (از چپ)‌نوع فايل را مشخص نموده و ۹تاي باقي‌مانده مجوز‌هاي دسترسي به فايل توسط کاربر مالک، گروه مالک و مابقي افراد مي‌باشد. نحوه‌ي تعيين مجوز ها با سه کاراکتر rwx براي خواندن، نوشتن و اجرا کردن فايل و يا – براي عدم وجود مجوز مي‌باشد. در صورتيکه به خروجي دقت نماييد، متوجه مي‌شويد که مالک اين دو فايل کاربر root بوده و ديگران (بخش سوم مجوزها) اجازه‌ي خواندن passwd را داشته (با مجوز –r) ولي اين مجوز را براي فايل shadow‌ ندارند که دليل استفاده از sudo براي خواندن خط اول فايل مي‌باشد.

نکته‌ي آخري که در خروجي خطوط اول فايل‌ّها وجود دارد اين است که کد رمزي براي کاربر root وجود نداشته و بجاي آن از ! استفاده شده است. در لينوکس در صورتيکه نياز به منع کاربري از ورودي به سيستم باشد، مي‌توان بجاي رمز آن از ! استفاده نموده و يا اينکه در ابتداي کد رمز آن يک ! اضافه نمود.

کاربر root به دليل مسائل امنيتي از ورود به سيستم منع شده و در صورت انتساب رمز نيز ممکن است امکان ورود به سيستم را نداشته باشد. در صورت نياز به استفاده از آن (هر چند توصيه نمي‌شود) مي‌توان امکان ورود به سيستم از طريق shell‌ با کاربر root‌ را به صورت زير فعال نمود.

sudo passwd root$

براي انتساب رمز به کاربر root‌

sudo passwd –u root$

براي unlock کردن کاربر root

در صورتيکه اين کاربر را فعال کرده و بعد از مدتي مجددا تصميم به غير فعال کردن آن گرفته شود مي‌توان با استفاده از l- بجاي u-  در دستور passwd اينکار را انجام داد. غير فعال کردن root و تغييري که در محتويات فايل shadow ايجاد مي‌شود را مي‌توان در شکل زير مشاهده نمود.

lock_unlock

اکنون که با نحوه‌ي ذخيره‌ي اطلاعات کاربران در لينوکس‌ آشنا شده‌ايم به ساخت کاربر جديد پرداخته و نکاتي که بيان شد را مرور کرده و چند نکته‌ي مهم ديگر را نيز بيان خواهيم نمود.

دستوري که براي ساخت کاربر در لينوکس استفاده مي‌شود، useradd‌ مي‌باشد. اين دستور پارامترهاي مختلفي دريافت کرده و اطلاعات کاربر را در فايل passwd ذخيره خواهد نمود. براي تست کاربر جديد نيز مي‌توانيم با زدن دستور su –l يک ورود جديد به لينوکس انجام داده و کاربر جديد را تست نمود. البته دقت نماييد که بايد رمزي براي کاربر تنظيم کنيد تا بتوانيد با آن وارد شويد. در شکل زير ساخت و تست کاربر جديد نمايش داده شده است.

useradd

در اين شکل اعلاني که براي کاربر مشخص شده را با يک $ تنها مشاهده مي‌کنيد (دستور whoami استفاده شده که نشان دهد با کاربر جديد وارد شده‌ايم) که اين اعلان بر خلاف چيزي است که در لينوکس به صورت پيش فرض وجود دارد. اعلان پيش فرض لينوکس (حداقل در Ubuntu) به صورت زير مي‌باشد:

$username@hostname:path

که در صورت ورود با کاربر root‌ بجاي $ يک ‌# نمايش داده خواهد شد.

اگر نگاهي به خط مربوط به کاربر جديد در فايل passwd‌ بياندازيد مي‌بينيد که براي اين کاربر home‌ تنظيم شده ولي ساخته نشده است و shell پيش فرض نيز ندارد.

useradd_res

تاثير shell را مي‌توان در نحوه‌ي اعلان مشاهده نمود و تاثير home را در مواردي مثل سابقه‌ي دستورات. به اين شکل که اگر دستوراتي را تايپ کرده، خارج شده و مجدد وارد شويد، هيچ سابقه‌اي از دستورات نشست قبل نخواهيد داشت. علت اين است که محيط کاربر از طريق home تنظيم مي‌شود و سابقه‌ي دستورات که مثال زدم در فايلي به نام .bash_history  که در home مي‌باشد ذخيره مي‌گردد. اگر دستور useradd با پارامتر‌هاي –m  و –s استفاده شود، هم home‌ ساخته شده و هم shell تنظيم مي‌گردد. اما براي کاربر جديد که ساخته‌شده است چطور مي‌توان home را ساخته و shell را تنظيم نمود؟ تغيير در ساختار تنظيمات کاربر با usermod امکان‌پذير مي‌باشد که پارامترهايي مشابه useradd دارد (مثل –s که در هر دو وجود دارد) و براي ساخت home نيز مي‌توان از يک دستور کمکي استفاده نمود.

usermod

کاربر جديد ما الان مشابه يک کاربر عادي مي‌تواند به کار در سيستم بپردازد ولي هنوز يک مساله براي اين کاربر وجود دارد. اگر ليست گرو‌ه‌هاي اين کاربر را با دستور groups مشاهده کنيد، مي‌بينيد که گروه sudo در آن نبوده و تاثير را وقتي متوجه خواهيد شد که مثلا به اجراي دستوري به کمک sudo بپردازيد.

groups

پيغامي که مشاهده مي‌کنيد در مورد نبود اين کاربر در فايل sudoers‌ مي‌باشد. در صورتيکه از کاربر اصلي سيستم که اجازه‌ي استفاده از دستور sudo را دارد استفاده کرده و با usermod گروه sudo را به گرو‌ه‌هاي کاربر جديد اضافه کنيد (با aG- که براي اضافه کردن گروه به ليست گروه‌هاي فعلي است) اين مشکل برطرف شده و امکان استفاده از دستور sudo فراهم خواهد شد.

using_sudo

مبحث آخري که در اين مقاله به آن خواهيم پرداخت نحوه‌ي توليد کد از روي رمز کاربر مي‌باشد. فيلد دوم در فايل shadow که حاوي کد رمز مي‌باشد، به صورت زير تعيين مي‌شود.

algorithm_id$salt_string$encrypted_password$

الگوريتم‌هاي مختلفي مي‌توانند براي توليد کد از روي رمز استفاده شوند (مثل md5 يا sha) و هر الگوريتم مي‌تواند تعداد بيت مختلفي استفاده کرده و کد رمز با طول متفاوتي تولي نمايد. در نسخه‌هاي فعلي لينوکي (Ubuntu 16 در مثال‌هاي اين مقاله شده) الگوريتم پيش فرض SHA-512 مي‌باشد. براي شناسايي الگوريتم استفاده شده در توليد کد رمز و مقايسه‌ي رمز وارد شده با رمز صحيح و احرازهويت کاربران، شناسه‌اي براي مشخص نمودن الگوريتم در اين بخش نگهداري مي‌شود که براي الگوريتم SHA-512 پيش فرض ۶ مي‌باشد(براي اطلاع از الگوريتم‌ّهاي مخلف و شناسه‌ي آن‌ها از صفحه ۳ فايل‌هاي کمکي لينوکي مربوط به crypt استفاده کنيد man 3 crypt). روش کار به اين صورت است که در زمان ورود کاربر، با خواندن اين فايل و بدست آوردن الگوريتم استفاده شده، کد رمزي توليد مي‌شود که با کد رمز ذخيره شده در اين فايل مقايسه شده و در صورت يکسان بودن به کاربر اجازه‌ي ورود داده مي‌شود. تا اينجاي کار با دو بخش از سه بخش جدا شده با $ در فيلد دوم فايل shadow آشنا شده‌ايم و يک بخش که رشته‌ي salt مي‌باشد باقي مانده است. براي درک کاربرد آن فرض کنيد که اين رشته استفاده نشده و دو کاربر رمز يکساني دارند. به دليل اينکه‌ الگوريتم‌هاي توليد hash از روي رمز در هر بار استفاده، رشته‌ي يکساني به عنوان کد رمز توليد مي‌کنند در فايل shadow مقدار يکساني براي کاربراني که رمز يکساني دارند خواهيم داشت که به لو رفتن رمز کاربران منجر خواهد شد و در شکستن رمزها نيز استفاده خواهد شد. حال اگر تابع توليد hash‌بجاي دريافت يک مقدار رمز، دو مقدار دريافت نمايد که مقدار دوم يک رشته‌ي تصادفي مي‌باشد (اين تعريف salt است که يک رشته‌ي تصادفي بين ۸ تا ۱۶ کاراکتر بوده و به عنوان ورودي دوم در کنار رمز به تابع hash‌ارسال مي‌شود تا کد رمز توليدي هر دفعه تغيير کرده و با دفعه قبل و براي کاربران مختلف يکسان نباشد) ديگر کد رمز مشابه نخواهيم داشت و مشکل حل خواهد شد.

براي توليد کد رمز با ارسال salt و رمز مي‌توانيد به صورت زير از دستور mkpasswd استفاده نماييد. (براي نصب آن در صورت عدم وجود از دستور sudo apt-get install whois استفاده کنيد)

mkpasswd

با دقت در شکل بالا مي‌بينيد که اگر salt ذخيره شده در فايل shadow‌ را استفاده کرده و رمز کاربر root (که من ۱۲ گذاشته بودم) را بکار بريم، دقيقا همان مقداري که در فيلد دوم shadow‌ ذخيره شده است را بدست خواهيم آورد.

در نهايت براي حذف کاربر از دستور userdel‌ استفاده کنيد. در صورتيکه بخواهيد فايل‌ّهاي موجود در home‌ نيز به همراه کاربر حذف گردند مي‌توانيد از r- به همراه دستور استفاده نمايد.

اميدوارم مفيد بوده باشه .