تاریخچه مختصر و جادوی فایل‌های تغییرناپذیر در لینوکس با دستور chattr

تصور کنید فایلی آنقدر مهم دارید که آرزو می‌کنید می‌توانستید آن را در یک گاوصندوق قفل کنید – حتی کاربر روت قدرتمند هم نباید بتواند تصادفاً آن را دستکاری کند. غیرممکن به نظر می‌رسد؟ نه با یک ابزار لینوکس کمتر شناخته‌شده به نام chattr.

وقتی مجوزها کافی نیستند

تاریخچه‌ی کوچکی ازchattr

در اوایل دهه ۱۹۹۰، همزمان با رشد لینوکس، توسعه‌دهنده‌ای به نام رمی کارت، ابزاری کاربردی را به عنوان بخشی از ابزارهای سیستم فایل ext2 معرفی کرد: chattrکه مخفف “change attribute” است. این ابزار اولین بار حدود سال ۱۹۹۳ به عنوان راهی برای تنظیم پرچم‌های ویژه سیستم فایل روی فایل‌ها و دایرکتوری‌های coral.googlesource.com ظاهر شد . این پرچم‌ها فراتر از مجوزهای استاندارد خواندن-نوشتن-اجرا هستند. در واقع، chattrو ابزار همراه آن lsattr(که ویژگی‌های فایل را فهرست می‌کند) در ابتدا مختص خانواده سیستم فایل ext2/ext3/ext4 بودند و با بسته e2fsprogs  همراه بودند . آن را به عنوان یک لایه اضافی کنترل و محافظت در نظر بگیرید که در فراداده‌های سیستم فایل گنجانده شده است.

جالب اینجاست که مفهوم ویژگی‌های فایل کاملاً جدید نبود – اکثر سیستم‌های شبیه BSD (از جمله macOS) ویژگی مشابهی ( chflags) دارند. اما لینوکس آن را به شیوه خودش تغییر داد . با گذشت زمان، پشتیبانی از chattrپرچم‌های ‘s به سایر سیستم‌های فایل (XFS، ReiserFS، btrfs و غیره) گسترش یافت، اگرچه همه سیستم‌های فایل از هر پرچمی پشتیبانی نمی‌کنند. با وجود این سابقه طولانی، بسیاری از کاربران لینوکس از وجود آن بی‌اطلاع هستند . این ویژگی در سایه‌ها کمین کرده است در حالی که همه مشغول دستوارت chmod , chown هستند.

چرا باید به chattr اهمیت بدهید ؟

چون می‌تواند ترفندهای جالبی انجام دهد که مجوزهای استاندارد فایل به سادگی نمی‌توانند . یکی از این ترفندها، تغییرناپذیر کردن یک فایل است – اساساً فریز کردن آن به طوری که هیچ کس (حتی “root” به معنای معمول) نتواند آن را تغییر دهد یا حذف کند در حالی که آنها با پرچم های chattr  تنظیم شده است .

وقتی مجوزها کافی نیستند

تصور کنید که یک فایل پیکربندی حیاتی یا یک اسکریپت مهم دارید که مطلقاً نباید تغییر کند. اولین کاری که باید انجام دهید این است که مجوزهای آن را قفل کنید: آن را متعلق به rootchown) قرار دهید و مجوزهای نوشتن را با حذف کنید . این یک شروع خوب است و در واقع کاربران عادی را از ویرایش یا حذف فایل chmodباز می‌دارد .

اما نکته اینجاست: اگر کسی امتیازات مدیریتی داشته باشد (مثلاً از طریق sudo)، می‌تواند به راحتی مالکیت یا مجوزها را به حالت قبل برگرداند و سپس فایل را خراب کند. به عبارت دیگر، مجوزهای سنتی یونیکس مانند نصب تابلوی «دست نزنید» هستند – در برابر کاربران رسمی مؤثرند، اما در برابر یک کاربر ارشد مصمم که مالک سرور است ، بی‌فایده هستند .

بنابراین چگونه می‌توانیم سطح امنیت را افزایش دهیم و یک فایل را حتی از تغییرات تصادفی یا مخرب توسط خود root محافظت کنیم ؟ اینجاست که chattrپرچم تغییرناپذیری آن مطرح می‌شود – آن را به عنوان یک قفل ویژه در نظر بگیرید که حتی root قبل از ایجاد تغییرات باید آن را باز کند.

تغییرناپذیر کردن یک فایل با chattr +i

لینوکس chattrویژگی‌ای به نام iimmutable ) دارد که دقیقاً همان کاری را که از اسمش برمی‌آید انجام می‌دهد: یک فایل را غیرقابل تغییر می‌کند. وقتی پرچم تغییرناپذیری روی یک فایل تنظیم شود، هیچ چیز نمی‌تواند آن را تغییر دهد: فایل را نمی‌توان ویرایش، حذف یا تغییر نام داد – حتی توسط کاربر ریشه (تا زمانی که پرچم حذف نشود) . انگار فایل در بتن محصور شده است.

طبق مستندات رسمی، «فایلی با ویژگی «i» قابل تغییر نیست: نمی‌توان آن را حذف یا تغییر نام داد، … و فایل را نمی‌توان در حالت نوشتن باز کرد. فقط کاربر ارشد یا فرآیندی که دارای قابلیت CAP_LINUX_IMMUTABLE است می‌تواند این ویژگی را تنظیم یا پاک کند.» به عبارت ساده‌تر: فایل کاملاً فقط خواندنی و غیرقابل لمس می‌شود، تا زمانی که کسی با امتیازات مناسب، پرچم تغییرناپذیری را به صراحت حذف کند.

جادویی به نظر می‌رسد؟ . فرض کنید فایلی داریم i-am-immutable.txtکه می‌خواهیم از آن محافظت کنیم:

sudo chattr + i  i -am-immutable .txt

ما این دستور را chattr +iبه عنوان root (یا با sudo) اجرا می‌کنیم زیرا فقط یک superuser می‌تواند این قفل ویژه را روی فایل اعمال کند . این دستور بیت تغییرناپذیر را روی i-am-immutable.txt تنظیم می‌کند . چگونه می‌توانیم بررسی کنیم که این دستور کار کرده است؟ lsattrبرای فهرست کردن ویژگی‌های فایل از این دستور استفاده کنید:

lsattr i -am-immutable .txt
 -- --i---------e-----  i -am-immutable .txt

اون قسمت کوچیک رو توی خروجی می‌بینی i؟ این نشون می‌ده که فایل حالا تغییرناپذیر شده.

در این مرحله، اگر سعی در تغییر، انتقال یا حذف داشته باشید i-am-immutable.txt، با خطا مواجه خواهید شد. برای مثال، حتی حذف در سطح ریشه نیز رد خواهد شد:

sudo  rm i-am-immutable.txt 
rm : نمی‌توان 'i-am-immutable.txt' را حذف کرد: عملیات مجاز نیست

بله — حتی کاربر قدرتمند روت هم با یک سیلی «مجوز رد شده» مواجه می‌شود! لینوکس پا پیش گذاشته و فایل به سادگی پاسخ می‌دهد: «نه، اجازه عبور نداری.» 🙂 در عمل، هسته به کسی اجازه تغییر آن فایل را نمی‌دهد، مادامی که پرچم تغییرناپذیر تنظیم شده باشد .

این ویژگی برای محافظت از فایل‌های حیاتی فوق‌العاده مفید است. برای مثال، اغلب پیشنهاد می‌شود که فایل‌های پیکربندی سیستم یا پایگاه‌های داده رمز عبور را تغییرناپذیر کنید تا نتوان آنها را به صورت مخرب یا تصادفی تغییر داد یا حذف کرد (حتی در حین ارتقاء نرم‌افزار). این مانند قرار دادن یک هاله محافظ در اطراف فایل است – هاله‌ای که هیچ چیز نمی‌تواند به آن نفوذ کند مگر اینکه مدیر سیستم آگاهانه آن را حذف کند.

البته، شما (به عنوان مدیر) همچنان کلیدهای لازم برای برداشتن این محافظت را در صورت نیاز در اختیار دارید. اگر زمانی نیاز به ویرایش یا حذف فایل داشتید، ابتدا باید پرچم تغییرناپذیری را حذف کنید :

sudo chattr - i  i -am-immutable .txt

پس از اجرای دستور بالا، فایل به حالت عادی برمی‌گردد و می‌توان دوباره آن را تغییر داد یا حذف کرد (تا زمانی که دفعه بعد پرچم تغییرناپذیری را فعال کنید). بنابراین تغییرناپذیری همیشگی نیست – فقط یک لایه دفاعی است که می‌توانید در صورت نیاز آن را فعال یا غیرفعال کنید.

فقط افزودن: وقتی فقط می‌خواهید چیزی اضافه کنید، نه اینکه چیزی را تغییر دهید

اگر نمی‌خواهید تغییرات در یک فایل را به طور کامل ممنوع کنید، اما می‌خواهید از رونویسی یا حذف هر چیزی جلوگیری کنید، چه ؟ یک سناریوی رایج، فایل‌های لاگ است: شما می‌خواهید برنامه‌ها بتوانند ورودی‌های جدید را به لاگ اضافه کنند ، اما ورودی‌های موجود را کوتاه یا تغییر ندهند. بار دیگر، chattrبا یک ویژگی دیگر آشنا شدید.

a با ویژگی ( فقط الحاق ) آشنا شوید . وقتی فایلی این aویژگی را داشته باشد، فقط می‌تواند در حالت الحاق برای نوشتن در باز شود . به زبان ساده: می‌توانید داده‌های جدید را به انتهای فایل اضافه کنید، اما نمی‌توانید داده‌های موجود را تغییر دهید یا حذف کنید. مانند یک دفتر خاطرات است که می‌توانید در آن به نوشتن مطالب جدید ادامه دهید، اما اجازه پاک کردن یا ویرایش مطالب قبلی را ندارید.

برای قرار دادن یک فایل در حالت فقط ضمیمه، از دستور زیر استفاده کنید:

sudo chattr + a my_log .txt

اکنون my_log.txtبه یک دفترچه یادداشت فقط نوشتنی تبدیل می‌شود – برنامه‌ها می‌توانند به آن اضافه کنند، اما نمی‌توانند آنچه را که قبلاً نوشته شده است تغییر دهند یا حذف کنند. اگر یک متجاوز (یا یک برنامه بی‌دقت) سعی کند محتوای موجود را کوتاه یا تغییر دهد، با یک پیام بزرگ “عملیات مجاز نیست” مواجه می‌شود که تاریخچه فایل شما را دست نخورده نگه می‌دارد. این یک روش عالی برای مقاوم‌سازی گزارش‌های مهم یا فایل‌های حسابرسی در برابر دستکاری است. و درست مانند پرچم تغییرناپذیر، فقط root (یا فرآیندی با قابلیت مناسب) می‌تواند پرچم فقط اضافه کردن را تنظیم یا پاک کند.

هر زمان که نیاز به حذف این محدودیت داشتید (مثلاً هنگام چرخش لاگ‌ها یا اگر واقعاً نیاز به ویرایش فایل دارید)، کافیست علامت را پاک کنید:

sudo chattr - یک فایل my_log.txt

پس از آن، my_log.txtبه حالت عادی خود برمی‌گردد – مانند همیشه قابل ویرایش و حذف است.

نتیجه‌گیری

دستور chattr شاید به اندازه chmod معروف نباشد ، اما بخش قدرتمندی از جعبه ابزار لینوکس است. این دستور به شما امکان می‌دهد با تغییر ویژگی‌های فایل‌های خاص در سطح سیستم فایل، آن‌ها را از دسترسی غیرمجاز مصون کنید . با یک دستور سریع chattr +i می‌توانید یک فایل را تغییرناپذیر کنید – اساساً آن را قفل کنید تا هیچ چیز نتواند آن را تغییر دهد تا زمانی که شما با chattr +a می‌توانید مطمئن شوید که یک فایل فقط با افزودن قابل نوشتن است، بنابراین محتوای موجود آن حفظ می‌شود.

در دنیایی که اشتباهات، اسکریپت‌های بدرفتار یا ویرایش‌های مخرب می‌توانند داده‌های مهم را تهدید کنند، chattrمانند یک مدیر سیستم قدیمی و زرنگ است که بی‌سروصدا تضمین می‌کند «این فایل، صرف نظر از هر اتفاقی، سر جای خود باقی می‌ماند». بنابراین دفعه بعد که فایلی دارید که مطلقاً و قطعاً نباید تغییر کند، یاد chattr بیفتید . با یک دستور ساده، می‌توانید یک فایل بی‌ارزش را به یک شیء دست‌نخورده از سیستم خود تبدیل کنید – حداقل تا زمانی که شما، حاکم قانونی (root)، تصمیم بگیرید طلسم را بردارید.