OpenSSH پروتکل سرویس SSH است. OpenSSH برای ورود از راه دور، بک آپ گیری، انتقال فایل از راه دور به وسیله ی scp یا sftp و موارد بسیار دیگر پیشنهاد می شود. SSH بهترین راه برای نگهداری محرمانه و کامل اطلاعات و داده های تبادل شده بین دو شبکه و سیستم می باشد. هرچند، اصلی ترین مزیت آن تایید سرور، از طریق استفاده از رمزگذاری کلید عمومی است. این مطلب به شما نشان خواهد داد که چگونه سرور OpenSSH فعال بر لینوکس یا یونیکس را مانند سیستم برای بهبود امنیت SSHD محافظت کرد.
پیشفرض های OpenSSH
پورت TCP-22
سرور OpenSSH دارای یک فایل کانفیگ می باشد-sshd ( در /etc/ssh/ قرار گرفته شده)
کانفیگ کردن فایل کلاینت OpenSSH- ssh (در /etc/ssh/ قرار گرفته شده)
۱.از کلید عمومی SSH برای لاگین استفاده کنید
سرور OpenSSH هویت های مختلف و متنوعی را پشتیبانی می کند. به همین دلیل پیشنهاد می شود تا از کلید عمومی احراز هویت استفاده کنید. ابتدا، جفت کلید را بر اساس ssh-keygen پیشنهاد شده بر لپتاپ یا دسکتاپ محلی خودتان بسازید:
نکته: DSA و RSA 1024 بایت یا کلید SSH پایین تر، ضعیف به شمار می روند. برای استفاده از آنها لطفا خودداری نمایید. کلید های RSA نسبت به کلید های ECDSA هنگامی که همگام سازی با کلاینت های 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 user@host
ssh-copy-id user@remote-server-ip-or-dns-name
ssh-copy-id toshan@rhel7-aws-server
هنگامی که ارتقا پیدا کرد، رمز کاربری را وارد کنید. بر اساس لاگینی که برای شما کار می کند، کلید ssh را تایید کنید:
ssh toshan@rhel7-aws-server
۲.روت لاگین را غیر فعال کنید
پیش از آنکه روت کاربری برای لاگین شدن را غیر فعال کنیم، باید اطمینان پیدا کنیم که کاربر معمولی می تواند به عنوان روت و مدیر وارد شود. برای مثال، این امکان را به وجود می آوریم تا کاربر toshan به عنوان روت با استفاده از کامند sudo لاگین شود.
چگونه کاربر toshan رابه گروه sudi به دبیان/ اوبونتو اضافه کنیم
اجازه دهید تا اعضای گروه sudo هر دستوری را اجرا کنند. کاربر toshan را به گروه اضافه کنید:
sudo adduser toshan
اعضای گروه را با دستور تایید کنید:
id toshan
چگونه کاربر toshan را به گروه sudo به CentOS/RHEL اضافه کنیم
اجازه دهید تا افراد حاضر در گروه wheel تمامی دستورات CentOS/RHEL و سرور فدورا لینوکس را اجرا کنند. از دستور حالت کاربری استفاده کنید و کاربری که toshan نام دارد را به گروه wheel اضافه کنید:
sudo usermod -aG wheel toshan
id toshan
دسترسی sudo و غیرفعال بودن لاگین شدن روت برای ssh را تست کنید
آن را تست کرده و مطمئن شوید که کاربر toshan می تواند به عنوان روت لاگین شده یا دستور را به عنوان روت اجرا کند:
sudo -i
sudo /etc/init.d/sshd status
sudo systemctl status httpd
یکبار دیگر با اضافه کردن خط زیر به کانفیگ sshd غیرفعال شدن روت لاگین را تایید کنید:
PermitRootLogin no
ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no
۳.رمز عبور را با لاگین غیر فعال کنید
تمامی پسوردهایی که بر اساس لاگین وجود داشته اند می بایست غیر فعال شوند. تنها کلید عمومی بر اساس لاگین ها مجاز هستند. دستور زیر را برای فایل کانفیگ sshd خود اضافه کنید:
AuthenticationMethods publickey
PubkeyAuthentication yes
ورژن قدیمی کاربر SSHD بر CentOS6.x/RHEL6.x می بایست از تنظیمات زیر استفاده کنید:
PubkeyAuthentication yes
۴.دسترسی کاربران ssh را محدود کنید
به صورت پیشفرض، تمامی کاربران سیستم ها می توانند با استفاده از رمز یا کلید عمومی ssh لاگین شوند. گاهی اکانت کاربری یونیکس/لینوکس برای ایمیل یا FTP می سازید. هرچند، آن کاربرها می توانند در سیستم با استفاده از SSH وارد شوند. کاربرها دسترسی کامل را به ابزارهای سیستم دارند. از جمله کامپایلرها و تهیه فایل آغازگر زبان هایی مانند Perl، Python که پورت های شبکه را می تواند باز کند و کارهای دیگری را نیز انجام دهند. تنها به کاربران toshan، sepanta و روت اجازه دهید تا از سیستم به وسیله ی ssh استفاده کنید. کانفیگ sshd زیر را اضافه کنید:
AllowUsers toshan sepanta
به نوبت، می توانید به تمامی کاربران اجازه دهید تا با ssh وارد شوند اما چند کاربر را نادیده بگیرید. کانفیگ این دستور به شرح زیر است:
DenyUsers root webii
همچنین می توانید با کاkفیگ لیونکس PAM اجازه یا مانع ورود از طریق سرور SSHD شوید. می توانید اجازه دهید لیستی از اسامی به SSH دسترسی داشته یا نداشته باشند.
۵.رمز ورودهای خالی را غیر فعال کنید
می بایست کاملا از ورود اکانت هایی که از راه دور رمز ورود خالی دارند جلوگیری کنید. کانفیگ sshd را با خط زیر به روز کنید:
PermitEmptyPasswords no
۶.از رمز عبورهای بلند و قوی برای کاربران/کلیدهای ssh استفاده کنید
واقعا نمی توان گفت که چه قدر استفاده از رمز عبور قوی کاربری و رمز عبورهای بلند برای کلیدها اهمیت فراوانی دارد. می توانید کاربر را مجبور کنید تا از حمله ی رمزهای مخالف دیکشنری جلوگیری کند و از ابزار john the ripper برای فهمیدن کدام رمزها ضعیف است، استفاده کند. در اینجا یک نمونه ی ساده از عملکرد رمز عبور را مشاهده می کنید:
genpasswd() {
local l=$1
[ "$l" == "" ] && l=20
tr -dc A-Za-z0-9_ < /dev/urandom | head -c ${l} | xargs
}
اجرایش کنید:
genpasswd 16
خروجی:
uw8CnDVMwC6vOKgW
فایروال ssh TCP پورت # ۲۲
شما به فایروال SSH TCP # 22 با به روزرسانی iptables/ufw/firewall-cmd نیاز دارید. سرور OpenSSH تنها کانکشن هایی را که از LAN یا دیگر WAN های سایت های ریموتی باشند، قبول می کند.
کانفیگ (iptables)
/etc/sysconfig/iptavles (redhat را به روز رسانی کنید تا تنها از ۱۹۲.۱۶۸.۱.۰ و ۲۰۲.۵۴.۱.۵/۲۹ کانکشن قبول کند.
دستورات زیر وارد کنید:
-A RH-Firewall-1-INPUT -s 192.168.1.0/۲۴ -m state --state NEW -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -s 202.54.1.5/۲۹ -m state --state NEW -p tcp --dport 22 -j ACCEPT
UFW مخفف uncomplicated firewall می باشد. از آن برای مدیریت و کنترل فایروال لینوکس استفاده می شود و هدف آن این است که استفاده ی آسان برای کاربر را فراهم نمایند.از دستور زیر برای قبول کردن پورت ۲۲ از ۲۰۲.۵۴.۱۵/۲۹ تنها استفاده می شود:
sudo ufw allow from 202.54.1.5/29 to any port 22
*کانفیگ فایروال BSD PF
اگر از فایروال PF استفاده می کنید /etc/pf.conf را به روزرسانی کنید:
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 به تمامی واسطه ها و آی پی آدرس های سیستم گوش می کند. پورت بایندینگ SSH را محدود و پورت SSH را تعویض کنید. (بروت های بسیاری اسکریپت ها را مجبور می کنند تنها تلاش کنند تا به TCP پورت # ۲۲ وصل شوند.) برای به هم پیوستن به ۱۹۲.۱۶۸.۱۵ و ۲۰۲.۵۴.۱.۵ آی پی ها و پورت ۳۰۰، کانفیگ SSH زیر را تصحیح یا اضافه کنید:
Port 300
ListenAddress 192.168.1.5
ListenAddress 202.54.1.5
بهترین راه برای استفاده از ورودی های اسکریپت محافظت شده مانند fail2ban یا denyhotos زمانی است که می خواهید از WAN IP آدرس پویا کانکشنی را قبول کنید.
۹.استفاده از بسته های TCP (اختیاری)
بسته TCP هاست شبکه ی سیستم ACL می باشد که برای فیلتر کردن دسترسی شبکه به اینترنت استفاده می شود. OpenSSH بسته های TCP را پشتیبانی می کند. تنها فایل /etc/hosts. را مانند ssh زیر تنها از ۱۹۲.۱۶۸.۱.۲ و ۱۷۲.۱۶.۲۳.۱۳ آی پی آدرس، به روزرسانی کنید :
sshd : 192.168.1.2 172.16.23.12
۱۰.حملات برای کرک پسورد SSH را دفع کنید
نیروی بروت متودی برای شکستن برنامه ی رمزگذاری با استفاده از امکان های بی شمار با استفاده از یک یا چند شبکه ی کامپیوتری توزیع شده، است. برای جلوگیری از حمله ی بروت علیه ssh از نرم افزار زیر استفاده کنید:
DenyHosts، ابزاری است که با پایتون نوشته شده است و تمایل دارد تا از حمله ی نیروی بروت به سرورهای ssh جلوگیری کند. این کار با نظارت بر تلاش های لاگین شدن ناموفق برای احراز هوییت و بلاک کردن آی پی آدرس انجام می شود.
.توضیح دهید که چگونه هاست های ناموفق تحت RHEL/FEDORA و CENTOS لینوکس تنظیم می شوند.
Fail2ban برنامه ی مشابهی است که از حمله های بروت علیه SSH جلوگیری می کند.
sshguard هاست ها را از حمله های بروت علیه ssh و دیگر سرورهایی که از pf استفاده می کنند، حمایت می کند.
sshblock تلاش های لاگین شدن SSH را بلاک می کند.
فیلتر IPQ BDB ممکن است به عنوان fail2ban lite شناخته شود.
۱۱.برآورد-محدود کردن ترافیک های ورودی در TCP پورت # ۲۲ (اختیاری)
هم فیلتر نت و هم PF گزینه ی برآورد-محدود کردن را برای اجرای 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
<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
۱۳.idle وقفه ای خروج را کانفیگ کنید
کاربر می تواند با ssh به سرور وارد شود و شما می توانید idle وقفه ای خروج را تنظیم کنید تا از ssh session ناایمن جلوگیری کنید. sshd-config را باز کرده و مطمئن شوید که کمیت های زیر کانفیگ شده اند:
ClientAliveInterval 300
ClientAliveCountMax 0
شما idle خروج را در ثانیه تنظیم می کنید (۳۰۰ ثانیه==۵ دقیقه). پس از آنکه این وقفه تمام شد، کاربر idle به صورت اتوماتیک بیرون می شود (بخوانید لوگ اوت شده است).
۱۴.هشدار را برای کاربران ssh فعال کنید
با به روز رسانی sshd-config با خط زیر، هشدار را تنظیم کنید:
Banner /etc/issue
نمونه فایل /etc/issue:
----------------------------------------------------------------------------------------------
You are accessing a XYZ Government (XYZG) Information System (IS) that is provided for authorized use only.
By using this IS (which includes any device attached to this IS), you consent to the following conditions:
+ The XYZG routinely intercepts and monitors communications on this IS for purposes including, but not limited to,
penetration testing, COMSEC monitoring, network operations and defense, personnel misconduct (PM),
law enforcement (LE), and counterintelligence (CI) investigations.
+ At any time, the XYZG may inspect and seize data stored on this IS.
+ Communications using, or data stored on, this IS are not private, are subject to routine monitoring,
interception, and search, and may be disclosed or used for any XYZG authorized purpose.
+ This IS includes security measures (e.g., authentication and access controls) to protect XYZG interests--not
for your personal benefit or privacy.
+ Notwithstanding the above, using this IS does not constitute consent to PM, LE or CI investigative searching
or monitoring of the content of privileged communications, or work product, related to personal representation
or services by attorneys, psychotherapists, or clergy, and their assistants. Such communications and work
product are private and confidential. See User Agreement for details.
----------------------------------------------------------------------------------------------
نمونه ی بالا یک نمونه ی استاندارد است، تیم قانونی خود را برای موافقت کاربر خاص و جزئیات قابل توجه قانونی در نظر بگیرید.
۱۵.فایل های .rhosts را غیر فعال کنید (اعتبار سنجی)
فایل های ~/.rhosts و ~/.shosts کاربر را نخوانید. با تنظیمات زیر sshd-config را به روز رسانی کنید:
IgnoreRhosts yes
Ssh می تواند عمل دستور rsh غیر کاربردی را تقلید کند. برای جلوگیری از این کار تنها کافی است دسترسی ناایمن به وسیله ی RSH را غیر فعال کنید.
۱۶.تایید یا احراز هویت HOST-BASED را غیر فعال کنید (اعتبار سنجی)
برای غیر فعال کردن احراز هویت host-based ، sshd-config را با گزینه ی زیر به روز رسانی کنید:
HostbasedAuthentication no
۱۷.OpenSSH و سیستم های عامل را به هم وصل کنید
پیشنهاد می شود که از ابزاری مانند yum، apt-get، freebsd-upadte و دیگر ابزارها استفاده کنید تا سیستم ها را با آخرین patch های امنیتی به روز رسانی کند:
۱۸.chroot OpenSSH (کاربران را به دایرکتوری های خانگی قفل کنید)
به صورت پیش فرض کاربران اجازه دارند تا دایرکتوری های سرورهایی مانند /etc/،/bin و غیره را مرور کنند. شما می توانید ssh را با استفاده از os based chroot و یا استفاده از ابزارهای خاصی مانند rssh محافظت کنید. با آزادسازی OpenSSH 4.8pl دیگر نیازی به تکیه به هک های شخص سوم مانند rssh و یا تنظیمات chroot (1) پیچیده برای محدودیت و لاک کردن کاربران از دایرکتوری های خانگی شان، نیست.
۱۹.سرور OpenSSH را بر کلاینت کامپیوتر غیر فعال کنید
ورک استیشن ها و لپتاپ ها می توانند بدون سرور OpenSSH کار کنند. اگر لاگین ریموت و فایل توانمندی های SSH انتقال را فراهم نمی کند، سرور SSHD را حذف و غیر فعال کنید. کاربران CesntOS / RHEL می توانند سرور openssh را با دستور yum حذف و غیر فعال کنند:
sudo yum erase openssh-server
کاربر دبیان/ لینکوس اوبونتو می تواند همین کا را با دستور apt ودستور apt-get حذف و غیر فعال کند:
sudo apt-get remove openssh-server
ممکن است شما به آپدیت اسکریپت iptables برای حذف کردن ssh نیاز داشته باشید. با centos / rhel / fedora فایل های /etc/sysconfig/iptables و /etc/syscongig/ip6tables را ویرایش کنید. هنگامی که ویرایش انجام شد، سرویس iptables را ری استارت کنید:
service iptables restart
service ip6tables restart
۲۰.راهکارهای bonus از Mozilla
اگر از 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 curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
# Specifies the ciphers allowed
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
#Specifies the available MAC (message authentication code) algorithms
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com
# 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
می توانید با استفاده از دستور زیر سرور OpenSSH خود را که با alog حمایت می شود، گرب کنید:
ssh -Q cipher
ssh -Q cipher-auth
ssh -Q mac
ssh -Q kex
ssh -Q key
(عکس دوم )
چگونه می توان فایل 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##
دیدگاهتان را بنویسید