آموزش امن کردن SSH در لینوکس (SSH Hardening) – بخش دوم

کارگاه عملی – ایجاد و انتقال کلیدهای SSH ( Hands-on lab creating and transferring SSH keys)

در این کارگاه، شما از یک ماشین مجازی (VM) به عنوان کلاینت و یک ماشین مجازی دیگر به عنوان سرور استفاده خواهید کرد. اگر از ماشین میزبان ویندوز استفاده می‌کنید، می‌توانید از Cygwin، PowerShell یا شل Bash داخلی ویندوز به عنوان کلاینت استفاده کنید. (توجه داشته باشید که PowerShell و شل Bash ویندوز کلیدها را در مکان‌های متفاوتی ذخیره می‌کنند.) اگر از ماشین میزبان مک یا لینوکس استفاده می‌کنید، می‌توانید از ترمینال خط فرمان بومی همان ماشین به عنوان کلاینت استفاده کنید. در هر صورت، فرایند یکسان خواهد بود. برای ماشین مجازی سرور، از Ubuntu یا CentOS 7 استفاده کنید. این فرایند در CentOS 8 نیز همانطور کار می‌کند. با این حال، ما از این ماشین مجازی برای کارگاه‌های بعدی استفاده خواهیم کرد و CentOS 8 برخی نکات ویژه‌ای دارد که بعداً به آن خواهیم پرداخت. بیایید شروع کنیم:

  1. روی ماشین کلاینت، یک جفت کلید 384-bit elliptic curve بیتی ایجاد کنید. نام و مکان پیش‌فرض فایل را مشخص کنید و یک رمز عبور برای آن تنظیم کنید:
    ssh-keygen -t ecdsa -b 384
    
  2. کلیدها را مشاهده کنید و تنظیمات مجوزها را بررسی کنید:
    ls -l ./ssh
    
  3. کلید خصوصی خود را به کی‌رینگ جلسه خود اضافه کنید. وقتی از شما خواسته شد، رمز عبور را وارد کنید:
    exec /usr/bin/ssh-agent $SHELL
    ssh-add
    
  4. کلید عمومی را به ماشین مجازی سرور منتقل کنید. وقتی از شما خواسته شد، رمز عبور حساب کاربری خود را روی ماشین مجازی سرور وارد کنید (نام کاربری و آدرس IP خود را در دستور زیر جایگزین کنید):
    ssh-copy-id donnie@192.168.0.7
    
  5. به سرور ماشین مجازی مانند همیشه وارد شوید:
    ssh donnie@192.168.0.7
    
  6. فایل authorized_keys که روی سرور ایجاد شده است را مشاهده کنید:
    ls -l .ssh
    cat .ssh/authorized_keys
    
  7. از ماشین مجازی سرور خارج شوید و پنجره ترمینال را در ماشین کلاینت ببندید. یک پنجره ترمینال جدید باز کنید و دوباره سعی کنید به سرور وارد شوید. این بار، باید از شما خواسته شود که رمز عبور کلید خصوصی خود را وارد کنید.
  8. دوباره از ماشین مجازی سرور خارج شوید و کلید خصوصی خود را به کی‌رینگ جلسه ماشین کلاینت اضافه کنید. وقتی از شما خواسته شد، رمز عبور کلید خصوصی خود را وارد کنید:
    exec /usr/bin/ssh-agent $SHELL
    ssh-add
    

    تا زمانی که این پنجره ترمینال را در ماشین کلاینت باز نگه دارید، می‌توانید هر چند بار که بخواهید بدون وارد کردن رمز عبور وارد ماشین مجازی سرور شوید. با این حال، زمانی که پنجره ترمینال را ببندید، کلید خصوصی شما از کی‌رینگ جلسه شما حذف خواهد شد.

  9. ماشین مجازی سرور را نگه دارید، زیرا در آینده با آن کار خواهیم کرد.

شما به پایان کارگاه رسیدید – تبریک می‌گوییم!
کاری که در اینجا انجام دادیم خوب است، اما هنوز کافی نیست. یکی از معایب این است که اگر به یک ماشین کلاینت دیگر بروید، هنوز می‌توانید از روش احراز هویت معمولی نام کاربری/رمز عبور برای ورود استفاده کنید. این مشکلی نیست؛ در چند لحظه این را برطرف خواهیم کرد.

غیرفعال کردن ورود کاربر روت ( Disabling root user login)

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

  1. سرورهای در حال ارتباط با اینترنت به نحوی تنظیم شده بودند که از احراز هویت نام کاربری/رمز عبور برای SSH استفاده کنند.
  2. به کاربر روت اجازه داده شده بود که از طریق SSH وارد شود.
  3. رمزهای عبور کاربران، از جمله رمز عبور کاربر روت، بسیار ضعیف بودند.

تمام این موارد باعث شد که بدافزار به راحتی بتواند با حمله‌ی brute-force وارد سیستم شود.

توزیع‌های مختلف تنظیمات پیش‌فرض متفاوتی برای ورود کاربر روت دارند. در فایل /etc/ssh/sshd_config در ماشین CentOS خود، این خط را خواهید دید:

#PermitRootLogin yes

برخلاف بیشتر فایل‌های پیکربندی، خطوط کامنت‌شده در sshd_config تنظیمات پیش‌فرض برای Secure Shell را تعریف می‌کنند. پس این خط نشان می‌دهد که به کاربر روت اجازه داده شده است که از طریق SSH وارد شود. برای تغییر این تنظیمات، من علامت کامنت را حذف کرده و مقدار آن را به no تغییر می‌دهم:

PermitRootLogin no

برای اعمال این تغییر، SSH را که در CentOS به نام sshd شناخته می‌شود، ری‌استارت می‌کنم. در اوبونتو، این به نام ssh است:

sudo systemctl restart sshd

در ماشین اوبونتو، تنظیمات پیش‌فرض به طور کمی متفاوت است:

PermitRootLogin prohibit-password

این یعنی که به کاربر روت اجازه داده شده تا وارد شود، اما تنها از طریق تبادل کلید عمومی. این تنظیم احتمالاً برای بیشتر موارد امن است، اگر واقعاً نیاز دارید که به کاربر روت اجازه ورود دهید. اما در بیشتر موارد، شما می‌خواهید که از کاربران ادمین بخواهید که با حساب کاربری معمولی خود وارد شوند و از sudo برای نیازهای ادمین استفاده کنند. بنابراین، در بیشتر موارد، شما همچنان می‌خواهید این تنظیم را به no تغییر دهید.

توجه داشته باشید که اگر یک نمونه لینوکس را در یک سرویس ابری مانند Rackspace یا Vultr پیاده‌سازی کنید، مالکان سرویس از شما می‌خواهند که با حساب کاربری روت وارد شوید. اولین کاری که باید انجام دهید این است که حساب کاربری معمولی خود را ایجاد کرده، با آن وارد شوید، سپس حساب کاربری روت را غیرفعال کرده و ورود روت را در sshd_config غیرفعال کنید. مایکروسافت Azure یک استثنا از این قاعده است زیرا به طور خودکار یک حساب کاربری غیرمجوز برای شما ایجاد می‌کند.

غیرفعال کردن ورود با نام کاربری/رمز عبور

این کاری است که شما فقط پس از راه‌اندازی تبادل کلید با کلاینتان خود باید انجام دهید. در غیر این صورت، کلاینتان قادر به انجام ورود از راه دور نخواهند بود.

کارگاه عملی – غیرفعال کردن ورود روت و احراز هویت با رمز عبور

برای این کارگاه، از همان ماشین مجازی سرور که برای کارگاه قبلی استفاده کرده‌اید استفاده کنید. بیایید شروع کنیم:

  1. در ماشین مجازی سرور اوبونتو یا CentOS، به دنبال این خط در فایل sshd_config بگردید:
    #PasswordAuthentication yes
    
  2. علامت کامنت را حذف کنید، مقدار پارامتر را به no تغییر دهید و SSH را ری‌استارت کنید. خط باید به شکل زیر تغییر کند:
    PasswordAuthentication no
    

    اکنون، وقتی ربات‌های شبکه‌ی شما سیستم را اسکن می‌کنند، خواهند دید که حمله‌ی brute-force SSH با استفاده از رمز عبور بی‌فایده است. در نتیجه، آن‌ها می‌روند و شما را تنها می‌گذارند.

  3. به دنبال یکی از این دو خط باشید، بسته به اینکه سرور شما اوبونتو یا CentOS است:
    #PermitRootLogin yes
    #PermitRootLogin prohibit-password
    

    خط را از حالت کامنت خارج کرده و آن را به شکل زیر تغییر دهید:

    PermitRootLogin no
    
  4. SSH را ری‌استارت کنید تا تغییرات جدید اعمال شوند. در اوبونتو، می‌توانید این کار را به شکل زیر انجام دهید:
    sudo systemctl restart ssh
    

    در CentOS، این کار به شکل زیر انجام می‌شود:

    sudo systemctl restart sshd
    
  5. تلاش کنید که از طریق کلاینت که در کارگاه قبلی استفاده کرده‌اید وارد سرور ماشین مجازی شوید.
  6. تلاش کنید که از یک کلاینت دیگر که در آن جفت کلید ایجاد نکرده‌اید وارد سرور ماشین مجازی شوید. (نباید قادر به ورود باشید.)
  7. همان‌طور که قبلاً گفته شد، ماشین مجازی سرور را نگه دارید، زیرا در آینده با آن بیشتر کار خواهیم کرد.

حالا که نحوه ایجاد جفت کلید خصوصی/عمومی در سمت کلاینت و نحوه انتقال کلید عمومی به سرور را بررسی کردیم، بیایید در مورد نوع الگوریتم‌هایی که SSH استفاده می‌کند صحبت کنیم. پس از آن، به این موضوع خواهیم پرداخت که چگونه برخی از الگوریتم‌های قدیمی و ضعیف‌تر را غیرفعال کنیم.

پیکربندی Secure Shell با الگوریتم‌های رمزنگاری قوی

همانطور که قبلاً ذکر کردم، مجموعه توصیه‌های NIST، یعنی مجموعه الگوریتم‌های امنیت ملی تجاری (CNSA Suite)، شامل استفاده از الگوریتم‌های قوی‌تر و کلیدهای بلندتر از آنچه که قبلاً به آن نیاز داشتیم است. در اینجا توصیه‌های جدید را در این جدول خلاصه می‌کنم:

الگوریتم استفاده
RSA, 3,072 بیت یا بیشتر تأسیس کلید و امضای دیجیتال
Diffie-Hellman (DH), 3,072 بیت یا بیشتر تأسیس کلید
ECDH با NIST P-384 تأسیس کلید
ECDSA با NIST P-384 امضای دیجیتال
SHA-384 یکپارچگی
AES-256 محرمانگی

در برخی انتشارات دیگر، ممکن است شما استاندارد NIST Suite B را به عنوان استاندارد توصیه‌شده برای الگوریتم‌های رمزنگاری مشاهده کنید. Suite B یک استاندارد قدیمی است که توسط CNSA Suite جایگزین شده است. یک استاندارد رمزنگاری دیگر که ممکن است با آن کار کنید، استاندارد پردازش اطلاعات فدرال (FIPS) است که همچنین توسط دولت ایالات متحده منتشر می‌شود. نسخه فعلی FIPS 140-2 است که آخرین بار در دسامبر 2002 بازبینی شد. FIPS 140-3، که در تاریخ 22 سپتامبر 2019 تایید نهایی شد، در نهایت به استاندارد جدید تبدیل خواهد شد. سازمان‌های دولتی ایالات متحده که مشمول رعایت FIPS هستند، قبلاً دستور داده شده‌اند که به تدریج به FIPS 140-3 انتقال یابند.

درک الگوریتم‌های رمزنگاری SSH

SSH با ترکیبی از رمزنگاری متقارن و نامتقارن کار می‌کند، مشابه نحوه عملکرد Transport Layer Security (TLS). کلاینت SSH فرایند را با استفاده از روش کلید عمومی برای برقراری یک جلسه نامتقارن با سرور SSH آغاز می‌کند. پس از ایجاد این جلسه، دو دستگاه می‌توانند روی یک کد مخفی توافق کنند و آن را مبادله کنند، که از آن برای راه‌اندازی یک جلسه متقارن استفاده می‌کنند. (همانطور که قبلاً در TLS دیدیم، ما می‌خواهیم به دلایل عملکرد از رمزنگاری متقارن استفاده کنیم، اما به یک جلسه نامتقارن نیاز داریم تا تبادل کلید مخفی انجام شود.) برای انجام این فرایند، به چهار دسته الگوریتم رمزنگاری نیاز داریم که آن‌ها را در سمت سرور پیکربندی خواهیم کرد. این‌ها عبارتند از:

  1. Ciphers: این‌ها الگوریتم‌های متقارن هستند که داده‌هایی که بین کلاینت و سرور مبادله می‌شود را رمزنگاری می‌کنند.
  2. HostKeyAlgorithms: این لیست انواع کلید میزبان است که سرور می‌تواند از آن‌ها استفاده کند.
  3. KexAlgorithms: این الگوریتم‌ها هستند که سرور می‌تواند برای انجام تبادل کلید متقارن استفاده کند.
  4. MAC (Message Authentication Codes): این‌ها الگوریتم‌های هش هستند که داده‌های رمزنگاری‌شده در حال انتقال را به صورت رمزنگاری شده امضا می‌کنند. این کار از یکپارچگی داده‌ها اطمینان حاصل می‌کند و به شما اطلاع می‌دهد که آیا کسی داده‌های شما را دستکاری کرده است یا نه.

بهترین راه برای آشنایی با این‌ها، مشاهده صفحه man فایل sshd_config است:

man sshd_config

من می‌توانم از هر ماشین مجازی برای نمایش این موارد استفاده کنم. در حال حاضر، من از CentOS 7 استفاده می‌کنم، مگر اینکه خلاف آن را ذکر کنم. (لیست‌های الگوریتم‌های پیش‌فرض و در دسترس برای توزیع‌های مختلف لینوکس و نسخه‌های آن متفاوت خواهند بود.)

Lab Hands-on – نصب و استفاده از ssh_scan

در این قسمت، ما برای اسکن الگوریتم‌های SSH فعال، از ابزار ssh_scan استفاده خواهیم کرد. مراحل گام‌به‌گام نصب و استفاده از این ابزار را به شرح زیر دنبال خواهیم کرد:

مراحل نصب و استفاده از ssh_scan:

  1. نصب بسته‌های مورد نیاز (Ruby و gem): ssh_scan به زبان Ruby نوشته شده و به صورت یک Ruby gem ارائه می‌شود. بنابراین، ابتدا باید Ruby و gem را نصب کنیم. بسته به توزیع لینوکس خود، دستور مناسب را وارد کنید:

    • برای Ubuntu:
      sudo apt update
      sudo apt install ruby gem
      
    • برای CentOS 7:
      sudo yum install ruby gem
      
    • برای CentOS 8:
      sudo dnf install ruby gem
      
  2. نصب gem ssh_scan: حالا که Ruby و gem را نصب کرده‌ایم، باید بسته ssh_scan را نصب کنیم. برای این کار دستور زیر را وارد کنید:
    sudo gem install ssh_scan
    
  3. ایجاد لینک نمادین (symlink) در CentOS: در بیشتر توزیع‌ها، ssh_scan در مسیر /usr/local/bin/ نصب می‌شود. اما در CentOS، اگر از sudo برای فراخوانی دستور در این دایرکتوری استفاده کنید، سیستم آن را پیدا نمی‌کند، حتی اگر این مسیر در تنظیمات PATH کاربر root باشد. بنابراین، راه‌حل این مشکل ایجاد یک لینک نمادین به /usr/bin/ است. فقط در CentOS این کار را انجام دهید:
    sudo ln -s /usr/local/bin/ssh_scan /usr/bin/ssh_scan
    
  4. مشاهده گزینه‌های دستوری ssh_scan: ابزار ssh_scan دارای صفحه man نیست، اما می‌توانید لیست گزینه‌های دستوری آن را با استفاده از دستور زیر مشاهده کنید:
    sudo ssh_scan -h
    

    این دستور به شما راهنمای استفاده از ssh_scan را نشان می‌دهد.

  1. سرور VM که در آزمایشات قبلی ساخته و پیکربندی کرده‌اید را اسکن کنید.
    آدرس IP خود را جایگزین آدرسی که من اینجا استفاده کرده‌ام، کنید. توجه کنید که خروجی صفحه به فرمت JSON است. همچنین، توجه داشته باشید که حتی اگر جفت کلید را در دستگاه اسکنر خود ایجاد نکرده باشید، اسکن هنوز روی ماشین‌هایی که احراز هویت نام کاربری/گذرواژه غیرفعال شده است، کار می‌کند (اما البته شما قادر به ورود به سیستم از دستگاه اسکنر نخواهید بود):
sudo ssh_scan -t 192.168.0.7
  1. اسکن را تکرار کنید، اما این بار خروجی را به فایل .json ذخیره کنید، مانند این:
sudo ssh_scan -t 192.168.0.7 -o ssh_scan-7.json
  1. شما می‌توانید فایل JSON را در یک ویرایشگر متن عادی یا صفحه‌گردان باز کنید، اما بهتر است آن را در مرورگر وب خود باز کنید.
    فایل را به دستگاهی که رابط دسکتاپ دارد انتقال دهید و آن را در مرورگر وب دلخواه خود باز کنید. باید چیزی شبیه به این را مشاهده کنید:
    ssh scan JSON
  2. شما یک لیست کامل از تمام الگوریتم‌های فعال را مشاهده خواهید کرد. در پایین، شما توصیه‌هایی خواهید دید که در آن باید کدام الگوریتم‌ها را فعال یا غیرفعال کنید. از آنجا که ssh_scan یک پروژه بنیاد موزیلا است، از توصیه‌های خود موزیلا به عنوان راهنمای سیاست استفاده می‌کند. این‌ها همانند استانداردهایی که سازمان‌هایی مانند NIST توصیه می‌کنند نیستند. بنابراین، شما باید نتایج خود را با استانداردهایی که برای شرایط شما قابل اعمال است، مانند استاندارد CNSA NIST مقایسه کنید تا مطمئن شوید که چیزهای درست را فعال یا غیرفعال کرده‌اید.
  3. در دستگاه میزبان خود یا یک VM با رابط دسکتاپ، به وب‌سایت Shodan به آدرس https:/​/​www.​shodan.​io مراجعه کنید.
    کلمه ssh را در پنجره جستجو وارد کرده و لیستی از سرورهای SSH که در معرض اینترنت قرار دارند مشاهده کنید. روی آدرس‌های IP مختلف کلیک کنید تا سرور SSH‌ای که روی پورت پیش‌فرض 22 اجرا نمی‌شود پیدا کنید. لیست الگوریتم‌های فعال برای آن دستگاه را مشاهده کنید.
  4. دستگاه را اسکن کنید، با استفاده از سوئیچ -p برای اسکن پورت مختلف، مانند این:
sudo ssh_scan -t 178.60.214.30 -p 222 -o ssh_scan-178-60-214-30.json

توجه داشته باشید که علاوه بر لیست الگوریتم‌های فعال که در Shodan مشاهده کردید، اکنون یک لیست از الگوریتم‌های ضعیف دارید که مالک این دستگاه باید آنها را غیرفعال کند.

  1. این اسکنر و این سرور VM را در دسترس نگه دارید، زیرا پس از غیرفعال کردن برخی الگوریتم‌ها دوباره از آنها استفاده خواهیم کرد.

شما به انتهای آزمایش رسیده‌اید – تبریک!
خیلی خوب؛ در مقالات بعدی برخی از چیزهای قدیمی و ضعیف را غیرفعال میکنیم…

دیدگاه

آدرس ایمیل شما منتشر نخواهد شد.