فصل ۱۰: امنیت لینوکس
مدل امنیتی لینوکس، دسترسی فایل، sudo، سختسازی SSH، SELinux/AppArmor، امنیت کرنل (sysctl، ASLR، DEP)، auditd و ممیزی امنیتی با Lynis.
چرا امنیت لینوکس مهم است؟
لینوکس از مدتها پیش ستون فقرات اینترنت بوده است: بیش از ۹۶ درصد از یک میلیون دامنهٔ برتر، تمام ۵۰۰ ابررایانهٔ جهان، و بیشتر زیرساختهای ابری روی لینوکس اجرا میشوند. اما «امنیت پیشفرض» وجود ندارد؛ یک سرور لینوکس تازهنصبشده اگر سختسازی نشود، در کمتر از یک ساعت هدف اسکنرهای خودکار قرار میگیرد و در صورت داشتن سرویس آسیبپذیر، بهسرعت آلوده میشود.
در این فصل، مدل امنیتی لینوکس، سختسازی SSH، کنترلهای اجباری (MAC) و ممیزی عملی را مرور میکنیم.
مدل امنیتی لینوکس
لینوکس بر پایهٔ DAC (Discretionary Access Control) بنا شده است: هر فایل مالک (owner) و گروه (group) دارد و مالک میتواند مجوزها را به دلخواه تنظیم کند. سه مجموعه از مجوزها وجود دارد: خواندن (r)، نوشتن (w)، اجرا (x) بهتفکیک مالک/گروه/دیگران.
# نمایش مجوزهای عددی
stat -c '%a %n' /etc/passwd # 644
stat -c '%a %n' /etc/shadow # 640
stat -c '%a %n' /usr/bin/sudo # 4755 (SUID)
# تغییر مالک و مجوزها
sudo chown www-data:www-data /var/www/html/index.html
sudo chmod 640 /var/www/html/config.php
# مجوزهای نمادین
chmod u+x script.sh # اجرا برای مالک
chmod g-w config.yml # حذف نوشتن برای گروه
chmod o-r secret.key # حذف خواندن برای دیگرانخطر SUID/SGID
فایلهایی با بیت SUID (مانند sudo، passwd، mount) با دسترسی مالک اجرا میشوند، نه اجراکننده. اگر یک فایل SUID دارای آسیبپذیری باشد، مهاجم میتواند به root ارتقا دهد. هر ماه فایلهای SUID را اسکن کنید:
sudo find / -perm -4000 -type f 2>/dev/nullبرای کنترلهای ریزتر از ACL استفاده میکنیم:
# دادن دسترسی خواندن به کاربر alice بدون تغییر مجوز اصلی
sudo setfacl -m u:alice:r /var/www/html/config.php
getfacl /var/www/html/config.phpپیکربندی sudo
sudo به کاربر عادی اجازه میدهد دستورات را با دسترسی root اجرا کند؛ اما فقط طبق قواعد /etc/sudoers. هرگز این فایل را با ویرایشگر معمولی ویرایش نکنید؛ از visudo استفاده کنید که قواعد دستوری را قبل از ذخیره اعتبارسنجی میکند.
# فقط کاربر devops میتواند systemctl restart nginx را اجرا کند
devops ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx
# گروه admin تمام دستورات را میتواند اجرا کند اما با رمز
%admin ALL=(ALL) ALL
# کاربر deploy فقط بهعنوان کاربر www-data میتواند دستور بزند
deploy ALL=(www-data) NOPASSWD: /usr/bin/php /var/www/html/artisanقاعدهٔ طلایی: کمترین دسترسی. به جای NOPASSWD: ALL (که عملی эквивалent به رمز root است)، دستورات خاص را محدود کنید.
سختسازی SSH
SSH پرتکرارترین سرویس هدف در اینترنت است. پیکربندی پیشفرض آن باید سختسازی شود:
# پشتیبانگیری از پیکربندی اصلی
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# ویرایش پیکربندی
sudo nano /etc/ssh/sshd_configتغییرات پیشنهادی:
Port 2222 # تغییر پورت پیشفرض 22
PermitRootLogin no # ورود مستقیم root ممنوع
PasswordAuthentication no # فقط کلید عمومی
PubkeyAuthentication yes
PermitEmptyPasswords no
MaxAuthTries 3
LoginGraceTime 30
AllowUsers devops deploy # اجازه فقط به کاربران مشخص
X11Forwarding no
ClientAliveInterval 300
ClientAliveCountMax 0 # قطع اتصال بیاستفاده
Protocol 2# اعتبارسنجی و راهاندازی مجدد
sudo sshd -t # تست دستوری پیکربندی
sudo systemctl restart sshdنکتهٔ مهم: قبل از بستن PasswordAuthentication، یک ترمینال باز نگه دارید و کلید عمومی را در ~/.ssh/authorized_keys قرار دهید و از یک ترمینال جدید ورود را تست کنید؛ وگرنه خودتان را بیرون میاندازید!
نصب fail2ban برای مسدود خودکار IPهای مهاجم:
sudo apt install fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# بررسی وضعیت
sudo fail2ban-client status sshdfail2ban لاگهای احراز هویت را میخواند و IPهایی که بیش از پنج بار ناموفق وارد شدهاند را با iptables برای ۱۰ دقیقه (پیشفرض) مسدود میکند.
SELinux و AppArmor
DAC ضعیف است؛ اگر فرایند با دسترسی root اجرا شود، میتواند همهچیز را تغییر دهد. MAC (Mandatory Access Control) این مشکل را با اعمال سیاستهای اجباری بر فرایندها حل میکند: حتی root هم باید سیاست MAC را رعایت کند.
| ویژگی | SELinux | AppArmor |
|---|---|---|
| پلتفرم | RHEL، CentOS، Fedora | Ubuntu، openSUSE |
| مدل | Label-based (Type Enforcement) | Path-based |
| پیچیدگی | بالا | متوسط |
| انعطاف | بسیار بالا | متوسط |
| یادگیری | شیب تند | ملایمتر |
# وضعیت SELinux
sestatus
getenforce # Enforcing، Permissive یا Disabled
# تغییر موقت به حالت Permissive (برای عیبیابی)
sudo setenforce 0
# برچسبهای امنیتی یک فایل
ls -Z /var/www/html/index.html
# وضعیت AppArmor
sudo apparmor_status
sudo aa-statusهرگز SELinux/AppArmor را غیرفعال نکنید
وقتی برنامهای کار نمیکند، راهحل غیرفعالکردن MAC نیست؛ سیاست صحیح را بنویسید. غیرفعالکردن MAC، لایهٔ مهمی از دفاع در عمق (Defense-in-Depth) را حذف میکند. در حالت Permissive، نقضها فقط ثبت میشوند تا سیاست را بر اساس آن تنظیم کنید.
امنیت کرنل
پارامترهای کرنل از طریق /etc/sysctl.conf یا /etc/sysctl.d/ تنظیم میشوند. چند پارامتر امنیتی مهم:
# غیرفعالکردن ارسال بستههای IP منبع جعلی
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# فعالسازی حفاظت در برابر Smurf
net.ipv4.icmp_echo_ignore_broadcasts = 1
# غیرفعالکردن ارسال ICMP Redirect
net.ipv4.conf.all.accept_redirects = 0
# ثبت بستههای Marsian (آدرسهای غیرممکن)
net.ipv4.conf.all.log_martians = 1
# فعالسازی TCP SYN Cookies (ضد SYN Flood)
net.ipv4.tcp_syncookies = 1sudo sysctl -p # اعمال تغییراتسه سازوکار کلیدی سختسازی حافظه:
- ASLR (Address Space Layout Randomization): مکان بارگذاری کتابخانهها در هر اجرا تصادفی میشود تا ROP و buffer overflow سختتر شود.
- DEP/NX (Data Execution Prevention): صفحات حافظهٔ داده قابلاجرا نیستند.
- Stack Canary: مقدار تصادفی پیش از بازگشت از تابع قرار میگیرد تا سرریز بافر شناسایی شود.
ممیزی با auditd
auditd سیستم ثبت رویدادهای امنیتی در لینوکس است که برای انطباق (PCI DSS، HIPAA) ضروری است:
sudo apt install auditd
sudo systemctl enable --now auditd
# ثبت دسترسی به فایل حساس
sudo auditctl -w /etc/passwd -p wa -k identity_changes
# گزارش همهٔ رویدادها با کلید identity_changes
sudo ausearch -k identity_changes
# گزارش همهٔ دستورهای sudo
sudo ausearch -m USER_CMD -x sudoتمرین عملی: ممیزی امنیتی با Lynis
Lynis یک ابزار متنباز ممیزی امنیتی است که سرور لینوکس را اسکن میکند و پیشنهادهای سختسازی میدهد:
sudo apt install lynis
sudo lynis audit systemLynis صدها آزمایش انجام میدهد و در پایان یک امتیاز Hardening Index (۰ تا ۱۰۰) میدهد:
- Hardening index : [61] ( ) [###### ]
- Hardening level : [61] ( ) [###### ]
Possible hardening topics:
- Configure password hashing to SHA-512 (CRYPT_DEFAULT)
- Set password minimum length to at least 10 (PASS_MIN_LEN)
- Disable USB storage if not needed (modprobe)
- Add a banner to /etc/issue (legal)
- Disable kernel modules: dccp, sctp, rds, tipcبرای دیدن همهٔ هشدارها و توصیهها:
sudo lynis audit system --pentest | tee lynis-report.txt
sudo lynis show details TEST-IDچکلیست سختسازی لینوکس
| کنترل | اقدام | وضعیت |
|---|---|---|
| بهروزرسانی | sudo apt update && sudo apt upgrade هفتگی | □ |
| کاربر root | غیرفعالکردن ورود مستقیم | □ |
| احراز هویت SSH | کلید عمومی + MFA | □ |
| پورت SSH | تغییر از 22 به پورت غیراستاندارد | □ |
| fail2ban | نصب و فعال | □ |
| فایروال | UFW با سیاست پیشفرض Deny | □ |
| SUID/SGID | اسکن ماهانه و حذف غیرضروریها | □ |
| MAC | SELinux در حالت Enforcing یا AppArmor | □ |
| auto-updates | unattended-upgrades برای وصلهٔ امنیتی | □ |
| auditd | فعال و لاگها آرشیو میشود | □ |
| Lynis | ممیزی فصلی و رفع یافتهها | □ |
| پشتیبان | پشتیبان منظم و آفلاین (Air-Gapped) | □ |
بهروزرسانی منظم مهمترین کنترل است
بیش از ۶۰ درصد نفوذهای موفق از آسیبپذیریهایی استفاده میکنند که وصلهٔ آنها منتشر شده اما نصب نشده است. فعالکردن unattended-upgrades برای وصلههای امنیتی در دبیان/اوبونتو، سادهترین کار با بیشترین بازده امنیتی است: sudo apt install unattended-upgrades && sudo dpkg-reconfigure -plow unattended-upgrades.
خلاصه و گام بعدی
در این فصل با مدل امنیتی لینوکس از جمله مجوزهای فایل، sudo، و سختسازی SSH آشنا شدید. MAC با SELinux و AppArmor را برای دفاع در عمق بررسی کردید، پارامترهای امنیتی کرنل (sysctl، ASLR، DEP) را مرور کردید، ممیزی با auditd را آموختید و یک ممیزی عملی با Lynis انجام دادید.
در فصل بعد، با چارچوبهای امنیتی NIST و ISO آشنا میشوید تا کنترلهای فنی این فصل را در یک ساختار حاکمیتی منسجم قرار دهید.
این صفحه در تاریخ ۸ تیر ۱۴۰۵ بهروزرسانی شده است.