我可以/应该采取什么措施来确保SSH服务器周围的安全性绝对不可渗透?
从一开始这将是社区Wiki,因此让我们看看人们如何保护服务器。
我可以/应该采取什么措施来确保SSH服务器周围的安全性绝对不可渗透?
从一开始这将是社区Wiki,因此让我们看看人们如何保护服务器。
Answers:
使用公用/专用密钥对而非密码进行身份验证。
为每台需要访问服务器的计算机生成一个受密码保护的SSH密钥:
ssh-keygen
允许从允许的计算机进行公钥SSH访问:
将~/.ssh/id_rsa.pub
每台计算机的内容复制到~/.ssh/authorized_keys
服务器ssh-copy-id [server IP address]
上的每行中,或在您授予访问权限的每台计算机上运行(您必须在提示符下输入服务器密码)。
禁用密码SSH访问:
打开/etc/ssh/sshd_config
,找到提示的行#PasswordAuthentication yes
,然后将其更改为PasswordAuthentication no
。重新启动SSH服务器守护程序以应用更改(sudo service ssh restart
)。
现在,SSH进入服务器的唯一可能方法是使用与中的一行匹配的密钥~/.ssh/authorized_keys
。使用这种方法,我不在乎暴力攻击,因为即使他们猜出了我的密码,它也会被拒绝。当今的技术不可能强行强制使用公钥/私钥对。
其他答案可以提高安全性,但是您可以做一件事,这将使您的日志更安静,并减少您被锁定帐户的可能性:
将服务器从端口22移至另一端口。要么在您的网关上,要么在服务器上。
它不会增加安全性,但是确实意味着所有随机的互联网扫描程序都不会使您的日志文件混乱。
使用HOTP或TOTP启用两因素身份验证。从13.10开始可以使用。
这包括使用公共密钥身份验证而不是密码身份验证,就像这里的另一个答案一样,但是还要求用户证明除了自己的私钥之外,他还拥有第二要素设备。
摘要:
sudo apt-get install libpam-google-authenticator
让每个用户运行google-authenticator
命令,该命令将生成~/.google-authenticator
并帮助他们配置两个因子设备(例如Google Authenticator Android应用)。
编辑/etc/ssh/sshd_config
并设置:
ChallengeResponseAuthentication yes
PasswordAuthentication no
AuthenticationMethods publickey,keyboard-interactive
运行sudo service ssh reload
以获取对的更改/etc/ssh/sshd_config
。
编辑/etc/pam.d/sshd
并替换该行:
@include common-auth
与:
auth required pam_google_authenticator.so
有关不同配置选项的更多详细信息,是我去年的博客文章:在Ubuntu上更好的两因素ssh身份验证。
使未能提供正确登录信息的sshd阻止客户端IP“ DenyHØsts ”可以非常有效地完成此工作。我已经在所有Linux机器上安装了此工具,从外部可以通过某种方式访问。
这样可以确保对SSHD的强制攻击不会生效,但是请记住(!)这样,如果忘记密码,最终将自己锁定在外。在您无权访问的远程服务器上,这可能是个问题。
这是一件容易的事:安装ufw(“简单的防火墙”)并使用它来限制传入连接的速率。
在命令提示符下,键入:
$ sudo ufw limit OpenSSH
如果未安装ufw,请执行此操作,然后重试:
$ sudo aptitude install ufw
许多攻击者会尝试使用您的SSH服务器来强行使用密码。每30秒仅允许来自同一IP地址的6个连接。
如果我想提高安全性或需要访问某些公司网络内部的SSH服务器,可以使用匿名软件Tor设置隐藏服务。
localhost
。/etc/tor/torrc
。设置HiddenServiceDir /var/lib/tor/ssh
和HiddenServicePort 22 127.0.0.1:22
。var/lib/tor/ssh/hostname
。有一个类似的名字d6frsudqtx123vxf.onion
。这是隐藏服务的地址。打开$HOME/.ssh/config
并添加一些行:
Host myhost
HostName d6frsudqtx123vxf.onion
ProxyCommand socat STDIO SOCKS4A:127.0.0.1:%h:%p,socksport=9050
此外,我需要在本地主机上使用Tor。如果已安装,我可以输入,ssh myhost
并且SSH通过Tor打开连接。另一端的SSH服务器仅在本地主机上打开其端口。因此,没有人可以通过“普通互联网”连接它。
关于该主题,有一篇Debian Administration文章。它涵盖了基本的SSH服务器配置以及防火墙规则。这对于加固SSH服务器也可能很有用。
请参阅此处的文章:保持SSH访问的安全性。
我的SSH强化方法非常复杂。从我网络的最边缘到服务器本身,以下是关于我的操作方式的项目。
通过IDS / IPS使用已知服务扫描程序对黑名单中的流量进行边界级别过滤。 我可以通过边界防火墙(这是我的方法,pfSense设备)使用Snort来实现此目的。有时,我无法做到这一点,例如使用VPS。
SSH端口的防火墙/网络过滤。 我明确只允许某些系统进入我的SSH服务器。这可以通过网络边界处的pfSense防火墙来完成,也可以通过显式配置的每台服务器上的防火墙来完成。但是,在某些情况下我无法做到这一点(除了在钢笔测试或安全测试实验室环境中防火墙无法帮助测试的情况之外,几乎从来没有这种情况)。
与我的pfSense或边界防火墙(对内部网络进行NAT转换并与Internet和系统分开)结合使用,仅VPN对服务器的访问。将VPN插入我的网络以到达服务器,因为没有这样的面向Internet的端口。这对于我的所有VPS绝对不是有效的,但是与#2结合使用时,我可以通过将VPN连接到该服务器来使一个VPS成为“网关”,然后将其IP分配给其他服务器。这样,我确切知道可以或不能通过SSH进行的操作-我的一个盒子就是VPN。(或者,在我的pfSense后面的家庭网络中,我的VPN连接是我的,而且我是唯一拥有VPN访问权限的人)。
在无法执行#3的情况下,fail2ban配置为在4次失败尝试后阻止并阻止IP一小时或更长时间,这可以很好地保护人们免受残酷攻击的威胁-只需使用fail2ban和meh在防火墙处自动阻止em。但是配置fail2ban确实很麻烦。
通过更改SSH端口进行端口混淆。 但是,在没有任何其他安全措施的情况下也不是一个好主意 -在许多情况下,“通过隐蔽性进行安全”的口号已经遭到驳斥和质疑。我已经结合IDS / IPS和网络过滤完成了此操作,但是仅凭它自己做起来仍然是一件非常可怜的事情。
通过Duo Security的两要素认证解决方案进行强制两要素认证。 我的每台SSH服务器上都配置了Duo,因此,要进入该服务器,都会出现2FA提示,我必须确认每次访问。(这是最终的有用功能-因为即使有人知道我的密码或有密码闯入,他们也无法越过Duo PAM插件)。这是我的SSH服务器上最大的保护措施之一,可以防止未经授权的访问-每个用户登录名都必须绑定到Duo中已配置的用户,并且由于我有严格的设置,因此无法在系统中注册任何新用户。
我花了两分钱来保护SSH。或者至少是我对方法的想法。
您可能想从RedHat签出FreeOTP应用程序,而不是使用Google Authenticator。有时,在更新应用程序时,他们会将您拒之门外!;-)
如果您想使用Yubikey或eToken PASS或NG等其他硬件令牌,或者如果您有许多用户或许多服务器,则可能要使用开源两因素身份验证后端。
我最近写了一个小教程。基本上,您需要使用PKI,并且我的教程还显示了如何使用双重身份验证来提高安全性。即使您不使用这些东西,也有一些通过删除弱密码套件和其他基础知识来保护服务器安全的小窍门。https://joscor.com/blog/hardening-openssh-server-ubuntu-14-04/
对于大量用户/证书,请考虑LDAP集成。大型组织使用LDAP作为存储在徽章或表链上的用户凭证和证书的存储库,而无论这些证书是用于身份验证还是用于签名电子邮件。示例包括openLDAP,openDJ,Active Directory,Oracle通用目录,IBM Directory Server,snareWorks ...
也可以在LDAP中管理计算机和组,从而提供集中的凭据管理。这样,服务台就可以拥有一站式服务来应对大量人口。
这是centOS集成的链接:http : //itdavid.blogspot.com/2013/11/howto-configure-openssh-to-fetch-public.html
您还可以使用geoIP数据库基于原籍国进行屏蔽。
基本上,如果您居住在美国,则没有理由让俄罗斯的某人连接到您的SSH,因此它们将被自动阻止。
可以在以下位置找到该脚本:https : //www.axllent.org/docs/view/ssh-geoip/
您还可以向其中添加iptables命令(我为我的Droplet做过),以自动丢弃所有往返这些IP的流量。