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 ...
随机推荐
- SGA: allocation forcing component growth分析
1.问题现象 20年12月31日,数据库应用人员反映2020-12-31 12:40:10存在告警,过了几分钟之后业务恢复正常. 表现的状态:Connect to database time out, ...
- 全球城市ZoneId和UTC时间偏移量的最全对照表
前言 你好,我是A哥(YourBatman). 如你所知,现行的世界标准时间是UTC世界协调时,时区已不直接参与时间计算.但是呢,城市名称or时区是人们所能记忆和容易沟通的名词,因此我们迫切需要一个对 ...
- jenkins Windows下自动化部署.netcore
(1) 安装java-sdk (Jdk5-11)不用配置环境变量 https://www.oracle.com/java/technologies/javase/javase-jdk8-downloa ...
- APM调用链产品对比
APM调用链产品对比 随着企业经营规模的扩大,以及对内快速诊断效率和对外SLA(服务品质协议,service-level agreement)的追求,对于业务系统的掌控度的要求越来越高,主要体现在: ...
- Spring之 IOC&依赖注入
0x01.Spring 1什么是Spring Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的(解耦). 框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组 ...
- 前端面试之HTML5的新变化
前端面试之HTML5的新变化 H5新增语义化标签 头部标签 <header> :头部标签 <nav> :导航标签 <article> :内容标签 <secti ...
- 一文打尽 Linux/Windows端口复用实战
出品|MS08067实验室(www.ms08067.com) 本文作者:Spark(Ms08067内网安全小组成员) 定义:端口复用是指不同的应用程序使用相同端口进行通讯. 场景:内网渗透中,搭建隧道 ...
- MySQL高可用HA——keepalived配置
0. Keepalived介绍 Keepalived是基于VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)协议的一款高可用软件.Keepaili ...
- 2、剑指offer-字符串——替换空格
**题目描述** **请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. ...
- 【PC Basic】CPU、核、多线程的那些事儿
一.CPU与核的概念 1.半导体中名词[Wafer][Chip][Die]中文名字和用途 Wafer--晶圆 wafer 即为图片所示的晶圆,由纯硅(Si)构成.一般分为6英寸.8英寸.12英寸规格不 ...