目录
一、SSH服务介绍
1、SSH协议是什么?
SSH (Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功能。
SSH协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令,SSH为建
立在应用层和传输层基础上的安全协议。对数据进行压缩,加快传输速度。
远程管理Linux系统基本上都要使用到ssh,因为:telnet、FTP等传输方式是以明文传送用户认证信息,本质上是不安全的。SSH(Secure Shell)目前较可靠,是专为远程登录会话和其他忘了服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题,透过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。
2、SSH的优点
- 数据传输是加密的,可以防止信息泄漏
- 数据传输是压缩的,可以提高传输速度
3、SSH的客户端与服务端
客户端
- Linux 客户端: ssh, scp, sftp,slogin
- Windows 客户端:xshell, MobaXterm,putty, securecrt, ssh secure shell client
- SSH客户端的配置文件:
/etc/ssh/ssh_config
服务端
- SSH服务端:OpenSSH (开源)
- ssh服务端主要包括两个服务功能:ssh远程连接和sftp服务(文件传输功能)
4、SSH的原理
4.1 公钥首次连接原理
- 客户端发起链接请求
- 服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
- 客户端生成密钥对
- 客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
- 客户端发送加密后的值到服务端,服务端用私钥解密,得到Res
- 服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)
- 最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密
4.2 ssh远程登录
每次使用sshd登录到其他主机,双方都会生成一个文件known_hosts把对方主机的公钥在.ssh/known_hosts文件里。
格式:
ssh [选项] zhangsan@192.168.80.77 #指定登录用户、目标主机地址作为参数
ssh -p 20 zhangsan@192.168.80.77 #-p为指定端口
当用户第一次登录SSH服务器时,必须接受服务器发来的RSA密钥(需要根据提示输入:yes)后才能继续验证,接受的密钥信息将保存到~/.ssh/known_hosts
文件中,密码验证成功以后,就登录到目标服务器的命令行环境中了。如下:
The authenticity of host '192.168.79.130 (192.168.79.130)' can't be established.
ECDSA key fingerprint is SHA256:sRKz60ZIwaIjOXejXaNdZp69M/aygMdkunCMR7a3u+4.
ECDSA key fingerprint is MD5:be:42:dd:a7:be:d9:96:f3:9d:8a:0c:20:b6:65:c9:2e.
Are you sure you want to continue connecting (yes/no)? yes #接受密钥
root@192.168.79.130's password: #输入密码
如果sshd服务器使用了非默认的端口号(如:1234),则在登录时必须通过-p选项指定端口号
4.3 实例:使用ssh远程登录的简单案例
二、OpenSSH服务器
1、OpenSSH简介
- 服务名称:sshd(服务默认使用的是TCP的22端口)
- 服务端主程序:/usr/sbin/sshd
- 服务端配置文件:/etc/ssh/sshd_config
- 客户端配置文件:/etc/ssh/ssh.config
Centos 7系统默认已安装openssh相关软件包,并将sshd 服务添加为开机自启动。
SSHD作用:SSHD服务使用SSH协议可以用来进行远程控制,或在计算机之间传输文件。
相比较之前的telnet方式传输文件要安全很多,因为telnet使用明文传输,SSH是加密传输。
2、配置OpenSSH服务端
vim /etc/ssh/sshd_config #服务端配置文件
#Port 22 #监端口为22
#AddressFamily any #监听地址为任意网卡,也可以指定Openssh服务器的具体ip
#LoginGraceTime 2m #登录验证时间为2分钟
#PermitRootLogin yes #禁止root用户登录
#MaxAuthTries 6 #最大重试次数为 6
#PermitEmptyPasswords no #禁止空密码用户登录
#UseDNS no #禁用DNS反向解析,以提高服务器的响应速度
----------------------------------------------------------------------------------
配置允许和禁止用户登录:加@表示限制ip,注意允许和禁止不要同时使用!!
AllowUsers zhangsan #允许zhangsan登录
AllowUsers zhangsan@192.168.80.80 #只允许zhangsan通过192.168.80.80登录
DenyUsers lisi #禁止lisi登录
实例:只允许zhangsang、lisi、wangwu用户登录,且其中lisi用户仅能够从IP地址为192.168.80.80的主机远程登录。
vim /etc/ssh/sshd_config #修改服务端配置文件
-------------------------------------------------------
AllowUsers zhangsan lisi@192.168.80.80 wangwu #这里为添加的配置
-------------------------------------------------------
systemctl reload sshd #修改完记得重新加载
3、SSH服务的最佳实践
- 建议使用非默认端口22
- 禁止使用protocol version 1
- 限制可登录用户(白名单)
- 设定空闲会话超时时长
- 利用防火墙设置ssh访问策略
- 仅监听特定的IP地址、公网、内网
- 基于口令认证时,使用强密码策略,比如: tr -dc A-Za-z0-9_< /dev/urandom / head -c 12| xargs
- 使用基于密钥的认证
- 禁止使用空密码
- 禁止root用户直接登录
- 限制ssh的访问频度和并发在线数
- 经常分析日志分离
三、使用SSH客户端程序
1、scp:远程安全复制
格式:
scp [-r] 其他主机的用户名@其他主机IP:原文件 目标目录
下行复制:
scp root@192.168.79.210:/etc/passwd /root/passwd123.txt
#从目标主机192.168.79.210下载passwd文件到本机并改名为passwd123.txt
上行复制:
scp -r /etc/ssh/ root@192.168.79.210:/opt
#从本机上行复制/etc/ssh/目录到192.168.79.210的/opt目录下
例如:本机IP地址为192.168.79.130,目标主机(其他主机)IP地址为192.168.79.210
下行复制:
上行复制:
2、sftp:安全ftp上载
格式:
sftp 用户名@ip
例如:本机IP地址为192.168.79.130,目标主机(其他主机)IP地址为192.168.79.210
本机操作:
目标主机(其他主机)操作:
四、实验:免密登录
客户端IP地址为192.168.79.130,服务端IP地址为192.168.79.210
1、客户端生成密钥
2、客户端将公钥发给服务端
3、登录连接
五、ssh-agent 命令
[root@localhost ~]#ssh-agent bash
[root@localhost ~]#ssh-add
Enter passphrase for /root/.ssh/id_rsa:
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
命令介绍
ssh-agent 是 OpenSSH 认证代理。
sh-agent是一个用于保存公钥认证过程中用到的私钥的程序。ssh-agent 在 X 会话或登录会话之初启动,所有其他窗口或程序则以 ssh-agent 客户端程序的身份启动。当使用 ssh 登录到其他机器时,可通过环境变量定位到代理并使用代理自动进行身份验证。
其实 ssh-agent 就是一个密钥管理器,运行 ssh-agent 以后,使用 ssh-add 将私钥交给 ssh-agent 保管,其他程序需要身份验证的时候可以将验证申请交给 ssh-agent 来完成整个认证过程。
使用不同的密钥连接到不同的主机时,需要手动指定对应的密钥。ssh-agent 可以帮助我们选择对应的密钥进行认证,不用手动指定密钥即可进行连接。
当私钥设置了密码,我们又需要频繁的使用私钥进行认证时,ssh-agent 可以帮助我们免去重复的输入密码的操作。