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