امنیت سرور ssh

سند امنیت در سرور OpenSSH – چک لیست امنیتی OpenSSh

انتشار محتوای سایت ایران سایبر فقط با ذکر منبع رسمی مجاز است

OpenSSH اجرای پروتکل SSH است و به دلیل امنیت بالا برای ریموت لاگین ، ایجاد پشتیبان ، انتقال فایل از راه دور از طریق scp یا sftp و موارد دیگر توصیه می شود. SSH جهت حفظ محرمانگی و یکپارچگی داده های تبادل شده بین دو شبکه و سیستم بسیار مناسب است. با این حال، مزیت اصلی آن احراز هویت سرور از طریق استفاده از رمزنگاری کلید عمومی است و هر از گاهی شایعاتی درباره بهره برداری zero day از OpenSSH نیز وجود دارد.

در انتشار این سند امنیتی سعی میکنم روش های مختلفی از تضمین امنیت سرور OpenSSH ( چک لیست امنیتی ) در حال اجرا بر روی سیستم لینوکس یا یونیکس جهت بهبود کیفیت امنیت sshd را ارائه کنم.

پیش فرض OpenSSH

  • پورت TCP – 22

  • پرونده پیکربندی سرور : sshd_config (واقع در / etc / ssh /)

۱٫ از ورود به سیستم مبتنی بر کلید عمومی SSH استفاده کنید
سرور OpenSSH از احراز هویت مختلف پشتیبانی می کند. توصیه می شود از احراز هویت مبتنی بر کلید عمومی استفاده کنید. ابتدا با استفاده از دستور ssh-keygen در رایانه یا لپ تاپ خود، یک جفت کلید ایجاد کنید:

نکته مهم : کلید های DSA و RSA 1024 بیتی یا کلیدهای ssh سطح پایین معمولا ضعیف هستند که باید از آنها اجتناب کرد. کلیدهای ssh ED25519 یا RSA قابل اطمینان تر هستند. از انواع دیگری استفاده نکنید.

$ ssh-keygen -t key_type -b bits -C "comment"
$ ssh-keygen -t ed25519 -C "Login to production cluster at xyz corp"
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_aws_$(date +%Y-%m-%d) -C "AWS key for abc corp clients"

در مرحله بعد، کلید عمومی را با استفاده از دستور ssh-copy-id نصب کنید:

$ ssh-copy-id -i /path/to/public-key-file [email protected]
$ ssh-copy-id [email protected]
$ ssh-copy-id [email protected]

هنگام ترویج رمز ورود کاربر، باید ورود به سیستم را بر اساس کلید ssh تایید کنید :

$ ssh [email protected]

کلید ssh

برای اطلاعات بیشتر در مورد کلید عمومی ssh  می توانید به لینک های زیر مراجعه کنید:

۲٫ ورود کاربر root را غیرفعال کنید
قبل از غیرفعال کردن ورودی کاربر root ، مطمئن شوید کاربر معمولی می تواند به عنوان root وارد شود. به عنوان مثال ، به کاربر vivek اجازه دهید به عنوان root با استفاده از دستور sudo وارد شود.

نحوه اضافه کردن کاربر vivek به گروه sudo در Debian / Ubuntu :

به اعضای گروه sudo اجازه دهید تا هر دستوری را اجرا کنند. کاربر vivek را به گروه sudo اضافه کنید

$ sudo adduser vivek sudo

عضویت گروه را با دستور id تأیید کنید

$ id vivek

نحوه افزودن کاربر vivek به گروه سودو در سرور CentOS / RHEL :
خط فرمان زیر به کاربر در گروه اجازه می دهد تا تمام دستورات را روی یک سرور CentOS / RHEL و Fedora Linux اجرا کند. از دستور usermod برای اضافه کردن کاربر با نام vivek به گروه استفاده کنید:

$ sudo usermod -aG wheel vivek
$ id vivek

دسترسی به sudo را امتحان کنید و ورود به سیستم Root را غیرفعال کنید :
در این مرحله باید تست کنید و مطمئن شوید که کاربر  vivek می تواند به عنوان root وارد شود یا دستور را به عنوان root اجرا کند

$ sudo -i
$ sudo /etc/init.d/sshd status
$ sudo systemctl status httpd

پس از تأییدیه غیرفعال کردن root، با اضافه کردن خط فرمان زیر به sshd_config وارد شوید:

PermitRootLogin no
ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no

۳٫ ورود به سیستم مبتنی بر رمز عبور را غیرفعال کنید
همه ورودهای مبتنی بر رمز عبور باید غیرفعال شوند. فقط ورود به سیستم های مبتنی بر کلید عمومی باید مجاز باشد. موارد زیر را در دایرکتوری sshd_config خود اضافه کنید:

AuthenticationMethods publickey
PubkeyAuthentication yes

نسخه قدیمی SSHD در CentOS 6.x / RHEL 6.x کاربران باید از تنظیمات زیر استفاده کنند:

PubkeyAuthentication yes

۴٫ دسترسی به کاربران را محدود کنید
به صورت پیش فرض، کلیه کاربران سیستم می توانند با استفاده از گذرواژه یا کلید عمومی از طریق SSH وارد سیستم شوند. گاهی اوقات برای کاربر FTP یا ایمیل مورد نظر می توانید حساب کاربری UNIX / Linux ایجاد کنید.
  با این حال، این کاربران می توانند با استفاده از ssh وارد سیستم شوند. آنها دسترسی کامل به ابزارهای سیستم از جمله کامپایلرها و زبانهای اسکریپت مانند پرل ، پایتون را دارند که می توانند درگاههای شبکه را باز کرده و کارهای بسیار جالب دیگری را انجام دهند. فقط به کاربر root و vivek و jerry اجازه دهید از طریق SSH از سیستم استفاده کند ، موارد زیر را به sshd_config اضافه کنید:

AllowUsers vivek jerry

همچنین می توانید به همه کاربران اجازه دهید از طریق SSH وارد شوند و فقط چند کاربر خاص را deny کنید. از نمونه خط فرمان زیر در sshd_config استفاده کنید :

DenyUsers root Exam1 Exam2 foo

۵- غیرفعال کردن کلمات عبور
باید صریحاً از ورود به سیستم حساب هایی که دارای گذرواژه های خالی می باشند جلوگیری کنید. برای این کار 
sshd_config را با خط زیر به روز کنید:

PermitEmptyPasswords no

۶٫ از گذرواژه‌ها و عبارت های عبور قوی برای کاربران و کلیدهای ssh استفاده کنید
نمی توان به اندازه کافی تأکید کرد که استفاده از رمزها و عبارات عبور قوی کاربر برای کلیدهای شما چقدر مهم است. حمله بروت فورس همیشه بی رحمانه کار می کند مخصوصا مواقعی که کاربر کلمه های عبور ضعیف را انتخاب می کند. شما می توانید کاربران را مجبور کنید تا سیاست های پیچیده تری برای رمزهای عبور خود داشته باشند . در اینجا یک نمونه از تولیدکننده گذرواژه تصادفی را مشاهده می کنید (put in your ~/.bashrc) :

genpasswd() {
       local l=$1
      [ "$l" == "" ] && l=20
      tr -dc A-Za-z0-9_ < /dev/urandom | head -c ${l} | xargs
}

آن را اجرا کنید :

genpasswd 16

خروجی را مشاهده کنید :

uw8CnDVMwC6vOKgW

۷٫ پورت شماره ۲۲ SSH TCP در فایروال

شما باید تنظیمات فایروال ipables / ufw / firewall-cmd یا pf firewall ssh TCP # 22 را به روز رسانی کنید.
  معمولاً ، سرور OpenSSH از طریق اتصالات LAN یا مسیر های ریموت در بستر WAN متصل می گردد.

پیکربندی (Netfilter (Iptables
به روزرسانی etc / sysconfig / iptables/ 
برای پذیرش اتصالات باید مقادیر را با فرمت ۱۹۲٫۱۶۸٫۱٫۰/۲۴ و ۲۰۲٫۵۴٫۱٫۵/۲۹ وارد کنید:

-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -s 202.54.1.5/29 -m state --state NEW -p tcp --dport 22 -j ACCEPT

اگر sshd را با V6 وارد کرده اید لازم است مسیر etc/sysconfig/ip6tables/ را ویرایش کنید :

-A RH-Firewall-1-INPUT -s ipv6network::/ipv6mask -m tcp -p tcp --dport 22 -j ACCEPT

ipv6network::/ipv6mask را با دامنه های واقعی IPv6 جایگزین کنید.

UFW برای لینوکس Debian / Ubuntu 
UFW مخفف uncomplicated firewall است. این برای مدیریت فایروال لینوکس استفاده می شود و هدف آن ارائه رابط کاربری آسان برای کاربر است. برای پذیرش پورت ۲۲ از ۲۰۲٫۵۴٫۱٫۵/۲۹ فقط از دستور زیر استفاده کنید:

$ sudo ufw allow from 202.54.1.5/29 to any port 22

* تنظیمات فایروال BSD PF
اگر از به روزرسانی etc/pf.conf/ از PF firewall استفاده می کنید به شرح زیر است:

pass in on$ext_if inet proto tcp from {192.168.1.0/24, 202.54.1.5/29} to $ssh_server_ip port ssh flags S/SA synproxy state

۸- پورت SSH را تغییر داده و اتصال IP را محدود کنید
به صورت پیش فرض، SSH به تمام رابط ها و آدرس های IP موجود در سیستم گوش می دهد. اتصال پورت ssh را محدود کنید و درگاه ssh را تغییر دهید (بسیاری از اسکریپت های اجباری فقط سعی می کنند به پورت TCP شماره ۲۲ متصل شوند). برای اتصال به IP های ۱۹۲٫۱۶۸٫۱٫۵ و ۲۰۲٫۵۴٫۱٫۵ IP و درگاه ۳۰۰ ، خط زیر را در sshd_config اضافه یا تصحیح کنید:

Port 300
ListenAddress 192.168.1.5
ListenAddress 202.54.1.5

وقتی می خواهید ارتباط را از آدرس آی پی  WAN پویا بپذیرید، از اسکریپتهای رویکردهای فعال مانند Fail2ban یا Denyhosts استفاده کنید.

۹٫ استفاده از بسته های TCP (اختیاری)
TCP Wrapper یک سیستم ACL شبکه ای مستقر در میزبان است که برای فیلتر کردن دسترسی شبکه به اینترنت استفاده می شود. OpenSSH از بسته های TCP پشتیبانی می کند. فقط کافی است پرونده etc/hosts.allow/ خود را به شرح زیر به روز کنید تا SSH فقط از آدرس IP 192.168.1.2 و ۱۷۲٫۱۶٫۲۳٫۱۲ اجازه ارتباط داشته باشد:

sshd : 192.168.1.2 172.16.23.12

۱۰٫ حملات SSH crackers و brute force را خنثی کنید

Brute Force روشی برای شکستن طرح رمزنگاری با تلاش های متعدد (ترکیبی از نام کاربری و رمزهای عبور) با استفاده از یک شبکه رایانه ای تک یا توزیع شده است. برای جلوگیری از حملات بروت فورس علیه SSH ، از نرم افزار زیر استفاده کنید:

  • DenyHosts یک ابزار امنیتی مبتنی بر پایتون برای سرورهای SSH است. این ابزار جهت جلوگیری از حملات بروت فورس سرورهای SSH با نظارت بر اقدامات نامعتبر ورود به سیستم و مسدود کردن آدرسهای IP ارائه شده است.

  • Fail2ban یک برنامه مشابه است که از حملات بروت فورس علیه SSH جلوگیری می کند.

  • sshguard میزبان ها را از حملات بروت فورس در برابر ssh و سایر خدمات با استفاده از pf محافظت می کند.

۱۱- ترافیک ورودی با محدودیت در بندر TCP شماره ۲۲ (اختیاری)
هر دو netfilter و pf گزینه rate-limit را برای انجام throttling در اتصلات ورودی پورت ۲۲ ارائه می دهند.

مثالهای Iptables
مثال زیر اتصالات ورودی را که بیش از ۵ تلاش برای اتصال به پورت ۲۲ در مدت زمان ۶۰ ثانیه انجام می دهد را کنترل می کند:

#!/bin/bash
inet_if=eth1
ssh_port=22
$IPT -I INPUT -p tcp --dport ${ssh_port} -i ${inet_if} -m state --state NEW -m recent --set
$IPT -I INPUT -p tcp --dport ${ssh_port} -i ${inet_if} -m state --state NEW -m recent --update --seconds 60 --hitcount 5 -j DROP

اسکریپت های بالاتر در  iptables خود را فرآخوانی کنید
  یکی دیگر از گزینه های پیکربندی:

$IPT -A INPUT -i ${inet_if} -p tcp --dport ${ssh_port} -m state --state NEW -m limit --limit 3/min --limit-burst 3 -j ACCEPT
$IPT -A INPUT -i ${inet_if} -p tcp --dport ${ssh_port} -m state --state ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -o ${inet_if} -p tcp --sport ${ssh_port} -m state --state ESTABLISHED -j ACCEPT
# another one line example
# $IPT -A INPUT -i ${inet_if} -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 22 -m limit --limit 5/minute --limit-burst 5-j ACCEPT

برای اطلاعات بیشتر به صفحه منوی iptables مراجعه کنید.

* مثال BF PF
در دستورات زیر ، حداکثر تعداد اتصالات در هر منبع به ۲۰ و میزان تعداد اتصالات به ۱۵ در ۵ ثانیه محدود می شود. اگر کسی قوانین ما را نقض کند ، آنها را به جدول abusive_ips اضافه کرده و برای برقراری ارتباط بیشتر مسدود کنید. سرانجام ، کلمه کلیدی flush تمام حالت های ایجاد شده توسط قوانینی که از هاست سرچشمه می گیرد را کنترل میکند.

sshd_server_ip="202.54.1.5"
table <abusive_ips> persist
block in quick from <abusive_ips>
pass in on $ext_if proto tcp to $sshd_server_ip port ssh flags S/SA keep state (max-src-conn 20, max-src-conn-rate 15/5, overload <abusive_ips> flush)

۱۲٫ استفاده از knocking پورت (اختیاری)
knocking به پورت روشی برای باز کردن پورت های خارجی در فایروال با ایجاد یک اتصال به مجموعه ای از درگاه های بسته از پیش تعیین شده است. پس از دریافت توالی صحیح از تلاشهای اتصال ، قوانین فایروال بطور پویا اصلاح می شوند تا میزبانی که اتصال را ارسال کرده است سعی کند به پورت (های) خاص وصل شود.

نمونه درگاه knocking در ssh با استفاده از iptables:

$IPT -N stage1
$IPT -A stage1 -m recent --remove --name knock
$IPT -A stage1 -p tcp --dport 3456 -m recent --set --name knock2

$IPT -N stage2
$IPT -A stage2 -m recent --remove --name knock2
$IPT -A stage2 -p tcp --dport 2345 -m recent --set --name heaven

$IPT -N door
$IPT -A door -m recent --rcheck --seconds 5 --name knock2 -j stage2
$IPT -A door -m recent --rcheck --seconds 5 --name knock -j stage1
$IPT -A door -p tcp --dport 1234 -m recent --set --name knock

$IPT -A INPUT -m --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p tcp --dport 22 -m recent --rcheck --seconds 5 --name heaven -j ACCEPT
$IPT -A INPUT -p tcp --syn -j door

۱۳٫ پیکربندی خارج از تایم کاری

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

ClientAliveInterval 300
ClientAliveCountMax 0

در دستور بالا شما در حال تنظیم فاصله زمانی بیکار در ثانیه (۳۰۰ ثانیه == ۵ دقیقه) هستید. پس از گذشت این فاصله ، کاربر بیکار به طور خودکار از سیستم خارج می شود . برای جزئیات بیشتر ، نحوه ورود به صورت خودکار کاربران BASH / TCSH / SSH را پس از یک دوره عدم فعالیت مشاهده کنید.

۱۴٫ یک بنر هشدار دهنده را برای کاربران ssh فعال کنید
به روزرسانی sshd_config با خط فرمان زیر ، یک بنر اخطار تنظیم کنید:

Banner /etc/issue

۱۵٫ غیرفعال کردن پرونده های rhosts. (تأیید)
پرونده های rhosts./ها و shosts./های کاربر را نخوانید.
sshd_config را با تنظیمات زیر به روز کنید:

IgnoreRhosts yes

SSH می تواند رفتار فرمان منسوخ RSH را یاد بگیرد

فقط دسترسی ناامن از طریق RSH را غیرفعال کنید.

۱۶٫ غیرفعال کردن احراز هویت مبتنی بر میزبان (تأیید)
برای غیرفعال کردن احراز هویت مبتنی بر میزبان ، sshd_config را با گزینه زیر به روز کنید:

HostbasedAuthentication no

۱۷٫ به روز رسانی  OpenSSH و سیستم عامل ها
توصیه می شود تا از ابزارهایی مانند yum ، apt-get ، freebsd-upgrade و سایر موارد استفاده کنید تا سیستم ها را با جدیدترین وصله های امنیتی به روز کنید:

۱۸٫ Chroot OpenSSH (کاربران را در فهرست های خانگی خود لاک کنید)
به طور پیش فرض کاربران در دایرکتوریهای سرور مانند  etc،/bin/ و غیره مجاز هستند. برای حفاظت از ssh می توانید  از chroot based os استفاده کرده یا از ابزارهای ویژه مانند rssh استفاده کنید.

با انتشار OpenSSH 4.8p1 یا ۴٫۹p1 ، دیگر نیازی به تکیه بر لاک کردن شخص ثالث مانند rssh یا تنظیمات پیچیده chroot ندارید تا کاربران را در فهرست های خانگی خود لاک کنید.

۱۹٫ سرور OpenSSH را در رایانه مشتری غیرفعال کنید
ایستگاه های کاری و لپ تاپ ها می توانند بدون سرور OpenSSH کار کنند. اگر قابلیت ورود به سیستم و انتقال فایل SSH را از راه دور فراهم نکردید ، سرور SSHD را غیرفعال کنید یا حذف کنید. کاربران CentOS / RHEL می توانند سرور Openshash را با دستور yum غیرفعال و حذف کنند:

$ sudo yum erase openssh-server

کاربر لینوکس Debian / Ubuntu  می تواند همین کار را با دستور apt / apt-get غیرفعال و حذف کند:

$ sudo apt-get remove openssh-server

برای حذف قوانین استثناء ssh ممکن است لازم باشد اسکریپت iptables خود را به روز کنید.

تحت CentOS / RHEL / Fedora ویرایش پرونده ها etc / sysconfig / iptables/ و etc / sysconfig / ip6tables/.
و پس از آن ریستارت کردن سرویس iptables:

# service iptables restart
# service ip6tables restart

۲۰٫ نکات و سایر موارد
اگر از OpenSSH نسخه ۶٫۷+ یا جدیدتر استفاده می کنید ، تنظیمات زیر را دنبال کنید:

###########[ WARNING ]########################
# Do not use any setting blindly. Read sshd_config #
# man page. You must understand cryptography to #
# tweak following settings. Otherwise use defaults #
####################################################

# Supported HostKey algorithms by order of preference.
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key

# Specifies the available KEX (Key Exchange) algorithms.
KexAlgorithms [email protected],ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256

# Specifies the ciphers allowed
Ciphers [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr

#Specifies the available MAC (message authentication code) algorithms
MACs [email protected],[email protected],[email protected],hmac-sha2-512,hmac-sha2-256,[email protected]

# LogLevel VERBOSE logs user's key fingerprint on login. Needed to have a clear audit track of which key was using to log in.
LogLevel VERBOSE

# Log sftp level file access (read/write/etc.) that would not be easily logged otherwise.
Subsystem sftp /usr/lib/ssh/sftp-server -f AUTHPRIV -l INFO

با استفاده از دستورات زیر می توانید لیستی از رمزنگاری و alog پشتیبانی شده توسط سرور OpenSSH خود را دنبال کنید:

$ ssh -Q cipher
$ ssh -Q cipher-auth
$ ssh -Q mac
$ ssh -Q kex
$ ssh -Q key

پیکر بندی openssh

چگونه می توانم فایل sshd_config را تست کنم و سرور SSH خود را دوباره راه اندازی یا بارگذاری مجدد کنم؟
برای بررسی اعتبار پرونده پیکربندی و سلامت بودن کلیدها برای هرگونه خطا قبل از شروع مجدد، sshd را اجرا کنید:

$ sudo sshd -t

حالت تست :

$ sudo sshd -T

سرانجام sshd را بر اساس نسخه distro خود بر روی سیستمهای لینوکس یا یونیکس قرار دهید:

sudo systemctl start ssh ## Debian/Ubunt Linux##
sudo systemctl restart sshd.service ## CentOS/RHEL/Fedora Linux##
$ doas /etc/rc.d/sshd restart ## OpenBSD##
$ sudo service sshd restart ## FreeBSD##

چند نکته مهم :

  • جهت امنیت بهتر SSH می توان از  ۲FA یا تأیید هویت چند عاملی  با ابزار OATH یا DuoSecurance استفاده کرد.

  • از احراز هویت مبتنی بر keychain استفاده کنید – keychain یک اسکریپت bash مخصوص است که برای احراز هویت مبتنی بر کلید فوق العاده راحت و انعطاف پذیر طراحی شده است. این مزایای امنیتی مختلف نسبت به کلیدهای بدون عبارات ارائه می دهد.

 

انتشار محتوای سایت ایران سایبر فقط با ذکر منبع رسمی مجاز است

نویسنده : سید محمد اسماعیلی

 

 

 

نوشته های مرتبط

مدیریت پایگاه داده

۱۵

آذر
همه موضوعات

ابزار OmniDB نسخه v2.17.0 ابزاری تحت وب برای مدیریت پایگاه داده

انتشار محتوای سایت ایران سایبر فقط با ذکر منبع رسمی مجاز است ابزار OmniDB ابزاری تحت وب است که مدیریت بانک اطلاعاتی-DataBase ( دیتابیس ) را با تمرکز بر تعامل، ساده بودن، پرقدرت و سبک انجام می دهد. برخی خصوصیات این ابزار را بررسی می کنیم: ابزار وب: با استفاده از یک مرورگر تحت وب به عنوان […]

مدیریت دستگاه های IOT

۰۵

آبان
همه موضوعات

مدیریت از راه دور دستگاه های IOT با استفاده از ابزار Upswift

انتشار محتوای سایت ایران سایبر فقط با ذکر منبع رسمی مجاز است اگر فقط از یک دستگاه IoT استفاده می کنید و درحال توسعه پروژه های خود هستید، به روزرسانی و مدیریت آن سریع و آسان است. اما اگر ۱۰ ، ۵۰ یا ۱۰۰ دستگاه داشته باشید چه می کنید؟ مدیریت همه آنها ناگهان به یک دردسر[…]