## 🔐 کنترل دسترسی اجباری (MAC) با SELinux – راهنمای کامل و بهروز
**SELinux** یا **Security-Enhanced Linux** یک چارچوب امنیتی قدرتمند برای پیادهسازی **کنترل دسترسی اجباری (Mandatory Access Control)** است که توسط NSA توسعه یافته و امروزه در توزیعهایی مثل **RHEL، CentOS، Fedora و Rocky Linux** بهصورت پیشفرض فعال است.
در این مقاله، به زبان ساده ولی دقیق با مفاهیم، ابزارها، سیاستها و مثالهای عملی SELinux آشنا میشوید.
---
## 🧠 SELinux چیست و چرا اهمیت دارد؟
برخلاف کنترل دسترسی سنتی لینوکس (مثل مجوزهای فایل و مالکیت)، **SELinux سطح دومی از امنیت را اعمال میکند** که حتی اگر مهاجم به root دسترسی پیدا کند، همچنان در اجرای بسیاری از عملیاتها محدود خواهد شد.
---
## 🔎 حالات SELinux
برای مشاهده وضعیت SELinux از دستور زیر استفاده کنید:
```bash
getenforce
```
سه حالت اصلی:
* `Enforcing`: فعال و در حال اجرا (پیشفرض در بسیاری از سیستمها)
* `Permissive`: فقط گزارش میدهد ولی مسدود نمیکند.
* `Disabled`: غیرفعال
تغییر موقت وضعیت:
```bash
setenforce 0 # Permissive
setenforce 1 # Enforcing
```
تغییر دائمی در فایل زیر انجام میشود:
```bash
sudo nano /etc/selinux/config
```
---
## 🔒 سیاستهای SELinux
SELinux رفتار فرآیندها و کاربران را بر اساس **سیاستهای امنیتی (Policies)** محدود میکند.
### سه بخش اصلی:
| مورد | توضیح |
| ------------------------------------ | ------------------------------------------------ |
| **Type enforcement (TE)** | تعیین نوع منابع و فرآیندها |
| **Role-Based Access Control (RBAC)** | نقشهای امنیتی برای کاربران |
| **Multi-Level Security (MLS)** | امنیت چند سطحی (در محیطهای نظامی یا بسیار حساس) |
---
## 📁 برچسبها در SELinux
هر فایل، پوشه، پورت یا فرآیند دارای برچسبی شبیه به زیر است:
```bash
ls -Z /var/www/html
```
خروجی:
```
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 index.html
```
ساختار برچسب:
**user\:role\:type\:level**
---
## 🧰 دستورات پرکاربرد SELinux
### 1. تغییر نوع برچسب (type)
```bash
sudo chcon -t httpd_sys_content_t /var/www/html/index.html
```
### 2. بازگردانی برچسب پیشفرض
```bash
sudo restorecon -Rv /var/www/html/
```
### 3. نمایش context کامل
```bash
ps -eZ | grep httpd
```
---
## 🔧 مدیریت پالیسیها با ابزار semanage
### اضافهکردن context به پورت:
```bash
sudo semanage port -a -t http_port_t -p tcp 8081
```
### نمایش تمام پورتهای تعریفشده:
```bash
sudo semanage port -l | grep http
```
---
## ⚠️ بررسی خطاهای SELinux
برای خطاهای ناشی از محدودیتهای SELinux، لاگها را در فایل زیر بررسی کنید:
```bash
/var/log/audit/audit.log
```
یا استفاده از ابزار:
```bash
sudo ausearch -m avc -ts recent
```
---
## 🔍 تجزیه و تحلیل لاگها با `sealert`
ابزار `sealert` از بسته `setroubleshoot-server` کمک میگیرد:
```bash
sudo yum install setroubleshoot-server
sudo sealert -a /var/log/audit/audit.log
```
---
## ✅ نتیجهگیری
فعال نگه داشتن SELinux در حالت Enforcing، یکی از **مهمترین راهکارهای امنیتی برای سرورهای لینوکسی** محسوب میشود. درک سیاستها، برچسبها و نحوه رفع خطاها، شما را قادر میسازد یک محیط کاملاً امن و کنترلشده ایجاد کنید.