37.day05--ssh远程协议
1.SSH基本概述
SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输。确保了数据传输安全。
1.提供远程连接服务器的服务、2.对传输的数据进行加密
远程连接: ssh telnet RDP(Windows) MAc--RDP-->Windows
ssh 主要是提供给服务器使用(Linux) 安全 数据包都是加密的 22/tcp
telnet 主要是提供给路由器\交换机\防火墙 明文 数据包不进行加密 23/tcp
必须要记下来的............
面试题: 请说说如下服务都是那些端口运行的?
ftp 20/tcp 21/tcp
http 80/tcp
https 443/tcp
ssh 22/tcp
telnet 23/tcp
dns ......... 53/tcp 53/udp
面试题: 请说说如下端口都代表那些服务?
80 443 22 3306 9000 10050 10051
验证 ssh 与 telnet 的区别?
1.安装telnet服务
[root@nfs ~]# yum install telnet-server -y
2.启动telnet服务
[root@nfs ~]# systemctl start telnet.socket
3.准备普通用户进行远程链接测试 (开启抓包工具)
[root@nfs ~]# useradd oldboy
[root@nfs ~]# echo "1" | passwd --stdin oldboy
telnet验证结果:
1.不支持root直接登录
2.所有的传递的数据都是明文
ssh验证结果:
1.支持root直接登录
2.所有传递的数据都是密文
2.SSH相关命令 scp
ssh客户端命令: 远程连接
[root@nfs ~]# ssh 172.16.1.41 #当前客户端是root,则登录的服务端也使用root
[oldboy@nfs ~]$ ssh root@172.16.1.41 #链接对端服务器,并写上链接服务器的用户身份
[root@nfs ~]# ssh -p22 root@172.16.1.41 #链接服务器,指定用户,并指定端口
[root@nfs ~]# ssh -p2222 root@172.16.1.41
ssh: connect to host 172.16.1.41 port 2222: Connection refused
sftp客户端命令: 文件传输
命令:
图形界面: xftp FileZilla
xftp:
1.能上传文件夹
2.能支持断点续传
3.能支持上传大于4个G的文件
rz:
1.只能上传小于4G的文件
2.不支持断点续传
3.不能传文件夹
scp客户端命令: 远程拷贝
scp--->rsync 都是用来远程拷贝
scp是全量
rsync是增量
scp 支持数据的推送和拉取 windows也有scp工具 winscp
推送文件
[root@nfs ~]# scp 12312321 root@172.16.1.41:/root
root@172.16.1.41's password:
12312321 100% 49 44.2KB/s 00:00
拉取文件
[root@nfs ~]# scp root@172.16.1.41:/root/2 ./
root@172.16.1.41's password:
2 100% 4 0.5KB/s 00:00
推送目录
[root@nfs ~]# scp -rp /etc root@172.16.1.41:/root
大量的小文件传输
real 0m59.852s
user 0m9.821s
sys 0m21.730s
打包之后的效果对比
real 0m7.654s
user 0m0.040s
sys 0m0.065s
限速 -l 单位是kb-->KB-->
[root@nfs ~]# dd if=/dev/zero of=/root/file bs=1M count=500
传输的速度 74MB/s 占用实际带宽 1000兆带宽
[root@nfs ~]# scp file 172.16.1.41:/root
root@172.16.1.41's password:
file 100% 500MB 74.0MB/s 00:06
80960kb/8KB/1024=10MB/s 占用实际带宽 100兆 带宽
[root@nfs ~]# scp -l 80960 file 172.16.1.41:/root
root@172.16.1.41's password:
file 100% 500MB 10.0MB/s 00:50
占用10兆带宽-->实际的传输速度1MB-->scp具体换算的单位 8000
[root@nfs ~]# scp -l 8000 file 172.16.1.41:/root
root@172.16.1.41's password:
file 10% 52MB 1.0MB/s 07:22 ETA
安全: 效率就低
性能: 安全就差
3.SSH验证方式
方法一: 用户和密码
知道服务器的IP端口,账号密码,即可通过ssh客户端命令登陆远程主机。
ssh -p22 root@10.0.0.61
root用户
root密码
简单: 简单容易被破解
复杂: 复杂又记不住
密码不要设定为一样:
密码三个月更换一次: lastpass 1passwd keepass
人 ---> 道德层面---->
方式二: 秘钥 ( 锁 钥匙 )
降低密码泄露的机率和提高登陆的方便性,建议使用密钥验证方式。
1.在 管理机 生成一对秘钥 ssh-keygen
[root@m01 ~]# ssh-keygen -C xuliangwei@qq.com
[root@m01 ~]# ll ~/.ssh/
总用量 12
-rw-------. 1 root root 1679 5月 24 19:16 id_rsa #私钥 生活中,钥匙
-rw-r--r--. 1 root root 399 5月 24 19:16 id_rsa.pub #公钥 生活中,锁
2.在 管理机 上下发公钥给 nfs服务端 (锁 公钥)
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.31
root@172.16.1.31's password: #输入需要连接的主机密码
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@172.16.1.31'"
- 管理机 通过ssh命令连接nfs服务器,如果能实现免密码登陆则ok (钥匙 私钥)
[root@m01 ~]# ssh 'root@172.16.1.31'
Last login: Fri May 24 19:24:58 2019 from 172.16.1.61
[root@nfs ~]#
4.将ssh登陆主机的信息放入一个文件,当我执行文件时就自动的链接到该主机了.....
5.将从WIndows下复制好的公钥粘贴至跳板机~/.ssh/authorized_keys中,然后测试
[root@m01 ~]# cd ; umask 077; mkdir -p .ssh ; cd .ssh
[root@m01 .ssh]# vim authorized_keys #添加windows公钥
塞key
我: 公钥信息........
你: 公网IP Port root
扩展:
1.测试链接无需密码
[root@m01 ~]# ssh root@172.16.1.31
[root@nfs ~]#
2.可以不登录对端主机,执行命令
[root@m01 ~]# ssh root@172.16.1.31 "ifconfig eth1"
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.1.31 netmask 255.255.255.0 broadcast 172.16.1.255
3.使用scp也无需密码
[root@m01 ~]# scp oldboy root@172.16.1.31:/tmp
oldboy 100% 26 1.9KB/s 00:00
4.ssh密码+ Google Authenticator 实现双向认证
简单来说,就是当用户通过ssh登陆系统时,先输入google的随机验证码,然后在输入服务器的ssh密码
[root@m01 ~]# yum -y install wget gcc make pam-devel libpng-devel pam-devel autoconf automake libtool
[root@m01 ~]# cat ~/.google_authenticator
SKVOCWN23G7AAPSVEDOMWX4H74
" RATE_LIMIT 3 30 1558709812
" WINDOW_SIZE 17
" HOTP_COUNTER 4
47386284
70612256
80548411
83234725
68105428
5.SSH安全优化
SSH作为远程连接服务,通常我们需要考虑到该服务的安全,所以需要对该服务进行安全方面的配置。
1.更改远程连接登陆的端口
2.禁止ROOT管理员直接登录 --普通用户--sudo提权 || 普通用户 --- su - root
3.密码认证方式改为密钥认证
4.重要服务不使用公网IP地址 ( 跳板机 | [ 防火墙 | 负载均衡 ] )
SSH服务登录防护需进行如下配置调整,先对如下参数进行了解
Port 6666 # 修改sshd服务监听的端口
PermitRootLogin no # no代表禁止root用户直接远程连接
PasswordAuthentication no # no代表禁止使用密码的方式连接
UseDNS no # 禁止ssh进行dns反向解析,影响ssh连接效率参数
GSSAPIAuthentication no # 禁止GSS认证,减少连接时产生的延迟
将如下具体配置添加至/etc/ssh/sshd_config文件中,参数需根据实际情况进行调整
SSH###
Port 6666
PasswordAuthentication no
PermitRootLogin no
GSSAPIAuthentication no
UseDNS no
END###
Port 6666 #减少被扫描到的几率
PermitRootLogin no #禁止root直接通过远程连接
PasswordAuthentication no #禁止所有用户使用密码远程连接
变更端口为6666,防止别人轻易的被扫描.
root用户无法通过密码登录,也无法通过秘钥登录,总之就是不行.
普通用户仅能通过秘钥登录,无法通过密码登录.
ssh-keygen生成秘钥非交互,注意,如果存在则会提示是否覆盖.
ssh-keygen -P "" -f ~/.ssh/id_rsa
6.SSH安全防护
fail2ban可以监控系统日志,并且根据一定规则匹配异常IP后使用Firewalld将其屏蔽,尤其是针对一些爆破/扫描等非常有效。
1.开启Firewalld防火墙
[root@bgx ~]# systemctl start firewalld
[root@bgx ~]# systemctl enable firewalld
[root@bgx ~]# firewall-cmd --state
running
2.修改firewalld规则,启用Firewalld后会禁止一些服务的传输,但默认会放行常用的22端口, 如果想添加更多,以下是放行SSH端口(22)示例,供参考:
#放行SSHD服务端口
[root@bgx ~]# firewall-cmd --permanent --add-service=ssh --add-service=http
#重载配置
[root@bgx ~]# firewall-cmd --reload
#查看已放行端口
[root@bgx ~]# firewall-cmd --list-service
3.安装fail2ban,需要有epel
[root@bgx ~]# yum install fail2ban fail2ban-firewalld mailx -y
4.配置fail2ban规则.local会覆盖.conf文件
[root@bgx fail2ban]# cat /etc/fail2ban/jail.local
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 86400
findtime = 600
maxretry = 5
banaction = firewallcmd-ipset
action = %(action_mwl)s
[sshd]
enabled = true
filter = sshd
port = 22
action = %(action_mwl)s
logpath = /var/log/secure
5.启动服务,并检查状态
[root@bgx ~]# systemctl start fail2ban.service
[root@bgx ~]# fail2ban-client status sshd
6.清除被封掉的IP地址
[root@bgx ~]# fail2ban-client set sshd unbanip 10.0.0.1
7.如果有ssh秘钥无法正常连接的情况,可以尝试使用如下的调试模式.开启ssh debug调试模式。
(1)31服务器上开启临时ssh服务 /usr/sbin/sshd -p 10001 -d
(2)61服务器上访问 ssh -vvv -p 10001 root@10.0.0.31
(3)31服务器上查看debug日志,发现身份验证被拒绝,目录的所有权错误。
Authentication refused: bad ownership or modes for directory /root