SSH协议的原理和使用:深入剖析SSH协议的原理和使用方法

简介: SSH协议的原理和使用:深入剖析SSH协议的原理和使用方法

SSH协议简介

SSH(Secure Shell)协议是一种基于安全套接字层(SSL)或传输层安全(TLS)协议的安全协议。

SSH协议是一种网络协议,用于在不安全的网络上安全地进行远程登录和其他网络服务。SSH协议可以使用SSL或TLS协议来加密和保护数据传输,以保护数据的机密性和完整性。SSH协议通常用于登录和执行远程命令,以及传输文件和其他数据。

SSL和TLS协议是一种用于加密和保护数据传输的安全协议。SSL和TLS协议使用公钥加密和私钥解密的方式来保护数据的安全性,同时使用数字证书来验证通信双方的身份。SSL和TLS协议通常用于保护Web浏览器和Web服务器之间的数据传输,以防止数据被窃取或篡改。

总之,SSH协议是一种基于SSL或TLS协议的安全协议,而不是基于SSH协议的。SSH协议使用SSL或TLS协议来加密和保护数据传输,以保护数据的机密性和完整性。

SSH是目前较可靠,专为远程登陆会话和其他网络服务提供安全性的协议。是建立在应用层和传输层基础上的安全协议。**

利用SSH协议可以有效防止远程管理过程中的信息泄露问题。

而OpenSSH是SSH协议的免费开源实现,它采用安全、加密的网络连接工具代替了telnet、ftp等古老明文传输工具。

SSH可以将所有的传输数据加密,这样“中间人”这种攻击方式就不可能实现了,而且也可以防止DNS和IP欺骗。

还有一个额外的好处就是传输的数据经过压缩的,可以加快传输的速度。

SSH是由服务端和客户端的软件组成,服务端是一个守护进程,它在后台运行并响应来自客户端的连接请求。

SSH的工作机制

本地客户端发送一个连接请求到远程的服务端,

服务端检查申请的包和IP地址再发送密钥给SSH客户端,

本地再将密钥发回给服务端,到此为止,连接建立。

启动SSH服务器后,sshd进程运行并在默认的22端口进行监听。

安全验证方式

基于口令的安全验证(账号密码),也有可能受到中间人攻击基于密钥的安全验证,就是提供一对密钥,把公钥放在需要访问的服务器上,

如果连接到SSH服务器上,客户端就会向服务器发出请求,请求用密钥进行安全验证,

服务器收到请求之后,先在改服务器的主目录下寻找公钥,然后把它和发送过来的公钥进行比较。

如果两个密钥一致,服务器就用公钥加密“质询”并把它发送给客户端。

客户端收到“质询”之后就可以用私钥解密再把它发给服务器端。基于这种方式,相对比较安全。

SSH协议框架中最主要的部分是三个协议

  • 传输层协议(The Transport Layer Protocol)提供服务器认证,数据机密性,信息完整性 等的支持;
  • 用户认证协议(The User Authentication Protocol) 则为服务器提供客户端的身份鉴别;
  • 连接协议(The Connection Protocol) 将加密的信息隧道复用成若干个逻辑通道,提供给更高层的应用协议使用; 各种高层应用协议可以相对地独立于SSH基本体系之外,并依靠这个基本框架,通过连接协议使用SSH的安全机制。

SSH 的工作过程

在整个通讯过程中,为实现 SSH的安全连接,服务器端与客户端要经历如下五个阶段:

  1. 版本号协商阶段,SSH目前包括 SSH1和SSH2两个版本, 双方通过版本协商确定使用的版本
  2. 密钥和算法协商阶段,SSH支持多种加密算法, 双方根据本端和对端支持的算法,协商出最终使用的算法
  3. 认证阶段,SSH客户端向服务器端发起认证请求, 服务器端对客户端进行认证
  4. 会话请求阶段, 认证通过后,客户端向服务器端发送会话请求
  5. 交互会话阶段 ,会话请求通过后,服务器端和客户端进行信息的交互

1 . 版本号协商阶段

  1. 服务器打开端口 22,等待客户端连接。
  2. 客户端向服务器端发起 TCP初始连接请求,TCP连接建立后,服务器向客户端发送第一个报文,包括版本标志字符串,格式为“SSH-<主协议版本号>.<次协议版本号>-<软件版本号>”,协议版本号由主版本号和次版本号组成,软件版本号主要是为调试使用。
  3. 客户端收到报文后,解析该数据包,如果服务器端的协议版本号比自己的低,且客户端能支持服务器端的低版本,就使用服务器端的低版本协议号,否则使用自己的协议版本号。
  4. 客户端回应服务器一个报文,包含了客户端决定使用的协议版本号。服务器比较客户端发来的版本号,决定是否能同客户端一起工作。
  5. 如果协商成功,则进入密钥和算法协商阶段,否则服务器端断开 TCP连接。

Note: 版本号协商阶段报文都是采用明文方式传输的。

2. 密钥和算法协商阶段

  1. 服务器端和客户端分别发送算法协商报文给对端,报文中包含自己支持的公钥算法列表、加密算法列表、MAC(Message Authentication Code,消息验证码)算法列表、压缩算法列表等;
  2. 服务器端和客户端根据对端和本端支持的算法列表得出最终使用的算法。
  3. 服务器端和客户端利用 DH交换(Diffie-Hellman Exchange)算法、主机密钥对等参数,生成会话密钥和会话 ID。

通过以上步骤,服务器端和客户端就取得了相同的会话密钥和会话ID。

  • 对于后续传输的数据,两端都会使用会话密钥进行加密和解密,保证了数据传送的安全
  • 在认证阶段,两端会使用会话 ID用于认证过程。

Note:

在协商阶段之前,服务器端已经生成 RSA或 DSA密钥对,他们主要用于参与会话密钥的生成。

3. 认证阶段

  1. 客户端向服务器端发送认证请求,认证请求中包含用户名、认证方法、与该认证方法相关的内容(如:password认证时,内容为密码)。
  2. 服务器端对客户端进行认证,如果认证失败,则向客户端发送认证失败消息,其中包含可以再次认证的方法列表。
  3. 客户端从认证方法列表中选取一种认证方法再次进行认证。
  4. 该过程反复进行, 直到认证成功或者认证次数达到上限, 服务器关闭连接为止。

SSH提供两种认证方式:

  1. password认证:客户端向服务器发出 password认证请求,将用户名和密码加密后发送给服务器;

服务器将该信息解密后得到用户名和密码的明文,与设备上保存的用户名和密码进行比较,并返回认证成功或失败的消息。

  1. publickey 认证:采用数字签名的方法来认证客户端。

目前,设备上可以利用RSA和 DSA两种公共密钥算法实现数字签名。

客户端发送包含用户名、公共密钥和公共密钥算法的 publickey 认证请求给服务器端。

服务器对公钥进行合法性检查,如果不合法,则直接发送失败消息;

否则,服务器利用数字签名对客户端进行认证,并返回认证成功或失败的消息

SSH2.0还提供了 password-publickey 认证和 any 认证:

  1. password-publickey 认证:指定该用户的认证方式为 password 和 publickey认证同时满足。

客户端版本为 SSH1的用户只要通过其中一种认证即可登录;客户端版本为 SSH2的用户必须两种认证都通过才能登录。

  1. any认证:指定该用户的认证方式可以是 password,也可以是 publickey。

4.会话请求阶段

  1. 服务器等待客户端的请求;
  2. 认证通过后,客户端向服务器发送会话请求;
  3. 服务器处理客户端的请求。请求被成功处理后, 服务器会向客户端回应 SSH_SMSG_SUCCESS包,SSH进入交互会话阶段;否则回应 SSH_SMSG_FAILURE包,表示服务器处理请求失败或者不能识别请求。

5.交互会话阶段

在这个模式下,数据被双向传送:

  1. 客户端将要执行的命令加密后传给服务器;
  2. 服务器接收到报文,解密后执行该命令,将执行的结果加密发还给客户端;
  3. 客户端将接收到的结果解密后显示到终端上.

linux(ubuntu) 安装

# 安装ssh 服务 
sudo apt-get install ssh  
sudo apt-get install openssh-server
# 修改 配置
sudo  vi /etc/ssh/sshd_config 
# 重启ssh服务  
sudo  service ssh restart

生成密匙

#Create an ssh key in the default path
ssh-keygen -t rsa
# -Enter the path to save the secret key
# -Enter the password, you can leave it alone

说明

id_rsa是私匙

id_rsa.pub是公匙

#Verify whether the ssh key is successful
ssh -T git@github.com

linux SSH各配置项解释

关于ssh 设置的相关总结(ssh最大连接数、ssh连接时长、安全性配置等)

以redhat6.3为例

ssh配置文件在:/etc/ssh/sshd_config

可以打开查看相应配置,默认情况下只开放了几个选项,其余全部#屏蔽掉了。

#sshd_config 中文手册
#SSHD_CONFIG(5) OpenBSD Programmer's Manual SSHD_CONFIG(5)
名称
sshd_config - OpenSSH SSH 服务器守护进程配置文件
大纲
/etc/ssh/sshd_config
描述
sshd(8) 默认从 /etc/ssh/sshd_config 文件(或通过 -f 命令行选项指定的文件)读取配置信息。
配置文件是由"指令 值"对组成的,每行一个。空行和以'#'开头的行都将被忽略。
如果值中含有空白符或者其他特殊符号,那么可以通过在两边加上双引号(")进行界定。
[注意]值是大小写敏感的,但指令是大小写无关的。
当前所有可以使用的配置指令如下:
AcceptEnv
指定客户端发送的哪些环境变量将会被传递到会话环境中。[注意]只有SSH-2协议支持环境变量的传递。
细节可以参考 ssh_config(5) 中的 SendEnv 配置指令。
指令的值是空格分隔的变量名列表(其中可以使用'*'和'?'作为通配符)。也可以使用多个 AcceptEnv 达到同样的目的。
需要注意的是,有些环境变量可能会被用于绕过禁止用户使用的环境变量。由于这个原因,该指令应当小心使用。
默认是不传递任何环境变量。
AddressFamily
指定 sshd(8) 应当使用哪种地址族。取值范围是:"any"(默认)、"inet"(仅IPv4)、"inet6"(仅IPv6)。
AllowGroups
这个指令后面跟着一串用空格分隔的组名列表(其中可以使用"*"和"?"通配符)。默认允许所有组登录。
如果使用了这个指令,那么将仅允许这些组中的成员登录,而拒绝其它所有组。
这里的"组"是指"主组"(primary group),也就是/etc/passwd文件中指定的组。
这里只允许使用组的名字而不允许使用GID。相关的 allow/deny 指令按照下列顺序处理:
DenyUsers, AllowUsers, DenyGroups, AllowGroups
AllowTcpForwarding
是否允许TCP转发,默认值为"yes"。
禁止TCP转发并不能增强安全性,除非禁止了用户对shell的访问,因为用户可以安装他们自己的转发器。
AllowUsers
这个指令后面跟着一串用空格分隔的用户名列表(其中可以使用"*"和"?"通配符)。默认允许所有用户登录。
如果使用了这个指令,那么将仅允许这些用户登录,而拒绝其它所有用户。
如果指定了 USER@HOST 模式的用户,那么 USER 和 HOST 将同时被检查。
这里只允许使用用户的名字而不允许使用UID。相关的 allow/deny 指令按照下列顺序处理:
DenyUsers, AllowUsers, DenyGroups, AllowGroups
AuthorizedKeysFile
存放该用户可以用来登录的 RSA/DSA 公钥。
该指令中可以使用下列根据连接时的实际情况进行展开的符号:
%% 表示'%'、%h 表示用户的主目录、%u 表示该用户的用户名。
经过扩展之后的值必须要么是绝对路径,要么是相对于用户主目录的相对路径。
默认值是".ssh/authorized_keys"。
Banner
将这个指令指定的文件中的内容在用户进行认证前显示给远程用户。
这个特性仅能用于SSH-2,默认什么内容也不显示。"none"表示禁用这个特性。
ChallengeResponseAuthentication
是否允许质疑-应答(challenge-response)认证。默认值是"yes"。
所有 login.conf(5) 中允许的认证方式都被支持。
Ciphers
指定SSH-2允许使用的加密算法。多个算法之间使用逗号分隔。可以使用的算法如下:
"aes128-cbc", "aes192-cbc", "aes256-cbc", "aes128-ctr", "aes192-ctr", "aes256-ctr",
"3des-cbc", "arcfour128", "arcfour256", "arcfour", "blowfish-cbc", "cast128-cbc"
默认值是可以使用上述所有算法。
ClientAliveCountMax
sshd(8) 在未收到任何客户端回应前最多允许发送多少个"alive"消息。默认值是 3 。
到达这个上限后,sshd(8) 将强制断开连接、关闭会话。
需要注意的是,"alive"消息与 TCPKeepAlive 有很大差异。
"alive"消息是通过加密连接发送的,因此不会被欺骗;而 TCPKeepAlive 却是可以被欺骗的。
如果 ClientAliveInterval 被设为 15 并且将 ClientAliveCountMax 保持为默认值,
那么无应答的客户端大约会在45秒后被强制断开。这个指令仅可以用于SSH-2协议。
ClientAliveInterval
设置一个以秒记的时长,如果超过这么长时间没有收到客户端的任何数据,
sshd(8) 将通过安全通道向客户端发送一个"alive"消息,并等候应答。
默认值 0 表示不发送"alive"消息。这个选项仅对SSH-2有效。
Compression
是否对通信数据进行加密,还是延迟到认证成功之后再对通信数据加密。
可用值:"yes", "delayed"(默认), "no"。
DenyGroups
这个指令后面跟着一串用空格分隔的组名列表(其中可以使用"*"和"?"通配符)。默认允许所有组登录。
如果使用了这个指令,那么这些组中的成员将被拒绝登录。
这里的"组"是指"主组"(primary group),也就是/etc/passwd文件中指定的组。
这里只允许使用组的名字而不允许使用GID。相关的 allow/deny 指令按照下列顺序处理:
DenyUsers, AllowUsers, DenyGroups, AllowGroups
DenyUsers
这个指令后面跟着一串用空格分隔的用户名列表(其中可以使用"*"和"?"通配符)。默认允许所有用户登录。
如果使用了这个指令,那么这些用户将被拒绝登录。
如果指定了 USER@HOST 模式的用户,那么 USER 和 HOST 将同时被检查。
这里只允许使用用户的名字而不允许使用UID。相关的 allow/deny 指令按照下列顺序处理:
DenyUsers, AllowUsers, DenyGroups, AllowGroups
ForceCommand
强制执行这里指定的命令而忽略客户端提供的任何命令。这个命令将使用用户的登录shell执行(shell -c)。
这可以应用于 shell 、命令、子系统的完成,通常用于 Match 块中。
这个命令最初是在客户端通过 SSH_ORIGINAL_COMMAND 环境变量来支持的。
GatewayPorts
是否允许远程主机连接本地的转发端口。默认值是"no"。
sshd(8) 默认将远程端口转发绑定到loopback地址。这样将阻止其它远程主机连接到转发端口。
GatewayPorts 指令可以让 sshd 将远程端口转发绑定到非loopback地址,这样就可以允许远程主机连接了。
"no"表示仅允许本地连接,"yes"表示强制将远程端口转发绑定到统配地址(wildcard address),
"clientspecified"表示允许客户端选择将远程端口转发绑定到哪个地址。
GSSAPIAuthentication
是否允许使用基于 GSSAPI 的用户认证。默认值为"no"。仅用于SSH-2。
GSSAPICleanupCredentials
是否在用户退出登录后自动销毁用户凭证缓存。默认值是"yes"。仅用于SSH-2。
HostbasedAuthentication
这个指令与 RhostsRSAAuthentication 类似,但是仅可以用于SSH-2。推荐使用默认值"no"。
推荐使用默认值"no"禁止这种不安全的认证方式。
HostbasedUsesNameFromPacketOnly
在开启 HostbasedAuthentication 的情况下,
指定服务器在使用 ~/.shosts ~/.rhosts /etc/hosts.equiv 进行远程主机名匹配时,是否进行反向域名查询。
"yes"表示 sshd(8) 信任客户端提供的主机名而不进行反向查询。默认值是"no"。
HostKey
主机私钥文件的位置。如果权限不对,sshd(8) 可能会拒绝启动。
SSH-1默认是 /etc/ssh/ssh_host_key 。
SSH-2默认是 /etc/ssh/ssh_host_rsa_key 和 /etc/ssh/ssh_host_dsa_key 。
一台主机可以拥有多个不同的私钥。"rsa1"仅用于SSH-1,"dsa"和"rsa"仅用于SSH-2。
IgnoreRhosts
是否在 RhostsRSAAuthentication 或 HostbasedAuthentication 过程中忽略 .rhosts 和 .shosts 文件。
不过 /etc/hosts.equiv 和 /etc/shosts.equiv 仍将被使用。推荐设为默认值"yes"。
IgnoreUserKnownHosts
是否在 RhostsRSAAuthentication 或 HostbasedAuthentication 过程中忽略用户的 ~/.ssh/known_hosts 文件。
默认值是"no"。为了提高安全性,可以设为"yes"。
KerberosAuthentication
是否要求用户为 PasswordAuthentication 提供的密码必须通过 Kerberos KDC 认证,也就是是否使用Kerberos认证。
要使用Kerberos认证,服务器需要一个可以校验 KDC identity 的 Kerberos servtab 。默认值是"no"。
KerberosGetAFSToken
如果使用了 AFS 并且该用户有一个 Kerberos 5 TGT,那么开启该指令后,
将会在访问用户的家目录前尝试获取一个 AFS token 。默认为"no"。
KerberosOrLocalPasswd
如果 Kerberos 密码认证失败,那么该密码还将要通过其它的认证机制(比如 /etc/passwd)。
默认值为"yes"。
KerberosTicketCleanup
是否在用户退出登录后自动销毁用户的 ticket 。默认值是"yes"。
KeyRegenerationInterval
在SSH-1协议下,短命的服务器密钥将以此指令设置的时间为周期(秒),不断重新生成。
这个机制可以尽量减小密钥丢失或者黑客攻击造成的损失。
设为 0 表示永不重新生成,默认为 3600(秒)。
ListenAddress
指定 sshd(8) 监听的网络地址,默认监听所有地址。可以使用下面的格式:
ListenAddress host|IPv4_addr|IPv6_addr
ListenAddress host|IPv4_addr:port
ListenAddress [host|IPv6_addr]:port
如果未指定 port ,那么将使用 Port 指令的值。
可以使用多个 ListenAddress 指令监听多个地址。
LoginGraceTime
限制用户必须在指定的时限内认证成功,0 表示无限制。默认值是 120 秒。
LogLevel
指定 sshd(8) 的日志等级(详细程度)。可用值如下:
QUIET, FATAL, ERROR, INFO(默认), VERBOSE, DEBUG, DEBUG1, DEBUG2, DEBUG3
DEBUG 与 DEBUG1 等价;DEBUG2 和 DEBUG3 则分别指定了更详细、更罗嗦的日志输出。
比 DEBUG 更详细的日志可能会泄漏用户的敏感信息,因此反对使用。
MACs
指定允许在SSH-2中使用哪些消息摘要算法来进行数据校验。
可以使用逗号分隔的列表来指定允许使用多个算法。默认值(包含所有可以使用的算法)是:
hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160,hmac-sha1-96,hmac-md5-96
Match
引入一个条件块。块的结尾标志是另一个 Match 指令或者文件结尾。
如果 Match 行上指定的条件都满足,那么随后的指令将覆盖全局配置中的指令。
Match 的值是一个或多个"条件-模式"对。可用的"条件"是:User, Group, Host, Address 。
只有下列指令可以在 Match 块中使用:AllowTcpForwarding, Banner,
ForceCommand, GatewayPorts, GSSApiAuthentication,
KbdInteractiveAuthentication, KerberosAuthentication,
PasswordAuthentication, PermitOpen, PermitRootLogin,
RhostsRSAAuthentication, RSAAuthentication, X11DisplayOffset,
X11Forwarding, X11UseLocalHost
MaxAuthTries
指定每个连接最大允许的认证次数。默认值是 6 。
如果失败认证的次数超过这个数值的一半,连接将被强制断开,且会生成额外的失败日志消息。
MaxStartups
最大允许保持多少个未认证的连接。默认值是 10 。
到达限制后,将不再接受新连接,除非先前的连接认证成功或超出 LoginGraceTime 的限制。
PasswordAuthentication
是否允许使用基于密码的认证。默认为"yes"。
PermitEmptyPasswords
是否允许密码为空的用户远程登录。默认为"no"。
PermitOpen
指定TCP端口转发允许的目的地,可以使用空格分隔多个转发目标。默认允许所有转发请求。
合法的指令格式如下:
PermitOpen host:port
PermitOpen IPv4_addr:port
PermitOpen [IPv6_addr]:port
"any"可以用于移除所有限制并允许一切转发请求。
PermitRootLogin
是否允许 root 登录。可用值如下:
"yes"(默认) 表示允许。"no"表示禁止。
"without-password"表示禁止使用密码认证登录。
"forced-commands-only"表示只有在指定了 command 选项的情况下才允许使用公钥认证登录。
同时其它认证方法全部被禁止。这个值常用于做远程备份之类的事情。
PermitTunnel
是否允许 tun(4) 设备转发。可用值如下:
"yes", "point-to-point"(layer 3), "ethernet"(layer 2), "no"(默认)。
"yes"同时蕴含着"point-to-point"和"ethernet"。
PermitUserEnvironment
指定是否允许 sshd(8) 处理 ~/.ssh/environment 以及 ~/.ssh/authorized_keys 中的 environment= 选项。
默认值是"no"。如果设为"yes"可能会导致用户有机会使用某些机制(比如 LD_PRELOAD)绕过访问控制,造成安全漏洞。
PidFile
指定在哪个文件中存放SSH守护进程的进程号,默认为 /var/run/sshd.pid 文件。
Port
指定 sshd(8) 守护进程监听的端口号,默认为 22 。可以使用多条指令监听多个端口。
默认将在本机的所有网络接口上监听,但是可以通过 ListenAddress 指定只在某个特定的接口上监听。
PrintLastLog
指定 sshd(8) 是否在每一次交互式登录时打印最后一位用户的登录时间。默认值是"yes"。
PrintMotd
指定 sshd(8) 是否在每一次交互式登录时打印 /etc/motd 文件的内容。默认值是"yes"。
Protocol
指定 sshd(8) 支持的SSH协议的版本号。
'1'和'2'表示仅仅支持SSH-1和SSH-2协议。"2,1"表示同时支持SSH-1和SSH-2协议。
PubkeyAuthentication
是否允许公钥认证。仅可以用于SSH-2。默认值为"yes"。
RhostsRSAAuthentication
是否使用强可信主机认证(通过检查远程主机名和关联的用户名进行认证)。仅用于SSH-1。
这是通过在RSA认证成功后再检查 ~/.rhosts 或 /etc/hosts.equiv 进行认证的。
出于安全考虑,建议使用默认值"no"。
RSAAuthentication
是否允许使用纯 RSA 公钥认证。仅用于SSH-1。默认值是"yes"。
ServerKeyBits
指定临时服务器密钥的长度。仅用于SSH-1。默认值是 768(位)。最小值是 512 。
StrictModes
指定是否要求 sshd(8) 在接受连接请求前对用户主目录和相关的配置文件进行宿主和权限检查。
强烈建议使用默认值"yes"来预防可能出现的低级错误。
Subsystem
配置一个外部子系统(例如,一个文件传输守护进程)。仅用于SSH-2协议。
值是一个子系统的名字和对应的命令行(含选项和参数)。比如"sft /bin/sftp-server"。
SyslogFacility
指定 sshd(8) 将日志消息通过哪个日志子系统(facility)发送。有效值是:
DAEMON, USER, AUTH(默认), LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7
TCPKeepAlive
指定系统是否向客户端发送 TCP keepalive 消息。默认值是"yes"。
这种消息可以检测到死连接、连接不当关闭、客户端崩溃等异常。
可以设为"no"关闭这个特性。
UseDNS
指定 sshd(8) 是否应该对远程主机名进行反向解析,以检查此主机名是否与其IP地址真实对应。默认值为"yes"。
UseLogin
是否在交互式会话的登录过程中使用 login(1) 。默认值是"no"。
如果开启此指令,那么 X11Forwarding 将会被禁止,因为 login(1) 不知道如何处理 xauth(1) cookies 。
需要注意的是,login(1) 是禁止用于远程执行命令的。
如果指定了 UsePrivilegeSeparation ,那么它将在认证完成后被禁用。
UsePrivilegeSeparation
是否让 sshd(8) 通过创建非特权子进程处理接入请求的方法来进行权限分离。默认值是"yes"。
认证成功后,将以该认证用户的身份创建另一个子进程。
这样做的目的是为了防止通过有缺陷的子进程提升权限,从而使系统更加安全。
X11DisplayOffset
指定 sshd(8) X11 转发的第一个可用的显示区(display)数字。默认值是 10 。
这个可以用于防止 sshd 占用了真实的 X11 服务器显示区,从而发生混淆。
X11Forwarding
是否允许进行 X11 转发。默认值是"no",设为"yes"表示允许。
如果允许X11转发并且sshd(8)代理的显示区被配置为在含有通配符的地址(X11UseLocalhost)上监听。
那么将可能有额外的信息被泄漏。由于使用X11转发的可能带来的风险,此指令默认值为"no"。
需要注意的是,禁止X11转发并不能禁止用户转发X11通信,因为用户可以安装他们自己的转发器。
如果启用了 UseLogin ,那么X11转发将被自动禁止。
X11UseLocalhost
sshd(8) 是否应当将X11转发服务器绑定到本地loopback地址。默认值是"yes"。
sshd 默认将转发服务器绑定到本地loopback地址并将 DISPLAY 环境变量的主机名部分设为"localhost"。
这可以防止远程主机连接到 proxy display 。不过某些老旧的X11客户端不能在此配置下正常工作。
为了兼容这些老旧的X11客户端,你可以设为"no"。
XAuthLocation
指定 xauth(1) 程序的绝对路径。默认值是 /usr/X11R6/bin/xauth
时间格式
在 sshd(8) 命令行参数和配置文件中使用的时间值可以通过下面的格式指定:time[qualifier] 。
其中的 time 是一个正整数,而 qualifier 可以是下列单位之一:
<无> 秒
s | S 秒
m | M 分钟
h | H 小时
d | D 天
w | W 星期

Linux ssh命令

ssh [-p port] user@remote
 
#user 是在远程机器上的用户名,如果不指定的话默认为当前用户
#remote 是远程机器的地址,可以是IP/域名,或者是别名
#port 是SSH Server监听的端口,如果不指定,就为默认值22
#(使用exit退出当前用户的登录)
#有关SSH配置信息都保存在用户家目录下的.ssh目录下
ssh -p 22 root@192.168.31.207

Linux通过ssh传输文件(scp)

scp是secure copy的简写,scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。

用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。

ssh服务连接超时設置

vim /etc/ssh/sshd_config
#客户端每隔多少秒向服务发送一个心跳数据
ClientAliveInterval 120
#客户端多少秒没有相应,服务器自动断掉连接
ClientAliveCountMax 0
service sshd restart

SSH协议和Telnet协议区别

虽然这两种协议服务都可以远程登录另一台机器,但SSH更安全

(我们在尝试远程登录到另一台机器时,具体选中协议,则需要远程系统有提供你正在访问的服务,或者要在一个相同的端口上提供服务,否则会远程连接不上)

telnet是明文传送, ssh是加密的且支持压缩

此外ssh服务一般都提供sftp支持,支持文件传送。

telnet一般只能通过zmodem等协议传送文件。ssh还可以借助ssh连接建立tcp通道,映射远端或本地的端口,以及转发X到本地X Server等。

使用Telnet这个用来访问远程计算机的TCP/IP协议以控制你的网络设备相当于在离开某个建筑时大喊你的用户名和口令。

很快会有人进行监听,并且他们会利用你安全意识的缺乏。

传统的网络服务程序如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。

而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易受到“中间人”(man-in-the-middle)这种方式的攻击。

所谓“中间人”的攻击方式,就是“中间人”冒充真正的服务器接收你的传给服务器的数据,然后再冒充你把数据传给真正的服务器。

服务器和你之间的数据传送被“中间人”一转手做了手脚之后,就会出现很严重的问题。

SSH是替代Telnet和其他远程控制台管理应用程序的行业标准。SSH命令是加密的并以几种方式进行保密。

在使用SSH的时候,一个数字证书将认证客户端(你的工作站)和服务器(你的网络设备)之间的连接,并加密受保护的口令。

SSH1使用RSA加密密钥,SSH2使用数字签名算法(DSA)密钥保护连接和认证。

加密算法包括Blowfish,数据加密标准(DES),以及三重DES(3DES)。

SSH保护并且有助于防止欺骗,“中间人”攻击,以及数据包监听。

通过使用SSH把所有传输的数据进行加密,这样“中间人”这种攻击方式就不可能实现了,而且也能够防止DNS和IP欺骗。

还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。

SSH有很多功能,它既可以代替telnet,又可以为ftp、pop、甚至ppp提供一个安全的“通道”。

如果从一台linux服务器通过ssh远程登录到另一台机器,

这种情况通常会在多台服务器的时候用到。

因为常常会为服务器架设一个防火墙,在外网不能直接访问某一台服务器,

要能访问,则需要先连接到防火墙外面的一台机器,然后再通过它连接上防火墙内的服务器。

如用root帐号连接一个IP为192.168.1.102的机器,输入:

ssh 192.168.1.102 -l root

回车后输入root帐号的密码再回车确认即可。

如果该服务器的ssh端口不是默认的22端口,是自定义的一个如1234,则可在命令后面加参数-p,

ssh 192.168.1.102 -l root -p 1234


C++ 编写ssh 服务器和 客户端的思路

ssh服务器

使用libssh库:这是一个SSH客户端和服务器的开源库,可用于Linux和其他平台。您可以使用该库来编写SSH服务器。

初始化SSH服务器:使用libssh库中的ssh_init函数初始化SSH服务器,使用ssh_bind_listen函数绑定服务器IP地址和端口号。

进行身份验证:当客户端连接到SSH服务器时,需要进行身份验证。在进行身份验证前,需要使用ssh_options_set函数设置SSH服务器选项,例如允许密码身份验证或公钥身份验证。使用ssh_accept函数接受客户端连接并进行身份验证。

执行命令:在进行身份验证后,客户端可以使用SSH连接执行命令。使用ssh_channel_new函数创建一个新的SSH通道,使用ssh_channel_request_exec函数执行命令,并使用ssh_channel_read函数读取命令输出。

关闭SSH连接:完成任务后,使用ssh_disconnect函数关闭SSH连接。

这些是编写Linux下SSH服务器的基本步骤。

可以在这些步骤的基础上进行代码编写。同时,编写SSH服务器需要考虑到安全性,例如防止未授权访问和拒绝服务攻击等。

ssh客户端

使用libssh库:这是一个SSH客户端和服务器的开源库,可用于Linux和其他平台。您可以使用该库来编写SSH客户端。

建立SSH连接:使用libssh库中的ssh_new函数创建一个SSH会话,并使用ssh_options_set函数设置SSH连接选项。然后使用ssh_connect函数建立SSH连接。

进行身份验证:在建立SSH连接后,需要进行身份验证。使用ssh_userauth_password函数进行密码身份验证,或使用ssh_userauth_publickey_auto函数进行公钥身份验证。

执行命令:使用ssh_channel_new函数创建一个新的SSH通道,使用ssh_channel_request_exec函数执行命令,并使用ssh_channel_read函数读取命令输出。

关闭SSH连接:完成任务后,使用ssh_disconnect函数关闭SSH连接。

编写登录ssh服务器以及传输文件的Shell脚本

#!/bin/bash
# 检查参数个数
if [ $# -lt 3 ]; then
  echo "Usage: $0 <server_address> <username> <password> [-ssh_command]"
  exit 1
fi
# 定义SSH登录信息
host="$1"
user="$2"
password="$3"
shift 3
# 解析命令行参数
verbose=false
filename=""
while [ $# -gt 0 ]
do
    case "$1" in
        -f) filename="$2"; shift;;
        -v) verbose=true;;
        --help) echo "Usage: $0 <server_address> <username> <password> [-ssh_command] [-f filename] [-v]"; exit 0;;
        *) ssh_command="$@"; break;;
    esac
    shift
done
# 自动登录SSH服务器
if [ -z "$filename" ]; then
    sshpass -p "$password" ssh "$user"@"$host" "$ssh_command"
else
    if $verbose; then
        sshpass -p "$password" scp -v "$filename" "$user"@"$host":~
    else
        sshpass -p "$password" scp "$filename" "$user"@"$host":~
    fi
fi

在上面的脚本中,我们使用了getopts命令来解析命令行参数。可以使用以下命令运行脚本并执行SSH命令:

./ssh_script.sh 192.168.31.1 username password -ls

在上面的命令中,我们指定了服务器地址、用户名和密码,并使用-ls作为SSH命令,以列出SSH服务器上的文件和目录。您可以根据需要修改SSH命令。如果您需要传输文件,可以使用-f选项指定文件名,例如:

./ssh_script.sh 192.168.31.1 username password -f file.txt

如果您需要打开详细过程,可以使用-v选项,例如:

./ssh_script.sh 192.168.31.1 username password -f file.txt -v

如果您需要查看命令帮助指示,可以使用–help选项,例如:

./ssh_script.sh --help


目录
相关文章
|
5月前
|
移动开发 监控 安全
通过SSH协议实现的屏幕局域网电脑监控:屏幕安全访问代码
随着科技的不断发展,网络安全问题愈发突出。为了确保屏幕数据的安全,我们需要一种高效可靠的监控方法。本文介绍了一种基于SSH协议的屏幕局域网电脑监控方案,同时提供了相关代码示例,确保屏幕数据的安全传输和访问。
245 0
|
9月前
|
算法 安全 网络协议
ssh工作流程及其原理——ssh免密登录
ssh工作流程及其原理——ssh免密登录
193 0
|
安全 网络安全 C++
基于Windows下VSCode安装及安装相关插件通过SSH协议远程连接服务器详细方法(一)
基于Windows下VSCode安装及安装相关插件通过SSH协议远程连接服务器详细方法
349 0
基于Windows下VSCode安装及安装相关插件通过SSH协议远程连接服务器详细方法(一)
|
2月前
|
存储 弹性计算 算法
SSH学习(三)- SSH协议中的Public Key Algorithm
在SSH协议中,有两个地方涉及到公钥算法,分别是: 1. 服务端认证:服务端在进行密钥协商的时候证明自己身份,防止中间人攻击,此时为SSH-TRANS协议发生的事情; 2. 客户端认证:客户端通过PublicKey方式证明自己身份,完成SSH登录认证,此时SSH-USERAUTH发生的事情; 这两种情况下的公钥算法使用的是同一个概念,接下来本文将主要基于PublicKey公钥认证方式,学习对应的内容。
49 1
SSH学习(三)- SSH协议中的Public Key Algorithm
|
4月前
|
安全 Shell 网络安全
远程登录安全连接协议SSH(Secure Shell)
SSH(Secure Shell)协议是一种用于在不安全网络上提供安全远程登录、命令执行和数据传输的加密网络协议,通过公钥加密和身份验证技术确保通信的安全性和隐私性。
97 0
|
27天前
|
存储 网络安全 开发工具
Git的GUI图形化工具&ssh协议&IDEA集成Git
Git的GUI图形化工具&ssh协议&IDEA集成Git
113 0
|
5月前
|
Shell 网络安全 开发工具
git02->gui图形化界面使用,ssh协议,idea集成GIT
git02->gui图形化界面使用,ssh协议,idea集成GIT
52 0
git02->gui图形化界面使用,ssh协议,idea集成GIT
|
5月前
|
安全 网络安全 开发工具
更安全的ssh协议与Gui图形化界面使用
更安全的ssh协议与Gui图形化界面使用
|
5月前
|
安全 网络安全 开发工具
【Git】gui图形化界面的使用、ssh协议以及idea集成Git
【Git】gui图形化界面的使用、ssh协议以及idea集成Git
64 0
|
6月前
|
网络安全 开发工具 数据安全/隐私保护
【Git】Git使用Gui图形化界面,Git中SSH协议,Idea集成Git(下)
【Git】Git使用Gui图形化界面,Git中SSH协议,Idea集成Git
46 0