SUDOERS_TIMESTAMP(5) File Formats Manual SUDOERS_TIMESTAMP(5)

sudoers_timestamp — فرمت فایلهای برچسب زمانی sudoers

پلاگین sudoers از پرونده‌های برچسب زمانی به ازای هر شناسه کاربر (user-ID) برای حافظهٔ نهان اعتبارنامه‌ها استفاده می‌کند. هنگامی که کاربری احراز هویت شد، می‌تواند برای مدت کوتاهی ( دقیقه، مگر اینکه توسط گزینهٔ timestamp_timeout لغو شده باشد) بدون نیاز به گذرواژه از sudo استفاده کند. به طور پیشفرض، sudoers از یک رکورد مجزا برای هر ترمینال استفاده می‌کند، به این معنی که نشست‌های ورود کاربر به طور جداگانه احراز هویت می‌شوند. گزینهٔ می‌تواند برای انتخاب نوع رکورد برچسب زمانی که sudoers استفاده خواهد کرد، به کار رود.

یک فرمت پرونده برچسب زمانی چندرکوردی در sudo 1.8.10 معرفی شد که از یک پرونده واحد برای هر کاربر استفاده می‌کند. پیش از این، یک پرونده جداگانه برای هر ترکیب کاربر و ترمینال استفاده می‌شد، مگر اینکه برچسب‌های زمانی مبتنی بر tty غیرفعال شده بودند. فرمت جدید قابل گسترش است و رکوردهایی از انواع و نسخه‌های مختلف می‌توانند درون یک پرونده مشترک همزیستی داشته باشند.

تمام رکوردها، صرف‌نظر از نوع یا نسخه، با یک شماره نسخهٔ ۱۶ بیتی و یک اندازه رکورد ۱۶ بیتی آغاز می‌شوند.

رکوردهای برچسب زمانی ساختار زیر را دارند:

/* Time stamp entry types */
#define TS_GLOBAL               0x01U   /* not restricted by tty or ppid */
#define TS_TTY                  0x02U   /* restricted by tty */
#define TS_PPID                 0x03U   /* restricted by ppid */
#define TS_LOCKEXCL             0x04U   /* special lock record */

/* Time stamp flags */
#define TS_DISABLED             0x01U   /* entry disabled */
#define TS_ANYUID               0x02U   /* ignore uid, only valid in key */

struct timestamp_entry {
    unsigned short version;     /* version number */
    unsigned short size;        /* entry size */
    unsigned short type;        /* TS_GLOBAL, TS_TTY, TS_PPID */
    unsigned short flags;       /* TS_DISABLED, TS_ANYUID */
    uid_t auth_uid;             /* uid to authenticate as */
    pid_t sid;                  /* session ID associated with tty/ppid */
    struct timespec start_time; /* session/ppid start time */
    struct timespec ts;         /* time stamp (CLOCK_MONOTONIC) */
    union {
        dev_t ttydev;           /* tty device number */
        pid_t ppid;             /* parent pid */
    } u;
};

فیلدهای ساختار timestamp_entry به شرح زیر هستند:

version
شماره نسخهٔ ساختار timestamp_entry. ورودی‌های جدید با شماره نسخهٔ ۲ ایجاد می‌شوند. رکوردهایی با شماره نسخه‌های مختلف می‌توانند درون یک پرونده همزیستی داشته باشند اما با یکدیگر سازگار و دارای عملکرد متقابل (inter-operable) نیستند.
size
اندازهٔ رکورد بر حسب بایت.
type
نوع رکورد، در حال حاضر TS_GLOBAL, TS_TTY, یا TS_PPID.
flags
صفر یا چند پرچم رکورد که می‌توانند با یکدیگر OR بیتی شوند. پرچم‌های پشتیبانی‌شده عبارتند از TS_DISABLED, برای رکوردهای غیرفعال‌شده از طریق sudo -k و TS_ANYUID, که تنها هنگام تطبیق رکوردها به کار می‌رود.
auth_uid
شناسه کاربری (user-ID) که برای احراز هویت استفاده شده است. بسته به مقدار گزینه‌های , و targetpw, شناسه کاربری ممکن است متعلق به کاربر فراخواننده، کاربر root، کاربر پیشفرض runas یا کاربر هدف باشد.
sid
شناسهٔ نشست ترمینال کاربر، در صورت وجود. شناسهٔ نشست تنها هنگام تطبیق رکوردهای از نوع TS_TTY استفاده می‌شود.
start_time
زمان شروع رهبر نشست برای رکوردهای از نوع TS_TTY یا فرایند والد برای رکوردهای از نوع TS_PPID. فیلد start_time برای کمک به جلوگیری از استفادهٔ مجدد از یک رکورد برچسب زمانی پس از خروج کاربر از سیستم استفاده می‌شود. همه سیستم‌ها از روشی برای بازیابی آسان زمان شروع فرایند پشتیبانی نمی‌کنند. فیلد start_time در sudoers نسخهٔ 1.8.22 برای بازبینی دوم ساختار timestamp_entry اضافه شد.
ts
برچسب زمانی واقعی. در صورتی که سیستم از آن پشتیبانی کند، یک منبع زمانی یکنواخت (monotonic time source، که رو به عقب حرکت نمی‌کند) استفاده می‌شود. در صورت امکان، sudoers از یک تایمر یکنواخت استفاده می‌کند که حتی در زمان تعلیق سیستم نیز افزایش می‌یابد. مقدار ts هر بار که دستوری از طریق sudo اجرا می‌شود، به‌روزرسانی می‌گردد. اگر اختلاف بین ts و زمان فعلی کمتر از مقدار گزینهٔ timestamp_timeout باشد، نیازی به گذرواژه نخواهد بود.
u.ttydev
شماره دستگاه ترمینال مرتبط با نشست برای رکوردهای از نوع TS_TTY.
u.ppid
شناسهٔ فرایند والد برای رکوردهای از نوع TS_PPID.

ابزار tsdump, که همراه با توزیع سورس sudo ارائه شده است، می‌تواند برای نمایش محتویات یک پروندهٔ برچسب زمانی استفاده شود.

در sudoers نسخه‌های 1.8.10 تا 1.8.14، هنگام خواندن یا نوشتن در پرونده، کل پروندهٔ برچسب زمانی برای دسترسی انحصاری قفل می‌شد. از sudoers 1.8.15 به بعد، به جای کل پرونده، رکوردهای مجزا در پرونده برچسب زمانی قفل می‌شوند و قفل برای مدت زمان طولانی‌تری نگه داشته می‌شود. این سازوکار در ادامه شرح داده شده است.

نخستین رکورد در پرونده برچسب زمانی از نوع TS_LOCKEXCL است و به عنوان یک رکورد (قفل) به کار می‌رود تا از افزودن رکورد جدید توسط بیش از یک فرایند sudo به طور همزمان جلوگیری کند. به محض اینکه رکورد برچسب زمانی مورد نظر پیدا یا ایجاد (و قفل) شد، قفل رکورد TS_LOCKEXCL آزاد می‌شود. با این حال، قفل روی رکورد مجزای برچسب زمانی تا زمان تکمیل احراز هویت حفظ می‌شود. این قابلیت به sudoers اجازه می‌دهد تا از درخواست چندبارهٔ گذرواژه در زمانی که بیش از یک بار در یک خط لوله (pipeline) استفاده می‌شود، جلوگیری کند.

رکوردهای از نوع TS_GLOBAL نمی‌توانند برای مدت طولانی قفل شوند، زیرا انجام این کار با سایر فرایندهای sudo تداخل ایجاد می‌کند. در عوض، از یک رکورد قفل جداگانه استفاده می‌شود تا از درخواست همزمان گذرواژه توسط چندین فرایند sudo که از یک ترمینال (یا شناسه فرایند والد) یکسان استفاده می‌کنند، جلوگیری به عمل آید.

sudoers(5), sudo(8)

در ابتدا، sudo از یک پروندهٔ تک با طول صفر برای هر کاربر استفاده می‌کرد و زمان ویرایش پرونده به عنوان برچسب زمانی به کار می‌رفت. نسخه‌های بعدی sudo محدودیت‌هایی بر مالکیت پرونده‌ها و دایرکتوری برچسب زمانی و همچنین بررسی‌هایی بر صحت خود برچسب زمانی اضافه کردند. تغییرات قابل توجه در نسخه‌های زیر از sudo معرفی شدند:

1.4.0
پشتیبانی از پرونده برچسب زمانی مبتنی بر tty با الحاق نام ترمینال به انتهای نام پرونده برچسب زمانی اضافه شد.
1.6.2
پرونده برچسب زمانی با یک دایرکتوری به ازای هر کاربر که شامل پرونده‌های برچسب زمانی مبتنی بر tty بود، جایگزین گردید.
1.6.3p2
هنگامی که گزینهٔ targetpw تنظیم شده بود، نام کاربر هدف به نام پرونده برچسب زمانی اضافه شد.
1.7.3
اطلاعات مربوط به دستگاه ترمینال برای بررسی‌های اعتبار در پرونده‌های برچسب زمانی مبتنی بر tty ذخیره شد. این اطلاعات شامل شماره‌های دستگاه ترمینال، شماره inode و در سیستم‌هایی که هنگام نوشتن روی دستگاه به‌روزرسانی نمی‌شد، زمان تغییر inode بود. این امر به جلوگیری از استفاده مجدد از پرونده برچسب زمانی پس از خروج از سیستم کمک کرد.
1.8.6p7
شناسهٔ نشست ترمینال به پرونده‌های برچسب زمانی مبتنی بر tty اضافه شد تا از استفاده مجدد از برچسب زمانی توسط همان کاربر در یک نشست ترمینال دیگر جلوگیری به عمل آید. همچنین به جلوگیری از استفاده مجدد از پرونده برچسب زمانی در سیستم‌هایی که در آن‌ها زمان تغییر inode دستگاه ترمینال هنگام نوشتن به‌روزرسانی می‌شد، کمک کرد.
1.8.10
یک فرمت جدید و چندرکوردی برای پرونده برچسب زمانی معرفی شد که از یک پرونده واحد به ازای هر کاربر استفاده می‌کند. زمان تغییر دستگاه ترمینال گنجانده نشد، زیرا اکنون بیشتر سیستم‌ها همان‌طور که توسط POSIX الزامی شده است، پس از انجام عمل نوشتن، زمان تغییر را به‌روز می‌کنند.
1.8.15
رکوردهای منفرد در پرونده برچسب زمانی به جای کل پرونده قفل می‌شوند و قفل تا زمان تکمیل احراز هویت حفظ می‌شود.
1.8.22
زمان شروع رهبر نشست ترمینال یا فرایند والد اکنون در رکوردهای غیرسراسری (non-global) برچسب زمانی ذخیره می‌شود. این کار در اکثر موارد مانع از استفاده مجدد از پرونده برچسب زمانی پس از خروج از سیستم می‌شود.

پشتیبانی از برچسب‌های زمانی tty مبتنی بر هسته که در OpenBSD موجود است و از پرونده برچسب زمانی روی دیسک استفاده نمی‌کند، افزوده شد.

1.9.15
مسیرهای پرونده برچسب زمانی اکنون به جای نام کاربر، بر اساس شناسه کاربری (user-ID) کاربر فراخواننده تعیین می‌شوند. این امر از بروز مشکلات با نام‌های کاربری که شامل نویسهٔ جداکننده مسیر هستند، جلوگیری می‌کند.

افراد بسیاری در طول سال‌ها بر روی sudo کار کرده‌اند؛ این نسخه عمدتاً متشکل از کدهایی است که توسط افراد زیر نوشته شده است:

Todd C. Miller

برای مشاهده فهرست جامعی از افرادی که در sudo مشارکت داشته‌اند، پرونده CONTRIBUTORS.md را در توزیع sudo (https://www.sudo.ws/about/contributors) ببینید.

اگر فکر می‌کنید اشکالی در sudoers_timestamp یافته‌اید، می‌توانید گزارش اشکال را در پایگاه‌داده اشکالات sudo در https://bugzilla.sudo.ws ثبت کنید یا یک issue در https://github.com/sudo-project/sudo/issues باز نمایید. اگر ترجیح می‌دهید از ایمیل استفاده کنید، پیام‌ها می‌توانند به لیست پستی sudo-workers در https://www.sudo.ws/mailman/listinfo/sudo-workers (عمومی) یا <sudo@sudo.ws> (خصوصی) ارسال شوند.

لطفاً آسیب‌پذیری‌های امنیتی را از طریق issueهای عمومی گیت‌هاب، Bugzilla یا لیست‌های پستی گزارش ندهید. در عوض، آن‌ها را از طریق ایمیل به <Todd.Miller@sudo.ws> ارسال نمایید. در صورت تمایل می‌توانید پیام خود را با استفاده از کلید موجود در https://www.sudo.ws/dist/PGPKEYS با PGP رمزگذاری کنید.

پشتیبانی محدود و رایگان از طریق فهرست پستی sudo-users در دسترس است، برای عضویت یا جستجو در آرشیوها به https://www.sudo.ws/mailman/listinfo/sudo-users مراجعه نمایید.

sudo به صورت “همان‌طور که هست (AS IS)” ارائه می‌شود و هرگونه ضمانت صریح یا ضمنی، شامل، اما نه محدود به، ضمانت‌های ضمنی خریدوفروش و تناسب برای یک هدف خاص سلب می‌شود. برای جزئیات کامل، پروندهٔ LICENSE.md توزیع‌شده همراه با sudo یا https://www.sudo.ws/about/license را ببینید.

November 26, 2023 Sudo 1.9.17p2