SSH协议概述

SSH是一个安全协议,提供了远程连接服务,在进行远程数据传输时,会对数据包加密处理,保证了数据传输安全。

除了SSH协议可以提供远程连接服务,传输数据以外,Telnet协议也可以提供远程连接服务,传输数据

SSH 和 Telnet 的区别

连接方式 数据传输 监听端口 登陆用户
SSH 加密 22/tcp 支持root用户登陆
Telnet 明文 23/tcp 不支持root用户登陆

SSH 相关命令

# ssh 远程登录
[root@m01 ~]# ssh root@172.16.1.5 -p 22 # scp 复制数据 至 远程主机
-P # 指定端口号
-r # 递归(目录)
-p # 保留原有属性
-l # 限制传输带宽,单位 bit/s
# scp 命令推送(或拉取)文件,只能全量拷贝,8096bit/s=1024Byte/s=1MB/s
[root@m01 ~]# scp -P22 -rp -l 8096 /root/etc root@172.16.1.5:/tmp # sftp 命令,get 下载到本地,put 推送到远端
[root@m01 ~]# sftp root@172.16.1.5
Connected to 172.16.1.5.
sftp> get /etc/passwd /tmp
sftp> put /etc/passwd /tmp # SSH 相关命令 传输文件时都会把 数据包加密

SSH 验证方式

从客户端来看,SSH提供两种级别的安全验证。

第一种级别(基于口令的安全验证)

只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。

第二种级别(基于密钥的安全验证)

需要依靠密钥,也就是你必须为自己创建一对密钥,并把公用密钥放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密钥进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密钥,然后把它和你发送过来的公用密钥进行比较。如果两个密钥一致,服务器就用公用密钥加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密钥解密再把它发送给服务器。

用这种方式,你必须知道自己密钥的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。

第二种级别不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有你的私人密钥)。但是整个登录的过程可能需要10秒。

此外,如果将公钥复制到其他账户甚至主机(需要设置相关的文件及目录权限 600/700),利用私钥也可以登录。

基于密钥的安全认证

制作密钥对

[root@m01 ~]# ssh-keygen  <== 建立密钥对(默认rsa)
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): <== 密钥文件保存路径,按 Enter
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): <== 输入密钥锁码,或直接按 Enter 留空
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: # fingerprint 指纹
SHA256:xDpkuMOmNLQ56/ZmJZUCsFjNORT7wt79DQD93MvtaiY root@m01
The key's randomart image is: # 看做密钥的二维码
+---[RSA 2048]----+
|...+oo |
|.o. =o o |
|o ..o.+.+ |
| . =.=o+ o . |
| * Bo+ S o . |
| . B.+.o . . o |
| o .o. . . o . |
| .. o .Eoo. |
| ..+. .+o.. |
+----[SHA256]-----+

向服务端推送公钥

# ssh-copy-id 命令
# Usage:ssh-copy-id [-i [identity_file]] [user@]machine
-i # 指定下发公钥的路径
[user@] # 以什么用户身份进行公钥分发(root),如果不输入,表示以当前系统用户身份分发公钥
machine # 下发公钥至那台服务器, 填写远程主机IP地址 # 分发公钥,将公钥写入到远程主机的 /root/.ssh/authorized_keys 文件中,分发时,需要连接密码
[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.5 # 再次连接远程主机不需要密码
[root@m01 ~]# ssh 172.16.1.5 "hostname -I"
10.0.0.5 172.16.1.5

使用跳板机连接/管理服务器

#!/bin/bash
cat <<EOF
================================
| 1.连接lb01
| 2.连接lb02
| 3.连接web01
| 4.连接web02
| 5.连接web03
| 6.连接nfs
| 7.连接backup
| 8.连接db01
| 9.连接zabbix
| 10.批量管理/监控
================================
EOF read -p "输入选项: " num if [ $num -eq 1 ];then
ssh 172.16.1.5
elif [ $num -eq 2 ];then
ssh 172.16.1.6
elif [ $num -eq 3 ];then
ssh 172.16.1.7
elif [ $num -eq 4 ];then
ssh 172.16.1.8
elif [ $num -eq 5 ];then
ssh 172.16.1.9
elif [ $num -eq 6 ];then
ssh 172.16.1.31
elif [ $num -eq 7 ];then
ssh 172.16.1.41
elif [ $num -eq 8 ];then
ssh 172.16.1.51
elif [ $num -eq 9 ];then
ssh 172.16.1.71
elif [ $num -eq 10 ];then
read -p "输入想执行的命令: " COMMAND
for i in 5 6 7 8 9 31 41 51 71;do
echo "==== 172.16.1.$i 输出信息 ===="
ssh 172.16.1.$i "$COMMAND"
done
fi

在某些时候,重新部署服务器或者重新安装系统后,重新连接会出现如下错误,只要删除此IP服务器在文件 /root/.ssh/known_hosts 中相对应的信息即可,也可以直接删除此文件,不会影响其他主机的连接,只会在连接其他主机的时候,询问一次(yes/no),不需要输入密码。

SSH 优化

# 修改 /etc/ssh/sshd_config 配置文件
[root@m01 ~]# vim /etc/ssh/sshd_config ## 在企业中需要优化哪些项
---- 安全方面 ----
# 1.修改端口
Port 123456 (1-65535,不能占用其它服务的常用端口)
# 2.禁止root登录
PermitRootLogin no
# 3.禁止密码登录
PasswordAuthentication no ---- 性能方面 ----
# 4.不使用DNS反向解析
UseDNS no
# 5.不使用GSS认证
GSSAPIAuthentication no ## 重启服务
[root@lb01 ~]# systemctl restart sshd

expect 脚本免交互登录

# 安装软件包
[root@m01 ~]# yum install -y expect
# 编辑 expect 脚本
[root@m01 ~]# vi ignorepasswd.sh
#!/usr/bin/expect
set ip 172.16.1.5
set pass 123
set timeout 30
spawn ssh root@$ip
expect {
"(yes/no)" {send "yes\r"; exp_continue}
"password:" {send "$pass\r"}
}
expect "root@*" {send "df -h\r"}
expect "root@*" {send "exit\r"}
expect eof

sshpass 免交互登录

# 安装软件包
[root@m01 ~]# yum install -y sshpass
# 需要将密码写入命令中
[root@m01 ~]# sshpass -p 123 ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.41 # sshpass 选项
[option]
-p:指定密码
-f:从文件中取密码
-e:从环境变量中取密码
-P:设置密码提示
# 补充:ssh-keygen的使用

[option]
[-P old_passphrase ] 密码
[-f output_keyfile ] 输出的秘钥文件
[-q ] 不输出信息
[-t dsa/rsa ] 指定秘钥类型
[root@m01 ~]# ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa # 免密推送公钥的脚本
[root@m01 ~]# vim send_pud.sh
#!/bin/bash
# 基本变量
pass='123'
ip='172.16.1.'
# 生成秘钥对
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa
# 循环免密下发公钥
for i in 5 6 7 8 9 31 41 51 52 53 54 71 ;
do
sshpass -p $pass ssh-copy-id -i /root/.ssh/id_rsa.pub -o stricthostkeychecking=no root@${ip}${i}
done # 一个简单的可选择免密登录脚本
[root@m01 ~]# vim ignore_passwd.sh
#!/bin/bash
pass='123'
ip='172.16.1.' read -p '请输入需要远程连接ip最后一位: ' num sshpass -p ${pass} ssh -o stricthostkeychecking=no root@${ip}${num}

SSH 密钥认证的更多相关文章

  1. Linux之SSH密钥认证

    1.SSH协议的认识 SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层基础上的安全协议.SSH 是目前 ...

  2. 转载 :配置ssh密钥认证自动登录

    原文地址 :https://segmentfault.com/a/1190000000481249 在客户端来看,SSH提供两种级别的安全验证.[摘自wikipedia] 第一种级别(基于密码的安全验 ...

  3. [转] SSH 密钥认证机制

    使用 RSA 密钥对进行 SSH 登录验证 使用 RSA 密钥对验证 SSH 的优点是 1) 不用打密码 2) 比密码验证更安全:缺点是 1) 第一次配置的时候有点麻烦 2) 私钥需要小心保存.Any ...

  4. Mac OS X下配置远程Linux 服务器SSH密钥认证自动登录

    1. 在本地机器创建公钥 打开万能的终端,执行如下命令,无视一切输出,一路欢快地回车即可. ssh-keygen -t rsa -C 'your email@domain.com' -t 指定密钥类型 ...

  5. Mac下配置远程Linux 服务器SSH密钥认证自动登录

    1. 在本地机器创建公钥 打开万能的终端,执行如下命令,无视一切输出,一路欢快地回车即可. ssh-keygen -t rsa -C 'your email@domain.com' -t 指定密钥类型 ...

  6. SSH密钥认证添加方法和一些实用配置

    更改SSH端口号 用账号密码进入主机 sudo nano /etc/ssh/sshd-config 再其中添加Port 22等或改变该条 添加公钥到主机 cd ~ sudo mkdir .ssh 此处 ...

  7. linux ssh密钥认证, 免密码登陆

    1. 客户端生成密钥 # mkdir ~/.ssh # chmod ~/.ssh # cd ~/.ssh 生成RSA密钥 # ssh-keygen -t rsa (然后连续三次回车) 2. 把公钥传到 ...

  8. ssh密钥认证排错

    sshd配置文件没问题: 目录权限设置也没问题: 但是 ssh -vvv 提示: debug3: no such identity: /Users/user/.ssh/id_rsa,/Users/us ...

  9. 使用Putty和Xshell远程登录之密钥认证

    本次实验主要使用目前使用最多的Putty和Xshell工具进行实验 关于SSH密钥认证原理,请参考链接:http://www.cnblogs.com/ImJerryChan/p/6661815.htm ...

随机推荐

  1. Apache目录详解

    Apache的主要目录和配置文件理解 参考链接:http://httpd.apache.org/docs/2.4/misc/security_tips.html 一.Apache主要配置文件注释(演示 ...

  2. MyBatis初级实战之四:druid多数据源

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. Java编程开发之浅析Java引用机制

    对于一个Java的对象而言,存储主要分为两种,一种是内存堆(Heap),内存堆是无序的,主要用来存放创建的Java对象:一种是内存栈(Stack),主要用来存放Java引用,然后在管理过程使用Java ...

  4. 消息队列之kafka

    消息队列之activeMQ 消息队列之RabbitMQ 1.kafka介绍 kafka是由scala语言开发的一个多分区,多副本的并且居于zookeeper协调的分布式的发布-订阅消息系统.具有高吞吐 ...

  5. 同一份数据,Redis为什么要存两次

    前言 在 Redis 中,有一种数据类型,当在存储的时候会同时采用两种数据结构来进行分别存储,那么 Redis 为什么要这么做呢?这么做会造成同一份数据占用两倍空间吗? 五种基本类型之集合对象 Red ...

  6. Py-时间,随机,os,sys,jsonpickle序列化,shelve,xml模块

    内置模块 1.时间模块 第一:time.time()是时间戳 时间戳默认是 从1970年到现在过的秒数,是一个很长的数值它可以做时间的计算以及显示 第二:localtime() 获取当前的时间,按元组 ...

  7. Atlas 2.1.0 实践(3)—— Atlas集成HIve

    Atlas集成Hive 在安装好Atlas以后,如果想要使用起来,还要让Atlas与其他组件建立联系. 其中最常用的就是Hive. 通过Atlas的架构,只要配置好Hive Hook ,那么每次Hiv ...

  8. IDEA安装问题解决

    一,安装正确的jdk和idea版本 首先在控制面查看电脑位数,电脑是64位的,安装64位的jdk和idea 二.打开正常的快捷键 有两个启动项,打开对应位数的 三,权限问题 如果弹出不能加载jvm的提 ...

  9. python 11 模块

    模块 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较 ...

  10. scrapy爬虫 简单入门

    1. 使用cmd+R命令进入命令行窗口,并进入你需要创建项目的目录 cd 项目地址 2. 创建项目 scrapy startproject <项目名> cd <项目名> 例如 ...