آموزش سرور

مدیریت کاربران و دسترسی sudo در لینوکس؛ از ساخت کاربر تا بستن ورود root

تهیه: کلودیفای (نگارش با کمک هوش مصنوعی) · انتشار: · زمان مطالعه: ۸ دقیقه

root@server: ~$ adduser aliAdding user `ali' ...$ usermod -aG sudo ali$ groups aliali : ali sudo$ su - ali -c 'sudo whoami'sudorootآموزش سرورمدیریت کاربران و دسترسیsudo در لینوکس؛ از ساختکاربر تا بستن ورود rootمجلهٔ کلودیفایclodify.net/blog
پاسخ کوتاه

کار روزمره روی سرور را با کاربر root انجام ندهید. با adduser یک کاربر بسازید، با usermod -aG sudo او را به گروه sudo اضافه کنید، کلید SSH را در authorized_keys همان کاربر قرار دهید و پس از تست ورود، ورود مستقیم root را در sshd_config ببندید. برای دسترسی‌های محدودتر، فایل‌های جداگانه در /etc/sudoers.d بسازید و همیشه با visudo ویرایش کنید تا خطای نگارشی شما را از دسترسی مدیریتی محروم نکند.

چرا با root کار نکنیم؟

بیشتر سرورهای مجازی با کاربر root تحویل داده می‌شوند. root محدودیتی ندارد: هر فایلی را می‌خواند، هر سرویسی را متوقف می‌کند و هر دستوری را بدون پرسش اجرا می‌کند. همین قدرت آن را خطرناک می‌کند. یک اشتباه تایپی در دستور حذف، یک اسکریپت ناشناس یا برنامه‌ای آسیب‌پذیر که با root اجرا شود، می‌تواند کل سرور را از بین ببرد یا در اختیار مهاجم قرار دهد.

روش استاندارد این است که برای هر انسان یک کاربر جداگانه بسازید و فقط وقتی کار مدیریتی لازم است، با sudo دسترسی موقت بگیرید. مزیت‌ها: هر دستور مدیریتی در لاگ با نام کاربر ثبت می‌شود، اشتباه‌ها با یک لایه احتیاط بیشتر همراه‌اند، و ورود مستقیم root، که هدف اصلی ربات‌های حمله است، کاملاً بسته می‌شود. این یکی از قدم‌های اصلی چک‌لیست امنیت سرور جدید است.

ورود امن با کاربر جداگانه
ssh ali@…sudo دستوراجرا با rootشماکلید SSHکاربر aliورود مستقیم root بستهsudoدسترسی موقت و ثبت در لاگسیستمکار مدیریتیssh ali@…sudo دستوراجرا با rootشماکلید SSHکاربر aliورود مستقیم root بستهsudoدسترسی موقت و ثبت در لاگسیستمکار مدیریتی
شکل ۱ با کاربر شخصی وارد شوید و فقط برای کارهای مدیریتی از sudo استفاده کنید؛ هر استفاده با نام شما ثبت می‌شود.

ساخت کاربر جدید

در اوبونتو و دبیان، دستور adduser تعاملی است و پوشهٔ خانه، رمز و اطلاعات اولیه را می‌سازد:

sudo adduser ali

در AlmaLinux و Rocky از useradd و سپس passwd استفاده کنید:

sudo useradd -m -s /bin/bash ali
sudo passwd ali

useradd در اوبونتو هم وجود دارد، اما بدون گزینهٔ -m پوشهٔ خانه نمی‌سازد؛ برای ساخت دستی کاربر انسانی، adduser ساده‌تر است.

دادن دسترسی sudo

در اوبونتو و دبیان اعضای گروه sudo و در خانوادهٔ Red Hat اعضای گروه wheel اجازهٔ اجرای sudo دارند:

sudo usermod -aG sudo ali     # اوبونتو و دبیان
sudo usermod -aG wheel ali    # AlmaLinux و Rocky
groups ali                    # بررسی عضویت

گزینهٔ -a بسیار مهم است؛ بدون آن، usermod -G همهٔ گروه‌های قبلی کاربر را حذف می‌کند و فقط گروه جدید را نگه می‌دارد. عضویت جدید پس از ورود دوبارهٔ کاربر اعمال می‌شود.

تست کنید:

su - ali
sudo whoami      # باید root چاپ شود

ورود با کلید SSH برای کاربر جدید

کلید عمومی شما باید در پوشهٔ همین کاربر قرار بگیرد، نه root. ساده‌ترین راه از کامپیوتر خودتان:

ssh-copy-id ali@203.0.113.10

اگر ورود با رمز بسته است، می‌توانید کلیدی را که قبلاً برای root گذاشته‌اید، روی سرور به کاربر جدید کپی کنید:

sudo mkdir -p /home/ali/.ssh
sudo cp /root/.ssh/authorized_keys /home/ali/.ssh/
sudo chown -R ali:ali /home/ali/.ssh
sudo chmod 700 /home/ali/.ssh && sudo chmod 600 /home/ali/.ssh/authorized_keys

مالکیت و مجوزهای درست ضروری‌اند؛ در غیر این صورت با خطای publickey روبه‌رو می‌شوید که روش رفعش در خطای Permission denied (publickey) آمده است.

root@server: ~
$ adduser aliAdding user `ali' ...$ usermod -aG sudo ali$ groups aliali : ali sudo$ su - ali -c 'sudo whoami'root$ 
شکل ۲ سه دستور برای ساخت کاربر، دادن دسترسی sudo و تست آن.

بستن ورود مستقیم root

پیش از این مرحله، در یک پنجرهٔ جداگانه مطمئن شوید با کاربر جدید وارد می‌شوید و sudo کار می‌کند. سپس:

sudo nano /etc/ssh/sshd_config
# این خطوط را تنظیم کنید:
PermitRootLogin no
PasswordAuthentication no

در نسخه‌های جدید اوبونتو، فایل‌های داخل /etc/ssh/sshd_config.d/ ممکن است این تنظیمات را بازنویسی کنند؛ آن‌ها را هم بررسی کنید. سپس تست و بارگذاری:

sudo sshd -t && sudo systemctl reload ssh

نشست فعلی را تا وقتی ورود جدید را تست نکرده‌اید نبندید. برای جزئیات بیشتر دربارهٔ امن‌سازی SSH، کلید SSH و تغییر پورت را ببینید.

sudo محدود: فقط دستورهای مشخص

گاهی کاربری (مثلاً کاربر استقرار خودکار یا یک همکار) باید فقط چند کار مدیریتی خاص انجام دهد، مثل ری‌استارت یک سرویس. به‌جای عضویت کامل در گروه sudo، یک فایل جداگانه در /etc/sudoers.d بسازید. همیشه با visudo ویرایش کنید؛ این ابزار پیش از ذخیره نگارش را بررسی می‌کند و خطای نگارشی در sudoers می‌تواند دسترسی sudo همه را از کار بیندازد:

sudo visudo -f /etc/sudoers.d/deploy
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart myapp, /usr/bin/systemctl status myapp

این خط اجازه می‌دهد کاربر deploy فقط همین دو دستور را با sudo و بدون رمز اجرا کند. مسیر کامل دستورها را بنویسید و از دادن دسترسی به ویرایشگرها، شل‌ها یا دستورهایی که امکان اجرای دستور دلخواه دارند (مثل vim، less یا find با -exec) خودداری کنید؛ چون از داخل آن‌ها می‌توان به شل root رسید.

کاربرهای سیستمی برای برنامه‌ها

برنامه‌ها و سرویس‌ها هم نباید با root اجرا شوند. برای هر برنامه یک کاربر سیستمی بدون امکان ورود بسازید:

sudo useradd --system --no-create-home --shell /usr/sbin/nologin myapp

سپس در فایل سرویس systemd با User=myapp آن را اجرا کنید. اگر برنامه آسیب‌پذیری داشته باشد، مهاجم فقط به دسترسی‌های همین کاربر محدود می‌شود. نمونهٔ کامل در ساخت سرویس systemd آمده است.

گروه‌ها و مجوز فایل‌ها در کار تیمی

وقتی چند نفر روی یک سرور کار می‌کنند، مثلاً دو توسعه‌دهنده که هر دو باید فایل‌های سایت را به‌روز کنند، دادن sudo به همه راه‌حل درستی نیست. ابزار لینوکس برای این موقعیت «گروه» است. هر فایل یک مالک، یک گروه و سه دسته مجوز دارد: برای مالک، برای اعضای گروه و برای بقیه. اگر پوشهٔ سایت متعلق به یک گروه مشترک باشد و آن گروه اجازهٔ نوشتن داشته باشد، همهٔ اعضا بدون دسترسی مدیریتی می‌توانند فایل‌ها را تغییر دهند.

روند کلی این است: یک گروه مثل webdev بسازید، کاربران را با usermod -aG به آن اضافه کنید، گروه پوشهٔ سایت را با chgrp -R به آن تغییر دهید و مجوز نوشتن گروه را با chmod -R g+w بدهید. برای اینکه فایل‌های جدیدی که در این پوشه ساخته می‌شوند هم خودکار همین گروه را بگیرند، بیت setgid را روی پوشه‌ها فعال کنید (chmod g+s).

در این کار مراقب باشید مجوزها را بیش از حد باز نکنید. دستور chmod -R 777 که در بسیاری از آموزش‌های اینترنتی برای «حل» خطای مجوز پیشنهاد می‌شود، به همهٔ کاربران و همهٔ فرایندهای سرور اجازهٔ نوشتن می‌دهد و اگر یکی از آن‌ها آسیب‌پذیر باشد، مهاجم می‌تواند کد سایت را تغییر دهد. همیشه حداقل دسترسی لازم را بدهید: معمولاً ۷۵۵ برای پوشه‌ها و ۶۴۴ برای فایل‌ها، و نوشتن فقط برای پوشه‌هایی که واقعاً لازم است، مثل پوشهٔ آپلود.

دستورهای مدیریت روزمره

sudo passwd ali             # تغییر رمز کاربر
sudo passwd -l ali          # قفل کردن رمز (ورود با رمز غیرفعال)
sudo usermod -L ali         # قفل کردن حساب
sudo chage -l ali           # اطلاعات انقضای رمز
sudo deluser ali sudo       # خارج کردن از گروه sudo
sudo deluser --remove-home ali   # حذف کاربر و پوشهٔ خانه
getent passwd | cut -d: -f1 # فهرست همهٔ کاربران
getent group sudo           # اعضای گروه sudo
last -n 20                  # آخرین ورودها

توجه کنید که قفل کردن رمز با passwd -l جلوی ورود با کلید SSH را نمی‌گیرد. برای غیرفعال کردن کامل کاربری که دیگر نباید وارد شود، کلیدهایش را از authorized_keys حذف کنید، حسابش را قفل کنید یا پوستهٔ او را به nologin تغییر دهید.

ترتیب امن تغییر از root به کاربر عادی
  1. ساخت کاربر

    adduser و رمز قوی.

  2. افزودن به sudo

    usermod -aG sudo؛ گزینهٔ -a را فراموش نکنید.

  3. کلید SSH

    authorized_keys در پوشهٔ همین کاربر با مجوز درست.

  4. تست در پنجرهٔ جدید

    ورود با کاربر جدید و اجرای sudo whoami.

  5. بستن root

    PermitRootLogin no و reload سرویس SSH.

شکل ۳ تا ورود با کاربر جدید را تست نکرده‌اید، ورود root را نبندید.

وقتی همکار یا پیمانکار می‌رود

یکی از لحظه‌هایی که مدیریت کاربران اهمیت واقعی پیدا می‌کند، پایان همکاری با کسی است که به سرور دسترسی داشته است. اگر همه با یک حساب root مشترک کار می‌کردند، باید رمز را عوض کنید، همهٔ کلیدها را بررسی کنید و به همه اطلاع دهید. اما وقتی هر نفر حساب خودش را داشته باشد، کافی است همان حساب را قفل یا حذف کنید و کلیدهایش را بردارید؛ کار بقیه بدون وقفه ادامه پیدا می‌کند.

ممیزی: چه کسی چه کرد؟

همهٔ استفاده‌های sudo در لاگ ثبت می‌شوند:

sudo journalctl _COMM=sudo --since today
sudo grep sudo /var/log/auth.log | tail -n 20

هر چند وقت یک‌بار فهرست کاربران، اعضای گروه sudo و کلیدهای موجود در authorized_keys همهٔ کاربران را مرور کنید. کاربر یا کلید فراموش‌شده، به‌خصوص از همکار یا پیمانکاری که دیگر با شما کار نمی‌کند، یکی از راه‌های رایج نفوذ است. در سرورهای کلودیفای، اگر دسترسی root را گم کردید، از بخش مدیریت سرور می‌توانید رمز را بازنشانی کنید یا از کنسول وارد شوید؛ مراحل در راهنمای اولین ورود به سرور آمده است.

سؤالات متداول

تفاوت sudo و su چیست؟

su با رمز کاربر مقصد (معمولاً root) به آن کاربر تغییر هویت می‌دهد و تا خروج همهٔ دستورها با دسترسی او اجرا می‌شود. sudo با رمز خود شما یک دستور را با دسترسی root اجرا می‌کند و هر استفاده را در لاگ ثبت می‌کند؛ برای مدیریت سرور امن‌تر است.

چرا بعد از افزودن به گروه sudo هنوز خطا می‌گیرم؟

عضویت گروه پس از ورود دوباره اعمال می‌شود. از نشست خارج و دوباره وارد شوید یا با su - نام‌کاربر یک نشست جدید باز کنید. همچنین مطمئن شوید در usermod از گزینهٔ -a استفاده کرده‌اید.

ویرایش مستقیم /etc/sudoers خطرناک است؟

بله، اگر خطای نگارشی ایجاد شود، sudo برای همه از کار می‌افتد و ممکن است فقط از کنسول بتوانید مشکل را رفع کنید. همیشه از visudo استفاده کنید و قوانین سفارشی را در فایل‌های جداگانه در /etc/sudoers.d قرار دهید.

NOPASSWD امن است؟

برای کاربران انسانی بهتر است sudo رمز بخواهد. NOPASSWD برای کاربران خودکار، مثل کاربر استقرار در CI، قابل‌قبول است به شرط اینکه فقط به دستورهای مشخص و محدود اجازه داده شود، نه به همهٔ دستورها.

آماده‌اید؟ سرورتان را بسازید.

از ۱٬۲۰۰ تومان در ساعت · پرداخت ریالی

سرورتان را همین حالا بسازید.

ساعتی بپردازید. هر وقت خواستید حذف کنید.