理解SSH服务
深入理解SSH服务:从基础到安全配置与实战
在当今的网络世界中,远程管理服务器已成为常态,而SSH(Secure Shell)作为一种安全的网络协议,凭借其加密传输的特性,成为远程登录和文件传输的首选工具。本文将从SSH的基本概念出发,详细介绍其工作原理、登录方式、安全配置以及相关实用技巧,帮助你全面掌握SSH服务的使用与管理。
一、SSH是什么?
SSH(Secure Shell)是一种建立在应用层和传输层基础上的安全通道协议,主要用于实现字符界面的远程登录、远程复制等功能。与传统的Telnet、FTP等协议不同,SSH协议对通信双方的数据传输进行了加密处理,包括用户登录时输入的用户口令,有效防止了信息泄露。
同时,SSH协议还对数据传输进行压缩,提高了传输速度,其工作模式如下:
SSH客户端 <------------------------------> SSH服务端网络
数据传输是加密的,可以防止信息泄漏
数据传输是压缩的,可以提高传输速度
1.1 SSH客户端与服务端
- SSH客户端:常见的有Putty、Xshell、CRT、MobaXterm、FinalShell等,用于发起对SSH服务端的连接请求。
- SSH服务端:主要通过OpenSSH实现,这是一个实现SSH协议的开源软件项目,适用于各种UNIX、Linux操作系统。
在Centos 7系统中,默认已安装openssh相关软件包,并将sshd服务添加为开机自启动。执行systemctl start sshd
命令即可启动sshd服务。
1.2 SSH服务的基本信息
- 默认端口:sshd服务默认使用TCP的22端口。
- 安全协议版本:默认使用sshv2,sshv1存在漏洞,不建议使用。
- 配置文件:
- 服务端配置文件:
/etc/ssh/sshd_config
- 客户端配置文件:
/etc/ssh/ssh_config
- 服务端配置文件:
- 服务名称:sshd
- 服务端主程序:
/usr/sbin/sshd
1.3 SSH的作用
SSHD服务使用SSH协议可以进行远程控制,或在计算机之间传送文件。相比Telnet、FTP等明文传输方式,SSH的加密传输更为安全,能有效防止远程管理过程中的信息泄露,还能防止DNS欺骗和IP欺骗。
二、SSH远程登录方式
2.1 登录方法一
ssh [远程主机用户名]@[远程服务器主机名或IP地址] -p port
当在Linux主机上远程连接另一台Linux主机时,若当前登录用户与远程登录用户均为root,且端口为默认时,可直接使用ssh IP
。若端口非默认,则需要用-p
指定端口。
示例:
ssh zhangsan@192.168.10.22
ssh zhangsan@benet37
2.2 登录方法二
ssh -l [远程主机用户名] [远程服务器主机名或IP地址] -p port
-l
:指定登录名称。-p
:指定登录端口(当服务端端口非默认时使用)。
2.3 首次登录提示
第一次登录服务器时,系统因未保存远程主机信息,会提示用户确认主机身份,输入yes
后登录,远程服务器信息会被写入用户主目录下的$HOME/.ssh/known_hosts
文件中,下次登录则不会再提示。
三、SSH故障及解决办法
在使用SSH登陆时,可能会遇到类似以下的提示:
The authenticity of host '192.168.10.9 (192.168.10.9)' can't be established.
ECDSA key fingerprint is SHA256:AaGpHeEiRuXMy96oezzV6TOej5nJJmZIe/djqR7qCVk.
ECDSA key fingerprint is MD5:78:a1:b1:1c:36:76:c7:34:54:87:cc:ea:51:3f:0c:24.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.9' (ECDSA) to the list of known hosts.
Authentication failed.
3.1 原因
一台主机上有多个Linux系统且经常切换,这些系统使用同一IP,登录过一次后,ssh信息会记录在本地的~/.ssh/known_hosts
文件中,切换系统后再用ssh访问该主机就会出现冲突警告。
3.2 解决办法
-
连接时加上
-o StrictHostKeyChecking=no
选项:ssh -o StrictHostKeyChecking=no 192.168.xxx.xxx
-
修改配置文件彻底去掉提示,在
/etc/ssh/ssh_config
文件(或$HOME/.ssh/config
)中添加:StrictHostKeyChecking no UserKnownHostsFile /dev/null
四、OpenSSH服务包及安装
OpenSSH软件包提供了服务端后台程序和客户端工具,用来加密远程控制和文件传输过程中的数据,以替代Telnet或Ftp等服务。安装OpenSSH需要以下4个软件包:
openssh-5.3p1-114.el6_7.x86_64
:包含OpenSSH服务器及客户端需要的核心文件。openssh-clients-5.3p1-114.el6_7.x86_64
:OpenSSH客户端软件包。openssh-server-5.3p1-114.el6_7.x86_64
:OpenSSH服务器软件包。openssh-askpass-5.3p1-114.el6_7.x86_64
:支持对话框窗口的显示,基于X系统。
注意:编译安装openssh升级可能存在风险,必须先安装telnet并测试用户登录无问题后再进行升级。
五、SSH服务配置与管理
5.1 服务配置
监听端口修改
- SSH预设使用22端口,也可使用多个端口,只需重复使用
port
设定项。例如开放22和222端口,可添加Port 222
,然后重新启动SSHD。 - 建议修改端口号为其他端口,防止暴力破解。
监听地址(ListenAddress)
ListenAddress 0.0.0.0
表示侦听所有地址。安全建议:若主机不需要从公网ssh访问,可将监听地址改为内网地址。
协议版本(Protocol)
设置为Protocol 2
,因SSH1存在漏洞与缺陷,选择SSH2。
DNS反向解析(UseDNS)
一般在内网互连时,建议设置为no
,可提高联机速度。
日志记录(SyslogFacility)
SyslogFacility AUTHPRIV
表示当有人使用SSH登入系统时,SSH会将信息记录为AUTHPRIV类型,sshd服务日志存放在/var/log/secure
。
5.2 安全调优
登录宽限时间(LoginGraceTime)
LoginGraceTime 2m
表示系统给予2分钟时间进行登录(0表示无限制)。若在指定时间内未成功登录,将被强迫断线。
允许root登录(PermitRootLogin)
默认允许root登入,建议设定为no
。真实生产环境服务器通常不允许root账号直接登陆,仅允许普通用户登录,需使用root用户时再切换。
示例:
# 创建用户
useradd zhangsan、lisi
# 查询组
grep "wheel" /etc/group
# 将zhangsan加入wheel组
gpasswd -a zhangsan wheel
# 开启pam模块
密码验证(PasswordAuthentication)
默认yes
,表示需要密码验证。在安全级别要求高的服务器上,可设置为no
,通过认证的秘钥来登陆。
允许空密码登录(PermitEmptyPasswords)
默认为no
,不允许空密码登录。
显示上次登入信息(PrintLastLog)
默认为yes
,显示上次登入的信息。
最大认证次数(MaxAuthTries)
默认值是6。如果失败认证的次数超过这个数值的一半,连接将被强制断开,且会生成额外的失败日志消息(默认3次)。
可通过以下命令验证:
ssh -o NumberOfPasswordPrompts=8 lisi@192.168.10.9
用户登录限制(AllowUsers/DenyUsers)
当希望只允许或禁止某些用户登录时,可使用AllowUsers
或DenyUsers
配置,两者用法类似(注意不要同时使用)。
例如,只允许zhangsan、wangwu用户登录:
AllowUsers zhangsan@192.168.10.10 wangwu
六、SSH扩展命令参数
ssh -o ConnectTimeout=3 -o ConnectionAttempts=5 -o PasswordAuthentication=no -o StrictHostKeyChecking=no $ip "command"
ConnectTimeout=3
:连接超时时间,3秒。ConnectionAttempts=5
:连接失败后重试次数,5次。PasswordAuthentication=no
:不使用密码认证,没有互信直接退出。StrictHostKeyChecking=no
:自动信任主机并添加到known_hosts文件。
示例:
ssh -o StrictHostKeyChecking=no root@192.168.10.0
七、SSHD服务的验证方式
sshd服务支持两种验证方式:
7.1 密码验证
对服务器中本地系统用户的登录名称、密码进行验证。这种方式简便,但存在被假冒和遭遇密码穷举攻击的风险。建议使用18位复杂密码(包含大写、小写、字符、数字),并修改端口(1023以上高位端口,如1922)以提高安全性。
7.2 密钥对验证
要求提供相匹配的密钥信息才能通过验证。通常先在客户端创建一对密钥文件(公钥、私钥),然后将公钥文件放到服务器指定位置。远程登录时,系统使用公钥、私钥进行加密/解密关联验证,安全性高,且可实现免交互登录,在Shell中广泛使用。
当两种验证方式都启用时,服务器优先使用密钥对验证。对安全性要求高的服务器,建议禁用密码验证,只允许密钥对验证;若无特殊要求,两种方式均可启用。
八、构建密钥对验证的SSH
8.1 公钥和私钥的关系
在非对称加密技术中,私钥由密钥对所有者持有,不可公布;公钥由密钥对持有者公布给他人。公钥用于加密数据,用公钥加密的数据只能使用私钥解密。
8.2 构建密钥对验证的SSH原理
- ssh通过加密算法在客户端产生密钥对(公钥和私钥),公钥发送给服务器端,客户端保留私钥。
- 客户端请求连接带有公钥的SSH服务器时,SSH服务器在该用户的家目录下寻找事先存放的对应公钥,与客户端发送的公钥比较。
- 若一致,SSH服务器用公钥加密“质询”并发送给SSH客户端。
- 客户端用私钥解密“质询”并返回,验证通过则登录成功。
8.3 配置密钥对验证的步骤
-
修改配置文件:
vim /etc/ssh/sshd_config PasswordAuthentication no # 禁用密码验证 PubkeyAuthentication yes # 启用密钥对验证 AuthorizedKeysFile .ssh/authorized_keys # 指定公钥库文件
-
在客户端创建密钥对:
useradd admin echo "123123" | passwd --stdin admin su - admin ssh-keygen -t ecdsa # 按提示操作,生成的私钥、公钥文件默认存放在宿主目录的.ssh/下 # id_ecdsa是私钥文件,权限默认为600;id_ecdsa.pub是公钥文件
-
将公钥文件上传至服务器:
scp ~/.ssh/id_ecdsa.pub root@192.168.80.10:/opt # 或使用ssh-copy-id直接导入 cd ~/.ssh/ ssh-copy-id -i id_ecdsa.pub zhangsan@192.168.80.10
-
在服务器中导入公钥文本:
mkdir /home/zhangsan/.ssh/ cat /opt/id_ecdsa.pub >> /home/zhangsan/.ssh/authorized_keys
-
在客户端使用密钥对验证:
ssh zhangsan@192.168.80.10 # 输入私钥的密码
-
设置ssh代理功能,实现免交互登录:
ssh-agent bash # 开启ssh代理功能 ssh-add # 添加私钥到ssh-agent缓存 # 输入私钥的密码 ssh zhangsan@192.168.80.10 # 无需再输入密码
九、TCP Wrappers访问控制
TCP Wrappers(TCP封套)将TCP服务程序“包裹”起来,代为监听端口,增加安全检测过程,外来连接请求必须通过检测才能访问真正的服务程序。
9.1 基本信息
- 一般系统默认安装,可通过
rpm -q tcp_wrappers
查看。 - 提供执行程序tcpd和共享链接库文件libwrap.so.*。
- 多数网络服务通过调用libwrap.so.*链接库实现保护,如sshd,可通过
ldd /usr/sbin/sshd | grep "libwrap"
查看。
9.2 语法格式
<服务程序列表>: <客户端地址列表>
-
服务程序列表:
ALL
:代表所有的服务。- 单个服务程序:如“vsftpd”。
- 多个服务程序组成的列表:如“vsftpd,sshd”。
-
客户端地址列表:
ALL
:代表任何客户端地址。LOCAL
:代表本机地址。- 多个地址以逗号分隔。
- 允许使用通配符“*”(任意长度字符)和“?”(一个字符)。
- 网段地址:如“192.168.80.”或192.168.80.0/255.255.255.0。
- 区域地址:如“.benet.com”匹配benet.com域中的所有主机。
9.3 访问控制的基本原则
- 首先检查
/etc/hosts.allow
文件,找到相匹配的策略则允许访问。 - 否则检查
/etc/hosts.deny
文件,找到相匹配的策略则拒绝访问。 - 若两个文件都无匹配策略,则允许访问。
9.4 实例
若只希望从IP地址为12.0.0.1的主机或192.168.80.0/24网段的主机访问sshd服务,其他地址被拒绝:
vi /etc/hosts.allow
sshd,vsftpd:12.0.0.1,192.168.80.*vi /etc/hosts.deny
sshd:ALL
十、总结
SSH作为一种安全的网络协议,为客户端与远程主机的安全连接和交互提供了可靠保障。其安全连接过程如下:
- 远程主机端收到客户端的登陆请求时,先发送自己的公钥给客户端。
- 客户端用拿到的公钥加密用户名和密码,发送给远程主机。
- 远程主机用自己的密钥解密收到的用户名和密码,校验正确则登陆成功。
而公钥登录(免密登陆)流程为:
- 客户端在本地生成一对公钥密钥文件,将公钥存储在远程主机上。
- 客户端登陆时,远程主机会随机生成一串字符串发送给客户端。
- 客户端用自己的密钥将收到的字符串加密,并返回给远程主机。
- 远程主机利用公钥解密收到的加密字符串,若解密成功且与发送的一致,则直接免密登陆。
通过掌握SSH的基本概念、登录方式、安全配置及密钥对验证等知识,你可以更安全、高效地进行远程服务器管理。在实际应用中,还需根据具体需求进行合理配置,不断加强SSH服务的安全性,以应对各种潜在的网络威胁。