SSH 密钥认证
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 密钥认证的更多相关文章
- Linux之SSH密钥认证
1.SSH协议的认识 SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层基础上的安全协议.SSH 是目前 ...
- 转载 :配置ssh密钥认证自动登录
原文地址 :https://segmentfault.com/a/1190000000481249 在客户端来看,SSH提供两种级别的安全验证.[摘自wikipedia] 第一种级别(基于密码的安全验 ...
- [转] SSH 密钥认证机制
使用 RSA 密钥对进行 SSH 登录验证 使用 RSA 密钥对验证 SSH 的优点是 1) 不用打密码 2) 比密码验证更安全:缺点是 1) 第一次配置的时候有点麻烦 2) 私钥需要小心保存.Any ...
- Mac OS X下配置远程Linux 服务器SSH密钥认证自动登录
1. 在本地机器创建公钥 打开万能的终端,执行如下命令,无视一切输出,一路欢快地回车即可. ssh-keygen -t rsa -C 'your email@domain.com' -t 指定密钥类型 ...
- Mac下配置远程Linux 服务器SSH密钥认证自动登录
1. 在本地机器创建公钥 打开万能的终端,执行如下命令,无视一切输出,一路欢快地回车即可. ssh-keygen -t rsa -C 'your email@domain.com' -t 指定密钥类型 ...
- SSH密钥认证添加方法和一些实用配置
更改SSH端口号 用账号密码进入主机 sudo nano /etc/ssh/sshd-config 再其中添加Port 22等或改变该条 添加公钥到主机 cd ~ sudo mkdir .ssh 此处 ...
- linux ssh密钥认证, 免密码登陆
1. 客户端生成密钥 # mkdir ~/.ssh # chmod ~/.ssh # cd ~/.ssh 生成RSA密钥 # ssh-keygen -t rsa (然后连续三次回车) 2. 把公钥传到 ...
- ssh密钥认证排错
sshd配置文件没问题: 目录权限设置也没问题: 但是 ssh -vvv 提示: debug3: no such identity: /Users/user/.ssh/id_rsa,/Users/us ...
- 使用Putty和Xshell远程登录之密钥认证
本次实验主要使用目前使用最多的Putty和Xshell工具进行实验 关于SSH密钥认证原理,请参考链接:http://www.cnblogs.com/ImJerryChan/p/6661815.htm ...
随机推荐
- Objects as Points:预测目标中心,无需NMS等后处理操作 | CVPR 2019
论文基于关键点预测网络提出CenterNet算法,将检测目标视为关键点,先找到目标的中心点,然后回归其尺寸.对比上一篇同名的CenterNet算法,本文的算法更简洁且性能足够强大,不需要NMS等后处理 ...
- Upload - Labs (上)
Pass - 01: 1.尝试上传一个php文件:aaa.php,发现只允许上传某些图片类型,用bp抓包,发现http请求都没通过burp就弹出了不允许上传的提示框,这表明验证点在前端,而不在服务端 ...
- MyBatis初级实战之四:druid多数据源
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- LVM 逻辑卷扩容
当lv空间不够用时,就需要我们对lv进行的扩容. 扩容分两种情况:(lv的有点,支持在线扩容) VG有充足的空间,可直接对LV进行扩容: VG空间不足,需要先对VG进行扩容,然后再对LV进行扩容 这里 ...
- 六个你不知道的PR快捷键,拯救你的剪辑效率
5G时代到来,会剪辑视频的人,无论在校园还是未来步入职场都很吃香.对于普通人来说,视频处理也成为了一个通用技能.PR是我们大多数人剪辑中,经常会用到的剪辑工具,之前的文章中已经给大家总结了pr的一些提 ...
- 并发编程之fork/join(分而治之)
1.什么是分而治之 分而治之就是将一个大任务层层拆分成一个个的小任务,直到不可拆分,拆分依据定义的阈值划分任务规模. fork/join通过fork将大任务拆分成小任务,在将小任务的结果join汇总 ...
- 【Android初级】如何动态添加菜单项(附源码+避坑)
我们平时在开发过程中,为了灵活多变,除了使用静态的菜单,还有动态添加菜单的需求.今天要分享的功能如下: 在界面的右上角有个更多选项,点开后,有两个子菜单:关于和退出 点击"关于", ...
- TCP为什么要三次握手与四次分手?
TCP协议简介 TCP协议是五层协议中运输层的协议,下面依赖网络层.链路层.物理层,对于一个报文想发到另一台机器(假设是服务器)上对等层,每一个所依赖的层都会对报文进行包装,例如TCP协议就依赖网络层 ...
- ubuntu 14.04下安装 mysql-workbench
直接在命令行下运行下面命令: sudo apt-get install mysql-workbench 安装完,都可以在Dash中找到 "mysql" 就点击应用打开. 在data ...
- Infrastructure as Code 行为驱动开发指南 https://www.ibm.com/developerworks/cn/devops/d-bbd-guide-iac/index.html
Infrastructure as Code 行为驱动开发指南 https://www.ibm.com/developerworks/cn/devops/d-bbd-guide-iac/index.h ...