SSH远程管理服务

1.1 SSH服务介绍说明

Secure shell protocol——安全的shell协议

SSH:先对要传输的数据包进行加密处理,然后在进行数据传输,确保了数据的安全

telnet:用于远程连接控制,但不对数据传输进行加密

1.1.1 SSH服务主要提供的两个功能:

1. 远程连接

2. 远程文件传输:如sftp

 

1.1.2 SSH连接排错思路 

1. ping 172.16.1.41

  traceroute 172.16.1.1.41 #路由追踪

2.关闭防火墙和SElinux

  临时关闭:service iptables stop setenforce 0

  永久关闭:chkconfig iptables off

        sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux

3.测试SSH服务是否开启:

    1. nmap 172.16.1.41 -p 22

    2. telnet 172.16.1.41 22 #标准退出方式telnet连接,按ctrl+],输入quit

    3. lsof -i:22

    4. nc 172.16.1.41:22

    5. ss 172.16.1.41 22

    PS:1. 不要用iptables -nL检查iptables状态,因检查完会默认开启

      2. /etc/services  #存放服务与其对应的端口号,只有在这里存放的服务才能被启动

        否则,就算启动了,端口号也不在监听状态(相当于没启动)

1.2 远程管理服务说明

1.2.1 telnet远程管理

1. 安装telnet软件服务

    yum install -y telnet telnet-server

2. 配置telnet服务可以被xinetd服务管理

    vim /etc/xinetd.d/telnet

    disable = no

3. 启动xinetd服务

    /etc/init.d/xinetd start

    netstat -lnptu |grep 23 #检查服务是否开启,这时候服务名不叫telnet了,叫xineted

 


1.2.2 使用wireshark抓包来实现SSH远程协议进行数据的加密,telnet远程协议未对数据包加密

1. 分析telnet包的数据是明文传输的

1.windows中安装wireshark,选择vmnet 8 网卡

2.抓取telnet包,分析数据不是加密的

3)根据协议过滤出tenet

4)确认源和目的地址,选择一个telnet包,右击选择追踪流

image.png

image.png



2. 使用wireshark抓取三次握手和四次挥手包

1)用ssh从本地shell登录进去,exit退出登录

2) 过滤tcp包,进行分析,步骤同上类似

三次握手:

image.png 

四次挥手:

image.png

 

1.2.3 . linux中使用命令方式抓包

tcpdump -i eth0 -nn -c 5 "port 22" -w /tmp/data.pkg

 

PS:-i      #指定抓取哪一个网卡上产生的数据包流量

  -nn      #根据端口号转换为服务名

  -c       #指定抓包数量

 "port 22"    #抓取指定端口号的数据包

  -w       #将抓取的数据包内容保存到指定文件中,便于发给其他人

  -r       #对保存的数据包文件进行读取(否则不能读取)

 

1.2.4 SSH要点总结

1.3 linux系统中主要的两个数据加密软件(opensshopenssl

1.3.1 openssh

服务端

    /etc/rc.d/init.d/sshd        --- ssh服务端启动脚本命令

    /etc/ssh/sshd_config         --- ssh服务端配置文件

    /usr/sbin/sshd              --- 启动ssh服务进程命令          

 

客户端

    /etc/ssh/ssh_config          --- ssh客户端配置文件

    /usr/bin/.ssh.hmac          --- ssh服务的算法文件

    /usr/bin/scp                --- 基于ssh协议,实现远程拷贝数据命令

    /usr/bin/sftp               --- 基于ssh协议,实现数据传输命令

    /usr/bin/slogin              --- 远程登录主机连接命令    

    /usr/bin/ssh                --- 远程登录主机连接命令

    /usr/bin/ssh-add             --- 此参数必须和ssh-agent命令结合使用,将私钥信息注册到    代理服务中

    /usr/bin/ssh-agent            --- 启动ssh认证代理服务命令

    /usr/bin/ssh-copy-id         --- 远程分发公钥命令

    /usr/bin/ssh-keyscan         --- 显示本地主机上默认的ssh公钥信息

 

1.3.2 openssl:(https)这个暂时不做解释

1.4 SSH协议实现加密技术的原理

1. 利用了公钥和私钥的认证机制,实现对数据的加密和解密

 公钥:在网络中传输

 私钥:保存在本地

2. 使用ssh-keyscan可根据IP查看对应主机的公钥

[root@web01 ~]# ssh-keyscan -t dsa 172.16.1.7

172.16.1.7 SSH-2.0-OpenSSH_5.3

172.16.1.7 ssh-dss AAAAB3NzaC1kc3MAAACBAP+E6feKhADKLR5/D/dh4BTn3I8l88wJhITxzNn/XwK88BvWhBPu5sceD9C7JPC47PpDyvG99kL48RaxdiKiaiMvNfoATwutVAUlyx8k/UYRDiQRxAlOnKPj0PFVzDutr6EJad+FNSS0X+av3lHvdJwHHAbo0BpQdGNtmTSgnuORAAAAFQD1ORmJdB+3B75ICTkpLYUKiK7clwAAAIEA1eqSq7QiLrvU9y07I0xrW9uIiFme8+Trgzd7dXJ5aGyRGUB/wJrqjmudtANRoAsmL/gT65oZw2I1AP0KbBqjlqU97Zzbfz7brkeEDdXgZ1yTW1u2vMtKlearlgIoUp0a5DZKZn6+/A5AQG6NvY7Xnu0FhNMirkMWBqZ32n/69WwAAACBAMQiVKjk5KvRGcGzIqErubzOKFj1zlWlgBPot/HoTCdFGfkodaHdqP5JkqEOmrSBtJwNUEPjXOr+fNKL0/qL4FxChbXi4UAe9MixNhXTK7KyU7RsaXPb27d7Kw+34GAyw+VWQAr3DP/6j6S0xGtgv0anHvKzYwq4ZWanVs7xAha5

PS:-t :指定加密类型(默认为rsa)

3. 私钥和公钥的存储位置

[root@backup ~]# ls /etc/ssh

moduli           ssh_host_dsa_key      ssh_host_rsa_key

ssh_config       ssh_host_dsa_key.pub  ssh_host_rsa_key.pub

sshd_config      ssh_host_key

sshd_config.bak  ssh_host_key.pub

PS:1.ssh_host_key就是私钥(里面都是乱码)

   2.后面带.pub的文件就是公钥(如:ssh_hosts_pub)

4. 分析执行ssh 10.0.0.31时,下图的含义

image.png 

客户机执行ssh 10.0.0.31连接服务端时,服务端询问客户端是否要连接我,客户端确认连接后,需要输入服务端的密码,服务端确认正确后,连接连接。

 

1.4.1 SSH V1V2版本的区别

1. V1版本钥匙和锁头默认不会变化,数据传输不安全

2. V2版本钥匙和锁头会经常变化,数据传输更安全

 

1.4.2  SSH服务认证类型

1. 基于密码的认证

2. 基于秘钥的认证、安全 (实现免密码管理)(重点

1.4.3 基于秘钥管理的认证全过程:(实现免密码管理)

   ①. 在管理端创建出秘钥对(创建两个信物)

   ②. 管理端将公钥(锁头)传输给被管理端,锁头传输给被管理端要基于密码方式认证

   ③. 管理端向被管理端发出建立连接请求

   ④. 被管理端发出公钥质询

   ⑤. 管理端利用私钥解密公钥,进行公钥质询响应

   ⑥. 被管理端接收到质询响应,确认基于秘钥认证成功

      下图:客户端为管理端,服务端为被管理端

image.png

1.4.4 基于秘钥认证部署过程(免密码方式登录的过程)

1. 客户端上创建秘钥对

1) [root@nfs01 ~]# ssh-keygen -t rsa

    Generating public/private rsa key pair.

    Enter file in which to save the key (/root/.ssh/id_rsa):    ---确认私钥保存路径(默认路径)

    Enter passphrase (empty for no passphrase):             ---确认私钥文件是否设置密码(设 置为空)

    Enter same passphrase again:                       ---确认私钥文件是否设置密码 (设置 为空)

    Your identification has been saved in /root/.ssh/id_rsa.     ——私钥保存位置

    Your public key has been saved in /root/.ssh/id_rsa.pub.     ——公钥保存位置

    The key fingerprint is:

    fc:7d:bd:64:62:d1:95:03:ca:c2:7f:71:d0:70:7e:1c root@backup

    The key's randomart image is:

    +--[ RSA 2048]----+

    |               oE|

    |         .     ..|

2) 创建完后,会在当前用户的宿主目录.ssh/下生成一个公钥与私钥

    [root@nfs01 ~]# ls .ssh/

    id_rsa  id_rsa.pub  known_hosts


2.  分发公钥给服务端主机

1)[root@nfs01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@172.16.1.31

root@172.16.1.31's password:  ——需要服务端密码验证

Now try logging into the machine, with "ssh 'root@172.16.1.31'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

 

PS:1. -i   #指定要进行分发的公钥文件

   2. root表示客户端以什么样的身份登录到服务端

补充:

PS: 如果ssh端口不是22了,那么需要在公钥文件后面加参数:-p 666

如:ssh-copy-id -i /root/.ssh/id_rsa.pub -p 666 root@172.16.1.31


2)在服务端查看宿主目录.ssh/下,发现多了authorized_keys这个公钥文件

 [root@nfs01 ~]# ls .ssh/

 authorized_keys  known_hosts

3. 利用基于秘钥方式登录

[root@backup ~]# ssh 172.16.1.31 ——直接可以登录,不需要密码了

Last login: Mon Jan 29 16:31:35 2018 from 172.16.1.41

Either to be the first or to be the best one !

 

 

1.4.5 如何实现多台主机之间彼此相互访问,都是基于秘钥的

首先:管理服务器将公钥分别发布给web1web2

1.创建秘钥对 ssh-keygen -t rsa

2.将公钥发布到web1 ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.31

3.将公钥发布到web2 ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.7

第一步:启动认证代理服务

[root@backup ~]# eval `ssh-agent -s`

Agent pid 2278

PS:eval这个命令,相当于执行俩次bash

第二步:agent代理服务器注册本地服务器私钥信息

[root@backup ~]# ssh-add

Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)

第三步:将注册凭证信息通过远程登录方式给被管理主机

[root@backup ~]# ssh -A 172.16.1.31

Last login: Mon Jan 29 16:35:28 2018 from 172.16.1.41

Either to be the first or to be the best one !

PS:1.注册凭证不是私钥信息

   2.被管理主机接受到后,会产生凭证信息/tmp/ssh-xxx/agent.12334

 

        image.png 

 

1.5 企业面试题:

1.5.1 如果给你一个进程名(如:ssh),如何查看对应的端口是什么?

netstat -lnptu |grep sshd

ss -lnptu |grep sshd

1.5.2 取出sshd端口号22

[root@web01 ~]# netstat -lnptu |awk -F "[ :]+" '$4~/^22/{print $4}'

[root@web01 ~]# netstat -lnptu |awk -F "[ :]+" '!/:::/&& /sshd/{print $5}'

[root@web01 ~]# netstat -lnptu |awk -F "[ :]+" '$5~/22/{print $5}'

1.5.3 给你一个端口,如何命令行查出对应的服务是什么?

nmap -p 22 172.16.1.41

netstat -lnptu |grep 22

ss -lnptu |grep 22

lsof -i:22

nc 172.16.1.41 22

 

1.6 SSH配置文件一些重要参数说明

   vim /etc/ssh/sshd_config

   13 (行号)#Port 22                                        --- 表示修改默认端口号信息

   15 (行号)#ListenAddress 172.16.1.41        --- 指定监听本地主机网卡地址信息

   UseDNS no                   --- 默认此参数配置信息为yes,要对访问过来主机信   息做dns反向解析

   GSSAPIAuthentication no          --- 默认此参数配置信息为yes,不对连接进行GSSAPI   认证

   permitRootLogin no          --- 禁止root登录,默认为yes允许

   permitEmptyPasswords no        --- 禁止空密码登录

   PasswordAuthentication yes      --- 密码验证登录

  

扩展说明:sshd服务主要的两个进程

   /usr/sbin/sshd           ---  此进程对客户端第一次连接ssh服务端有影响

   sshd: root@pts/0          ---  一旦ssh连接成功,是否可以始终保持连接由此进程决定

 

 

1.7 SSH***案例说明

1.7.1 如何防止SSH登录***小结

1)用秘钥登录,不用密码登录

2)牤牛阵法,解决SSH安全问题

    a. 防火墙关闭SSH,指定源IP限制(局域网,信任公网)

    b.(负载均衡服务器)开启SSH只监听内网IP

3)尽量不给服务器外网IP

4)最小化(软件安装授权)

5)给系统重要文件或命令做指纹

6)给重要配置文件加锁chattr -i / -a

image.png


最后补充一点:多台服务器之间如何相互免秘钥登录?

最好理解也是最笨的方法:每个服务器都创建密钥对,把公钥分别发给每个服务器,这样每个服务器之间除了第一次要密码,以后就不会要了

                        

小伙伴们可以关注我的微信公众号:linux运维菜鸟之旅

qrcode_for_gh_5ecc48d3d14a_258.jpg

关注“中国电信天津网厅”公众号,首次绑定可免费领2G流量,为你的学习提供流量! 

qrcode_for_gh_d20dccd1c74b_258.jpg