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. 细说 JavaScript 七种数据类型

    在 JavaScript 规范中,共定义了七种数据类型,分为 “基本类型” 和 “引用类型” 两大类,如下所示: 基本类型:String.Number.Boolean.Symbol.Undefined ...

  2. 百度APP移动端网络深度优化实践分享(二):网络连接优化篇

    本文由百度技术团队“蔡锐”原创发表于“百度App技术”公众号,原题为<百度App网络深度优化系列<二>连接优化>,感谢原作者的无私分享. 一.前言 在<百度APP移动端网 ...

  3. JAVA之enum类详解

    目录    一.简介    二.默认枚举类    三.多值枚举类    四.属性和方法    五.构造函数    六.重要方法    七.引用参考 一.简介    1.枚举类代表一组常量:    2. ...

  4. AI - TensorFlow - 第一个神经网络(First Neural Network)

    Hello world # coding=utf-8 import tensorflow as tf import os os.environ[' try: tf.contrib.eager.enab ...

  5. 【TensorFlow篇】--Tensorflow框架实现SoftMax模型识别手写数字集

    一.前述 本文讲述用Tensorflow框架实现SoftMax模型识别手写数字集,来实现多分类. 同时对模型的保存和恢复做下示例. 二.具体原理 代码一:实现代码 #!/usr/bin/python ...

  6. qml demo分析(maskedmousearea-异形窗口)

    一.效果展示 如本文的标题所示,这篇文章分析的demo是一个异形窗口,主要展示鼠标在和异形区域交互的使用,效果如图1所示,当鼠标移动到白云或者月亮上时,相应的物体会高亮,当鼠标按下时,物体会有一个放大 ...

  7. DotNetCore深入了解之三HttpClientFactory类

    当需要向某特定URL地址发送HTTP请求并得到相应响应时,通常会用到HttpClient类.该类包含了众多有用的方法,可以满足绝大多数的需求.但是如果对其使用不当时,可能会出现意想不到的事情. usi ...

  8. springboot~环境搭建与Helloworld

    转了,非转了 只是项目需要,从.net到java,以后可以学习java的思想把它应用到.net上来,让咱们的.net越来越强大,springbool是一个强大的框架,几乎有了你想要的所有功能模块,大叔 ...

  9. SLAM+语音机器人DIY系列:(二)ROS入门——2.ROS系统整体架构

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  10. JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构、调试、部署

    接上篇<JAVA WEB快速入门之环境搭建>,在完成了环境搭建后(JDK.Tomcat.IDE),现在是万事具备,就差写代码了,今天就来从编写一个JSP WEB网站了解JSP WEB网站的 ...