Linux系统下如何配置SSH_Centos7 ssh连接配置 CentOS7下安全配置
Posted 激流中的树叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统下如何配置SSH_Centos7 ssh连接配置 CentOS7下安全配置相关的知识,希望对你有一定的参考价值。
转自:http://www.linuxdown.net/install/config/2016/0611/5853.html
Linux系统下如何配置SSH_Centos7 ssh连接配置 CentOS7下安全配置SSH
SSH 通常是我们进入新伺服器的第一个应用程式,它也取代了telnet 和rsh 成为管理伺服器的最主要介面。尽管SSH 预设使用加密通讯,登入的密码和通讯内容都不容易被偷窥,预设的设定大致上安全,可惜由于需要兼顾旧用户和旧系统,一些过时和不安全的选项仍然被开启着,在国家级黑客横行无忌的年代,系统中任何一颗松掉的螺丝都会致命,所以我们将会讨论如何加强SSH 的安全性。这一篇只讨论基本的安全配置,比较容易理解,过程也比较简单,对用户的负面影响也比较少,较进阶和较具争议性的安全配置将会留待下一篇讨论。
以下的方法,一部分已经在「安装CentOS 7后必做的七件事」中讨论过,不过为了完整起见,我会重复解说SSH相关的部分,希望大家包涵,不过内容会比较详尽,例如会加入对用户体验的影响,增加技术讨论的篇幅,和比较支持与反对方的意见等等。在该篇文章中与SSH无关的部分例如更改root密码等等,将不会重复讨论,但他们对系统的安全性同样重要,请大家不要忽视。
1. 使用第二代通讯协定
SSH的通讯协定分为第一代和第二代,不用多说第二代有更多功能、选项、和更高的安全性,它是在2006 正式由IETF发表,至今已有十年。由于两代SSH协定并不兼容,我们只能二选其一,CentOS 7的SSH预设使用第二代协定,所以无需做任何设定,但我建议在设定档中明确写清楚,开启/etc/ ssh/sshd_config
,寻找:
1
|
#Protocol 2
|
改为:
1
|
Protocol 2
|
跟着输入以下指令重新启动sshd
:
1
|
systemctl restart sshd.service
|
完成后不要登出系统,使用另一个视窗尝试用普通帐号SSH登入。
2. 不容许空白密码
其中一个登入SSH的方法是输入帐号名称和密码,不过当CentOS 7新增一个帐号的时候,可以不设定初始密码,登入的时候只需输入帐号名称,这显然十分不安全,所以我们应该禁止这类型的帐号登入SSH,CentOS7的SSH预设禁止这类型的帐号登入,但我建议在设定档中明确写清楚,开启/etc/ssh/sshd_config
,寻找:
1
|
#PermitEmptyPasswords no
|
改为:
1
|
PermitEmptyPasswords no
|
3. 禁止root 使用SSH 登入
CentOS 7的SSH预设容许任何帐号登入,包括root
和普通帐号,为了避免root
帐号被暴力入侵,我们必须禁止root
帐号的SSH功能,事实上root
也没有必要SSH登入伺服器,因为只要使用su
或sudo
指令(当然需要输入root
的密码)普通帐号便可以拥有root
的权限。开启/etc/ssh/sshd_config
,寻找:
1
|
# PermitRootLogin yes
|
修改为:
1
|
PermitRootLogin no
|
最后输入以下指令重新启动sshd
:
1
|
systemctl restart sshd.service
|
这样黑客要取得root
的权限,必须先破解一个普通用户帐号,然后再破解root
的密码,难度增加了。
完成后不要登出系统,使用另一个视窗尝试用普通帐号SSH登入,退出后再尝试用root
帐号SSH登入。
这一项设定只会影响需要使用root 权限工作的人,所以影响的人数十分少,影响也很轻微,但对安全性却有极大帮助。
4. 使用非常规的SSH 端口
SSH预设使用端口(port) 22,这是在IANA注册的官方端口,但没有人说SSH不能使用其他端口,很多黑客专门向伺服器的22端口发动攻击,即使你的伺服器固若金汤、 牢不可破,但是要系统日以继夜接受攻击,消耗的系统资源(网络、处理器、记忆体等等)也不会少,何况它是否真的牢不可破还说不定呢!所以有必要让SSH使用其他端口,只让有权使用SSH的用户知道。
开启/etc/ssh/sshd_config
,寻找:
1
|
# Port 22
|
修改为:
1
|
Port 10837
|
你可以把10837
改为任何1024
– 65535
之间的数字,若果怕与某些系统服务发生冲突,可以参考一下这里。
跟着重新启动sshd
:
1
|
systemctl restart sshd.service
|
然后是设定防火墙,CentOS 7的内核已经有防火墙netfilter,但你的系统未必安装了用户界面,较前版本的CentOS预设使用iptables
,但CentOS 7开始使用效能更高、稳定性更好的firewalld
。习惯使用iptables
的管理员仍然可以在CentOS 7安装和使用iptables
,但必须注意iptables
和firewalld
不能同时运作。
如果伺服器尚未安装firewalld
,可以使用以下指令安装,不确定是否已经安装的话也可以输入这个指令,它会告诉你已经安装然后退出。
1
|
yum install firewalld
|
跟着启动:
1
|
systemctl start firewalld
|
设定firewalld
的方法有两个,第一个是修改firewalld
有关sshd
的设定,把端口22
改为10837
,这是正统的做法,但步骤比较多;第二个是要求firewalld
开启端口10837
,不指定它属于哪一个服务(service),这个做法通常处理临时的端口开启/封锁,步骤简单,但是日后你要是忘记了这个端口为什么开启了呢?什么时候开启的呢?为了哪一项服务开启呢?可能有点麻烦。我两种方法都会介绍一下,但作为专业的系统管理员(即使不是真正的专业,也应该具备这样的心态),我推荐使用第一种方法。
设定防火墙方法一:
复制firewalld
有关sshd
的设定档案:
1
|
cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
|
开启/etc/firewalld/services/ssh.xml
,寻找:
1
|
<port protocol="tcp" port="22"/>
|
修改为:
1
|
<port <code>protocol="tcp"</code> port="10837"/>
|
储存后重新载入firewalld
:
1
|
firewall-cmd --reload
|
设定防火墙方法二:
输入以下指令:
1
|
firewall-cmd --zone=public --add-port=10837/tcp --permanent
|
就是这样简单!
不论使用哪种方法,完成后不要登出系统,使用另一个视窗尝试登入,例如:
1
|
ssh -p 10837 user@12.34.56.78
|
不少人对更改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
指令建立一对加密钥匙,它会询问储存加密钥匙的档案名称,和把钥匙加密的密码,档案名称使用预设的路径和名称便可以:
1
|
ssh-keygen -t rsa
|
这个指令会创造两个档案,一个名为id_rsa
,是你的RSA密钥,另一个是id_rsa.pub
,是你的RSA公钥。这两条钥匙的预设长度是2048 bit,安全程度达112 bit,估计在2030年前都不可能暴力破解,可说十分安全(这纯碎是数学上的预测,不考虑硬件技术的突破、加密算法研究的突破、硬件瑕疵等因素),如果你不放心,可以使用-b
参数设定钥匙的长度,例如:
1
|
ssh-keygen -t rsa -b 4096
|
有些人认为太长的钥匙拖慢了加密/解密的过程,因而减慢了通讯的速度,那是对加密通讯的无知做成的误解!公钥加密法只是用来建立通讯,过程中双方会协商对称加密法(例如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预设启用这个方法,你也可以加入这一行明确启用它:
1
|
PubkeyAuthentication yes
|
如果你有两台或以上电脑需要使用SSH 登入伺服器,便要在每一台电脑重复以上步骤,很多懒惰的人把这一对加密钥匙(公钥和密钥)复制到其他电脑,这样做的确可以从不同的电脑登入伺服器,但却提高了加密钥匙被盗取的风险,违反了公钥验证的原意。
有些人建议使用公钥验证法后,密码登入的方法便应该停用,因为这是一个比较容易被暴力破解的方法,方法是在设定档/etc/ssh/sshd_config 中寻找:
1
|
PasswordAuthentication yes
|
把它改为:
1
|
PasswordAuthentication no
|
如果你打算只使用公钥验证法,这是对的。不过我在下一篇文章将会讨论双重验证法,即是公钥验证法和密码验证法同时使用,届时我们仍然要开启密码验证法,倒不如暂时把它保留着。
在日常使用电脑中的加密钥匙应该以稳当的密码保护,必须明白你的电脑并不是绝对安全的,例如你的朋友可能会借你的电脑检查电邮;当你离开位子上厕所而屏幕保护程式启动之前,谁人接触过你的电脑?你的手提电脑也有可能被盗取或遗失,诸如此类的情况多不胜数,倘若你的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
|
AllowUsers peter jane
|
帐号名称之间用空白字符分隔,帐号名称可以使用通配字符*
和?
,不过我不建议这样做,因为
- 你可能不小心容许了一些不该使用SSH 的帐号登入。
- 将来新增了一些不该使用SSH,但巧合地匹配这些模式的帐号,让他们拥有登入SSH 权限。
跟着输入以下指令重新启动sshd
:
1
|
systemctl restart sshd.service
|
完成后不要登出系统,尝试使用peter或者jane帐号在另一个视窗登入,退出后再尝试用其他帐号登入。
除了AllowUsers
之外,也可以使用DenyUsers
明确拒绝某些帐号登入,例如:
1
|
DenyUsers simon john
|
如果伺服器设定了用户群组,也可以用群组名称来授权/拒绝SSH 登入,例如:
1
2
|
AllowGroups developers testers
DenyGroups dbusers
|
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
中寻找:
1
|
UsePAM yes
|
改为:
1
|
UsePAM no
|
跟着输入以下指令重新启动sshd
:
1
|
systemctl restart sshd.service
|
一如既往,完成后不要登出系统,尝试在另一个视窗登入。
总结
以上是比较简单和容易理解的设定,如果你有任何问题或指正,欢迎在下面回响中提出和讨论。下一篇将讨论比较复杂,必较具争议性,和对用户体验有较大影响的设定。
以上是关于Linux系统下如何配置SSH_Centos7 ssh连接配置 CentOS7下安全配置的主要内容,如果未能解决你的问题,请参考以下文章