به طور خلاصه sudo دستوری است که به شما اجازه وارد شد با کاربر روت را میدهد
حال اگر بخواهیم برخی از دسترسی های کاربر روت را به یک کاربر دیگر بدهیم باید فایل etc/sudoers/ را ویرایش کنیم. مقاله که در این بخش آماده کرده ام به تشریح همین موضوع پرداخته
استفاده از حساب root براي استفاده كاري روزمره، ايده بدي است. بهتر است وقتي نياز به كمي مديريت سيستمي داريد از sudo براي عمل كردن به عنوان root استفاده كنيد. كن هس چگونگي اين كار را به شما نشان ميدهد.
سيستم لينوكس دو نوع كاربر دارد:كاربران معمولي و كاربر root . هر كاربر معمولي داراي يك مجموعه قدرتمند از مجوزها براي مديريت فايلهايش است (و فايلهايي كه به گروهي كه در آن عضويت دارد متعلق است)، ولي يك كاربر معمولي نميتواند روي پيكربندي سيستم، سرويسهاي ضروري شروع و توقف مثل SSH daemon اثر بگذارد، و نميتواند يك پورت privileged يا هر پورت شبكهاي كه كمتر از 1024 باشد، را نگه دارد. كاربر root مجاز به دسترسي و تغيير هر فايلي، انجام هر عملي، و اثرگذاري روي سيستم به هر نحوي كه ميخواهد، است.
البته همانطور كه مرد عنكبوتي ميگويد،” قدرت، مسئوليت ميآورد. ” root بايد هوشيار باشد زيرا يك اشتباه كوچك ممكن است باعث فاجعه شود. براي مثال، اختلاف فاحشي بين دستور rm -rf /a
و rm -rf / است. با دادن پتانسيل اينچنين دگرگونيهاي عمده غيرمترقبه، بهترين رويه اين است كه هرگز با كابر root براي ورود به سيستم استفاده نكنيد تا مبادا شما قدرتي كه را كه داريد بد هدايت نكنيد يا فراموش نكنيد.
در حقيقت، بسياري از توزيعهايLinux ، از ورود به صورت root جلوگيري ميكنند و درعوض به كاربر ابتدايي در مواقع لزوم، امتياز و حق عمليات مثل root را ميدهد. اين مزيت كه ميتواند به ساير كاربران سيستم گسترش يابد از طريق برنامه sudo مديريت ميشود. Sudo افرادي كه به صورت root عمل ميكنند را كنترل ميكند و ميتواند روي نوع كاربري كه ميتواند به صورت root عمل كند نيز كنترل بيشتري داشته باشد.
وقتي يك كار نيازمند مجوزهاي root باشد، و با فرض اينكه كاربر حق انجام عمل دم دست به عنوان root را دارد، كاربر به سادگي دستور را با sudo آغاز ميكند. براي مثال، بگوييد دايركتوري /tmp با تودههايي از فايلهاي موقتي توسط تعداد بيشماري از كاربران ايجاد شده است. هنگامي كه هر كاربر ميتواند فقط فايلهاي موقتي خودش را پاك كند، يك كاربر با حق اجراي rm به عنوان root(همانطور كه در sudo گفته شده است) ميتواند تمام دايركتوري را با يك دستور حذف كند:
$ whoami
khess
$ sudo rm -rf /tmp/*
كاربر با نام khess داراي حقوق محدود است. هرچند، آغاز كردن دستور با sudo، دستور را به گونهاي فراخواني ميكند مثل اينكه كاربر root بوده است. شما هنوز ميتوانيد يا اشتباه كنيد يا تمام /tmp را پاك كنيد، ولي sudo استفاده از مجوزهاي root را حداقل ميكند و از اين رو ريسك كاهش مييابد.
من را su كن
sudo يك نسخه خاص از برنامه كاربردي قديمي به نام su است كه مختصر شده ” substitute user” است. su به كاربر اجازه ميدهد به طور موقت به عنوان كاربر ديگري عمل كند. به ويژه، su يك پوسته با ID هاي كاربر و گروه جايگزين اجرا ميكند. هر كاربر ممكن است /bin/su را صادر كند و به حساب هر كاربر ديگري، حتي root، اگر كلمه عبور كاربر جايگزين معلوم باشد، جابجا شود.
$ whoami
khess
$ su – bob
Password:
$ whoami
bob
$ exit
$ whoami
Khess
گزينه – يك پوسته login به عنوان كاربر bob آغاز ميكند. وقتي شما كلمه عبور Bob را تايپ ميكنيد، شما bob هستيد. مالكيت هر فايلي كه ايجاد ميكنيد يا هر پروسه اي كه شروع ميكنيد با bob است. اگر از پوسته login كه از su به وجود آمده است، خارج شويد، ID هاي كاربر اصلي و گروه به وضعيت جديد بازگردانده ميشوند، همانطور كه در بالا نشان داده شد.
su همچنين ميتواند براي root شدن استفاده شود همانطور ميتواند براي bob شدن استفاده شود.
$ su –
Password:
با فرض اين كه شما كلمه عبور root را ميدانيد،- su (نام كاربري حذف شده است) ID كاربري و گروهي شما را به root تغيير ميدهد.
هرچند، انتشار كلمه عبور root توصيه نميشود زيرا ريسك امنيتي جدي را مطرح ميكند. اگر كلمه عبور به دست يك ناراضي بيفتد، سيستم(يا بسياري از سيستمها) ممكن است به خطر بيفتند.
براي بالا بردن امنيت su، در مجوزهاي /bin/su براي فراهم كردن امكان دسترسي براي root و گروه admin، تغيير ايجاد كنيد:
# chgrp admin /bin/su
# chmod o-rwx /bin/su
# ls -l /bin/su
r-sr-x— root admin ‘
دراينجا، مجوزهاي خواندني و اجرايي براي “سايرين” لغو شده است، و مالك گروه تغيير يافته است تا دسترسي را به اعضاي گروه adminمحدود كند. اين تنظيم، براي يك سيستم چند كاربره توصيه شده است.
براي چه كسي شما sudo را انجام ميدهيد؟
با وجود اينكه su محدود است، استفاده از آن هنوز نيازمند داشتن كلمه عبور root است. كلمه عبور آشكار، داراي ريسك است، و تغيير متناوب كلمه عبوري root ممكن است باعث بروز مسائلي شود زيرا يادآوري كلمات عبوري ، به ويژه كه خوب رمز شده باشد، دشوار است. sudo براي حل اين دو موضوع و موضوعاتي ديگر به وجود آمده است. sudo كسي كه ميتواند root شود و آنچه كاربران ميتوانند به عنوان root اجرا كنند را فهرست ميكند. فهرست در /etc/sudoers نگهداري ميشود.
به منظور مشخص كردن اينكه آيا شما مزاياي sudo را داريد، دستور sudo -l را اجرا كنيد.
$ sudo -l
Password:
در اينجا، بايد كلمه عبور خود را وارد كنيد تا خودتان را تآييد كنيد، و از سو استفاده افراد از مجوزهاي خود جلوگيري كنيد.اگر شما دسترسي sudoنداريد، پيامي مشابه با اين پيام دريافت خواهيد كرد:
Sorry, user fred may not run sudo on this host
درغيراين صورت، sudo ليستي از دستورات را نمايش ميدهد كه شما مجوز اجراي آنها را داريد:
fred
$ sudo -l
Password:
User fred may run the following commands on this host:
(root) /usr/local/bin/apachectl
همانطور كه ميتوانيد مشاهده كنيد fred ميتواند Apache HTTP Server daemon را از طريق apachectl به عنوان root كنترل كند.
بعد از فراخواني sudo و تهيه كلمه عبور، sudo “بليطي” كه براي دسترسي پنج دقيقهاي مناسب است فراهم ميكند. درحين اين پنج دقيقه، لازم نيست دوباره كلمه عبورتان را ارائه دهيد تا دستورات اضافه تري را از طريق sudo اجرا كنيد.
درحقيقت، هر دستوري كه در اين پنج دقيقه اجرا ميكنيد پنجره پنج دقيقه را تمديد ميكند. هرچند، اگر شما در اين پنج دقيقه دستوري با استفاده از sudo ارسال نكنيد، بليط منقضي ميشود و شما بايد دوباره معتبر شويد و دوباره از sudo استفاده كنيد. يك مدت زمان سايرين را از ربودن مجوزهاي شما هنگامي كه براي ناهار بيرون رفتهايد يا به دلايل ديگر از كامپيوتر دور هستيد، پيش گيري ميكند.
اين مثالي از يك سري دستورات sudo براي كپي و ويرايش يك فايل و راهاندازي مجدد Apache است:
$ sudo cp -p index.html index.html.20070511
Password:
$ sudo vi index.html
$ sudo apachectl restart
شما بايد قبل از هر دستوري sudo را بياوريد. اگر قبل از هر دستوري sudo را نياوريد ، سيستم فرض ميكند شما دستور را به عنوان خودتان اجرا ميكنيد13.
چگونه sudo را انجام ميدهيد؟
همانطور كه در بالا نشان داده شد، sudo لازم نيست كه كليد جعبه پاندورا باشد. يك كاربر ميتواند محدود به استفاده از يك مجموعه از دستورات شود. براي مثال fred ميتواند Apacheرا از طريق apachectl متوقف، راهاندازي و دوباره راهاندازي14 كند، ولي نميتواند rm يا vi را اجرا كند.
براي ويرايش كردن فهرست sudo ، /etc/sudoers شما مي توانيد از يك ويرايشگر ويژه با نام visudo استفاده كنيد. فهرست تا حدي داراي فرمت پيچيده و خاص است. ليست زير ، مثالي از فايل sudoers است.
ليست يك: مثالي از فايل /etc/sudoers
# User privilege specification
root ALL=(ALL) ALL
%admin ALL=(ALL) ALL
strike ALL=(ALL) NOPASSWD:ALL
# Uncomment to allow people in group wheel to run all commands
%wheel ALL=(ALL) ALL
* اولين فيلد هم يك نام كاربري، مثل strike ، و هم نام گروه، مثل %admin يا wheel است.
* دومين فيلد ليستي از ميزبانان را مشخص ميكند.(از آنجايي كه همان فايل sudoers ممكن است روي تمام ماشينهاي شبكه براي هماهنگي كپي شده باشد، شما ممكن است اجازه مزاياي مختلف را روي ميزبانهاي مختلف بدهيد. ) مخفف ALL با هر hostname مطابقت ميكند.
* سومين فيلد(در داخل پرانتز بعد از =) نام هاي كاربري يا ID ها به شمار ميآيد. يك دستور ميتواند به عنوان هر كدام از كاربران ليست شده اجرا شود كه هنگامي كه نياز به متوقف، راهاندازي و دوباره راهاندازي يا حذف كردن يك پروسه كه تحت مالكيت root نباشد داشته باشيد، مفيد واقع مي شود. (البته شما هر پروسه اي را ميتوانيد به عنوان root متوقف كنيد، ولي ممكن است نخواهيد تا هر پروسهاي را عنوان root با داشتن مجوزهاي يك سرويس root آغاز كنيد. ) دوباره، ALL با هر كاربري مطابقت ميكند.
* چهارمين فيلد دستوراتي را كه ميتوانند اجرا شوند را ليست ميكند.
يا به طور سادهتر، فيلدها به اين صورت هستند:
Username Hosts=(Usernames or UIDs)) Commands
وروديهاي چندگانه را براي هركدام از فيلدهاي بعدي با كاما از هم جدا كنيد. (براي جزئيات بيشتر به صفحه sudoers man مراجعه كنيد.)
از اين رو، اين مشخصات مجوز كاربري
root ALL=(ALL) ALL
به كاربر root اجازه ميدهد تمام دستورات روي تمام ميزبانها را مثل هر كاربر ديگري اجرا كند. به طور مشابه، اگر شما fred باشيد و از يك سيستم desktop Linux استفاده كنيد، /etc/sudoers احتمالاً محتوي ورودي اي مشابه اين است:
fred ALL=(ALL) ALL
كه توسط sudo، -l منعكس ميشود:
$ sudo -l
Password:
User fred may run the following commands on this host:
(ALL) ALL
براي اجراي دستور به عنوان كاربري غير از root (با اين فرض كه sudoers آن را اجازه ميدهد)، انتخاب -u را استفاده كنيد:
$ sudo -u nobody /etc/init.d/some_service restart
اين بعضي از سرويسها را به عنوان كاربر nobody دوباره راهاندازي ميكند. براي ارسال بيش از يك دستور به كاربر ديگر، بايد از سوييچ هر زمان كه sudo فراخواني ميشود استفاده كرد. اگر -u را حذف كنيد،كاربر root در نظر ميشود.
Sudo’s and Sudon’ts
در اينجا ليستي از چيزهايي كه هنگامي كه sudo را تنظيم و مورد استفاده قرار ميدهيد، بايد انجام يا اجتناب شود آمده است. انجام دهيد:
* مسير كامل تمام دستورات را براي aliases و دستورات تكي مشخص كنيد.
* از aliases براي ميزبانها، گروهها، و دستورات استفاده كنيد.(صفحه man را براي ايجاد aliases مشاهده كنيد.)
* از اصل “حداقل مجوزها” استفاده كنيد: تنها آن مجوزي را مسلم بگيريد كه لازم است نه بيشتر، و صريح باشيد.
* فايلهاي log /var/log/auth.log يا /var/log/secure را اغلب براي استفاده sudo و تخلفات چك كنيد.
انجام ندهيد:
* سعي نكنيد دستورات را از ALL جدا كنيد.(دوباره از aliases استفاده كنيد.)
* هرگز را با اعطا ALL=(ALL) ALL به هركسي موافقت نكنيد.
* NOPASSWD را براي كاربران عادي تعيين نكنيد. NOPASSWD به كاربر اجازه ميدهد تا بدون تعيين اعتبار كلمه عبور از sudo استفاده كند.
You Think You’re Foolin’?
مسائل زيادي با استفاده از sudo حل ميشود. بهترين آنها، اين است كه مجبور نيستيد كلمه عبور root را به هر كسي غير از administrator ها يا مالك سيستم بدهيد. استفاده هوشمندانه از sudo مي تواند استفاده با مجوز بالا را روي يك سيستم پيگيري كند.
هرچند، اگر به كاربران امكان دسترسي زيادي بدهيد، sudoميتواند باعث سوء استفاده شود. براي مثال، اگر به يك كاربر اجازه دهيد به ALL دسترسي داشته باشد، كاربر ميتواند به طور دائم با استفاده از دستور sudo su – يا sudo /bin/bash root شود(تا زمانlogin بعدي شان). پيادهسازي سياستهاي sudo بايد داري يك طرح خوب فكرشده باشد. Sudo هم مي تواند .