首页 > 技术文章 > ssh远程管理服务的介绍

liangyuxing 2019-11-30 16:16 原文

 

第6章 远程管理的介绍

6.1 服务的概念介绍

6.1.1 sshtelnet服务的相同和不同点

ssh:

  • 服务端口号为22
  • 在数据传输的时候是加密的传输
  • 一般在互联网中使用,可以使用root账号进行登录

telnet:

  • 服务端口号为23
  • 在数据的传输的时候是明文传输
  • 一般在局域网中使用,不可以使用root账号进行登录

6.2 远程服务密码连接的原理


  • 客户端向服务端发送请求建立的连接
  • 服务端向客户端发送确认是建立连接吗(yes/no)
  • 客户端在给服务端发送确认建立连接(yes),并且接收到一个公钥文件,保存到(~/.ssh/known_hosts)文件中
  • 客户端进行密码确认的操作
  • 服务端向客户端发送密码的确认消息,成功则建立连接

6.3 远程服务连接的方式

6.3.1 密码连接

密码连接有风险,第一,密码基本是固定的形式的;第二:密码的难易由密码的复杂度来决定的

6.3.2 密钥进行连接

6.3.2.1 秘钥连接的原理过程

  • 客户端生成一个密钥对信息
  • 客户端将公钥发送给服务端
  • 客户端使用远程连接命令发送,并且请求建立连接
  • 服务端接收客户端的请求,并且发送确认请求
  • 客户端选择(yes),接着会生成一个公钥,保存到~/.ssh/known_hosts文件中
  • 服务端会发送公钥质询信息(验证客户端有私钥可以解密我这个公钥的文件内容吗)
  • 客户端接收质询信息,并且使用私钥进行解密
  • 客户端将结果发送给服务端
  • 连接建立成功

 

6.3.2.2 管理端创建密钥进行连接

  • -t                        指定密钥的类型(rsa,dsa)
  • -f                        指定密钥的文件名称
  • -C                        指定公钥的内容备注
  • -P                        指定旧的私钥密码
  • -N                        指定新的私钥密码
  • -q                        默认不进行输出

[root@nfs01 ~] # ssh-keygen -t dsa                    密钥创建

Generating public/private dsa key pair.

Enter file in which to save the key (/root/.ssh/id_dsa):             保存密钥的地方

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /root/.ssh/id_dsa.            保存的公钥路径

Your public key has been saved in /root/.ssh/id_dsa.pub.            保存的私钥路径

The key fingerprint is:

SHA256:P4YoWQkaZ2j0Modev90czdp60WWVk9in08MdA0jr44Y root@nfs01

The key's randomart image is:

+---[DSA 1024]----+

| . ....+ o|

| . + ... Bo|

| B B . .oB|

| o X o . .o oo=|

| o + S .oo. +.|

| o + =o+o . |

| o o oEBo.. |

| . ..o. |

| .. |

+----[SHA256]-----+

You have new mail in /var/spool/mail/root

6.3.2.3 分发公钥

6.3.2.3.1 分发公钥的原理
  • 管理端和远程服务器进行连接
  • 连接的时候会将公钥发送给远程服务端的/root/.ssh/ authorized_keys的文件里,并且权限为600
  • 在连接建立的时候,ssh服务会加载authorized_keys的文件里面的密钥信息来建立连接
6.3.2.3.2 分发公钥的操作步骤

[root@nfs01 .ssh] # ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.41            将公钥发送给172.16.1.41

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_dsa.pub"

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

root@172.16.1.41's password:                 输入172.16.1.41的密码

 

Number of key(s) added: 1

 

Now try logging into the machine, with: "ssh 'root@172.16.1.41'"

and check to make sure that only the key(s) you wanted were added.

 

[root@nfs01 .ssh] # ssh 172.16.1.41                    远程连接ssh 172.16.1.41

Last login: Sun Oct 27 20:44:18 2019 from 10.0.0.1

[root@backup ~] #                发现不需要密码就可以连接成功

6.4 利用脚本进行批量的分发

6.4.1 密码和端口都是固定的情况下

for i in 41 7

do

sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub -o StrictHostKeyChecking=no 172.16.1.$i

if [ $? -eq 0 ]

then

echo "172.16.1."$i"发送成功"

else

 

echo "172.16.1."$i"发送失败"

fi

 

done

6.4.1.1 ssh批量分发公钥的思路解析

6.4.1.1.1 手动分发公钥

ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.7

6.4.1.1.2 解决需要进行密钥分发的确认信息

ssh 参数-o里面可以指定StrictHostKeyChecking=no来忽略确认,直接将公钥发送过来就可以

ssh -o StrictHostKeyChecking=no        忽略确认,直接将公钥发送过来就可以

6.4.1.1.3 解决输入密码的困境

使用sshpass来忽略

sshpass -p123456                免交互来指定你输入的密码

6.4.1.1.4 将公钥发送的前几个过程连接起来

sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa -o StrictHostKeyChecking=no 172.16.1.7        单个用户直接发密钥的思路

6.4.2 端口和密码不固定的情况下

[root@m01 scripts] # cat different.txt                编写定义IP 密码端口的配置文件

172.16.1.31 123456 52113

172.16.1.41 654321 22

172.16.1.7 123456 22

[root@m01 scripts] # cat different_miyao_fenfa.sh

#!/bin/bash

 

cat /server/scripts/different.txt|\

while read line                        循环读取

do

IP_INFO="$(echo $line|awk '{print $1}')"                读取第一行,使用awk进行分割,取出IP

PASS_INFO="$(echo $line|awk '{print $2}')"            读取第二行,使用awk进行分割,取出密码

PORT_INFO="$(echo $line|awk '{print $3}')"            读取第三行,使用awk进行分割,取出端口

sshpass -p$PASS_INFO ssh-copy-id -i /root/.ssh/id_dsa.pub -o StrictHostKeyChecking=no $IP_INFO -p $PORT_INFO &>/dev/null                IP,密码,端口依次赋值给变量下面进行调用

if [ $? -eq 0 ]

then

echo "Public key distribution success"

echo ""

else

echo "Public key distribution faild"

echo ""

fi

done

[root@m01 scripts] #

 

6.5 远程服务配置文件

  • 17 #Port 22                            这个是指定ssh端口配置
  • 19 #ListenAddress 0.0.0.0                指定监听的IP地址(这个地址只能是服务器网                                    卡本身拥有的)
  • 64 #PermitEmptyPasswords no            不允许空密码进行连接
  • 38 #PermitRootLogin yes                        禁止root登录系统
  • 79 GSSAPIAuthentication no                    关闭GSSAPI认证,加快ssh的连接
  • 23 UseDNS no                                关闭DNS反向解析 加快SSH连接效率
  • 47 AuthorizedKeysFile .ssh/authorized_keys        存放发过来的公钥认证文件

 

6.6 远程访问防范入侵方案

  • 使用密钥进行登录系统,别使用密码进行登录
  • 解决ssh安全的问题
    • 防火墙将ssh服务关闭,指定源IP地址限制(只对一些信任公网和私网可以访问)
    • 对服务器的指定IP进行监听(监听的端口只能是网卡里面拥有的)
  • 尽量不给服务器的外网IP(负载均衡是需要外网IP的)
  • 尽量最小化的安装系统
  • 把一些重要的文件进行指纹验证
  • 将一些重要的文件进行加锁来解决

推荐阅读