OpenSSH源码分析——PART1

介绍

OpenSSH是SSH(Secure SHell)协议的免费开源实现,可以用来进行远程控制或在计算机之间传送文件,比传统的telnet、rcp ftp等工具更安全1

OpenSSH的开源代码可以在这里下载,也可以在GitHub上查看。

OpenSSH主要提供了以下功能

  • ssh:客户端程序,用来连接到远程服务器,执行命令或传输文件。
  • sshd:服务端程序,用来监听客户端的连接请求,验证身份,提供服务。
  • scp:客户端程序,用来在本地和远程之间复制文件。
  • sftp:客户端程序,用来在本地和远程之间交互式地传输文件。
  • ssh-keygen:客户端程序,用来生成密钥对,用于公钥认证。
  • ssh-agent:客户端程序,用来管理私钥,避免重复输入密码。
  • ssh-add:客户端程序,用来向ssh-agent添加私钥。
  • ssh-keyscan:客户端程序,用来收集远程主机的公钥。
  • ssh-keysign:服务端程序,用来为主机认证签名。
  • ssh-pkcs11-helper:客户端程序,用来支持PKCS#11令牌设备。
  • sftp-server:服务端程序,用来提供sftp服务。
  • ssh_config:客户端配置文件,用来设置连接参数。
  • sshd_config:服务端配置文件,用来设置服务参数。

OpenSSH源码分析

openssh的目录结构有些松散,没有对其代码按照特性或者功能去划分,其主要目录如下

目录名功能
openbsd-compat兼容BSD操作系统的代码实现
regress相关测试用例和脚本实现
m4存放的是一些宏处理器的文件,用于配置文件和脚本的生成
其余零散源文件openssh主体功能代码实现

主体功能代码分析

功能板块具体功能文件名功能点
SSH客户端交互式会话主循环clientloop.c包含了SSH客户端的主要事件循环,它处理输入和输出,管理通道,等等;
ssh客户端守护进程ssh.c

SSH客户端的主要入口点,它初始化客户端,处理命令行参数,然后进入主事件循环等

具体而言,ssh.c文件负责以下功能:

  1. 连接建立和维护:建立与远程服务器的连接,并保持连接的活动状态。它处理与服务器之间的握手过程,包括协商加密算法、验证服务器主机密钥等;

  2. 用户身份验证:实现了与远程服务器进行身份验证的逻辑。它支持多种身份验证方法,如密码、公钥、证书等。根据用户提供的凭据,ssh.c将向服务器发送相应的身份验证请求;

  3. 远程命令执行:负责将用户指定的远程命令发送到服务器,并获取执行结果。它通过与服务器进行交互来实现命令的执行和输出的传输;

  4. 文件传输:支持通过SCP(Secure Copy Protocol)和SFTP(SSH File Transfer Protocol)进行安全的文件传输。它实现了相关的文件传输逻辑,使用户能够从本地系统向远程服务器上传或下载文件;

  5. 安全性措施:实施了各种安全性措施,例如对传输数据进行加密、阻止中间人攻击、验证服务器的身份等;

  6. 错误处理和日志记录:包含了错误处理和日志记录的逻辑,以便在出现问题时生成有用的日志信息并向用户报告;

SSH服务端ssh服务端守护进程sshd.c

SSH服务器的主要入口点,它初始化服务器,处理命令行参数,然后进入主事件循环等

具体而言,sshd.c文件负责以下功能:

  1. 监听和处理传入连接:包含创建监听套接字,并处理传入连接请求。一旦连接建立,它将调用其他函数来处理连接的各个方面;

  2. 身份验证:sshd.c实现了与客户端进行身份验证的逻辑。它包括使用密码、公钥、证书等不同方法进行身份验证,并在成功验证后提供访问权限;

  3. 会话管理:sshd.c负责为经过身份验证的用户创建和管理会话。它设置用户环境变量、执行shell或指定命令,并通过输入/输出通道与客户端进行通信;

  4. 安全性措施:sshd.c实施了各种安全性措施,例如防止暴力破解攻击、限制并发连接数、记录日志以及实施访问控制策略;

  5. 错误处理和日志记录:sshd.c包含了错误处理和日志记录的逻辑,以便在出现问题时生成有用的日志信息并向管理员报告;

算法套实现

加密算法实现

(cryptographic cipher implementations)

cipher.c/cipher.h, cipher-*.c这处理SSH加密和解密,它们包含了处理各种加密算法的函数;

秘钥交换算法实现

(Key exchange algorithms implementations, KEX)

kex.c/kex.h, kexdh.ckexecdh.ckexgex.c, etc..实现不同处理各种密钥交换方法的函数 方法,如 Diffie-Hellman、ECDH、Group Exchange

消息完整性算法实现

(Message authentication code algorithms implementations, MAC)

mac.cmac.h, mac-*.c数据完整性检查的各种 MAC 算法(例如 HMAC-SHA1、HMAC-SHA256)的实现和支持

通用工具

网络地址处理addr.*socket地址处理相关工具函数实现
对socket使用的封装atomicio.*封装socket数据读写接口,用于保证保证数据在套接字上完整传输的函数;
事件记录和报告audit*.*用于实现记录和报告SSH事件实现,可以根据不通平台和配置,调用相应的审计模块来处理SSH事件
用户认证用户认证(User Authentiucation)auth*.*处理用户身份验证,它们包含了处理各种身份验证方法(如密码、公钥等)的函数;
channels.c/channels.h处理SSH通道的创建和管理,SSH通道用于在客户端和服务器之间创建加密的通信路径;
 配置读取配置读取readconf.c/readconf.h处理SSH配置文件的读取和解析;

SSH主体流程在开源代码中的实现分析

源码文件函数名
ssh.cmain入口函数,它负责解析命令行参数、初始化日志、读取配置文件、加载密钥、创建套接字等;
ssh_connect负责与服务器建立TCP连接,并协商协议版本、交换密钥、验证服务器身份等;
ssh_login登录函数,它负责根据配置文件和服务器请求,调用不同的认证方法,如密码认证、公钥认证、Kerberos认证等,并检查服务器权限和登录限制;
client_loop主循环函数,它负责处理客户端的输入和输出,包括转发X11、TCP/IP、认证连接,以及执行shell命令或子系统请求等;
sshd.cmainsshd的入口函数,它负责解析命令行参数、初始化日志、读取配置文件、设置信号处理器、创建主进程和子进程等;
server_accept_loopsshd的主循环函数,它负责接受新的连接请求,并为每个连接创建一个子进程;
server_loop2sshd的子进程函数,它负责处理一个连接的所有操作,包括协商协议版本、交换密钥、验证用户、分发消息等;
do_ssh2_kexsshd的密钥交换函数,它负责与客户端协商加密算法、压缩算法、MAC算法等,并生成会话密钥;
do_authentication2sshd的认证函数,它负责根据配置文件和客户端请求,调用不同的认证方法,如密码认证、公钥认证、Kerberos认证等,并检查用户权限和登录限制;
do_authenticated2sshd的会话管理函数,它负责根据客户端请求,创建和销毁通道(channel),并调用不同的服务函数,如shell服务、exec服务、subsystem服务;

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值