当前位置: 主页 > Linux安装教程 > 系统设置 >

Linux系统下如何配置SSH_Centos7 ssh连接配置 CentOS7下安全配置SSH

时间:2016-06-11 11:13来源:未知 作者:Linux先生 举报 点击:
SSH 通常是我们进入新伺服器的第一个应用程式,它也取代了telnet 和rsh 成为管理伺服器的最主要介面。

SSH 通常是我们进入新伺服器的第一个应用程式,它也取代了telnet 和rsh 成为管理伺服器的最主要介面。尽管SSH 预设使用加密通讯,登入的密码和通讯内容都不容易被偷窥,预设的设定大致上安全,可惜由于需要兼顾旧用户和旧系统,一些过时和不安全的选项仍然被开启着,在国家级黑客横行无忌的年代,系统中任何一颗松掉的螺丝都会致命,所以我们将会讨论如何加强SSH 的安全性。这一篇只讨论基本的安全配置,比较容易理解,过程也比较简单,对用户的负面影响也比较少,较进阶和较具争议性的安全配置将会留待下一篇讨论。

以下的方法,一部分已经在「安装CentOS 7后必做的七件事」中讨论过,不过为了完整起见,我会重复解说SSH相关的部分,希望大家包涵,不过内容会比较详尽,例如会加入对用户体验的影响,增加技术讨论的篇幅,和比较支持与反对方的意见等等。在该篇文章中与SSH无关的部分例如更改root密码等等,将不会重复讨论,但他们对系统的安全性同样重要,请大家不要忽视。

1. 使用第二代通讯协定

SSH的通讯协定分为第一代和第二代,不用多说第二代有更多功能、选项、和更高的安全性,它是在2006 正式由IETF发表,至今已有十年。由于两代SSH协定并不兼容,我们只能二选其一,CentOS 7的SSH预设使用第二代协定,所以无需做任何设定,但我建议在设定档中明确写清楚,开启/etc/ ssh/sshd_config,寻找:

改为:

跟着输入以下指令重新启动sshd

完成后不要登出系统,使用另一个视窗尝试用普通帐号SSH登入。

2. 不容许空白密码

其中一个登入SSH的方法是输入帐号名称和密码,不过当CentOS 7新增一个帐号的时候,可以不设定初始密码,登入的时候只需输入帐号名称,这显然十分不安全,所以我们应该禁止这类型的帐号登入SSH,CentOS7的SSH预设禁止这类型的帐号登入,但我建议在设定档中明确写清楚,开启/etc/ssh/sshd_config,寻找:

改为:

 

3. 禁止root 使用SSH 登入

CentOS 7的SSH预设容许任何帐号登入,包括root和普通帐号,为了避免root帐号被暴力入侵,我们必须禁止root帐号的SSH功能,事实上root也没有必要SSH登入伺服器,因为只要使用susudo指令(当然需要输入root的密码)普通帐号便可以拥有root的权限。开启/etc/ssh/sshd_config,寻找:

修改为:

最后输入以下指令重新启动sshd

这样黑客要取得root的权限,必须先破解一个普通用户帐号,然后再破解root的密码,难度增加了。

完成后不要登出系统,使用另一个视窗尝试用普通帐号SSH登入,退出后再尝试用root帐号SSH登入。

这一项设定只会影响需要使用root 权限工作的人,所以影响的人数十分少,影响也很轻微,但对安全性却有极大帮助。

4. 使用非常规的SSH 端口

SSH预设使用端口(port) 22,这是在IANA注册的官方端口,但没有人说SSH不能使用其他端口,很多黑客专门向伺服器的22端口发动攻击,即使你的伺服器固若金汤、 牢不可破,但是要系统日以继夜接受攻击,消耗的系统资源(网络、处理器、记忆体等等)也不会少,何况它是否真的牢不可破还说不定呢!所以有必要让SSH使用其他端口,只让有权使用SSH的用户知道。

开启/etc/ssh/sshd_config,寻找:

修改为:

你可以把10837改为任何1024 – 65535之间的数字,若果怕与某些系统服务发生冲突,可以参考一下这里。

跟着重新启动sshd

然后是设定防火墙,CentOS 7的内核已经有防火墙netfilter,但你的系统未必安装了用户界面,较前版本的CentOS预设使用iptables,但CentOS 7开始使用效能更高、稳定性更好的firewalld。习惯使用iptables的管理员仍然可以在CentOS 7安装和使用iptables,但必须注意iptablesfirewalld不能同时运作。

如果伺服器尚未安装firewalld,可以使用以下指令安装,不确定是否已经安装的话也可以输入这个指令,它会告诉你已经安装然后退出。

跟着启动:

设定firewalld的方法有两个,第一个是修改firewalld有关sshd的设定,把端口22改为10837,这是正统的做法,但步骤比较多;第二个是要求firewalld开启端口10837,不指定它属于哪一个服务(service),这个做法通常处理临时的端口开启/封锁,步骤简单,但是日后你要是忘记了这个端口为什么开启了呢?什么时候开启的呢?为了哪一项服务开启呢?可能有点麻烦。我两种方法都会介绍一下,但作为专业的系统管理员(即使不是真正的专业,也应该具备这样的心态),我推荐使用第一种方法。

设定防火墙方法一:

复制firewalld有关sshd的设定档案:

 

 

开启/etc/firewalld/services/ssh.xml,寻找:

 

 

修改为:

 

 

储存后重新载入firewalld

 

 

设定防火墙方法二:

输入以下指令:

 

 

就是这样简单!

不论使用哪种方法,完成后不要登出系统,使用另一个视窗尝试登入,例如:

不少人对更改SSH端口的有效性有异议,主要的反对意见认为铁了心要骇入你的伺服器的人,不会只尝试端口22后便放弃,一定会扫描所有65,536个TCP端口( port scanning),编写一个扫描TCP端口的程式很简单,执行起来也很快速,除非你不使用SSH,否则一定会被他们找到你使用的端口,然后发动攻击,所以更改SSH端口无助加强安全性。另一方面,用户每次登入SSH都要加上-p 10837这个参数,也添加麻烦。

我同意这些论点,更改SSH 端口无助防止有技术、有决心、有资源的黑客,但是它至少阻挡一些随意找一个伺服器,然后在端口22 碰碰运气的小伙子,别低估这些小伙子的数量,这些十来岁还在读中学或者大学的小伙子的数量是十分惊人的,而且借着自动ip 扫描的程式,他们可以在短时间内扫描大量开启了端口22 的伺服器,更改SSH 的端口可以避免成为他们的攻击对象。总的来说,这是防范低阶黑客的有效手段。

更改SSH 端口的另一个好处,是大幅减少SSH 日志(log)的长度,当你用人手翻阅日志查找不寻常的网络活动时,便了解它的可贵。一些查阅日志的工具例如fail2ban 等也可因此而提升效能。

5. 启用公钥验证

现在只有普通帐号才能透过 SSH 登入伺服器,但是 SSH 提供一个更先进更安全的验证方法:公钥验证法。

首先每一名用户建立一对加密钥匙(密钥和公钥),密钥储存在日常使用的电脑,公钥则储存在伺服器,使用SSH 联系到伺服器的时候,电脑会把一些建立连线请求的资料,其中包括帐号名称和公钥,并且把部分资料用密钥制作数码签署,一股脑儿送到伺服器,伺服器检查自己的「公钥库」是否包含送来的公钥,有的话再验证数码签署,成功的话便直接登入伺服器,无需输入帐号密码。

第一步在日常使用的电脑上使用ssh-keygen指令建立一对加密钥匙,它会询问储存加密钥匙的档案名称,和把钥匙加密的密码,档案名称使用预设的路径和名称便可以:

建立帐号的RSA 加密钥匙

这个指令会创造两个档案,一个名为id_rsa,是你的RSA密钥,另一个是id_rsa.pub,是你的RSA公钥。这两条钥匙的预设长度是2048 bit,安全程度达112 bit,估计在2030年前都不可能暴力破解,可说十分安全(这纯碎是数学上的预测,不考虑硬件技术的突破、加密算法研究的突破、硬件瑕疵等因素),如果你不放心,可以使用-b参数设定钥匙的长度,例如:

有些人认为太长的钥匙拖慢了加密/解密的过程,因而减慢了通讯的速度,那是对加密通讯的无知做成的误解!公钥加密法只是用来建立通讯,过程中双方会协商对称加密法(例如AES)的钥匙,此后SSH 只会使用对称加密法来加密通讯的内容。所以公钥加密法钥匙长度对速度的影响,只发生在开始的阶段,此后的加密/解密的工作都由效能远远优胜的对称加密法负责。

你也可以把加密算法从RSA改为更先进、效能更高的椭圆曲线算法(elliptic curve crytography),只要把上面指令中的rsa改为ed25519便可以了,ed25519的钥匙长度固定是256 bit,安全程度相当于128 bit,由于长度固定,所以无须使用-b指定长度。

公钥必需上传到伺服器并且附加于用户帐号里面的~/.ssh/authorized_keys档案中,这个档案储存所有可透过SSH登入到这一个帐号的公钥。

SSH的设定档/etc/ssh/sshd_config中可以使用PubkeyAuthentication来启用/停用公钥验证法,没有设定的话CentOS 7的SSH预设启用这个方法,你也可以加入这一行明确启用它:

如果你有两台或以上电脑需要使用SSH 登入伺服器,便要在每一台电脑重复以上步骤,很多懒惰的人把这一对加密钥匙(公钥和密钥)复制到其他电脑,这样做的确可以从不同的电脑登入伺服器,但却提高了加密钥匙被盗取的风险,违反了公钥验证的原意。

有些人建议使用公钥验证法后,密码登入的方法便应该停用,因为这是一个比较容易被暴力破解的方法,方法是在设定档/etc/ssh/sshd_config 中寻找:

把它改为:

如果你打算只使用公钥验证法,这是对的。不过我在下一篇文章将会讨论双重验证法,即是公钥验证法和密码验证法同时使用,届时我们仍然要开启密码验证法,倒不如暂时把它保留着。

在日常使用电脑中的加密钥匙应该以稳当的密码保护,必须明白你的电脑并不是绝对安全的,例如你的朋友可能会借你的电脑检查电邮;当你离开位子上厕所而屏幕保护程式启动之前,谁人接触过你的电脑?你的手提电脑也有可能被盗取或遗失,诸如此类的情况多不胜数,倘若你的SSH 密钥没有密码保护,等于你的伺服器没有密码保护。

公钥验证法比密码登入法安全的原因,是用暴力破解公钥/密钥近乎不可能,尤其是你使用的RSA 钥匙长度达到2048 bit 或以上,相当于黑客要暴力测试2^112 个密码,以现代的电脑技术,即使具备国家级的电脑设备也不可能破解。相反地,暴力破解你的登入密码便容易得多了,假设你精心挑选了一个8 个字符,包含大小写英文字母、数字和标点符号,并且完全随机产生的密码,安全性也只有大约48 bit ,相当于黑客要暴力测试2^48 个密码,即使是一台桌面电脑也可以轻易做到。

使用公钥验证法后,伺服器不容易被暴力入侵,但储存在桌面电脑或手提电脑内的密钥又怎么样呢?它们的安全性取决于那些电脑的安全性,和保护密钥的密码安全性。有些人认为公钥验证法只是把风险从伺服器转移到桌面和手提电脑,安全性没有提高,某些情况下反而下降了。所以有人提出多重验证(multi-factor authentication)概念,我们将会在第二部分详细讨论。

6. 限制可登入SSH 的用户

审视一下哪些帐号需要使用SSH登入伺服器,只让这些帐号透过SSH登入,可以减少被攻击的和被攻陷的机会。假如伺服器只容许peter和jane两个帐号登入,可以在/etc/ssh/sshd_config加入:

帐号名称之间用空白字符分隔,帐号名称可以使用通配字符*?,不过我不建议这样做,因为

  1. 你可能不小心容许了一些不该使用SSH 的帐号登入。
  2. 将来新增了一些不该使用SSH,但巧合地匹配这些模式的帐号,让他们拥有登入SSH 权限。

跟着输入以下指令重新启动sshd

完成后不要登出系统,尝试使用peter或者jane帐号在另一个视窗登入,退出后再尝试用其他帐号登入。

除了AllowUsers之外,也可以使用DenyUsers明确拒绝某些帐号登入,例如:

如果伺服器设定了用户群组,也可以用群组名称来授权/拒绝SSH 登入,例如:

 

7. 停用不需要的验证方法

CentOS 7 的SSH 提供九种帐户验证方法:

验证方法

SSH 协定版本

设定档案中没有指定时的预设值 CentOS 7 的SSH 预设值
ChallengeResponseAuthentication 1, 2 yes no
GSSAPIAuthentication 2 no yes
HostbasedAuthentication 2 no no
KbdInteractiveAuthentication 1, 2 yes* no
KerberosAuthentication 1, 2 no no
PasswordAuthentication 1, 2 yes yes
PubkeyAuthentication 2 yes yes
RhostsRSAAuthentication 1 no no
RSAAuthentication 1 no no
* 如果设定档案没有指定KbdInteractiveAuthentication 的值,它将会与ChallengeResponseAuthentication 的值相同。

启用不需要的验证法等于设立一道我们不会使用的门,尽管这道门关着,但它始终是一个安全隐患,所以我们应该只启用需要的验证法。

假如你只使用公钥验证法,请把所有其他验证法明确设定为no,不要依赖SSH的预设值。前面第五节已经介绍过公钥验证法和启用它的方法,启用/停用其他验证法的方法也差不多,这里不打算逐一说明。

我建议你最少要启用公钥验证法( PubkeyAuthentication yes ),若果你打算结合密码验证法实现多重验证,可以保留密码验证法( PasswordAuthentication yes ),其他验证法除非真的有需要,否则都应该停用(例如  GSSAPIAuthentication no )。

若果你不使用外挂验证模组(PAM – Pluggable Authentication Module),应该一并停用PAM,不过如果系统正在运行SELinux,停用PAM而没有加入适当的SELinux规则,会引致不可预知的结果,所以在SELinux环境下可以保留使用PAM。CentOS 7的SSH预设启用PAM,需要停用的话可以在/etc/ssh/sshd_config中寻找:

改为:

跟着输入以下指令重新启动sshd

一如既往,完成后不要登出系统,尝试在另一个视窗登入。

总结

以上是比较简单和容易理解的设定,如果你有任何问题或指正,欢迎在下面回响中提出和讨论。下一篇将讨论比较复杂,必较具争议性,和对用户体验有较大影响的设定。

推荐内容