ssh协议
为什么使用ssh协议?
在进行传输时,会对数据进行加密,保证会话安全;telnet协议不是加密传输,在传输过程中如果被抓包,就会造成信息泄露,telnet默认不支持root远程。
# 常用协议端口 ftp 21 ssh 22 telnet 23 # 不支持root登陆 rsync 873 rdp 3389
ssh的相关命令
# 1、ssh远程登陆 ssh username@IP -p portnumber username 表示的是用户名 -p 指定端口 IP 表示的是远程主机的IP # 2、scp文件传输 scp local_file username@IP:/dir
ssh免密登陆
原理
SSH免秘钥登录 就是避免了主机之间ssh需要输用户名和密码这一步。
- 公钥(id_dsa.pub)
- 私钥(id_dsa)
- 授权列表文件(authorized_keys)
实现方法:以A B两台机器为例
1.A机器分别生成各自的公钥(id_dsa.pub)+私钥(id_dsa),使用ssh-keygen命令,rsa|dsa两种加密方法,任意选一个。
ssh-keygen 然后全部默认回车;在 ~/.ssh目录下查看生成了 id_dsa.pub+id_dsa
2.将A的公钥内容添加到B机器的授权列表文件(authorized_keys)
ssh-copy-id -i /root/.ssh/id_rsa.pub root@B机器的IP
AB机器ssh免秘钥互相登录啦
登录原理过程:以A机器ssh登录B机器为例。
1.A向B发送登录请求
2.B 在自己的授权列表文件中查看是否有A的公钥;没有则拒绝A登录
3.B中有A公钥,则B随机生成一个字符串,并用A的公钥进行加密,发送给A
4.A 收到加密后的字符串,用自己的私钥进行解密,得到原始字符串,返回给B
5.B 对比字符串,如果一致就授权A登录。 A登录B 成功。
实现过程
- 客户机(跳板机)----私钥 id_rsa
- 服务端------公钥 id_rsa.pub
# 1、创建密钥对 [root@web02 ~]# ssh-keygen -t 指定加密算法 dsa rsa两种算法 # 2、发送公钥(需要知道root密码) [root@web02 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.7 -i 指定公钥 # 2-1 发送公钥(不需要知道root密码) 1、客户端查看公钥 [root@web02 ~]# cat /root/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD+xIvwrNgftG9mVbeTh+iTn4eCheCl4W54yoTurEGBqbVy9iUu1BeN3sc4KmFtAaY8PpvJab4SJnzSwTrrPyq/SZPCMP0jhYfnmFu3YyMFAfF2U3qzuvuJ4HZ20U2dCcCZLbGQxUfFO4tiUkt9fMeORL3G4sas3ENRni6Iq8vLx1auzSaI2XYXEWL0hA2OoeC6V79z/tTfolvY8xKSIatIsMc0GiC5gzDfxWgW1KekU15nFrkai//XPVumDLTprlUHkoI2M5GFm0IcImKzjg2ymMWSrnJCR/WBYNTF6j16DFpN9WLPKxHEOVDdSwS6/aRyc43+vjf5/041NxJoO25n root@web02 2、客户端创建认证目录 mkdir /root/.ssh 3、把公钥复制到服务端 vi /root/.ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD+xIvwrNgftG9mVbeTh+iTn4eCheCl4W54yoTurEGBqbVy9iUu1BeN3sc4KmFtAaY8PpvJab4SJnzSwTrrPyq/SZPCMP0jhYfnmFu3YyMFAfF2U3qzuvuJ4HZ20U2dCcCZLbGQxUfFO4tiUkt9fMeORL3G4sas3ENRni6Iq8vLx1auzSaI2XYXEWL0hA2OoeC6V79z/tTfolvY8xKSIatIsMc0GiC5gzDfxWgW1KekU15nFrkai//XPVumDLTprlUHkoI2M5GFm0IcImKzjg2ymMWSrnJCR/WBYNTF6j16DFpN9WLPKxHEOVDdSwS6/aRyc43+vjf5/041NxJoO25n root@web02 4、授权 chmod 700 /root/.ssh/ chmod 600 /root/.ssh/authorized_keys
生产场景案例
# 1、创建密钥 [root@m01 ~]# ssh-keygen # 2、分发公钥 [root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.7 [root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.8 [root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.31 [root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.41 # 3、在跳板机上编辑脚本 [root@m01 ~]# vi jump_server.sh #!/bin/bash web01="172.16.1.7" web02="172.16.1.8" nfs="172.16.1.31" backup="172.16.1.41" m01="172.16.1.61" cat<EOF +-------------------------+ | 1) web01 | | 2) web02 | | 3) nfs | | 4) backup | | h) help | +-------------------------+ EOF read -p 'Please input Number:' num if [ $num -eq 1 ];then ssh root@web01 elif [ $num -eq 2 ];then ssh root@web02 elif [ $num -eq 3 ];then ssh root@nfs elif [ $num -eq 4 ];then ssh root@backup fi
ssh安全优化
[root@web01 ~]# vi /etc/ssh/sshd_config Port 6666 # 变更SSH服务远程连接端口 PermitRootLogin no # 禁止root用户直接远程登录 PasswordAuthentication no # 禁止使用密码直接远程登录 # 这两个可以减少ssh的延迟尤其是在使用ansible的时候 UseDNS no # 禁止ssh进行dns反向解析,影响ssh连接效率参数 GSSAPIAuthentication no # 禁止GSS认证,减少连接时产生的延迟 # 在企业中需要优化的内容: 安全方面的优化: ssh 端口 不允许root登陆 禁止使用密码登陆 性能方面的优化: 不使用dns反向解析 不使用gss的认证 systemctl restart sshd
expect免交互
[root@web01 ~]# yum -y install expect [root@web01 ~]# vi expect.ext #!/usr/bin/expect set ip 10.0.0.31 set pass 1 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 -y install sshpass [root@m01 ~]# sshpass -p 1 ssh -o stricthostkeychecking=no root@10.0.0.31 -p # 指定密码