ریشه در ترمینال، رد شده زیر SELinux: چرا هوک شکست میخورد
هوکی که بهصورت دستی بینقص کار میکند ممکن است درون سرویس رد شود. قبل از ویرایش، دامنه فرایند، برچسب فایل و مجوز ردشده را مقایسه کنید.
اسکریپت up را با دسترسی ریشه اجرا میکنید، کامل میشود، و همان اسکریپت وقتی سرویس آن را فراخوانی میکند شکست میخورد. هیچچیز در مجوزهای فایل تغییر نکرده است، بنابراین گام بعدی طبیعی این است که دوباره آنها را شل کنید، کاری که هیچچیز را درست نمیکند. روی میزبان SELinux عامل تعیینکننده غالباً این نیست که فرایند کیست، بلکه این است که در کدام دامنه اجرا میشود، و ریشه داخل یک دامنه محدود همچنان محدود است.
همان فرمان، دو دامنه امنیتی متفاوت
اعمال نوع، دامنه مبدأ، برچسب مقصد و عملیات درخواستی را با هم ارزیابی میکند. نشست ترمینال شما در یک دامنه نامحدود یا مدیریتی اجرا میشود و سرویسدهنده در دامنهای اجرا میشود که به واحد آن اختصاص یافته است. بنابراین فرمانهای یکسان تصمیمهای متفاوتی تولید میکنند و این تفاوت عمدی است، نه اشکالی در سیاست.
به همین دلیل مقایسه دو اجرا تنها زمانی سودمند است که زمینههای آنها را مقایسه کنید. همان فرمان را از پوسته و از هوک اجرا کنید؛ نسخه پوسته ثابت میکند که فایل دودویی وجود دارد و آرگومانها درستاند، اما هیچ چیزی درباره اینکه آیا سرویس مجاز به اجرای آن است ثابت نمیکند. آن را به هر دو روش اجرا کنید و دامنهها را مقایسه کنید، نه فقط کدهای خروج. همین مقایسه است که شکایت مبهم درباره مجوز را به پرسشی مشخص درباره یک دامنه و یک برچسب تبدیل میکند.
شکل کلاسیک این خطا یک کمککننده است که ابزاری بیرونی را فراخوانی میکند. خود هوک ممکن است مجاز باشد، در حالی که ابزاری که فراخوانی میکند برچسبی دارد که دامنه سرویس اجازه اجرای آن را ندارد، یا در پوشهای مینویسد که برچسبش این را ممنوع میکند.
رکورد AVC را کنار خطای هوک بخوانید
رد AVC فیلدهایی را نام میبرد که پرونده را تعیین میکنند: زمینه مبدأ فرایند، زمینه مقصد شیء، کلاس شیء و مجوز مشخصی که رد شده است. پیش از ساختن یک نظریه، هر چهار مورد را بخوانید، زیرا رد شدن در اجرا و رد شدن در نوشتن اصلاحهای کاملاً متفاوتی دارند.
ausearch -m AVC,USER_AVC -ts recent
ls -Z /usr/local/sbin/vpn-up.sh
ps -eZ | grep openvpn
زمینه مبدأ باید با دامنهای که سرویس واقعاً در آن اجرا میشود مطابقت داشته باشد و زمینه مقصد با برچسب فایل یا پوشهای که عملیات به آن دست زده است. اگر هر یک از این دو با خطایی که دنبالش هستید جور نباشد، رویداد دیگری را میخوانید.
نسخه سیاست و مسیر دقیق فایل اجرایی را کنار رکورد یادداشت کنید. نام دامنهای که در سیاست یک توزیع ظاهر میشود شاهدی درباره همان نصب است، نه تضمینی که ساخت دیگری همان قواعد را عرضه میکند. همین زمینه است که به دیگری اجازه میدهد نتیجه شما را روی میزبان خودش بازتولید کند. بدون آن، رکورد مثل یک حکایت خوانده میشود، نه مثل شاهد.
برچسب، پیکربندی یا سیاست: سه اصلاح
اصلاح اول برچسبی است که با مکان نصبشده فایل مطابقت ندارد. اسکریپتی که با cp سر جایش کپی شده یا با ویرایشگر نوشته شده ممکن است برچسب پیشفرضی داشته باشد که دامنه سرویس نمیتواند از آن استفاده کند، و بازگرداندن زمینه مورد انتظار آن را بدون دست زدن به سیاست درست میکند.
دومی پیکربندی است. توزیع ممکن است روشی پشتیبانیشده برای اجرای عملیات، پوشهای مستند برای کمککننده یا بسته سیاست بهروزشدهای ارائه دهد که از قبل آن را مجاز میکند. تغییر چیدمان شما به چیدمان پشتیبانیشده ارزانتر از نوشتن سیاست است و از بهروزرسانیها جان سالم به در میبرد.
سومی قاعدهای است که واقعاً وجود ندارد و باید آخرین راه باشد. با ابزارهای حسابرسی یک نامزد تولید کنید، بخوانید که واقعاً چه چیزی را مجاز میکند، آن را به عملیات و دامنهای که مشاهده کردید محدود کنید، و پیش از آنکه به تولید نزدیک شود از دیگری بخواهید بازبینیاش کند.
چرا یک ماژول allow قدیمی پاسخ نیست
نتایج جستوجو برای این خطا پر از ماژولهای آماده است، اغلب برای ابزاری که هوک دیگر آن را فراخوانی نمیکند. نصب یکی مجوزهایی میدهد که ممکن است هیچ ارتباطی با رد شدن شما نداشته باشد، و ناهماهنگی واقعی را سر جایش میگذارد و در همان حال یک حفره دائمی اضافه میکند.
همچنین خطای بعدی را پنهان میکند. ماژولی که رده گستردهای از عملیات را مجاز میکند این خطا را ناپدید میکند و بعدی را به چیزی بسیار سختتر برای انتساب تبدیل میکند. حذف ماژول در آینده هم تغییری است که هیچکس نمیخواهد برنامهریزی کند، بنابراین میانبر گرایش دارد دائمی شود.
مقایسه منظم میان ردی است که میتوانید بخوانید و تغییری که پیشنهاد میدهید. راهنمای Red Hat برای عیبیابی مشکلات SELinux بررسی برچسب و پیکربندی را دقیقاً به همین دلیل پیش از سیاست تولیدشده قرار میدهد. اگر رد متناظری در رکورد نباشد، احتمالاً SELinux مشکل شما نیست، و مسائل مسیر، sandbox یا مجوز همچنان باز است.