CKPASSWD(8) InterNetNews Documentation CKPASSWD(8)

ckpasswd - برنامه کمکی احراز هویت رمز عبور برای NNTP

ckpasswd [-gs] [-d database] [-f filename] [-u username -p password]

دستور ckpasswd احراز‌هویت‌کننده پایه رمز عبور برای nnrpd است که برای اجرا از درون یک بند (stanza) احراز هویت در readers.conf مناسب است. برای اطلاعات بیشتر درباره نحوه پیکربندی احراز‌هویت‌کننده nnrpd صفحه راهنمای readers.conf(5) را ببینید.

دستور ckpasswd نام کاربری و رمز عبور را از nnrpd دریافت می‌کند و به nnrpd(8) اطلاع می‌دهد که آیا آن رمز عبور برای آن نام کاربری درست است یا خیر. به‌طور پیش‌فرض، هنگامی که هیچ آرگومانی داده نشود، اگر هنگام ساخت INN پشتیبانی از PAM یافت شده باشد، تلاش می‌کند رمز عبور را با استفاده از PAM بررسی کند. در صورت عدم موفقیت، تلاش می‌کند رمز عبور را در برابر فیلد رمز عبور بازگردانده‌شده توسط getpwnam(3) بررسی کند. توجه داشته باشید که امروزه بیشتر سیستم‌ها دیگر رمزهای عبور واقعی را از طریق getpwnam(3) در دسترس قرار نمی‌دهند (برخی هنوز این کار را انجام می‌دهند فقط و فقط در صورتی که برنامه فراخواننده getpwnam(3) به عنوان ریشه (root) اجرا شود).

هنگام استفاده از PAM، دستور ckpasswd خود را به عنوان "nnrpd" معرفی می‌کند، نه "ckpasswd"، و پیکربندی PAM باید بر همین اساس تنظیم شود. جزئیات پیکربندی PAM در سیستم‌عامل‌های مختلف (و حتی توزیع‌های مختلف لینوکس) متفاوت است؛ برای شروع به بخش «مثال‌ها (EXAMPLES)» در زیر مراجعه کنید و به دنبال صفحه راهنمای pam(7) یا pam.conf(4) روی سیستم خود باشید.

هنگام استفاده از هر روشی غیر از PAM، دستور ckpasswd انتظار دارد که تمام رمزهای عبور به‌صورت رمزگذاری‌شده توسط تابع crypt(3) سیستم ذخیره شده باشند و تابع crypt(3) را روی رمز عبور ارائه‌شده قبل از مقایسه آن با رمز عبور مورد انتظار فراخوانی می‌کند. هر الگوریتم درهم‌سازی (هشینگ) رمز عبور که توسط libc یا libcrypt شما پشتیبانی شود، قابل استفاده است.

رمزهای عبور را به جای استفاده از getpwnam(3) از یک پایگاه‌داده (با قالب ndbm، gdbm یا dbm بسته به آنچه در سیستم شما موجود است) بخواند. ckpasswd انتظار دارد فایل‌های database.dir و database.pag وجود داشته باشند و پایگاه‌داده‌ای با کلید نام کاربری و مقادیر رمزهای عبور رمزگذاری‌شده باشند.

اگرچه INN با برنامه‌ای که مشخصاً برای ایجاد چنین پایگاه‌های داده‌ای در نظر گرفته شده باشد ارائه نمی‌شود، در اکثر سیستم‌ها نوشتن یک اسکریپت Perl برای انجام این کار نسبتاً آسان است. چیزی شبیه به:

#!/usr/bin/perl
use NDBM_File;
use Fcntl;
tie (%db, 'NDBM_File', '/path/to/database', O_RDWR|O_CREAT, 0640)
    or die "Cannot open /path/to/database: $!\n";
$| = 1;
print "Username: ";
my $user = <STDIN>;
chomp $user;
print "Password: ";
my $passwd = <STDIN>;
chomp $passwd;
my @alphabet = ('.', '/', 0..9, 'A'..'Z', 'a'..'z');
my $salt = join '', @alphabet[rand 64, rand 64];
$db{$user} = crypt ($passwd, $salt);
untie %db;

توجه داشته باشید که این اسکریپت رمز عبور را هنگام تایپ نمایش می‌دهد (echo می‌کند)؛ بهبودهای آشکاری وجود دارد که می‌توان روی آن اعمال کرد، اما این می‌تواند یک شروع مناسب باشد. گاهی اوقات برنامه‌ای مانند این با نام dbmpasswd در دسترس است.

این گزینه در سیستم‌های فاقد کتابخانه‌های ndbm، gdbm یا dbm در دسترس نخواهد بود.

رمزهای عبور را به جای استفاده از getpwnam(3) از فایل داده‌شده بخواند. هر خط از این فایل باید چیزی شبیه به این باشد:
username:$5$Hlb2yXPd$2nOO/QR9P1mnRFr/i6L9ybxbgSDXd4UlatKqbcY4eoB
joe:FCjOJnpOo50IE:Old weak hash algorithm used for Joe

هر خط حداقل دارای دو فیلد است که با دو‌نقطه (:) از هم جدا شده‌اند. فیلد اول حاوی نام کاربری است؛ فیلد دوم حاوی رمز عبوری است که با تابع crypt(3) درهم‌سازی (هش) شده است. دونقطه‌ها و داده‌های اضافی ممکن است پس از رمز عبور رمزگذاری‌شده بیایند؛ این داده‌ها توسط ckpasswd نادیده گرفته می‌شوند. خطوطی که با علامت هش ("#") شروع می‌شوند نادیده گرفته می‌شوند.

برنامه INN ابزاری برای ایجاد رمزهای عبور رمزگذاری‌شده به همراه ندارد، اما OpenSSL می‌تواند این کار را انجام دهد و با Perl نیز به سرعت قابل انجام است (اسکریپت تک‌خطی نمونه زیر را ببینید).

یک خط در filename برای کاربر "user" با رمز عبور "pass" به صورت "user:" خواهد بود که به دنبال آن خروجی دستور زیر با استفاده از SHA-256 به عنوان طرح درهم‌سازی قرار می‌گیرد:

% openssl passwd -5 pass
$5$UIhtJSBOaC0Ap3Vk$nbKgmykshoQ2HmvA3s/nI.X4uhhNHBKTYhBS3pYLjJ6

برای مشاهده فهرست طرح‌های درهم‌سازی قابل تولید، صفحه راهنمای openssl-passwd(1) را ببینید. باید طرحی را انتخاب کنید که تابع crypt(3) سیستم شما از آن پشتیبانی می‌کند (دستور "man 3 crypt" یا "man 5 crypt" را برای یافتن طرح‌های درهم‌سازی پشتیبانی‌شده اجرا کنید).

در صورتی که OpenSSL روی سرور شما نصب نیست، می‌توانید از دستور Perl زیر نیز استفاده کنید که همین کار را با SHA-256 انجام می‌دهد (برای تنظیم "YourSalt" روی مقدار مناسب، جزئیات زیر را ببینید؛ "5" پیشوند مربوط به SHA-256 است که انتظار هیچ پارامتری را ندارد):

% perl -le 'print crypt("pass", q{$5$YourSalt$})'
$5$YourSalt$V5hqwFg1nhKb5as6md9KTe5b2NyavsMS6dBYVKfp5W7

از آنجا که Perl از crypt(3) استفاده می‌کند، به تمام طرح‌های درهم‌سازی موجود در سیستم‌های خود دسترسی دارید. به عنوان مثال، اگر yescript پشتیبانی شود، می‌توانید با آرگومانی مانند "$y$j9T$YourSalt$" به تابع crypt در Perl یک رمز عبور رمزگذاری‌شده تولید کنید، که در آن "y" پیشوند yescript است، "j9T" پارامترهای ارسالی به crypt_gensalt(3) برای تولید رمز عبور درهم‌سازی‌شده است (این پارامترها پیکربندی yescript را کنترل می‌کنند و در این مثال با پرچم "YESCRYPT_DEFAULTS" مطابقت دارند، نوع توصیه‌شده‌ای که در سال ۲۰۲۳ مقدار "j" دارد، با ضریب هزینه ۴۰۹۶ به عنوان تعداد بلوک و ۳۲ به عنوان اندازه بلوک) و "YourSalt" رشته‌ای است که باید به طور تصادفی انتخاب شود و برای هر کاربر متفاوت باشد. نحو و طول بهینه salt به طرح درهم‌سازی (به عنوان مثال، طولی مضرب ۴ برای yescript) و توصیه‌های رمزنگاری (به عنوان مثال، حداقل ۳۲ بیت تصادفی در طول، طبق توصیه‌های NIST SP 800-63B در سال ۲۰۲۳) بستگی دارد.

به طور خلاصه، در دستور زیر، فقط باید رمز عبور "pass" و رشته تصادفی "YourSalt" را تغییر دهید که برای هر کاربر متفاوت است، و بقیه دستور را همان‌طور که هست رها کنید:

% perl -le 'print crypt("pass", q{$y$j9T$YourSalt$})'
$y$j9T$YourSalt$X4tB48vKNDT6mK0vNOc7ppKPWvEsyMg5LwoQfO50r2A

یک salt تصادفی ۱۲ نویسه‌ای را می‌توان با دستور زیر به دست آورد (نتیجه مربوط به ۷۲ بیت تصادفی است زیرا هر نویسه در محدوده ۶ بیتی از ۶۴ نویسه ممکن انتخاب می‌شود):

% perl -le 'print join("",
      (".", "/", 0..9, A..Z, a..z)[map {rand 64} (1..12)])'
k2W/17eJu58r
تلاش برای جستجوی گروه سیستمی متناظر با نام کاربری و بازگرداندن رشته‌ای مانند "user@group" برای تطبیق در readers.conf. این گزینه با گزینه‌های -d و -f ناسازگار است.
استفاده از password به عنوان رمز عبور برای احراز هویت به جای خواندن رمز عبور با پروتکل احراز هویت nnrpd. این گزینه فقط برای آزمایش سیستم احراز هویت شما مفید است (به‌ویژه از آنجا که شامل قرار دادن رمز عبور در خط فرمان می‌شود)، و زمانی که ckpasswd توسط nnrpd اجرا می‌شود کار نمی‌کند. اگر این گزینه داده شود، گزینه -u نیز باید مشخص شود.
بررسی رمزهای عبور در برابر نتیجه getspnam(3) به جای getpwnam(3). این تابع، در سیستم‌هایی که از آن پشتیبانی می‌کنند، از /etc/shadow یا فایل‌های محدودتر مشابه می‌خواند. اگر می‌خواهید رمزهای عبور ارائه‌شده به nnrpd(8) را در برابر رمزهای عبور حساب‌های سیستمی بررسی کنید، احتمالاً در اکثر سیستم‌ها باید از این گزینه استفاده کنید.

بیشتر سیستم‌ها برای فراخوانی getspnam(3) به امتیازات ویژه نیاز دارند، بنابراین برای استفاده از این گزینه ممکن است لازم باشد ckpasswd را دارای setgid به گروهی خاص (مانند گروه "shadow") یا حتی setuid root کنید. ckpasswd به طور خاص برای چنین استفاده‌هایی بازرسی امنیتی نشده است! با این حال، این یک برنامه بسیار کوچک است که باید بتوانید آن را به صورت دستی از نظر امنیتی بررسی کنید.

این پیکربندی، در صورت امکان اجتناب از آن، به دلایل جدی امنیتی توصیه نمی‌شود. برای بحث در این مورد، به بخش «ملاحظات امنیتی (SECURITY CONSIDERATIONS)» در readers.conf(5) مراجعه کنید.

احراز هویت به عنوان username. این گزینه فقط برای آزمایش مفید است (به طوری که بتوانید سیستم احراز هویت خود را به راحتی آزمایش کنید) و زمانی که ckpasswd توسط nnrpd اجرا می‌شود کار نمی‌کند. اگر این گزینه داده شود، گزینه -p نیز باید مشخص شود.

برای مثال‌هایی از پیکربندی احراز هویت nnrpd(8) که از ckpasswd برای بررسی رمزهای عبور استفاده می‌کند، به readers.conf(5) مراجعه کنید.

یک پیکربندی نمونه PAM برای /etc/pam.conf که به ckpasswd می‌گوید نام‌های کاربری و رمزهای عبور را در برابر حساب‌های کاربری سیستم بررسی کند:

nnrpd auth    required pam_unix.so
nnrpd account required pam_unix.so

سیستم شما ممکن است از شما بخواهد به جای آن فایلی به نام nnrpd در /etc/pam.d با خطوطی مانند زیر ایجاد کنید:

auth    required pam_unix.so
account required pam_unix.so

این تنها ساده‌ترین پیکربندی است. شما ممکن است بتوانید فایل‌های مشترک را وارد (include) کنید، و ممکن است بخواهید ماژول‌های دیگری را روی هم بچینید (stack کنید)، چه برای مجاز کردن روش‌های مختلف احراز هویت یا برای اعمال محدودیت‌هایی مانند فهرست کاربرانی که نمی‌توانند با استفاده از ckpasswd احراز هویت شوند. بهترین راهنما، مستندات سیستم شما و سایر پیکربندی‌های PAM است که در حال حاضر استفاده می‌کنید.

برای آزمایش و اطمینان از اینکه ckpasswd به درستی کار می‌کند، می‌توانید آن را به صورت دستی اجرا کنید و سپس نام کاربری (با پیشوند "ClientAuthname:") و رمز عبور (با پیشوند "ClientPassword:") را در ورودی استاندارد به آن بدهید. به عنوان مثال:

(echo 'ClientAuthname: test' ; echo 'ClientPassword: testing') \
    | ckpasswd -f /path/to/passwd/file

این دستور نام کاربری "test" و رمز عبور "testing" را در برابر نام کاربری و رمزهای عبور ذخیره‌شده در /path/to/passwd/file بررسی خواهد کرد. در صورت موفقیت، ckpasswd عبارت "User:test" را چاپ کرده و با وضعیت "0" خارج می‌شود. در صورت شکست، نوعی پیام خطا چاپ کرده و با وضعیت غیرصفر خارج خواهد شد.

نوشته‌شده توسط Russ Allbery <eagle@eyrie.org> برای InterNetNews.

crypt(3), nnrpd(8), pam(7), readers.conf(5).

2023-03-07 INN 2.7.4