SSH: Secure Shell Protocol  (安全外壳协议)

Secure Shell,又可记为安全外壳协议(SSH)

Secure Shell,又可记为安全外壳协议(SSH),最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台,是一种在不安全网络上提供安全远程登录及其它安全网络服务的协议,SSH协议可以用来进行远程控制,或在计算机之间传送文件。而实现此功能的传统方式,如telnet(终端仿真协议)、 rcp ftp、rlogin、rsh都是极为不安全的,并且会使用明文传送密码。

SSH是一个好的应用程序,在正确使用时,它可以弥补网络中的漏洞。除此以外, SSH之所以流行,还有以下更关键原因:

1.SSH客户端适用于多种平台。

2.对非商业用途它是免费的。

3.通过SSH可以把传输的数据进行加密,防止“中间人(man-in-the-middle)”攻击,还能防止DNS和IP欺骗,同时SSH能够对数据进行压缩,可以加快传输的数据速度,甚至可以为ppp提供一个安全的“通道”。

4.UNIX版本提供了源代码,这意味着任何人都可以对它进行修改或b u g修补来提高其性能,甚至还可以增加功能,而我们现在linux中常用openssh的就是ssh的免费开源版本。(以下内容提到的SSH工具是OpenSSH)

注:最初SSH是由芬兰的一家公司开发的。由于受版权和加密算法的限制,所以现在很多人使用OpenSSH。SSH由客户端和服务端的软件组成的,有两个不兼容的版本分别是:1.x和2.x。 用SSH 2.x的客户程序是不能连接到SSH 1.x的服务程序上去的。OpenSSH 2.x同时支持SSH 1.x和2.x。

OpenSSH服务,sshd,是一个典型的独立守护进程(standalone daemon),但也可以根据需要通过网络守护进程(Internet Daemon)-inetd或Ineternet Daemon's more modern-xinted加载。OpenSSH服务可以通过/etc/ssh/sshd_config文件进行配置。OpenSSH提供了服务端后台程序和客户端,用来加密远程控制和文件传输过程中的数据,并由此来代替原来的类似服务,各自功能如下:

服务端:它是一个守护进程(demon),他在后台运行并响应来自客户端的连接请求。服务端一般是sshd进程,提供了对远程连接的处理,一般包括公共密钥认证、密钥交换、对称密钥加密和非安全连接。

客户端:包含ssh程序以及像scp(远程拷贝)、slogin(远程登陆)、sftp(安全文件传输)等其他的应用程序。

OpenSSH程序主要包括了几个部分:

ssh:rlogin与Telnet的替代方案。

scp、sftp:rcp的替代方案,将文件复制到其他电脑上。

sshd:SSH服务器。

ssh-keygen:产生RSA或DSA密钥,用来认证用。

ssh-agent、ssh-add:帮助用户不需要每次都要输入密钥密码的工具。

ssh-keyscan:扫描一群机器,并记录其公钥。

SSH的工作原理:

传输层协议 [SSH-TRANS] 提供了服务器认证,保密性及完整性。此外它有时还提供压缩功能。 SSH-TRANS 通常运行在 TCP/IP连接上,也可能用于其它可靠数据流上。 SSH-TRANS 提供了强力的加密技术、密码主机认证及完整性保护。该协议中的认证基于主机,并且该协议不执行用户认证。更高层的用户认证协议可以设计为在此协议之上。

用户认证协议 [SSH-USERAUTH] 用于向服务器提供客户端用户鉴别功能。它运行在传输层协议 SSH-TRANS 上面。当 SSH-USERAUTH 开始后,它从低层协议那里接收会话标识符(从第一次密钥交换中的交换哈希 H )。会话标识符唯一标识此会话并且适用于标记以证明私钥的所有权。 SSH-USERAUTH 也需要知道低层协议是否提供保密性保护。

连接协议 [SSH-CONNECT] 将多个加密隧道分成逻辑通道。它运行在用户认证协议上。它提供了交互式登录话路、远程命令执行、转发 TCP/IP 连接和转发 X11 连接。

目前SSH常用两种级别的安全验证:

第一种:通过口令的安全验证,只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密, 但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,例如受到“中间人”的攻击。

第二种:通过密钥的安全验证,一旦建立一个安全传输层连接,客户机就发送一个服务请求。当用户认证完成之后,会发送第二个服务请求。这样就允许新定义的协议可以与上述协议共存。连接协议提供了用途广泛的各种通道,有标准的方法用于建立安全交互式会话外壳和转发(“隧道技术”)专有 TCP/IP 端口和 X11 连接。简单说就是首先创建一个密钥,然后将其中的公钥放在需要访问的服务器中,如果想连接远程SSH服务器,客户端就会向服务器发出请求,用你的密钥进行安全验证,服务器收到请求之后,会对从客户端发送过来的公钥进行匹配,公钥匹配一致后,服务器会用公钥加密“质询”(challenge)并把它发送给客户端。 客户端收到“质询”之后就可以用你的私钥解密然后把它发送给服务器。

注:第二种级别不仅加密所有传送的数据,同时“中间人”无法攻击到你(因为他没有你的私人密匙),同样整个登录的过程就需要更长时间。而且S S H也支持一些其他的身份认证方法,如Kerberos和安全ID卡等。

注:启动SSH服务器后,sshd运行起来并在默认的22端口进行监听,SSH就将一直等待连接请求。当请求到来的时候SSH守护进程会产生一个子进程,该子进程进行这次的连接处理。(SSH可以通过inetd上的tcpd来运行)

服务器配置文件详解 :vim /etc/ssh/sshd_conf

#Port 22
#port用来设置sshd监听的端口,为了安全起见,建议更改默认的22端口为5位以上陌生端口

#AddressFamily any
#指定运行时使用的协议簇:
#inet:使用 IPV4 协议簇,为默认值。
#inet6:使用 IPV6 协议簇。
#any:同时启用 IPV4 和 IPV6 协议簇。

#ListenAddress用来设置sshd服务器绑定的IP地址,不设置的话,默认预设所有接口均接受SSH
#ListenAddress 0.0.0.0
#ListenAddress ::

#sshd版本2
#Protocol 2

#设置包含计算机私人密匙的文件
HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

#日志
# Logging
#SyslogFacilityAUTH
SyslogFacilityAUTHPRIV   #日志Facility为AUTHPRIV
#LogLevel INFO           #日志级别

# Authentication:
#LoginGraceTime 2m    #表示认证的时限(以秒为单位)
#PermitRootLogin yes  #root能不能用ssh登录
#StrictModes yes    #ssh在接收登录请求之前是否检查用户家目录和rhosts文件的权限和所有权
#MaxAuthTries 6         #只允许输错几回密码
#MaxSessions 10         #最大支持几个ssh会话

#密钥认证
PubkeyAuthentication yes     #支持密钥的方式连接
AuthorizedKeysFile       .ssh/authorized_keys      #密钥文件存放路径

#主机验证
#AuthorizedPrincipalsFile none
#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHostsyes
# Don't read theuser's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

#口令验证
# To disabletunneled clear text passwords, change to no here!
#PasswordAuthentication no  #是否开启身份验证
#PermitEmptyPasswords no   #是否允许用口令为空的帐号登录
PasswordAuthentication no    #是否使用口令验证

#是否开启挑战响应身份验证
# Change to no todisable s/key passwords
#ChallengeResponseAuthenticationyes
ChallengeResponseAuthenticationno

#Kerberos身份验证
# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
#KerberosUseKuserok yes
 
#GSSAPI是公共安全事务应用程序接口(GSS-API)
#公共安全事务应用程序接口以一种统一的模式为使用者提供安全事务,由于它支持最基本的机制和技术,所以保证不同的应用环境下的可移植性.该规范定义了GSS-API事务和基本元素,并独立于基本的机制和程序设计语言环境,并借助于其它相关的文档规范实现.
# GSSAPI options
GSSAPIAuthentication yes #是否允许使用基于GSSAPI 的用户认证.仅用于SSH-2
GSSAPICleanupCredentials no  #是否在用户退出登录后自动销毁用户凭证缓存。
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no
#GSSAPIEnablek5users no
 
#SSH服务端的的PAM认证

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
# WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several
# problems.
UsePAM yes   #是否加载/etc/pam.d/sshd

#转发
#AllowAgentForwarding yes
#如果采用本地转发方式,AllowTcpForwarding选项是no,则不允许转发.
#如果采用远程转发方式,AllowTcpForwarding选项是no,则不允许转发.
#AllowTcpForwarding yes
#远程主机连接本地转发端口
#GatewayPorts no  #是否允许远程主机连接本地的转发端口
#X11转发允许在 SSH 客户端上显示应用程序的图形部分,而程序逻辑依然在远程服务器上执行.
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
 
#允许或禁止登陆用户、组
#PermitTTY yes
#PrintMotd yes              #登录后显示/etc/motd中的信息
#PrintLastLog yes  #成功登录后显示最后一位用户的登录信息
TCPKeepAlive yes #是否持续发送tcp包,维持连接
#UseLogin no #是否使用ssh服务端的login程序进行登录验证
#UsePrivilegeSeparation sandbox #SSH服务端通过创建非特权子进程处理接入请求的方法来进行权限分离
#PermitUserEnvironment no
#Compressiondelayed   #压缩选项yes
#连接超时断开连接
#ClientAliveInterval 0    #设置一个以秒记的时长,如果超过这么长时间没有收到客户端的任何数据,sshd 将通过安全通道向客户端发送一个"alive"消息,并等候应答.
#ClientAliveCountMax3      #sshd在未收到任何客户端回应前最多允许发送多少个"alive"消息,到达这个上限后,sshd 将强制断开连接,关闭会话
#ShowPatchLevel no     #在连接ssh端口时,是否返回SSH的补丁版本信息
#UseDNS yes    #是否对远程主机名进行反向解析,以检查此主机名是否与其IP地址真实对应.
#PidFile/var/run/sshd.pid      #pid文件存放位置
#这个选项一定要配合LoginGraceTime选项一起使用.
#MaxStartups10:30:100 #允许有多少次验证连接请求
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none
 
# no defaultbanner path

#Banner none  #登录之前显示在用户屏幕上,后面跟着文件位置

#指定客户端发送的哪些环境变量将会被传递到会话环境中
# Accept locale-related environment variables
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS

#配置一个外部的子系统,仅用于SSH-V2协议,一般这里使用sftp
# override defaultof no subsystems
Subsystem      sftp  /usr/libexec/openssh/sftp-server

# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server

关于SSH的那些事的更多相关文章

  1. ssh 框架整合事,使用注解,action提示找不到

    There is no Action mapped for namespace [/] and action name [/select] associated with context path [ ...

  2. Linux禁用root账户ssh登录

    前言 今天登录服务器的时候,控制台输出如下信息 There were 48990 failed login attempts since the last successful login. Last ...

  3. CentOS7安全设置 yum-cron系统自动更新,firewalld防火墙简单使用

    PermitRootLogin nosystemctl restart sshd.service; yum -y install firewalld; systemctl start firewall ...

  4. java.langThrowable:STACKTRACE

    Jboss版本是4.2.0.GA代码运行完后总报错 但是程序的运行结果没问题 请问下这是什么原因2009-12-11 01:53:26,611 INFO  [org.jboss.resource.co ...

  5. 阿里云ECS每天一件事D1:配置SSH

    近期因为项目需求,采购了两台阿里云ECS,选择的系统为CentOS 6.3 X64 安全加固版,额外买了160G的硬盘,应该够应付此项目的需求了. ECS默认已经配置好了sshd服务,可以使用root ...

  6. 让一个端口同时做两件事:http/https和ssh

    相信很多人都在YY:能不能让80端口分析连接协议,如果是http协议就让服务器交给http服务程序(如Apache.Nginx等)处理,如果是ssh协议就交给ssh服务程序(如OpenSSH Serv ...

  7. SSH Config 那些你所知道和不知道的事 (转)

    原文地址:https://deepzz.com/post/how-to-setup-ssh-config.html SSH(Secure Shell)是什么?是一项创建在应用层和传输层基础上的安全协议 ...

  8. 局域网内主机ssh访问服务器宿主下VMWare 虚拟机(Ubuntu 12.04.1)并且实现虚拟机能上网的那点事

    (1)首先虚拟机已安装ssh服务 1) 自动安装 ssh 服务 apt-get install openssh-server 安装完成后,将自动开启 ssh 服务. 2) 查看 ssh 服务是否已开启 ...

  9. 糗事之 -- 用ssh公钥实现免密码登录

    前言:工作原因,每天都会登录好多次服务器,每次都是ssh root@192.168..... 然后输入密码,来来回回输几次真是很烦啊. 问题:怎么可以在每次ssh连接服务器时不用输入密码,直接登录? ...

随机推荐

  1. Swagger使用指南

    1:认识Swagger Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法 ...

  2. Scrapy-redis<数据库篇>

    scrapy-redis爬虫数据库连接部分——windows准备做salve,Linux准备做master开展工作 首先处理简单的windows熟悉的环境——安装Redis服务和Redis可视化~可视 ...

  3. 日吞吐万亿,腾讯云时序数据库CTSDB解密

    一.背景 随着移动互联网.物联网.大数据等行业的高速发展,数据在持续的以指数级的速度增长,比如我们使用手机访问互网络时的行为数据,各种可穿戴设备上报的状态数据,工厂中设备传感器采集的指标数据,传统互联 ...

  4. FragmentTabHostTopDemo【FragmentTabHost固定宽度且居中】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 使用FragmentTabHost实现顶部选项卡(居中且宽度非全屏)展现. 备注:该Demo主要是演示FragmentTabHost ...

  5. 《HelloGitHub》第 28 期

    <HelloGitHub>第 28 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程. ...

  6. ES6躬行记(21)——类的继承

    ES6的继承依然是基于原型的继承,但语法更为简洁清晰.通过一个extends关键字,就能描述两个类之间的继承关系(如下代码所示),在此关键字之前的Man是子类(即派生类),而在其之后的People是父 ...

  7. 基于Azkaban的任务定时调度实践

    本文由云+社区发表 作者:maxluo 一.Azkaban介绍 Azkaban是LinkedIn开源的任务调度框架,类似于JavaEE中的JBPM和Activiti工作流框架. Azkaban功能和特 ...

  8. js对象数组(JSON) 根据某个共同字段 分组

    首先判断 var arr = [ {"id":"1001","name":"值1","value": ...

  9. [TCP/IP] 计算机网络性能指标

    速率:连接在计算机网络上的主机在数字信道上传输数据位数的速率单位是 b/s kb/s mb/s gb/s带宽:数字信道所能传输的最高数据率 查看我的网卡是144Mbps吞吐量:单位时间内通过某个网络的 ...

  10. IGP和BGP路由协议配合降低非核心路由器的路由容量的实验与总结

    IGP和BGP路由协议配合降低非核心路由器的路由容量的实验与总结 一.结论 通过eBGP协议,可以显著降低对非核心路由器的路由容量要求,因为核心路由器的数量明显少于非核心路由器,所以,通过此措施既可以 ...