[网络/SSH]OpenSSH: sshd / sftp-server / ssh-agent | ssh / scp / sftp

1 OpenSSH

OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。

OpenSSH是使用SSH透过计算机网络加密通讯的实现。
SSH协议族可以用来进行远程控制, 或在计算机之间传送文件。
而实现此功能的传统方式,如 telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh都是极为不安全的,并且会使用明文传送密码。
OpenSSH提供了服务端后台程序和客户端工具,用来加密远程控制和文件传输过程中的数据,并由此来代替原来的类似服务。

1-1 定义

OpenSSH在其官网是如此描述的:

OpenSSH is the premier connectivity tool for remote login with the SSH protocol. It encrypts all traffic to eliminate eavesdropping, connection hijacking, and other attacks. In addition, OpenSSH provides a large suite of secure tunneling capabilities, several authentication methods, and sophisticated configuration options.

OpenSSH是使用SSH协议进行远程登录的主要连接工具。
它对所有流量进行加密,以消除窃听、连接劫持和其他攻击。
此外,OpenSSH还提供了一整套安全的隧道功能、几种身份验证方法和复杂的配置选项。

1-2 项目组件

截至目前(2020-10-15),OpenSSH的最新版本为: OpenSSH 8.4,其发布于 2020.9.27

The OpenSSH suite consists of the following tools:

  • Remote operations are done using ssh, scp, and sftp.
  • Key management with ssh-add, ssh-keysign, ssh-keyscan, and ssh-keygen.
  • The service side consists of sshd, sftp-server, and ssh-agent.
OpenSSH套件由以下工具组成:
+ 远程操作是使用ssh、scp和sftp完成的。
+ 使用ssh-add、ssh-keysign、ssh- keyyscan和ssh-keygen进行密钥管理。
+ 服务端由sshd、sftp-server和ssh-agent组成。
  • 客户端: ssh / scp / sftp
    SSH: SSH客户端。rlogin与Telnet的替代方案。
    SCP/SFTP: rcp的替代方案,将文件复制到其他电脑上。
  • 服务端: sshd / sftp-server / ssh-agent
    SSH服务端
  • 密钥管理: ssh-add / ssh-keysign / ssh-keyscan / ssh-keygen
    ssh-add/ssh-agent: 帮助用户不需要每次都要输入密钥密码的工具。
    ssh-keysign:
    ssh-keyscan: 扫描一群机器,并记录其公钥。
    ssh-keygen: 产生RSA或DSA密钥,用来认证用。

1-3 风险与漏洞

在OpenSSH 3.6.1p2及更早版本中,
当禁用PermitRootLogin并使用PAM键盘交互式身份验证时,sshd在使用正确密码进行root登录尝试后不会插入延迟,
这使远程攻击者更容易使用时序差异来确定是否多步验证的密码步骤是成功的,与CVE-2003-0190不同。

CVE-2003-0190 - CVE
CNNVD-200305-021 - 中国国家信息安全漏洞库

[风险描述]

OpenSSH是一种开放源码的SSH协议的实现,目前移植在多种系统下工作。
移植的OpenSSH版本在支持PAM的情况下存在时序攻击问题,远程攻击者可以利用这个漏洞判断用户是否存在,导致信息泄露。
根据测试,如果OpenSSH以--with-pam进行配置的情况下,由于对合法用户和非法用户响应信息的时间不同,该可以判断系统用户是否存在。
在判断用户情况下,可以进一步通过猜测密码进行攻击。
  • SSH

Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接。虽然任何网络服务都可以通过SSH实现安全传输,SSH最常见的用途是远程登录系统,人们通常利用SSH来传输命令行界面和远程执行命令。使用频率最高的场合类Unix系统,但是Windows操作系统也能有限度地使用SSH。2015年,微软宣布将在未来的操作系统中提供原生SSH协议支持。

在设计上,SSH是Telnet和非安全shell的替代品。Telnet和Berkeleyrlogin、rsh、rexec等协议采用明文传输,使用不可靠的密码,容易遭到监听、嗅探和中间人攻击。SSH旨在保证非安全网络环境(例如互联网)中信息加密完整可靠。

不过,SSH也被指出有被嗅探甚至解密的漏洞。
早在2011年,中国的互联网审查机构已经有能力针对SSH连接的刺探及干扰
而后爱德华·斯诺登泄露的文件也指出,美国国家安全局有时能够把SSH协议传输的信息解密出来,从而读出SSH会话的传输内容
2017年7月6日,非营利组织维基解密确认美国中央情报局已经开发出能够在Windows或Linux操作系统中窃取SSH会话的工具。

1-4 关于开源: OpenSSH————开源计划OpenBSD的子计划

OpenSSH is developed by a few developers of the OpenBSD Project and made available under a BSD-style license.

OpenSSH is incorporated into many commercial products, but very few of those companies assist OpenSSH with funding.

OpenBSD is developed entirely by volunteers. The project's development environment and developer events are funded through contributions collected by The OpenBSD Foundation. Contributions ensure that OpenBSD will remain a vibrant and free operating system.
Contributions towards OpenSSH can be sent to the OpenBSD Foundation.

OpenSSH是由OpenBSD项目的一些开发人员开发的,并在bsd风格的许可下提供。

OpenSSH被整合到许多商业产品中,但这些公司中很少有公司为OpenSSH提供资金支持。 [来自官方的吐槽...]

OpenBSD完全由志愿者开发。
该项目的开发环境和开发人员活动由OpenBSD基金会收集的捐款提供资金。
贡献的资金确保了OpenBSD将继续是一个充满活力和自由的操作系统。

对OpenSSH的资金捐献可以发送到OpenBSD基金会。
  • 补充说明: OpenSSH 与 OpenSSL
OpenSSH常常被误认以为与OpenSSL有关联,但实际上这两个计划的有不同的目的,不同的发展团队,名称相近。
只是因为两者有同样的软件发展目标──提供开放源代码的加密通讯软件。

2 常用命令

2-1 ssh / sshd

systemctl start/stop/restart sshd # 启动/停止/重启 【SSH服务端】服务
systemctl enable/disable sshd # 开启/关闭 开机自启 【SSH服务端】

systemctl reload sshd # 重新加载【SSH服务端】服务配置

systemctl status sshd # 查看【SSH服务端】服务状态( inactive(非活动状态) / active(活动状态) )
systemctl list-unit-files | grep sshd 或 netstat -antulp | grep ssh # 列出本机已开启服务当前状态
[查看 OpenSSH 版本]
[root@govern ~]# ssh -V
OpenSSH_8.1p1, OpenSSL 1.0.1e-fips 11 Feb 2013

[查看 OpenSSL 版本]
[root@govern ~]# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013

3 应用场景

场景1 - 在Git配置远程仓库(GitLab/Github)中的应用

  • step1 给Git 设置一个全局的账户(远程仓库GitLab[/Github/...]账户)
git config user.name "yourGitLabName"
git config user.email "myGitlab@email.cn"
  • step2 使用远程仓库GitLab账户的邮箱生成SSH密钥对
    (默认:在Windows系统中生成id_rsa :C:/用户/username/.ssh/id_rsa)
ssh-keygen -t rsa -C "myGitlab@email.cn"
至此,SSH密钥对(公钥[*.pub]+私钥)已生成,在 ~/.ssh 文件夹下 (~/.ssh 即C: Users/yourUserName/)
> 文件1: id_rsa [私钥] > 文件2: id_rsa.pub [公钥]
  • step3 将公钥文件的内容全文复制到 GitLab的个人账户的SSH公钥管理处
  • ...(本地电脑单远程仓库账户时,单即可直接使用Git了)

》》》 多远程仓库
但是Git 默认的只会用id_rsa这个密钥对。
如果想针对不同的域名(多远程仓库)使用不同的密钥对, 需要做设置,即 配置known_hosts文件。

  • step4 配置known_hosts文件
    PS1: 把id_rsa_github密钥对添加到配置列表。若此命令报错 ,请先执行:ssh-agent bash
    ssh-agent tcsh (另一Shell)
ssh-add ~/.ssh/id_rsa_github

PS2:新增完后,可执行本命令进行测试:

ssh -T git@github.com

PS3:在后续的使用中,例如git clonegit init/clone/pull/push等与远程仓库相关的首次操作前,建议先检查【git config –get user.email / git config -l / git branch -av】一下:

  • 本地仓库对应的个人账户是否无误
  • 本地仓库对应的远程仓库地址是否无误
    (避免将源码提交至错误的远程仓库 或 出现 push/pull失败等情况)

PS4:获取SSH公钥的HASH指纹值——ssh-keygen -lf ~/.ssh/id_rsa_github.pub
-l 表示"list",而不是创建新密钥; -f 表示"filename"

X 参考/推荐文献

原文地址:https://www.cnblogs.com/johnnyzen/p/13819086.html