ssh密钥认证

1、SSH协议的认识

SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UXLinuxAIXSolarisDigital UNIXIrix,以及其他平台,都可运行SSH。

2、通过SSH管理远程服务器

通过SSH协议,用户可以通过终端机访问和使用远程linux服务器,ssh的端口为22。但每次进行连接都要输入密码。如果管理几台到十几台集群,那可以应付的的过来。如果集群增加了几百,上千台。那么使用SSH管理起来就不方便了。所以SSH有没有更简便的方法呢?有的,在linux集群中,由一台管理机通过SSH管理其它的远程linux服务器,这种方法被称为SSH密钥认证管理服务器。

3、ssh软件扩展安装

1. 是否存在命令

rpm -qa | grep ssh


2. 安装scp,查询scp属于哪个软件包

rpm -qf 'which scp'


3. 列出包文件

rpm -ql openssh-clients

 

###### openssh 客户端命令

scp 远程复制

scp /etc/hosts 172.16.1.41:/tmp/  ##远程复制文件
scp -r /etc/sysconfig/ 172.16.1.41:/tmp/   ##远程复制目录
scp -r /etc/sysconfig/ test@172.16.1.41:/tmp/   ##指定test用户复制
scp -r -P 22 /etc/sysconfig/ test@172.16.1.41:/tmp/   ##-P指定端口复制

注意:

想把/etc/hosts/文件复制到172.16.1.41服务的/tmp目录下并以test用户的身份

①、确认/etc/hosts的文件权限

②、/tmp目录下是否已经存在hosts(root root),且权限是root

 

ssh远程连接

ssh  172.16.1.41     ##默认当前用户远程登陆  
ssh test@172.16.1.41      ##指定用户连接
ssh test@172.16.1.41  ls     ## 远程连接执行命令
ssh -p22 test@172.16.1.41 whoami       ##-p指定端口

 

sftp----xftp

sftp 172.16.1.41     ##进度sftp界面,help查看帮助
put /etc/hosts /mnt       ##上传hosts文件到远程的mnt目录下
ls -l /mnt        ###查看远程连接机器的目录
get /etc/hosts /tmp       ##下载到本地tmp目录下
lls -l /tmp       ##查看本地tmp目录
xftp:Windows与Linux传输

###### ssh配置文件

cat /etc/ssh/sshd_config  

port   ##修改ssh服务端口,默认22
PermitEmptyPasswords no  ##是否允许空密码登录
PermitRootLogin yes   ##是否允许root用户远程登录(为了安全改为no)
UseDNS no   ##对远程主机名进行反向解析,造成连接慢(改为no)
GSSAPIAuthentication yes   ##是否允许使用基于 GSSAPI 的用户认证,改成no
ListenAddress  172.16.1.41 ##监听地址,本地已有的具体地址
如果修改了配置文件,记得reload一下ssh服务

ListenAddress 示意图(ssh监听地址)

注意:监听本地已有的IP地址

 

 查看本地的监听端口

ss -lntup | grep ssh

 

###### 问题:

* 给出22端口,如何命令查出对应的服务

lsof -i:22
ss -lntup | grep 22
netstat
nmap -p22 10.0.0.3
nmap -p1-1024 10.0.0.3  ##找出一个范围的端口
nmap -p1-1024 10.0.0.0/24  ##找出一个网段所有开启的端口
nc 10.0.0.3 22 
telnet

* 给出进程的名字,找出对应的端口

ss -lntup | grep sshd

 

#### ssh key 秘钥认证过程(钥匙锁头认证的过程)

4、密钥认证部署过程

客户端生成公钥和私钥发送公钥给服务端

1. 创建密钥对

ssh-keygen -t dsa     ##不加密码就一直回车
ssh-keygen -t rsa

 

2. 把公钥传送到对应的服务端

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

 

3. 测试免密登录

ssh 172.16.1.41 hostname

ssh 172.16.1.41 "cat /root/.ssh/authorized_keys"  ##服务端查看客户端发送的公钥


4.多秘钥

ssh-keygen -t dsa  -f /root/.ssh/id_dsa -P ""    ##指定秘钥生成位置,指定空秘钥密码

ssh-keygen -t dsa  -f /root/.ssh/id_dsa -P "" >/dev/null 2>&1

 

实际遇到情况:

[root@localhost script]# ansible client -a 'uptim'
172.16.1.10 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,                                                                               gssapi-keyex,gssapi-with-mic,password).",
    "unreachable": true
}

操作:

ansible端生成密钥对
ssh-keygen -t rsa

发送公钥给客户机
ssh-copy-id -i /root/.ssh/id_rsa.pub 172.16.1.10

测试
[root@localhost ~]# ansible client -m ping
172.16.1.10 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

 

5、ssh密钥认证进化非交互式生成密钥对:

1. 传输秘钥使用sshpass(免密登陆工具)

rpm -qa sshpass    ##查询是否安装
yum -y install sshpass     ##epel源里,ansible也自带这个命令
sshpass -p123456 ssh 172.16.1.41 ls  ##测试 (-p123456 是root密码)
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.41    ##传输秘钥

2. 免密登录

sshpass -p123456 ssh-copy-id -i  /root/.ssh/id_dsa.pub  "ssh -o StrictHostKeyChecking=no 172.16.1.8 "  
##-o临时不输入yes/no不进行身份验证,简便传输秘钥到其他机器

sshpass -p123456 ssh-copy-id -i  /root/.ssh/id_dsa.pub  "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null 172.16.1.8 "  ##更完整 

sshpass -p123456 ssh 172.16.1.8 ls

报错:

/usr/bin/ssh-copy-id: ERROR: ssh: Could not resolve hostname ssh -o stricthostkeychecking=no 192.168.24.130 : Name or service not known

注:虚拟机中由于报这个域名解析不成功错误

sshpass -p123.com ssh-copy-id -i /root/.ssh/id_dsa.pub 192.168.24.130 ##只有这个可以(130是服务端)

 

 总结

1. sshpass 给ssh相关的软件提供密码

2. yes/no 主机的身份验证,显示你链接的服务器信息,问问你是否认识

 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null

3. ssh-copy-id 执行过程

 4.想要对哪台机器进行操作,就把自己的公钥传输给那台机器

 

【了解】ssh-copy-id的执行过程

ssh "$@" "exec sh -c 'cd ; umask 077 ; mkdir -p .ssh && cat >> .ssh/authorized_keys || exit 1 ; if type restorecon >/dev/null 2>&1 ; then restorecon -F .ssh .ssh/authorized_keys ; fi'" \

      || exit 1

1、临时设置了umask 077

2、看目标服务器是否存在 ~/.ssh 目录

3、如果目录不存在,则创建mkdir ~/.ssh 700

4、把id_dsa.pub内容,放到了~/.ssh/authorized_keys 存放公钥的文件600

=============================================================================批量免密登陆(没有验证)

sshpass + ssh-copy-id 进行批量互信

1.新建文件保存主机信息

包含主机的IP、端口、密码

cat hostsname.txt

10.2.3.42 22 dddddd

10.2.3.43 22 dddddd

10.2.3.44 22 dddddd

 

####注意:提前在/etc/ssh/ssh_config添加

StrictHostKeyChecking=no

 

 

2、脚本:

cat copy_ssh_id.sh

#!/usr/bin/env bash
cat hostsname.txt | while read hostname ipaddr  passwd
do
sshpass -p $passwd ssh-copy-id $ipaddr
done

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值