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