SSH服务

 

1.1.1 ssh介绍

  SSHSecure ShellProtocol的简写,由IETF网络工作小组(Network Working Group)制定;在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后在进行数据传输。确保了传递的数据安全。

  SSH是专为远程登录会话和其他网络服务提供的安全性协议。利用SSH协议可以有效的防止远程管理过程中的信息泄露问题,在当前的生产环境中,绝大多数企业普遍采用SSH协议服务来代替传统的不安全的远程联机服务软件,如telnet(23端口,非加密的)等。

  在默认状态下,SSH服务主要提供两个服务功能:一个是提供类似telnet远程联机服务器的服务,即上面提到的SSH服务;另一个是类似FTP服务的sftp-server,借助SSH协议来传输数据的,提供更安全的SFTP服务。

  特别提醒:SSH客户端(ssh命令)还包含一个很有用的远程安全拷贝命令scp,也是通过ssh协议工作的。

总结:

1、  ssh安全的加密协议,用于远程连接服务器。

2、  默认端口是22,安全协议版本ssh2

3、  服务端主要包含两服务功能shh远程连接,SFTP服务。

4、  Ssh客户端包含ssh连接命令,以及远程拷贝scp命令等。

1.1.2 ssh结构

  SSH服务由服务端软件OpenSSH和客户端(SecureCRTxshell)组成,SSH服务默认使用22端口提供服务,它有两个不兼容的SSH协议版本,分别是1.x2.x

  下面查看服务端上的ssh相关软件

小提示:sudo su – 切换到root模式

[root@cl1 ~]# rpm -qa opensshopenssh-5.3p1-94.el6.x86_64[root@cl1 ~]# rpm -qa openssh opensslopenssl-1.0.1e-15.el6.x86_64openssh-5.3p1-94.el6.x86_64[root@cl1 ~]# rpm -qa|grep opensshopenssh-5.3p1-94.el6.x86_64openssh-server-5.3p1-94.el6.x86_64[root@cl1 ~]# ps -ef|grep sshdroot        986      1 0 18:28 ?        00:00:00/usr/sbin/sshdroot       1100    986 0 18:29 ?        00:00:00 sshd:root@pts/0root       1122   1104 0 18:30 pts/0    00:00:00 grepsshd

 OpenSSH同时支持SSH1.x2.x。用SSH2.x的客户端程序不能连接到SSH1.x的服务程序上。

  SSH服务端是一个守护进程(demon),他在后台运行并响应来自客户端的连接请求。SSH服务端的进程名为sshd,负责实时监听远程SSH客户端的连接请求,并进行处理,一般包括公共密钥认证、密钥交换、对称密钥加密和非安全连接等。这个SSH服务必须开机自启动

  ssh客户端包含ssh程序以及像scp(远程拷贝)slogin(远程登录)sftp(安全FTP文件传输)等应用程序。

  ssh的工作机制大致是本地的ssh客户端先发送一个连接请求到远程的ssh服务端,服务端检查连接的客户端发送的数据包和IP地址,如果确认合法,就会发送密钥给SSH的客户端,此时,客户端本地再将密钥发回给服务端,自此连接建立。SSH 1.xSSH 2.x在连接协议上有一些安全方面的差异。

小提示:取IP地址

[root@cl2~]# ifconfig eth0|sed -rn 's#^.*dr:(.*) Bc.*$#\1#gp'

192.168.2.31

1.1.3 加密

  当前,网络上的数据包加密技术一般是通过所谓的一对公钥与私钥(Public key and Private key)组合成的密钥对进行加密与解密操作。

服务端Public key公钥 

客户端Private key私钥 钥匙

 

查看sshd_config配件文件

[root@cl1 ~]# less /etc/ssh/sshd_config  有d就是服务端,没有d是客户端# Disable legacy (protocol version 1) support in the server for new# installations. In future the default will change to requireexplicit# activation of protocol 1Protocol 2

  另外,SSH2同时支持RSADSA密钥,但是SSH1仅支持RSA密钥。

1、SSH 1.x

  每一台SSH服务器主机都可以使用RSA加密方式来产生一个1024-bit的RSAkey,这个RSA的加密方式就是用来产生公钥与私钥的算法之一。SSH 1.x的整个联机加密步骤如下:

  当SSH服务启动时,就会产生一个768-bit的临时公钥(sshd_config配置文件中ServerKeyBits 1024)存放在Server中。

[root@cl1 ~]# grep ServerKey /etc/ssh/sshd_config     #C6以后是1024,C5是768#ServerKeyBits 1024

  当Client端SSH联机请求传送过来时,Server就会将这个1024-bit的公钥传给Client端,此时Client会将此公钥与先前存储的公钥进行对比,看是否一致。判断标准是Client端联机用户目录下~/.ssh/known_hosts文件的内容(linux客户端)。

  在Client端接收到这个768-bit的Serverkey后,Client本地也会随机产生一个256-bit的私钥(Privatekey或hostkey),并且以加密的方式(具体的加密算法由客户端在服务器提供的所有可用算法中选择,默认为3DES算法)将Serverkey与hostkey整合成一对完整的keypair,交将这对KeyPair再传给Server。

  当客户端发完成以后,Server与Client端在这次的联机中,就以这一对1024-bit的Keypair来进行数据的传输。

  也就是说,Public key是放在Server上的,而Client端的软件需要接受Public key、计算出Private key,并把二者组合成一把独一无二的Key pair,因为Client每次的256-bit的host key是随机产生的,所以这次联机与下次联机的host key可能就会不一样。此外,在Client端的用户默认目录下的~/.ssh/know_hosts会记录曾经联机过的主机的Public key,用以确认每次来自该主机的联机是否正确。

2、SSH 2.x

  在SSH 1.x的联机过程中,当Server接受Client端的Privatekey后,就不再针对该次联机的Key pair进行检验。此时若有恶意***户针对该联机的Key pair对插入恶意的程序代码时,由于服务端你不会再检验联想的正确性,因为可能会接收该程序代码,从而造成系统被黑掉的问题。

  为了改正这个缺点,SSH version 2多加了一个确认联机正确性的Diff-Hellman机制,在每次数据传输中,server都会以该机制检查数据的来源是否正确,这样,可以避免联机过程中被插入恶意程序代码的问题。也就是说,SSH verion 2是比较安全的。

1.1.4 ssh服务谁类型

  SSH客户端来看,SSH服务主要提供两种级别的安全验证,具体级别如下:

  基于口令的安全验证:

  基于口令的安全验证方式就是大家现在一直在用的,只要知道服务器的SSH连接帐号和口令(服务器的IP及开放的SSH端口,默认为22),就可以通过ssh客户端登录到这台远程主机。此时,联机过程中所有传输的数据都是加密的。

小提示:查看ssh使用的端口

[root@cl1 ~]# netstat -lntup|grep ssh                 #使用的端口是22tcp        0     0 0.0.0.0:22                 0.0.0.0:*                   LISTEN      986/sshd           tcp        0     0 :::22                      :::*                        LISTEN      986/sshd           [root@cl1 ~]#

 

ssh客户端连接演示

在连接之前ls -l ~/.ssh没有文件,连接之后就会产生文件

[root@cl1 ~]# ss                                      #查看以ss开头的服务ss           ssh-add      ssh-copy-id  ssh-keygen  ssltap      ssh          ssh-agent    sshd        ssh-keyscan [root@cl1 ~]# ssh -p22 root@192.168.88.66             #连接到192.168.88.66The authenticity ofhost '192.168.88.66 (192.168.88.66)' can't be established.RSA key fingerprint is6e:6d:48:4c:63:be:17:e0:05:11:4a:9f:f5:d5:5d:b9.Are you sure you wantto continue connecting (yes/no)? yes       #输入yes按回车Warning: Permanentlyadded '192.168.88.66' (RSA) to the list of known hosts.reverse mappingchecking getaddrinfo for bogon [192.168.88.66] failed - POSSIBLE BREAK-INATTEMPT!root@192.168.88.66'spassword:                         #输入密码Last login: FriJul  8 11:45:43 2016 from 192.168.2.129[root@cat ~]# ifconfigeth0|sed -rn 's#^.*dr:(.*)  Bc.*$#\1#gp'    #查看IP,已连接上192.168.88.66[root@cat ~]#logout                                   #ctrl+d退出Connection to192.168.88.66 closed.[root@cl1 ~]# ls -l~/.ssh                             #已经有了文件total 4-rw-r--r--. 1 root root395 Jul  8 23:34 known_hosts[root@cl1 ~]# cat~/.ssh/known_hosts                    #以下是加密信息192.168.88.66 ssh-rsaAAAAB3NzaC1yc2EAAAABIwAAAQEAya+hbnpwYoPvrgSC+puPzLjVWkSOlrqFtysjCX0aMhTRRqpA1SpeLiBmKsKyDbyNVQa2mXcOYVdbjE7qPB7QcqK99nmgTkV70DE0Xvv6jxF5FFpV0qKepaTyRhFrMsmK0Mky04Iwb7rdkjfD82Hi+IQZY8DC2zGKS1+V6fKZ1XNapz4+/CXcoWTOGS6+H50zrv3ET5vtby3OLU6lJp4E5nPuE+0H2da9poQaIsJ2/JmW8gA5u8rXSC1Ccv1BEWjzqKeU8ZE72QEtDUqVfavGpRu8GjKRkCojXhsTsCBjy593GVu0ZGEgSUdWn1+CBXp7acc6Bhmd5HCCK/rWk3OEwQ==[root@cl1 ~]#

基于密钥的安全验证:

  基础密钥的安全验证方式是指,需要依靠密钥,也就是必须事先建立一对密钥对,然后把公用密钥(Public key)放在需要访问的目录服务器上,另外,还需要把私有密钥(Private key)放到SSH的客户端或对应的客户端服务器上。

  此时,如果要想连接到这个带有公用密钥的SSH服务器,客户端SSH软件或者客户端服务器就会向SSH服务器发出请求,请求用联机的用户密钥进行安全验证。SSH服务器收到请求之后,会先在该SSH服务器上连接的用户的家目录下寻找事先放上去的对应用户的公用密钥,然后反它和连接的SSH客户端发送过来的公用密钥进行比较。如果两个密钥一致,SSH服务器就用公用密钥加密质询challenge)并反它发送给SSH客户端。

  SSH客户端收到质询之后就可以用自己的私匙解密,再把它发送给SSH服务器。使用这种方式,需要知道联机用户的密钥文件。与第一种基于口令难的方式相比,第二种方式不需要在网络上传送口令密码,所以安全性更高了,这时我们也要注意保护我们的密钥文件,特别是私钥文件,一旦被***获取,危险就很大了。

1.1.5 启动SSH服务

  SSH服务所需要的软件包含OpenSSLOpenSSH,通过命令查询如下:

[root@cl1 ~]# rpm-qa|egrep "openss"openssl-1.0.1e-15.el6.x86_64openssh-server-5.3p1-118.1.el6_8.x86_64openssh-5.3p1-118.1.el6_8.x86_64openssh-clients-5.3p1-118.1.el6_8.x86_64[root@cl1 ~]# chkconfig--list|grep 3:onrsyslog         0:off  1:off   2:on    3:on   4:on    5:on   6:offsshd            0:off   1:off  2:on    3:on    4:on   5:on    6:offudev-post       0:off  1:on    2:on    3:on   4:on    5:on    6:off[root@cl1 ~]#[root@cl1 ~]# ll/etc/ssh/sshd_config                               #sshd是服务端-rw-------. 1 root root3879 May 12 12:52 /etc/ssh/sshd_config[root@cl1 ~]# ll/etc/ssh/ssh_config                                #sshd是客户端-rw-r--r--. 1 root root2047 May 12 12:52 /etc/ssh/ssh_config通过查看配置也可以区别是服务端还是客户端,如下:[root@cl1 ~]# less/etc/ssh/sshd_config#       $OpenBSD: sshd_config,v 1.80 2008/07/0202:24:18 djm Exp $ # This is the sshdserver system-wide configuration file. See       #显示server就是服务端

 

面试题:给你一个端口,如果查出对应的服务

下面以22端口为例,进行查询

[root@cl1 ~]# lsof -i:22                  #使用lsof命令加端口号,可以看到SSHD服务COMMAND  PID USER  FD   TYPE DEVICE SIZE/OFF NODENAMEsshd    2276 root    3r IPv4  14165      0t0 TCP bogon:ssh->bogon:50317 (ESTABLISHED)sshd    2700 root   3u  IPv4  15010     0t0  TCP *:ssh (LISTEN)sshd    2700 root   4u  IPv6  15012     0t0  TCP *:ssh (LISTEN)[root@cl1 ~]# netstat-lntup|grep 22                #lntup中的p是打印进程名的tcp        0     0 0.0.0.0:22                 0.0.0.0:*                   LISTEN      2700/sshd           tcp        0     0 :::22                      :::*                        LISTEN      2700/sshd           [root@cl1 ~]# netstat -lntu|grep 22                #不加p进程名不显示了tcp        0     0 0.0.0.0:22                 0.0.0.0:*                   LISTEN      tcp        0     0 :::22                      :::*                        LISTEN

小结:

1、  切换到别的机器ssh–p52113 user@ip

2、  到其他机器执行命令(不会切到机器上)ssh –p52113 user@ip 命令(全路径!不识别环境变量

当第一次连接的时候,本地会产生一个密钥文件~/.ssh/known_hosts(可能有多个密钥)

1.1.6 ssh客户端附带的远程拷贝scp命令

示例:把cl1机器tmp目录下的123.log复制到cl2上。这个相当于推push

cl2上的操作[root@cl2 tmp]# lltotal 0-rw-r--r--. 1 root root0 Jul  9 01:21 123.log-rw-------. 1 root root0 Jul  8 16:56 yum.log[root@cl2 tmp]# pwd/tmp[root@cl2 tmp]# scp -P22 /tmp/123.log root@192.168.2.30:/tmp     #scp后面的-P(是大写)reverse mappingchecking getaddrinfo for bogon [192.168.2.30] failed - POSSIBLE BREAK-INATTEMPT!root@192.168.2.30'spassword:123.log                                      100%    0     0.0KB/s  00:00   [root@cl2 tmp]#另一台机器cl1[root@cl1 ~]# ll /tmp                                            #/tmp下已有123.log文件total 0-rw-r--r--. 1 root root0 Jul  9 01:22 123.log-rw-------. 1 root root0 Jul  8 01:41 yum.log[root@cl1 ~]#

 

示例:拉

Cl1机器创建ddd文件[root@cl1 ~]# echo123456 >ddd[root@cl1 ~]# cat ddd123456在cl2机器上把cl1家目录的ddd拉过来  [root@cl2 tmp]# scp -P22 root@192.168.2.30:~/ddd .         #.代表当前目录reverse mappingchecking getaddrinfo for bogon [192.168.2.30] failed - POSSIBLE BREAK-INATTEMPT!root@192.168.2.30'spassword:ddd                                          100%    7     0.0KB/s  00:00   [root@cl2 tmp]# ll                                        #cl2的/tmp下已有dddtotal 4-rw-r--r--. 1 root root0 Jul  9 01:21 123.log-rw-r--r--. 1 root root7 Jul  9 01:31 ddd-rw-------. 1 root root0 Jul  8 16:56 yum.log[root@cl2 tmp]# cat ddd123456

 

推:PUSH

scp -P22 /tmp/123.log

拉:PULL

scp -P22 root@192.168.2.30:~/ddd .

#-àscp为远程拷贝文件或目录的命令

#-à-P(大写,注意和ssh命令的不同)接端口,默认22端口时可以省略-P22

#-à-r表示拷贝目录

#-à-p表示在拷贝前后保持文件或目录属性

#-à/tmp为本地的目录。“@”前为用户名,“@”后为要连接的服务器IPIP后的:/tmp目录,为远端的目标目录。->以上命令作用是反本地/tmp下的123.log拷贝到远端服务器192.168.2.30/tmp目录;

#-à还可以把远端目录抓到本地,scp –P22 /tmp/zdw。就是把PUSH的目录位置对调一下即可。

 

  小结:

  scp是加密的远程拷贝,可以把数据从一台机器推送到另一台机器,也可以从其它服务器把数据拉回到本地执行命令的服务器,但是,每次都是全量拷贝(rsync增量拷贝),因此,效率不高。

sftp服务:

[root@cl2 ~]# sftp -o Port=52113 zdw@192.168.2.30     #进入到192.168.2.30这台机器Connecting to192.168.2.30...reverse mappingchecking getaddrinfo for bogon [192.168.2.30] failed - POSSIBLE BREAK-INATTEMPT!root@192.168.2.30'spassword:                          #提示输入密码sftp> ls –l                                       #查看文件,这时看到的是2.30这台机器的家目录-rw-------    1 root    root         1096 Jul  8 01:44 anaconda-ks.cfg-rw-r--r--    1 root    root            7 Jul  9 01:29 ddd-rw-r--r--    1 root    root         9458 Jul  8 01:44 install.log-rw-r--r--    1 root    root         3091 Jul  8 01:43 install.log.syslogsftp> put /data/123.log                            #把123.log文件放到2.30上Uploading /data/123.logto /root/123.log/data/123.log                                 100%    0    0.0KB/s   00:00   sftp> ls –l                                       #查看,已存在123.log的文件-rw-r--r--    1 root    root            0 Jul 11 17:30123.log-rw-------    1 root    root         1096 Jul  8 01:44 anaconda-ks.cfg-rw-r--r--    1 root    root            7 Jul  9 01:29 ddd-rw-r--r--    1 root    root         9458 Jul  8 01:44 install.log-rw-r--r--    1 root    root         3091 Jul  8 01:43 install.log.syslogsftp>sftp> get ddd                                      #下载dddFetching /root/ddd toddd/root/ddd                                     100%    7    0.0KB/s   00:00   sftp>[root@cl2 ~]# ls                                  #ddd已下载(下载的目录是当前目录)anaconda-ks.cfg  ddd install.log  install.log.syslog

小结:

1、  sftp –oPort=22

2、  上传put加客户端本地路径,也可以指定路径上传,put /etc/hosts /tmp

3、  下载get服务端的内容,下载到本地的当前目录

客户端sftp

上传:

Therewas a problem using the initial local directoryC:\Users\dongwei_zhao\Documents: 系统找不到指定的路径。Attemptingto fall back to default initial path.sftp>put "C:\Users\zdw11\Desktop\work\wltx\678.txt"Uploading678.txt to /root/678.txt  100% 0 bytes      0 bytes/s 00:00:00    sftp>ls123.log               678.txt               anaconda-ks.cfgddd                   install.log           install.log.syslogsftp>

 

下载:

下载的目录在选项-会话选项里设置

sftp>get 123.log                          #下载123.log文件到windows本地Downloading123.log from /root/123.log  100% 0 bytes      0 bytes/s 00:00:00

注:下载操作时,如果没有成功。退出重新连接生效。

 

[root@www ~]# egrep -v "^#|^$" /etc/ssh/sshd_config     #排除以#和$开头的Port 52113PermitRootLogin noPermitEmptyPasswords noUseDNS noGSSAPIAuthentication noProtocol 2SyslogFacility AUTHPRIVPasswordAuthenticationyesChallengeResponseAuthenticationnoGSSAPIAuthenticationyesGSSAPICleanupCredentialsyesUsePAM yesAcceptEnv LANG LC_CTYPELC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGESAcceptEnv LC_PAPERLC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENTAcceptEnv LC_IDENTIFICATIONLC_ALL LANGUAGEAcceptEnv XMODIFIERSX11Forwarding yesSubsystem       sftp   /usr/libexec/openssh/sftp-server[root@www ~]#

学习自:

老男孩Linux