## 🔐 تفاوت بین `su` و `sudo` + آموزش پیکربندی پیشرفته `sudo` در لینوکس
در لینوکس، برای انجام کارهای مدیریتی به دسترسی سطح بالا (root) نیاز داریم. دو ابزار محبوب برای این کار `su` و `sudo` هستند، اما تفاوتهای مهمی بین این دو وجود داره که دانستنش برای هر مدیر سیستم حرفهای الزامیه.
---
## 🆚 تفاوت بین `su` و `sudo`
| ویژگی | `su` | `sudo` |
|-------|------|--------|
| نوع دسترسی | ورود کامل به حساب root | اجرای یک دستور با دسترسی root |
| نیاز به رمز عبور | رمز عبور **root** | رمز عبور **کاربر فعلی** |
| سطح دسترسی | سشن root کامل | محدود به همان دستور |
| لاگگیری | خیر (پیشفرض) | بله (در `/var/log/auth.log`) |
| امنیت | کمتر (چون کل سیستم تحت کنترل میره) | بیشتر (محدود و قابل کنترل) |
| مناسب برای | کاربر حرفهای یا در محیطهای تککاربره | محیطهای چندکاربره، سرورها، شرکتها |
---
## 🧪 مثال ساده:
### با `su`:
```bash
su
# وارد کردن رمز root
apt update
exit
```
### با `sudo`:
```bash
sudo apt update
```
---
## ⚙️ پیکربندی حرفهای `sudo`
فایل اصلی تنظیمات `sudo` در لینوکس:
```
/etc/sudoers
```
اما هیچوقت اون رو مستقیم با ویرایشگر باز نکن! استفاده از این دستور اجباریه:
```bash
sudo visudo
```
✅ این دستور سینتکس فایل رو چک میکنه تا از اشتباهات فاجعهبار جلوگیری کنه.
---
## 📁 ساختار فایل sudoers
```text
user ALL=(ALL:ALL) ALL
```
- user: نام کاربر
- `ALL`: تمام میزبانها
- `(ALL:ALL)`: بهعنوان تمام کاربران و گروهها
- دستور آخر: همه دستورها قابل اجرا هستن
---
### ✅ تعریف مجوز برای کاربر خاص:
```bash
ali ALL=(ALL) NOPASSWD: /usr/bin/apt
```
🔹 این دستور به کاربر `ali` اجازه میده بدون نیاز به رمز عبور، فقط دستور `apt` رو اجرا کنه.
---
### ✅ تعریف مجوز برای گروه:
```bash
%devs ALL=(ALL:ALL) /bin/systemctl restart apache2
```
🔹 اعضای گروه `devs` میتونن فقط سرویس Apache رو ریستارت کنن.
---
### ✅ ایجاد فایل sudoers.d برای مدیریت آسانتر
به جای دستکاری مستقیم `/etc/sudoers`، بهتره فایلهای مستقل بسازی:
```bash
sudo visudo -f /etc/sudoers.d/webteam
```
مثال محتوا:
```text
%web ALL=(ALL) /usr/bin/systemctl restart nginx
```
---
## 🔍 بررسی اعضای sudo
```bash
getent group sudo
```
یا
```bash
id username
```
---
## 🔒 افزایش امنیت `sudo`
- محدود کردن زمان معتبر بودن پس از وارد کردن رمز:
```bash
Defaults timestamp_timeout=2
```
- غیرفعالسازی sudo بدون رمز:
```bash
Defaults !authenticate
```
- لاگ گرفتن از دستورات sudo:
پیشفرض در اکثر توزیعها فعاله و در این فایل لاگ میشه:
```bash
/var/log/auth.log
```
---
## 🧠 نکات حرفهای
- استفاده از `sudo` در اسکریپتها بهتر از `su` هست چون قابل کنترلتر و امنتره.
- `su` خطرناکتره چون کل نشست شما root میشه و اشتباهات خطرناکتری ممکنه رخ بده.
- با استفاده از sudoers.d برای هر تیم یا پروژه، میتونی مدیریت بسیار حرفهای و تمیزی داشته باشی.
---
## ✍️ جمعبندی
| مورد | پیشنهاد حرفهای |
|------|------------------|
| اجرای یک دستور با دسترسی root | `sudo` ✅ |
| ورود کامل به root برای کار خاص | `su` (با دقت!) |
| مدیریت دسترسیها در محیطهای تیمی | `sudo` با پیکربندی sudoers.d ✅ |
| امنیت، لاگ، کنترل | فقط با `sudo` ✅ |