一、SSH基本概念
1.什么时ssh
SSL(Secure Socket Layer即安全套接层)协议是Netscape Communication公司推出在网络传输层之上提供的一种基于非对称密钥和对称密钥技术的用于浏览器和Web服务器.
SSH为Secure Shell的缩写,由IETF的网络工作小组(Network Working Group)所制定;SSH为建立在应用层和传输层基础上的安全协议。在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输。确保了数据传输安全。
关于http和https
2.SSH功能:
1.提供远程连接服务器(ssh、telnet)
2.提供远程传输数据加密
3. SSH与Telnet区别
服务连接方式 | 服务数据传输 | 服务监听端口 | 服务登陆用户 |
---|---|---|---|
ssh | 加密 | 22/tcp | 默认支持root用户登录 |
telnet | 明文 | 23/tcp | 不支持root用户登录 |
4 抓包分析SSH与Telnet
1.安装
[root@localhost ~]# yum install telnet telnet-server -y
2.启动
[root@localhost ~]# systemctl start telnet.socket
3.查看端口
[root@localhost ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 536/rpcbind
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 868/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1016/master
tcp6 0 0 :::111 :::* LISTEN 536/rpcbind
tcp6 0 0 :::22 :::* LISTEN 868/sshd
tcp6 0 0 :::23 :::* LISTEN 1/systemd
tcp6 0 0 ::1:25 :::* LISTEN 1016/master
[root@localhost ~]#
4.创建tom用户(因为默认不支持root用户登录,所以创建普通用户便于下面登录)
5.下载安装wireshark抓包分析
链接:https://pan.baidu.com/s/1XCcY646SpveAIpoxzywZVg
提取码:ia4m
cmd客户端连接刚才安装telnet-server的ip 10.0.0.99,抓包追踪tcp流,发现可以看见自己输入的密码
6.改为ssh连接 ssh root@10.0.0.99重新抓包追踪tcp流
发现已经加密过了。
二、ssh客户端命令
SSH有客户端与服务端(C/S架构)
ssh|slogin远程登陆
scp远程拷贝
sftp文件传输
ssh-copy-id秘钥分发程序
1.远程登录
ssh 用户名@目标主机ip -p 端口
[d:\~]$ ssh root@10.0.0.7 666
端口默认22可以不指定,如果服务端更改了端口,需要 -p+port 形式登录。
配置文件/etc/ssh/sshd_config
2.scp远程拷贝
scp复制数据至远程主机命令(全量复制)
-P 指定端口,默认22端口可不写
-r 表示递归拷贝目录
-p 表示在拷贝文件前后保持文件或目录属性不变
-l 限制传输使用带宽(默认kb/8=MB)
推:
将本机 /tmp 下a.txt 推送到远端10.0.0.99 /tmp目录下
[root@web01 tmp]$ scp -rp a.txt root@10.0.0.99:/tmp
拉:
[root@web01 tmp]# scp -pr -P22 root@10.0.0.31:/etc/exports /tmp
#限速下载速度为1MB 1MB/s=1024kb/s=1024*8kbit/s=8192kbit/s
[root@web01 tmp]# scp -rp -l 8192 /opt/1.txt root@172.16.1.31:/tmp
1.scp通过ssh协议加密方式进行文件或目录拷贝。
2.scp连接时的用户作为为拷贝文件或目录的权限。
3.scp支持数据推送和拉取,每次都是全量拷贝,效率较低。
三、SSH远程验证方式
1. 基于密码验证
知道服务器的IP端口,账号密码,即可通过ssh客户端命令登陆远程主机。
密码太简单容易破解;密码太复杂容易忘记
2.基于秘钥验证
为了降低密码泄露的机率和提高登陆的方便性,建议使用密钥验证方式。
3. 创建密钥
在主机A上生成非对称密钥,使用-t指定密钥类型, 使用-C指定用户邮箱
ssh-keygen -t rsa -C 邮箱
# 创建密钥
[root@web01 ~]# ssh-keygen -t rsa -C web01@qq.com
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
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:
SHA256:gL0dewzpd2LStl4YSXpt4CfH//6ZY4WJEHs9exFoe4Y web01@qq.com
The key's randomart image is:
+---[RSA 2048]----+
| . |
| o .. o . |
| . o + oo..o .|
| = Xo=.Eo+ |
| . S #oB.o=.|
| B @..+ o|
| o . ...|
| . . +o|
| . .+*|
+----[SHA256]-----+
[root@web01 ~]#
4. 推送公钥到要登录的服务器
将A的公钥推送到B
ssh-copy-id [-i [identity_file]] [user@]machine
ssh-copy-id:命令
-i:指定下发公钥的路径
[user@]:以什么用户身份进行公钥分发(root),如果不输入,表示以当前系统用户身份分发公钥
*machine:下发公钥至那台服务器, 填写远程主机IP地址
[root@web01 .ssh]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.31
推送过去后默认存在文件 ~/.ssh/authorized_keys 中
5. 测试连接
[root@web01 ~]# ssh 10.0.0.31
Last login: Fri Aug 6 19:39:43 2021 from 10.0.0.7
[root@rsync-server ~]#
# 在当前bash执行对方主机上的命令(不登录对方)
[root@web01 ~]# ssh 10.0.0.31 -C "hostname -i"
fe80::20c:29ff:fe40:4989%eth1 10.0.0.31 172.16.1.31
[root@web01 ~]#
四、SSH实现跳板机
用户通过Windows/MAC/Linux客户端连接跳板机免密码登录,跳板机连接后端无外网的Linux主机实现免密登录,架构图如下。
多用户登陆一台服务器无密码
单用户登陆多台服务器免密码
1 . Windows下发密钥
1.Xshell–>选择工具->新建密钥生成向导,生成公钥对,选择下一步
2.填写秘钥名称。秘钥增加密码则不建议配置,继续即可
3.生成秘钥后,点击Xshell->工具->用户秘钥管理者->选择对应秘钥的属性–》公钥
4.选择对应秘钥的公钥,将其复制至跳板机~/.ssh/authorized_keys中,然后测试
注意新建 .ssh目录的权限700 authorized_keys的权限是600,创建的时候请注意修改。
[root@manager ~]# mkdir .ssh
[root@manager .ssh]# cd .ssh
[root@manager .ssh]# vim authorized_keys
[root@manager .ssh]# chmod 600 authorized_keys
[root@manager .ssh]# cd ..
[root@manager ~]# chmod 700 .ssh
用windows客户端登录跳板机manager(10.0.0.62)
2 Linux跳板机下发密钥给集群中的所有主机
1.在跳板机上生成公钥和私钥,下发公钥给集群中的所有主机
[root@manager .ssh]# ssh-keygen -t rsa -C manager@163.com
2.将跳板机上的公钥推送给内网所有主机
假设内网有三台主机如下:
[root@manager ~]# ssh-copy-id -i .ssh/id_rsa.pub root@172.16.1.32
[root@manager ~]# ssh-copy-id -i .ssh/id_rsa.pub root@172.16.1.31
[root@manager ~]# ssh-copy-id -i .ssh/id_rsa.pub root@172.16.1.7
3.禁止所有内网主机公网,尝试windos先免密登录跳板机,再用跳板机登录任意一台内网主机
[root@manager ~]# ssh 172.16.1.31
Last login: Fri Aug 6 19:44:59 2021 from 10.0.0.7
[root@rsync-server ~]# exit
logout
Connection to 172.16.1.31 closed.
You have new mail in /var/spool/mail/root
[root@manager ~]# ssh 172.16.1.32
Last login: Fri Aug 6 08:52:00 2021 from 10.0.0.1
[root@nfs ~]# exit
logout
Connection to 172.16.1.32 closed.
[root@manager ~]# ssh 172.16.1.7
Last login: Fri Aug 6 18:01:27 2021
[root@web01 ~]#
3. Teleport 堡垒机
此前的ssh免密虽然可以实现跳板,但是他有很多的缺陷:
1.无法知道有多少后端主机可以免密连接
2.没有审计功能(无法知道用户登陆上来操作了什么)
3.没有很好的权限管理机制(无法为不同的用户分配不同的主机)
所以我们可以使用 teleport web界面管理的跳板机来解决ssh的不足。
在使用teleport之前,我们需要完成此前免密的环境搭建,因为teleport是基于此前免密的的环境基础之上实现,只不过新增了权限管理、主机管理、用户管理等功能。
Teleport官网请戳我
安装文档请戳我
用windows下载完成后上传到服务器,解压
[root@manager ~]# tar -xf teleport-server-linux-x64-3.2.2.tar.gz
[root@manager ~]# cd teleport-server-linux-x64-3.2.2
[root@manager teleport-server-linux-x64-3.2.2]# ./setup.sh # 执行
[root@manager teleport-server-linux-x64-3.2.2]# netstat -lntp # 监听7190端口
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:7190 0.0.0.0:* LISTEN 19184/tp_we
五、SSH基础优化
SSH作为远程连接服务,通常我们需要考虑到该服务的安全,所以需要对该服务进行安全方面的配置。
1.更改远程连接登陆的端口(对外的服务器一定要修改
2.禁止ROOT管理员直接登录
3.密码认证方式改为密钥认证
4.重要服务不使用公网IP地址(Redis\MySQL…)
5.使用防火墙限制来源IP地址
配置文件:
/etc/ssh/sshd_config
Port 6666 # 变更SSH服务远程连接端口
PermitRootLogin no # 禁止root用户直接远程登录
PasswordAuthentication no # 禁止使用密码直接远程登录
UseDNS no # 禁止ssh进行dns反向解析,影响ssh连接效率参数
GSSAPIAuthentication no # 禁止GSS认证,减少连接时产生的延迟