首页 > 技术文章 > Linux-SSH远程管理服务实战

guanchao 2019-08-21 19:51 原文

第五章 SSH远程管理服务实战

1. SSH基本概述

 
 
 
xxxxxxxxxx
 
 
 
 
SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输。确保了数据传输安全。那SSH服务主要功能有哪些呢?
 

1. 提供远程连接服务器的服务

2. 对传输的数据进行加密

那么除了SSH协议能提供远程连接服务,Telnet也能提供远程连接服务, 那么分别的区别是什么呢?

 
 
 
xxxxxxxxxx
 
 
 
 
SSH服务会对传输数据进行加密, 监听在本地22/tcp端口, ssh服务默认支持root用户登录
Telnet服务不对数据进行加密, 监听在本地23/tcp端口, Telnet默认不支持root用户登录
 
服务连接方式服务数据传输服务监听端口服务登陆用户
SSH 加密 22/tcp 默认支持root用户登陆
Telnet 明文 23/tcp 不支持root用户登陆

案例: 使用wireshark验证telnet明文传输与ssh加密传输

1.安装 Telnet服务并运行

 
 
 
xxxxxxxxxx
 
 
 
 
[root@m01 ~]# yum install telnet-server -y
[root@m01 ~]# systemctl start telnet.socket
 

2.使用wireshark检测vmnet8网卡上telnet的流量

img

3. telnet是无法使用root用户登录Linux系统,需要创建普通用户

 
 
 
xxxxxxxxxx
 
 
 
 
[root@m01 ~]# useradd qls
[root@m01 ~]# echo "1"| passwd --stdin qls
 

4. 使用普通用户进行telnet登录

img

5. 搜索wireshark包含telnet相关的流量

img

img

img

6. 使用wireshark分析ssh流量

img

img

img

img

2. SSH相关命令

 
 
 
xxxxxxxxxx
 
 
 
 
SSH有客户端与服务端,我们将这种模式称为C/S架构,ssh客户端支持Windows、Linux、Mac等平台。
在ssh客户端中包含 ssh|slogin远程登陆、scp远程拷贝、sftp文件传输、ssh-copy-id秘钥分发等应用程序。
 

1. ssh远程登录服务器命令示例

 
 
 
xxxxxxxxxx
 
 
 
 
ssh -p22 root@10.0.0.61
# -p指定连接远程主机端口,默认22端口可省略
# root@remotehost
# "@"前面为用户名,如果用当前用户连接,可以不指定用户
# "@"后面为要连接的服务器的IP
 

2. scp复制数据至远程主机命令(全量复制)

 
 
 
xxxxxxxxxx
 
 
 
 
# -P 指定端口,默认22端口可不写
# -r 表示递归拷贝目录
# -p 表示在拷贝文件前后保持文件或目录属性不变
# -l 限制传输使用带宽(默认kb)
#推:将本地/tmp/qls推送至远端服务器10.0.0.61的/tmp目录,使用对端的root用户
[root@m01 ~]# scp -P22 -rp /tmp/qls root@10.0.0.61:/tmp
#拉:将远程10.0.0.61服务器/tmp/oldboy文件拉取到本地/opt/目录下
[root@m01 ~]# scp -P22 -rp root@10.0.0.61:/tmp/qls /opt/
#限速
[root@m01 ~]# scp /opt/1.txt root@172.16.1.31:/tmp
root@172.16.1.31 password: 
test                        100%  656MB  '83.9MB/s'   00:07 
#限速为8096kb,换算为MB,要除以 8096/8=1024KB=1MB
[root@m01 ~]# scp -rp -l 8096  /opt/1.txt root@172.16.1.31:/tmp
root@172.16.1.31s password: 
test                        7%   48MB   '1.0MB/s'   09:45 
#结论:
1.scp通过ssh协议加密方式进行文件或目录拷贝。
2.scp连接时的用户作为为拷贝文件或目录的权限。
3.scp支持数据推送和拉取,每次都是全量拷贝,效率较低。
 

3. Sftp远程数据传输命令

 
 
 
x
 
 
 
 
#  sftp>      --- 进入到ftp文件传输模式(ftp相关命令)
#  bye        --- 离开ftp模式
#  cd path    --- 切换远程主机的目录
#  get        --- 从远程服务器上将数据下载到本地
#  lcd /tmp   --- 进行本地切换目录信息
#  lpwd   --- 查看本地所在路径信息
#  put        --- 进行数据上传操作
#默认可以通过sftp命令连接sftp服务
sftp root@10.0.0.61
sftp -oPort=52113 root@10.0.0.61  #sftp的特殊端口连接
# sftp使用get下载文件至于本地服务器
sftp> get conf.txt /tmp/
# sftp使用put上传本地服务器文件至远程服务器
sftp> put /root/t1.txt /root/
 

3. SSH验证方式

1. 基于账户密码远程登录

知道服务器的IP端口,账号密码,即可通过ssh客户端命令登陆远程主机。

 
 
 
xxxxxxxxxx
 
 
 
 
[C:\~]$ ssh -p22 root@10.0.0.61
root@10.0.0.61 password:
[root@m01 ~]#
 

2. 基于秘钥远程登录

默认情况下,通过ssh客户端命令登陆远程服务器,需要提供远程系统上的帐号与密码,但为了降低密码泄露的机率和提高登陆的方便性,建议使用密钥验证方式。

img

01. 在服务器上生成非对称密钥,使用-t指定密钥类型,使用-C指定用户邮箱

 
 
 
xxxxxxxxxx
 
 
 
 
[root@m01 ~]# ssh-keygen -t rsa -C 1176494252@qq.com
...
#默认一路回车即可
...
 

02. 将A服务器上的公钥推送至B服务器

 
 
 
xxxxxxxxxx
 
 
 
 
#命令示例: ssh-copy-id [-i [identity_file]] [user@]machine
ssh-copy-id #命令
-i          #指定下发公钥的路径
[user@]     #以什么用户身份进行公钥分发(root),如果不输入,表示以当前系统用户身份分发公钥
machine     #下发公钥至那台服务器, 填写远程主机IP地址
#分发秘钥,[将A服务器的公钥写入B服务器~/.ssh/authorized_keys文件中]
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.41
 

03. A服务器连接B服务器是无需密码的,如果能直接连接无需密码则表示秘钥已配置成功

 
 
 
xxxxxxxxxx
 
 
 
 
#远程登录对端主机方式
[root@m01 ~]# ssh root@172.16.1.41
[root@nfs ~]#
#不登陆远程主机bash,但可在对端主机执行命令
[root@m01 ~]# ssh root@172.16.1.41 "hostname -i"
172.16.1.41
 

4. SSH场景实践

实践场景,用户通过Windows/MAC/Linux客户端连接跳板机免密码登录,跳板机连接后端无外网的Linux主机实现免密登录,架构图如下。

实践多用户登陆一台服务器无密码

实践单用户登陆多台服务器免密码

img

1. Windows客户端使用Xshell生成秘钥对,并下发公钥至跳板机

1) Xshell-->选择工具->新建密钥生成工具

img

2) 生成公钥对,选择下一步

img

img

3) 填写秘钥名称。秘钥增加密码则不建议配置

img

4) Windows会提示密码,继续即可

img

5) 生成秘钥后,点击Xshell->工具->用户秘钥管理者->选择对应秘钥的属性

img

6) 选择对应秘钥的公钥,将其复制

img

7) 将从Windows下复制好的公钥粘贴至跳板机~/.ssh/authorized_keys中,然后测试

 
 
 
xxxxxxxxxx
 
 
 
 
[root@m01 ~]# cd ; umask 077; mkdir -p .ssh ;cd .ssh
[root@m01 .ssh]# vim authorized_keys  #添加windows公钥
 

img

2. 跳板机下发公钥至后端主机

1) 在跳板机上生成秘钥对

 
 
 
xxxxxxxxxx
 
 
 
 
[root@m01 ~]# ssh-keygen -t rsa -C 1176494252@qq.com
 

2) 拷贝跳板机上的密钥至后端主机,如果SSH不是使用默认22端口,使用-p指定对应端口

 
 
 
xxxxxxxxxx
 
 
 
 
[root@m01 ~]# ssh-copy-id  -i /root/.ssh/id_rsa.pub "-p22 root@172.16.1.31"
[root@m01 ~]# ssh-copy-id  -i /root/.ssh/id_rsa.pub "-p22 root@172.16.1.41"
 

3) 在m01管理机上测试是否成功登陆两台服务器

 
 
 
xxxxxxxxxx
 
 
 
 
[root@m01 ~]# ssh root@172.16.1.41
[root@nfs01 ~]# exit
[root@m01 ~]# ssh root@1172.16.1.31
[root@backup ~]# exit
 

3. 通过跳板机能实现scp拷贝文件免密码

 
 
 
xxxxxxxxxx
 
 
 
 
[root@manager ~]# scp /etc/hosts root@172.16.1.31:/tmp
/etc/hosts                 100%    0     0.0KB/s   00:00 
[root@manager ~]# scp /etc/hosts root@172.16.1.41:/tmp
/etc/hosts                 100%    0     0.0KB/s   00:00  
 

请思考以下几个问题?

 
 
 
xxxxxxxxxx
 
 
 
 
#问题一:
执行:ssh qls@10.0.0.51  能不能连接?
说明:基于密钥连接,会识别用户身份信息
#问题二:
密钥分发的实际过程:执行ssh-copy-id命令都干了什么?
01) 将公钥文件传输到被管理服务器相应用户的家目录中
    [root@m01 ~]# scp -rp ~/.ssh/id_dsa.pub root@10.0.0.51:~
输入密码
02) 被管理服务在家目录下面创建一个.ssh目录
    [root@m01 ~]# mkdir ~/.ssh/
03) 将公钥文件移动到.ssh目录中,并进行修改名称和授权
[root@m01 ~]# mv ~/id_dsa.pub ~/.ssh/authorized_keys
[root@m01 ~]# chmod 600 ~/.ssh/authorized_keys
04) 为什么要进行重命名?
[root@m01 ~]# cat /etc/ssh/sshd_config
47 AuthorizedKeysFile      .ssh/authorized_keys
#问题三:
如何实现自动批量分发公钥?
#!/bin/bash
# 删除旧的密钥对
rm -f ~/.ssh/id_rsa*
# 创建密钥对
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N "" &>/dev/null
# 批量分发公钥的操作
for ip in 5 6 7 8 9 31 41 51 61 71
do
  sshpass -p1 ssh-copy-id -i ~/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no" 172.16.1.$ip &>/dev/null
 if [ $? -eq 0 ];then
  echo -e "\033[32mhost 172.16.1.$ip Distribution of the secret key Success!!! \033[0m"
  echo
 else 
  echo -e "\033[31mhost 172.16.1.$ip Distribution of the secret key Failed !!! \033[0m"
  echo
 fi 
done
 

5. SSH安全优化

SSH作为远程连接服务,通常我们需要考虑到该服务的安全,所以需要对该服务进行安全方面的配置。

1.更改远程连接登陆的端口

2.禁止ROOT管理员直接登录

3.密码认证方式改为密钥认证

4.重要服务不使用公网IP地址

5.使用防火墙限制来源IP地址

SSH服务登录防护需进行如下配置调整,先对如下参数进行了解

 
 
 
xxxxxxxxxx
 
 
 
 
Port 6666                       # 变更SSH服务远程连接端口
PermitRootLogin         no      # 禁止root用户直接远程登录
PasswordAuthentication  no      # 禁止使用密码直接远程登录
UseDNS                  no      # 禁止ssh进行dns反向解析,影响ssh连接效率参数
GSSAPIAuthentication    no      # 禁止GSS认证,减少连接时产生的延迟
 

将如下具体配置添加至/etc/ssh/sshd_config文件中,参数需根据实际情况进行调整

 
 
 
xxxxxxxxxx
 
 
 
 
###SSH###
#Port 6666
#PasswordAuthentication no
#PermitRootLogin no
GSSAPIAuthentication no
UseDNS no
###END###
#注意:修改完配置文件一定要重启生效。
 

 

推荐阅读