مقدمه

وقتی قصد راه‌اندازی یک سرور را داشته باشیم، فارغ از نقش سرور که می‌تواند سرور وب، سرور دیتابیس، سرور فایل و غیره باشد، باید چند کار تنظیماتی اولیه را انجام دهیم. برای مثال، اگر یک سرور اختصاصی یا یک سرور مجازی را از یک شرکت ارائه‌دهنده‌ی خدمات میزبانی وب (web hosting) اجاره کرده باشید، بعد از تحویل سرور، باید تنظیماتی را روی سرور اعمال کنید تا اولاً امنیت سرور افزایش پیدا کند و ثانیاً سرور برای انجام کارهای بعدی آماده شود. در واقع، یک سرور، فارغ از هر نقشی که داشته باشد نیاز به برخی تنظیمات و پیکربندی‌های اولیه دارد. در این مقاله، انجام این تنظیمات را برای یک سرور Ubuntu 22.04 در قالب پنج گام بررسی می‌کنیم.

گام اول: لاگین به عنوان root

برای اتصال به یک سرور راه دور، به آدرس ip‌ عمومی (public ip) سرور و یک یوزر و پسورد آن نیاز داریم. توزیع‌های لینوکسی و از جمله Ubuntu دارای یوزری با اختیارات و دسترسی نامحدود به نام root هستند که معولاً پسورد این یوزر برای لاگین به سرور در اختیار شما قرار داده می‌شود. SSH یا Secure Shell پروتکلی است که از آن برای اتصال به سرورهای راه دور استفاده می‌شود و یک سرویس مبتنی بر این پروتکل با نام OpenSSH روی سرور نصب و کانفیگ شده تا امکان اتصال به سرور را فراهم سازد.

برای لاگین به سرور، دستور زیر را در ترمینال وارد کنید (به‌جای your_server_ip باید ip سرور را وارد کنید):

ssh root@your_server_ip

این یعنی اینکه ما می‌خواهیم با استفاده از پروتکل SSH به یوزر root مربوط به سرور با ip داده شده، لاگین کنیم. طبیعتاً صدور مجوز لاگین به احراز هویت (authentication) نیاز دارد. احراز هویت SSH به دو روش امکان‌پذیر است: روش Password Authentication که احراز هویت را بر اساس پسورد یوزر انجام می‌دهد و SSH Key Authentication که احراز هویت را بر اساس یک جفت کلید عمومی و خصوصی انجام می‌دهد.

معمولاً سرورها برای احراز هویت از پسورد استفاده می‌کنند که در این صورت، از شما خواسته می‌شود که پسورد یوزر root را وارد کنید. اما اگر تنظیمات سرور به‌گونه‌ای باشد (یا بعداً آن را طوری تغییر دهید) که برای احراز هویت از یک SSH key استفاده کند که توسط یک عبارت عبور یا passphrase محافظت می‌شود، اولین بار که در هر session از کلید (key) استفاده می‌کنید، باید passphrase را وارد کنید. در ضمن، اگر اولین بار است که به سرور لاگین می‌کنید، ممکن است از شما خواسته شود که پسورد root را تغییر دهید.

به هر حال، اگر برای اولین بار است که به سرور لاگین می‌کنید، به احتمال زیاد باید پسورد یوزر root را وارد کنید تا به عنوان root به سرور لاگین کنید.

درباره root

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

به جای استفاده از root، بهتر است یک یوزر جدید ایجاد کنیم و آن را در گروهی به نام sudo عضو کنیم. سطح دسترسی اعضای گروه sudo با یوزر root یکسان است اما این دسترسی به شکل مناسب‌تری صورت می‌گیرد که در ادامه خواهیم دید.

گام دوم: ایجاد یک یوزر جدید

وقتی برای اولین بار با استفاده از یوزر root به سیستم لاگین کردید، یک یوزر جدید ایجاد کنید تا در دفعات بعدی به جای root با استفاده از این یوزر جدید به سرور متصل شوید. در Ubuntu دستور adduser به ما امکان می‌دهد که به ساده‌ترین شکل ممکن یک یوزر جدید ایجاد کنیم (به جای dabi از نام دلخواهتان برای یوزر استفاده کنید):

adduser dabi

وقتی این دستور را اجرا کنید، چند سؤال از شما پرسیده می‌شود که با تعیین پسورد برای یوزر شروع می‌شود؛ یک پسورد قوی تعیین کنید که شامل انواع کاراکترها باشد. سؤالات بعدی همگی اختیاری هستند و اگر نمی‌خواهید به آنها پاسخ دهید، کافیست کلید enter را فشار دهید.

userad یا adduser؟

برای ایجاد یک یوزر جدید می‌توانیم از دستور useradd هم استفاده کنیم. اما بر خلاف adduser، این دستور به یادآوری برخی سوئیچ‌ها (options) نیاز دارد و پسورد یوزر را نیز با یک رویکرد اینتراکتیو (سؤال و جواب) ایجاد نمی‌کند، بلکه ما باید بعد از ایجاد یوزر، با استفاده از دستور passwd یک پسورد برای یوزر تعیین کنیم. برتری adduser به useradd کاملاً مشخص است اما نکته‌ای که وجود دارد این است که adduser در همه‌‌ی توزیع‌های لینوکسی وجود ندارد اما useradd در هر توزیعی وجود دارد. به هر حال، اگر سیستم لوکال ما Ubuntu باشد، می‌توانیم به راحتی از adduser استفاده کنیم. بد نیست بدانید که بر خلاف useradd که یک باینری است، adduser اسکریپتی است که با استفاده از زبان Perl نوشته شده و useradd را فراخوانی می‌کند.

گام سوم: اعطای مجوز ادمین به یوزر جدید

یوزر جدیدی که ایجاد کردیم، یک یوزر معمولی است و بر خلاف root، دسترسی ادمین ندارد. اما ما برای انجام خیلی از کارها مثل نصب یک پکیج، مدیریت یوزرها یا ویرایش فایل‌های کانفیگ اپ‌ها به سطح دسترسی ادمین نیاز داریم. بنابراین، همانطور که قبلاً هم گفتیم، یوزر جدید را در گروهی با نام sudo عضو می‌کنیم. این کار با استفاده از دستور زیر انجام می‌شود (به جای dabi نام یوزر خودتان را بنویسید):

usermod -aG sudo dabi

اعضای گروه sudo می‌توانند با قرار دادن پیشوند sudo در ابتدای دستوراتی که برای یوزرهای معمولی قابل اجرا نیستند، آن دستورات را اجرا کنند. در واقع، وقتی ما دستوری را با پیشوند sudo اجرا می‌کنیم، ادعا می‌کنیم که عضو گروه sudo هستیم و برای اثبات این ادعا باید پسورد اکانت یوزر را وارد کنیم. وقتی یک بار این پسورد را وارد کردیم، برای زمان کوتاهی کَش می‌شود و برای مدتی نیازی به وارد کردن مجدد آن در دستورات sudo بعدی نیست.

به این ترتیب، ما یوزری داریم که مثل root دارای سطح دسترسی ادمین است اما نسبت به root امن‌تر است. چرا؟ چون root یک مکانیزم همه یا هیچ ارائه می‌دهد؛ یعنی وقتی به عنوان root لاگین کردیم، می‌توانیم آزادانه هر کاری را روی سرور انجام دهیم. اما در مقابل، وقتی با یوزری که عضو گروه sudo است، لاگین می‌کنیم، باید برای اجرای هر دستوری که دسترسی ادمین می‌خواهد، عبارت sudo را قرار دهیم و این احتمال اشتباه را به شکل محسوسی پایین می‌آورد.

گام چهارم: تنظیمات فایروال

سرورهای Ubuntu 22.04 مجهز به فایروالی به نام UFW هستند که می‌تواند لیست سرویس‌هایی را که دسترسی به آنها مجاز است، مشخص کند. اپلیکیشن‌ها می‌توانند بعد از نصب، پروفایلشان را در UFW رجیستر کنند تا UFW بتواند این اپ‌ها را با استفاده از نام آنها مدیریت کند. یکی از سرویس‌هایی که پروفایلش در UFW رجیستر شده، OpenSSH است که همان سرویسی است که از آن برای اتصال به سرور استفاده می‌شود. لیست پروفایل‌های رجیستر شده در UFW را می‌توانید با استفاده از دستور زیر ببینید:

ufw app list

برای اینکه مطمئن شوید در لاگین بعدی امکان اتصال به سرور از طریق SSH وجود دارد، باید دستور زیر را تایپ کنید:

ufw allow OpenSSH

در ادامه، با استفاده از دستور زیر، فایروال را فعال کنید:

ufw enable

برای تأیید انجام فرایند، y را تایپ کنید. حالا برای مشاهده‌ی وضعیت سرویس ufw و اطمینان از اینکه این فایروال، امکان اتصال به سرور با استفاده از SSH را مجاز تعیین کرده، دستور زیر را تایپ کنید:

ufw status

نتیجه باید چیزی بشبیه زیر باشد که نشان می‌دهد فایروال همه‌ی اتصالات را بلاک کرده به‌جز اتصالات SSH.

Status: active

To            Action      From 
--            ------      ----- 
OpenSSH       ALLOW       Anywhere
OpenSSH(v6)   ALLOW       Anywhere(v6)
                            

گام پنجم: فراهم کردن امکان دسترسی ریموت برای یوزر

در گام بعدی باید به یوزر جدیدمان امکان دهیم که بتواند مستقیماً با استفاده از SSH به سرور لاگین کند. نحوه‌ی انجام این کار به این امر بستگی دارد که یوزر root برای لاگین به سرور از پسورد استفاده می‌کند یا کلیدهای عمومی و خصوصی.

ssh dabi@your_server_ip

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

sudo command_to_run

برای افزایش امنیت سرور، به‌شدت توصیه می‌کنم که به جای Password Authentication از SSH Key استفاده کنید.

اگر یوزر root از SSH Key Authentication استفاده می‌کند:
اگر برای اتصال به سرور از کلید استفاده کردید، پس SSH Key Authentication برای SSH فعال است و Password Authentication غیرفعال. در این صورت، برای فراهم کردن امکان لاگین به سرور توسط یوزر مورد نظر، باید از یک دستور rsync به شکل زیر استفاده کنید:

rsync --archive --chown=dabi:dabi ~/.ssh /home/dabi

در واقع، کاری که باید انجام شود این است که یک کپی از کلید عمومی (public key) لوکال به فایل ~/.ssh/authorized_keys مربوط به یوزر جدید اضافه شود. از آنجایی که کلید عمومی در فایل ~/.ssh/authorized_keys مربوط به یوزر root در سرور قرار دارد، می‌توانیم این فایل ساختار دایرکتوری را به اکانت یوزر جدید کپی کنیم. و بهترین راه برای این کار، استفاده از یک دستور rsync به شکل بالاست که دایرکتوری .ssh یوزر root را با حفظ سطوح دسترسی (permissions) و تغییر مالکیت (ownership) کپی می‌کند.

دستور rsync بین آدرس‌های مبدأ (source) و مقصدی (destination) که با یا بدون یک کاراکتر اسلش به پایان می‌رسند، تفاوت قائل می‌شود. وقتی از دستور rsync بالا استفاده می‌کنید، مراقب باشید که در انتهای دایرکتوری مبدأ یعنی ~/.ssh اسلش قرار ندهید. اگر تصادفاً یک اسلش در انتهای این دایرکتوری قرار دهید، یعنی آن را به صورت ~/.ssh/ بنویسید، دستور rsync به جای کل دایرکتوری، محتوای آن را کپی می‌کند. در نتیجه‌ی این اشتباه، فایل‌ها در مکان غلطی قرار می‌گیرند و SSH قادر به پیدا کردن و استفاده از آنها نیست.

حالا می‌توانید از ماشین لوکال خود به صورت زیر به سرور متصل شوید:

ssh dabi@your_server_ip

و به این ترتیب، بدون نیاز به وارد کردن پسورد به سرور متصل خواهید شد.