دستور passwd برای تغییر گذرواژه کاربر و ایجاد محدودیتهایی مانند مدت زمان اعتبار، تعیین بازه زمانی بین تغییر گذرواژه و... استفاده میشود.
پسوردها بهصورت پیشفرض در فایل etc/shadow/ ذخیره میشوند.
فایل shadow
هر خط از این فایل حاوی قسمتهای مختلفی هست که محدودیتهای پسورد کاربر مربوطه و خود پسورد رو تعیین میکنن.
متن زیر رو در نظر بگیرین:
aliabry:$6$tPJaEgzh$F691xpJDJbz8QXG0bLmp/k7mOuAisXbLEED5BvTVBdwuuGooK4VE7ZVwrxdOg5mPvr.dmdDgOOPONwtO2jLdk1:15832:0:99999:7:::
همونطور که میبینین ۹ قسمت مختلف در این خط با :
از هم جدا شدن. پس محتویات بین هر :
معنی خاصی دارد که در زیر توضیح داده شده:
aliabry
: نام کاربری
$6$tPJaEgzh$F691xpJDJbz8QXG0bLmp/k7mOuAisXbLEED5BvTVBdwuuGooK4VE7ZVwrxdOg5mPvr.dmdDgOOPONwtO2jLdk1
: پسورد کاربر هستش.
اگر در اول پسورد کاراکتر !
باشد به معنی قفل بودن اکانت کاربر هست.
اگر بهجای پسورد کاراکتر *
باشد یعنی اکانت اجازه ی لوگین کردن به صورت اینتراکتیو را ندارد.
اگر بهجای پسورد !!
باشد، یعنی هیچوقت پسورد تعیین نشده است.
اگر هیچ مقداری وجود نداشته باشد، یعنی پسوردی نداره (بدون پسورد میتونه لوگین کنه). نبود پسورد به این دلیل نیست که میتونه بدون پسورد لوگین کند باید تغییرات دیگری هم اعمال بشه.
15832
: تعداد روزهایی که از آخرین باری که پسورد تغییر کرده میگذرد. تعداد روزها از 1970-1-january محاسبه میشود. برای اطلاعات بیشتر در این مورد به این لینک مراجعه کنید.
0
: تعداد روزهایی که باید بگذره تا بتونه پسوردش رو تغییر بده. عدد صفر یا خالی بودن این قسمت یعنی هر موقعی.
99999
: تعداد روزهایی که کار بر میتونه پسوردش رو بدون تغییر نگاه داره. اگر مدتش گذشت باید پسوردش رو تغییر بده.
7
: یعنی هفت روز قبل از منقضی شدن پسورد بهتون اخطار میده.
سه قسمت خالی دیگر به ترتیب برای:
۱. تعداد روزهایی که بعد از expire (تاریخ مصرف پسورد بگذره) شدن پسورد، کاربر غیرفعال باشه (یعنی لوگین نکنه) تا نام کاربری قفل شود.
۲. تعداد روزی که از تاریخ 1970-1-january بگذرد تا نام کاربری expire (منقضی) شود. تو این قسمت از عدد 0 نباید استفاده کنیم چون هم معنی روز 1970-1-january رو میده و هم معنی منقضی نشدن.
۳. قسمت پایانی بعد از آخرین :
برای آینده در نظر گرفته شده و استفادهای نداره.
فرق منقضی شدن (expire) نام کاربری با پسورد
وقتی پسورد منقضی میشود کاربر هنوز قابلیت لوگین کردن به سیستم رو دارد ولی وقتی نام کاربری منقضی میشود، کاربر دیگر توانایی لوگین کردن رو ندارد.
وقتی پسورد منقضی شد، کاربر یک مدت زمانی مهلت داره تا پسوردش رو تغییر بده وگرنه بعد از اون مدت زمان نام کاربریش غیر فعال میشود.
تغییر پسورد
برای تغییر پسورد دستور passwd رو به تنهایی میتونین بزنین:
aliabry@lp:~$ passwd Changing password for aliabry. (current) UNIX password: Enter new UNIX password: Retype new UNIX password: Bad: new and old password are too similar Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully aliabry@lp:~$
تغییر پسورد دیگران:
برای این کار نام کاربری اون فرد رو در ادامه دستور passwd بنویسین. این کار احتیاج به دسترسی ریشه دارد وگرنه ارور زیر رو میگیرین:
aliabry@lp:~$ passwd aliali passwd: You may not view or modify password information for aliali.
در دستورات بالا چه اتفاقی افتاد:
اول از کاربر پسورد قدیمیاش درخواست میشود (اگر پسوردی وجود داشته باشه این درخواست میاد و گرنه نمیاد. برای کاربر روت این درخواست نمیاد چون ممکنه بخواد پسورد نام کاربری که پسوردش فراموش شده رو از نو تعیین کند) سپس پسورد وارد شده رمزنگاری یا HASH میشود و با پسورد کنونی مقایسه میشود، اگر پسورد وارد شده درست باشد چک میکند که آیا اجازه تغییر پسورد رو دارد یا نه (تعداد روزهایی که باید بگذرد تا کاربر بتونه پسوردش رو تغییر دهد. این قسمت برای کاربر روت انجام نمیشه) اگر اجازه تغییر پسورد رو داشت از کاربر دومرتبه پسورد جدید درخواست میشود و سپس این دو پسورد با هم مقایسه میشن، اگر با هم یکی بودن پسورد از نظر پیچیدگی تجزیه و تحلیل میشود. (این قسمت برای روت انجام نمیشه .اطلاعات بیشتر در مورد پسورد پیچیده اینجا) اگر از نظر پییدگی هم مورد تایید بود پسورد تغییر میکند.
در passwd چه پسوردی از نظر پیچیدگی مورد تایید است؟
پسوردی که از ۶ تا ۸ کاراکتر تشکیل شده باشد که حداقل حاوی یک یا چند مورد از موارد زیر باشد:
- حروف الفبای انگلیسی کوچک (مثل a, b, c)
- اعداد (بین 0 تا 1)
- علائم (مثل @, #, $, ^. لیست کاملش در این لینک موجوده)
آپشنهای دستور passwd
d-
: برای پاک کردن پسورد استفاده میشود (احتیاج به دسترسی ریشه دارد).
aliabry@lp:~$ sudo passwd aliabry -d passwd: password expiry information changed. aliabry@lp:~$
بعد از پاک کردن پسورد خط مربوطه به کاربر در فایل shaddow شبیه زیر میشه:
aliabry::15849::::::
همونطور که میبینین چون پسوردی در کار نیست پس اطلاعات مربوط به پسورد مثل مدت زمان منقضی شدن و... پاک شدن.
e-
: باعث میشه تا پسورد کاربر بلافاصله منقضی (expire) بشه ودفعه بعد که کاربر لوگین کرد مجبور میشه پسوردش رو تغییر بده زیر رو نگاه کنین:
aliali@lp:~$ sudo passwd aliabry -e passwd: password expiry information changed. aliali@lp:~$ sudo login aliabry [sudo] password for aliali: Sorry, try again. [sudo] password for aliali: Password: You are required to change your password immediately (root enforced) Changing password for aliabry. (current) UNIX password:
i-
: برای تعیین تعداد روزهایی که از منقضی شدن پسورد کاربر بگذرد تا نام کاربری غیرفعال شود.
l-
: برای قفل کردن نام کاربری است. برای قفل کردن نام کاربری یک !
در اول پسوردش قرار میدهد.
نکته: وقتی یک نام کاربری رو قفل کردیم به این معنا نیست که دیگه نمیتونه لوگین کنه بلکه ممکنه از روشهای اهراز هویت دیگر مثل ریموت ssh بتونه وارد حساب کاربریش بشه.
u-
: برای باز کردن یک نام کاربری (از قفل درش بیاره).
n-
: حداقل تعداد روزهایی که باید بگذرد تا پسوردش رو بتونه تغییر بده.
w-
: تعیین تعداد روزهایی که قبل از منقضی شدن پسورد کاربر باید به کاربر اخطار داده شود.x-
: تعیین تعداد روزهایی که پسورد کاربر معتبر میماند. بعد از گذشتن این تعداد روز کاربر باید پسوردش رو تغییر دهد.
چگونه دستور passwd کار میکند
اگر با یک ادیتور مثل gedit یا nano فایل shadow رو برای ویرایش کردن باز کنین متوجه میشین که این کار احتیاج به دسترسی ریشه دارد. پس شاید این سوال براتون پیش بیاد که وقتی بدون دسترسی ریشه دستور passwd رو اجرا میکنیم چگونه داخل فایل shadow اطلاعات جدید رو مینویسه؟
خوب خیلی سادس:
برای این که بشه بدون دسترسی ریشه توسط دستور passwd داخل فایل shadow چیزی نوشت روی فایل اجرایی دستور passwd از SUID استفاده کردن که باعث میشه وقتی این دستور رو اجرا میکنیم با دسترسی صاحب فایل اجرا شود و از جایی که صاحب فایل ریشه است پس با اجازه ریشه اجرا میشود و اجازه نوشتن در فایل shadow ایجاد میشود. اطلاعات بیشتر در مورد SUID در دستور chmod.