.\" -*- mode: troff; coding: utf-8 -*- .\" Automatically generated by Pod::Man 5.0102 (Pod::Simple 3.45) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. .ie n \{\ . ds C` "" . ds C' "" 'br\} .el\{\ . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" ======================================================================== .\" .IX Title "CKPASSWD 8" .TH CKPASSWD 8 2023-03-07 "INN 2.7.4" "InterNetNews Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "نام (NAME)" ckpasswd \- برنامه کمکی احراز هویت رمز عبور برای NNTP .SH "خلاصه دستور (SYNOPSIS)" .IX Header "SYNOPSIS" \&\fBckpasswd\fR [\fB\-gs\fR] [\fB\-d\fR \fIdatabase\fR] [\fB\-f\fR \fIfilename\fR] [\fB\-u\fR \fIusername\fR \fB\-p\fR \fIpassword\fR] .SH "توضیحات (DESCRIPTION)" .IX Header "DESCRIPTION" دستور \&\fBckpasswd\fR احراز‌هویت‌کننده پایه رمز عبور برای \&\fBnnrpd\fR است که برای اجرا از درون یک بند (stanza) احراز هویت در \&\fIreaders.conf\fR مناسب است. برای اطلاعات بیشتر درباره نحوه پیکربندی احراز‌هویت‌کننده \&\fBnnrpd\fR صفحه راهنمای readers.conf(5) را ببینید. .PP دستور \&\fBckpasswd\fR نام کاربری و رمز عبور را از \&\fBnnrpd\fR دریافت می‌کند و به nnrpd(8) اطلاع می‌دهد که آیا آن رمز عبور برای آن نام کاربری درست است یا خیر. به‌طور پیش‌فرض، هنگامی که هیچ آرگومانی داده نشود، اگر هنگام ساخت INN پشتیبانی از PAM یافت شده باشد، تلاش می‌کند رمز عبور را با استفاده از PAM بررسی کند. در صورت عدم موفقیت، تلاش می‌کند رمز عبور را در برابر فیلد رمز عبور بازگردانده‌شده توسط getpwnam(3) بررسی کند. توجه داشته باشید که امروزه بیشتر سیستم‌ها دیگر رمزهای عبور واقعی را از طریق getpwnam(3) در دسترس قرار نمی‌دهند (برخی هنوز این کار را انجام می‌دهند فقط و فقط در صورتی که برنامه فراخواننده getpwnam(3) به عنوان ریشه (root) اجرا شود). .PP هنگام استفاده از PAM، دستور \&\fBckpasswd\fR خود را به عنوان \&\f(CW\*(C`nnrpd\*(C'\fR معرفی می‌کند، نه \&\f(CW\*(C`ckpasswd\*(C'\fR، و پیکربندی PAM باید بر همین اساس تنظیم شود. جزئیات پیکربندی PAM در سیستم‌عامل‌های مختلف (و حتی توزیع‌های مختلف لینوکس) متفاوت است؛ برای شروع به بخش «مثال‌ها (EXAMPLES)» در زیر مراجعه کنید و به دنبال صفحه راهنمای pam(7) یا pam.conf(4) روی سیستم خود باشید. .PP هنگام استفاده از هر روشی غیر از PAM، دستور \&\fBckpasswd\fR انتظار دارد که تمام رمزهای عبور به‌صورت رمزگذاری‌شده توسط تابع crypt(3) سیستم ذخیره شده باشند و تابع crypt(3) را روی رمز عبور ارائه‌شده قبل از مقایسه آن با رمز عبور مورد انتظار فراخوانی می‌کند. هر الگوریتم درهم‌سازی (هشینگ) رمز عبور که توسط libc یا libcrypt شما پشتیبانی شود، قابل استفاده است. .SH "گزینه‌ها (OPTIONS)" .IX Header "OPTIONS" .IP "\fB\-d\fR \fIdatabase\fR" 4 .IX Item "-d database" رمزهای عبور را به جای استفاده از getpwnam(3) از یک پایگاه‌داده (با قالب ndbm، gdbm یا dbm بسته به آنچه در سیستم شما موجود است) بخواند. \&\fBckpasswd\fR انتظار دارد فایل‌های \&\fIdatabase\fR.dir و \&\fIdatabase\fR.pag وجود داشته باشند و پایگاه‌داده‌ای با کلید نام کاربری و مقادیر رمزهای عبور رمزگذاری‌شده باشند. .Sp اگرچه INN با برنامه‌ای که مشخصاً برای ایجاد چنین پایگاه‌های داده‌ای در نظر گرفته شده باشد ارائه نمی‌شود، در اکثر سیستم‌ها نوشتن یک اسکریپت Perl برای انجام این کار نسبتاً آسان است. چیزی شبیه به: .Sp .Vb 10 \& #!/usr/bin/perl \& use NDBM_File; \& use Fcntl; \& tie (%db, \*(AqNDBM_File\*(Aq, \*(Aq/path/to/database\*(Aq, O_RDWR|O_CREAT, 0640) \& or die "Cannot open /path/to/database: $!\en"; \& $| = 1; \& print "Username: "; \& my $user = ; \& chomp $user; \& print "Password: "; \& my $passwd = ; \& chomp $passwd; \& my @alphabet = (\*(Aq.\*(Aq, \*(Aq/\*(Aq, 0..9, \*(AqA\*(Aq..\*(AqZ\*(Aq, \*(Aqa\*(Aq..\*(Aqz\*(Aq); \& my $salt = join \*(Aq\*(Aq, @alphabet[rand 64, rand 64]; \& $db{$user} = crypt ($passwd, $salt); \& untie %db; .Ve .Sp توجه داشته باشید که این اسکریپت رمز عبور را هنگام تایپ نمایش می‌دهد (echo می‌کند)؛ بهبودهای آشکاری وجود دارد که می‌توان روی آن اعمال کرد، اما این می‌تواند یک شروع مناسب باشد. گاهی اوقات برنامه‌ای مانند این با نام \&\fBdbmpasswd\fR در دسترس است. .Sp این گزینه در سیستم‌های فاقد کتابخانه‌های ndbm، gdbm یا dbm در دسترس نخواهد بود. .IP "\fB\-f\fR \fIfilename\fR" 4 .IX Item "-f filename" رمزهای عبور را به جای استفاده از getpwnam(3) از فایل داده‌شده بخواند. هر خط از این فایل باید چیزی شبیه به این باشد: .Sp .Vb 2 \& username:$5$Hlb2yXPd$2nOO/QR9P1mnRFr/i6L9ybxbgSDXd4UlatKqbcY4eoB \& joe:FCjOJnpOo50IE:Old weak hash algorithm used for Joe .Ve .Sp هر خط حداقل دارای دو فیلد است که با دو‌نقطه (:) از هم جدا شده‌اند. فیلد اول حاوی نام کاربری است؛ فیلد دوم حاوی رمز عبوری است که با تابع crypt(3) درهم‌سازی (هش) شده است. دونقطه‌ها و داده‌های اضافی ممکن است پس از رمز عبور رمزگذاری‌شده بیایند؛ این داده‌ها توسط \&\fBckpasswd\fR نادیده گرفته می‌شوند. خطوطی که با علامت هش (\f(CW\*(C`#\*(C'\fR) شروع می‌شوند نادیده گرفته می‌شوند. .Sp برنامه INN ابزاری برای ایجاد رمزهای عبور رمزگذاری‌شده به همراه ندارد، اما OpenSSL می‌تواند این کار را انجام دهد و با Perl نیز به سرعت قابل انجام است (اسکریپت تک‌خطی نمونه زیر را ببینید). .Sp یک خط در \&\fIfilename\fR برای کاربر \&\f(CW\*(C`user\*(C'\fR با رمز عبور \&\f(CW\*(C`pass\*(C'\fR به صورت \&\f(CW\*(C`user:\*(C'\fR خواهد بود که به دنبال آن خروجی دستور زیر با استفاده از SHA\-256 به عنوان طرح درهم‌سازی قرار می‌گیرد: .Sp .Vb 2 \& % openssl passwd \-5 pass \& $5$UIhtJSBOaC0Ap3Vk$nbKgmykshoQ2HmvA3s/nI.X4uhhNHBKTYhBS3pYLjJ6 .Ve .Sp برای مشاهده فهرست طرح‌های درهم‌سازی قابل تولید، صفحه راهنمای openssl\-passwd(1) را ببینید. باید طرحی را انتخاب کنید که تابع crypt(3) سیستم شما از آن پشتیبانی می‌کند (دستور \&\f(CW\*(C`man 3 crypt\*(C'\fR یا \&\f(CW\*(C`man 5 crypt\*(C'\fR را برای یافتن طرح‌های درهم‌سازی پشتیبانی‌شده اجرا کنید). .Sp در صورتی که OpenSSL روی سرور شما نصب نیست، می‌توانید از دستور Perl زیر نیز استفاده کنید که همین کار را با SHA\-256 انجام می‌دهد (برای تنظیم \&\f(CW\*(C`YourSalt\*(C'\fR روی مقدار مناسب، جزئیات زیر را ببینید؛ \&\f(CW\*(C`5\*(C'\fR پیشوند مربوط به SHA\-256 است که انتظار هیچ پارامتری را ندارد): .Sp .Vb 2 \& % perl \-le \*(Aqprint crypt("pass", q{$5$YourSalt$})\*(Aq \& $5$YourSalt$V5hqwFg1nhKb5as6md9KTe5b2NyavsMS6dBYVKfp5W7 .Ve .Sp از آنجا که Perl از crypt(3) استفاده می‌کند، به تمام طرح‌های درهم‌سازی موجود در سیستم‌های خود دسترسی دارید. به عنوان مثال، اگر yescript پشتیبانی شود، می‌توانید با آرگومانی مانند \&\f(CW\*(C`$y$j9T$YourSalt$\*(C'\fR به تابع crypt در Perl یک رمز عبور رمزگذاری‌شده تولید کنید، که در آن \&\f(CW\*(C`y\*(C'\fR پیشوند yescript است، \&\f(CW\*(C`j9T\*(C'\fR پارامترهای ارسالی به crypt_gensalt(3) برای تولید رمز عبور درهم‌سازی‌شده است (این پارامترها پیکربندی yescript را کنترل می‌کنند و در این مثال با پرچم \&\f(CW\*(C`YESCRYPT_DEFAULTS\*(C'\fR مطابقت دارند، نوع توصیه‌شده‌ای که در سال ۲۰۲۳ مقدار \&\f(CW\*(C`j\*(C'\fR دارد، با ضریب هزینه ۴۰۹۶ به عنوان تعداد بلوک و ۳۲ به عنوان اندازه بلوک) و \&\f(CW\*(C`YourSalt\*(C'\fR رشته‌ای است که باید به طور تصادفی انتخاب شود و برای هر کاربر متفاوت باشد. نحو و طول بهینه salt به طرح درهم‌سازی (به عنوان مثال، طولی مضرب ۴ برای yescript) و توصیه‌های رمزنگاری (به عنوان مثال، حداقل ۳۲ بیت تصادفی در طول، طبق توصیه‌های NIST SP\ 800\-63B در سال ۲۰۲۳) بستگی دارد. .Sp به طور خلاصه، در دستور زیر، فقط باید رمز عبور \&\f(CW\*(C`pass\*(C'\fR و رشته تصادفی \&\f(CW\*(C`YourSalt\*(C'\fR را تغییر دهید که برای \&\fBهر\fR کاربر متفاوت است، و بقیه دستور را همان‌طور که هست رها کنید: .Sp .Vb 2 \& % perl \-le \*(Aqprint crypt("pass", q{$y$j9T$YourSalt$})\*(Aq \& $y$j9T$YourSalt$X4tB48vKNDT6mK0vNOc7ppKPWvEsyMg5LwoQfO50r2A .Ve .Sp یک salt تصادفی ۱۲ نویسه‌ای را می‌توان با دستور زیر به دست آورد (نتیجه مربوط به ۷۲ بیت تصادفی است زیرا هر نویسه در محدوده ۶ بیتی از ۶۴ نویسه ممکن انتخاب می‌شود): .Sp .Vb 3 \& % perl \-le \*(Aqprint join("", \& (".", "/", 0..9, A..Z, a..z)[map {rand 64} (1..12)])\*(Aq \& k2W/17eJu58r .Ve .IP \fB\-g\fR 4 .IX Item "-g" تلاش برای جستجوی گروه سیستمی متناظر با نام کاربری و بازگرداندن رشته‌ای مانند \&\f(CW\*(C`user@group\*(C'\fR برای تطبیق در \&\fIreaders.conf\fR. این گزینه با گزینه‌های \&\fB\-d\fR و \&\fB\-f\fR ناسازگار است. .IP "\fB\-p\fR \fIpassword\fR" 4 .IX Item "-p password" استفاده از \&\fIpassword\fR به عنوان رمز عبور برای احراز هویت به جای خواندن رمز عبور با پروتکل احراز هویت \&\fBnnrpd\fR. این گزینه فقط برای آزمایش سیستم احراز هویت شما مفید است (به‌ویژه از آنجا که شامل قرار دادن رمز عبور در خط فرمان می‌شود)، و زمانی که \&\fBckpasswd\fR توسط \&\fBnnrpd\fR اجرا می‌شود کار نمی‌کند. اگر این گزینه داده شود، گزینه \&\fB\-u\fR نیز باید مشخص شود. .IP \fB\-s\fR 4 .IX Item "-s" بررسی رمزهای عبور در برابر نتیجه getspnam(3) به جای getpwnam(3). این تابع، در سیستم‌هایی که از آن پشتیبانی می‌کنند، از \&\fI/etc/shadow\fR یا فایل‌های محدودتر مشابه می‌خواند. اگر می‌خواهید رمزهای عبور ارائه‌شده به nnrpd(8) را در برابر رمزهای عبور حساب‌های سیستمی بررسی کنید، احتمالاً در اکثر سیستم‌ها باید از این گزینه استفاده کنید. .Sp بیشتر سیستم‌ها برای فراخوانی getspnam(3) به امتیازات ویژه نیاز دارند، بنابراین برای استفاده از این گزینه ممکن است لازم باشد \&\fBckpasswd\fR را دارای setgid به گروهی خاص (مانند گروه \&\f(CW\*(C`shadow\*(C'\fR) یا حتی setuid root کنید. \&\fBckpasswd\fR به طور خاص برای چنین استفاده‌هایی بازرسی امنیتی نشده است! با این حال، این یک برنامه بسیار کوچک است که باید بتوانید آن را به صورت دستی از نظر امنیتی بررسی کنید. .Sp این پیکربندی، در صورت امکان اجتناب از آن، به دلایل جدی امنیتی توصیه نمی‌شود. برای بحث در این مورد، به بخش «ملاحظات امنیتی (SECURITY CONSIDERATIONS)» در readers.conf(5) مراجعه کنید. .IP "\fB\-u\fR \fIusername\fR" 4 .IX Item "-u username" احراز هویت به عنوان \&\fIusername\fR. این گزینه فقط برای آزمایش مفید است (به طوری که بتوانید سیستم احراز هویت خود را به راحتی آزمایش کنید) و زمانی که \&\fBckpasswd\fR توسط \&\fBnnrpd\fR اجرا می‌شود کار نمی‌کند. اگر این گزینه داده شود، گزینه \&\fB\-p\fR نیز باید مشخص شود. .SH "مثال‌ها (EXAMPLES)" .IX Header "EXAMPLES" برای مثال‌هایی از پیکربندی احراز هویت nnrpd(8) که از \&\fBckpasswd\fR برای بررسی رمزهای عبور استفاده می‌کند، به readers.conf(5) مراجعه کنید. .PP یک پیکربندی نمونه PAM برای \&\fI/etc/pam.conf\fR که به \&\fBckpasswd\fR می‌گوید نام‌های کاربری و رمزهای عبور را در برابر حساب‌های کاربری سیستم بررسی کند: .PP .Vb 2 \& nnrpd auth required pam_unix.so \& nnrpd account required pam_unix.so .Ve .PP سیستم شما ممکن است از شما بخواهد به جای آن فایلی به نام \&\fInnrpd\fR در \&\fI/etc/pam.d\fR با خطوطی مانند زیر ایجاد کنید: .PP .Vb 2 \& auth required pam_unix.so \& account required pam_unix.so .Ve .PP این تنها ساده‌ترین پیکربندی است. شما ممکن است بتوانید فایل‌های مشترک را وارد (include) کنید، و ممکن است بخواهید ماژول‌های دیگری را روی هم بچینید (stack کنید)، چه برای مجاز کردن روش‌های مختلف احراز هویت یا برای اعمال محدودیت‌هایی مانند فهرست کاربرانی که نمی‌توانند با استفاده از \&\fBckpasswd\fR احراز هویت شوند. بهترین راهنما، مستندات سیستم شما و سایر پیکربندی‌های PAM است که در حال حاضر استفاده می‌کنید. .PP برای آزمایش و اطمینان از اینکه \&\fBckpasswd\fR به درستی کار می‌کند، می‌توانید آن را به صورت دستی اجرا کنید و سپس نام کاربری (با پیشوند \&\f(CW\*(C`ClientAuthname:\*(C'\fR) و رمز عبور (با پیشوند \&\f(CW\*(C`ClientPassword:\*(C'\fR) را در ورودی استاندارد به آن بدهید. به عنوان مثال: .PP .Vb 2 \& (echo \*(AqClientAuthname: test\*(Aq ; echo \*(AqClientPassword: testing\*(Aq) \e \& | ckpasswd \-f /path/to/passwd/file .Ve .PP این دستور نام کاربری \&\f(CW\*(C`test\*(C'\fR و رمز عبور \&\f(CW\*(C`testing\*(C'\fR را در برابر نام کاربری و رمزهای عبور ذخیره‌شده در \&\fI/path/to/passwd/file\fR بررسی خواهد کرد. در صورت موفقیت، \&\fBckpasswd\fR عبارت \&\f(CW\*(C`User:test\*(C'\fR را چاپ کرده و با وضعیت \&\f(CW\*(C`0\*(C'\fR خارج می‌شود. در صورت شکست، نوعی پیام خطا چاپ کرده و با وضعیت غیرصفر خارج خواهد شد. .SH "تاریخچه (HISTORY)" .IX Header "HISTORY" نوشته‌شده توسط Russ Allbery برای InterNetNews. .SH "همچنین ببینید (SEE ALSO)" .IX Header "SEE ALSO" crypt(3), nnrpd(8), pam(7), readers.conf(5).