1、Telnet
传统的远程连接管理基本上都采用telnet,但是telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的(只能采用口令验证),就是很容易受到中间人攻击。
中间人攻击就是中间人冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传给真正的服务器。这样服务器和你之间的数据传送会被中间人做手脚,会出现很严重的安全问题。
2、SSH 简介
SSH为Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 是建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
SSH是标准的网络协议,可用于大多数UNIX操作系统,能够实现字符界面的远程登录管理,它默认使用22号端口,采用密文的形式在网络中传输数据,它将客户端与服务端之间的消息通过加密保护起来,这样就无法被窃取或篡改了。
SSH 采用了多种认证加密方式 , 解决了传输中数据加密和身份认证等问题 , 比较有效的防止网络嗅探与IP欺骗等问题。相对于通过明文传输的Telnet,具有更高的安全性。
3、SSH 服务认证类型
SSH提供了口令和密钥两种用户验证方式,这两者都是通过密文传输数据。
a. 口令认证
基于口令的安全验证就是使用服务器中系统帐号和密码进行验证,只要知道服务器的SSH连接帐号、密码、服务器IP和端口号,就可以通过ssh客户端登录到这台远程主机。要求设置密码时具有足够的复杂度才能提高安全性。
口令认证会受到中间人攻击
b. 秘钥认证
密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数,多用于网络中,用来保护个人隐私等问题,维护网络使用安全。一般来说密钥加密的方法有三种类型:对称加密、非对称加密和Hash加密。
对称加密:只使用了一个密钥进行加密解密,也可以叫做单密钥加密。它对密钥本身没有特殊的要求,通信双方只要有一个相同的密钥就行,一个用户把自己需要发送的数据通过密钥加密成混乱的信息,接受方使用相同的密钥把接受到的信息还原成原始数据,这个方法可以在极短的时间内对大量信息进行加密解密。但是如果密钥在传输过程中就被截获,那么以后的加密过程就形同虚设。这个方法的优点是使用同一个密钥节省了加密解密所需的时间,缺点是无法保证密钥的安全性。
非对称加密:在加密和解密中使用了一对密钥,一个是公用密钥,它对外公开发布,另一个是私有密钥,由用户自己保存。从理论上讲,这种加密方式只要是用户的私有密钥没有丢失或者被窃,那么他们之间加密的信息是绝对不会被破解的。但是它的缺点也非常明显,就是加密速度非常缓慢。由于要进行大量的数学运算,即使加密少量的信息也需要花费大量的时间。
Hash加密:是通过数学运算,把不同长度的信息转化到128位编码中,形成Hash值,通过比较这个数值是否正确,来确定通信双方的合法性。这也可以说是数字签名,在数据传输后,可以通过比较Hash值来判断信息途中是否被截获修改,是否由合法的发送人发送或者合法的接收人接收等。用这种方法,可以防止密钥丢失的问题,具有不可抵赖性。很适用于商业信息的传递。
基于密钥认证
- 1、为客户端创建一对密钥(公钥和私钥)
- 2、把公钥放在需要访问的SSH服务器上,私钥存放在ssh客户端。
- 3、客户端远程连接ssh服务器时,发送TCP连接请求,使用密钥进行安全验证。
- 4、服务器收到请求之后,服务器查看自己的./ssh/authorized_keys中是否有用户的公钥。如果有,服务器使用用户公钥加密一段随机字符串,并发送给客户端。
- 5、客户端使用本地的私钥解密后把解密字符串发送给服务器。
- 6、服务器对比字符串是否一致,一致则允许登录。
4、SSH 服务安装
在RHEL或CENTOS系统中,OPENSSH服务由openssh、openssh-server、openssh-clients等软件包提供(默认已经安装)。
yum list all | grep "^openssh"
a. openssh 配置信息
官方站点 | http://www.openssh.com |
服务端主程序 | /usr/sbin/sshd |
客户端程序 | /usr/bin/ssh |
服务端主配置配置文件 | /etc/ssh/sshd_config |
客户端配置文件 | /etc/ssh/ssh_config |
b. /etc/ssh/sshd_config
#Port 22 # 监听的端口(默认22),也可以使用多个Port
#ListenAddress 0.0.0.0 # 监听的IP地址(默认监听所有IP)
SyslogFacility AUTHPRIV # 当有人使用 SSH 登入系统的时候,SSH 会记录信息,这个信息要记录的类型为AUTHPRIV,日志存放目录/var/log/secure
#LogLevel INFO # 日志等级
#UseDNS yes # dns反向解析,判断客户端来源是否正常合法,设定为 no 会让联连接速度比较快
#LoginGraceTime 2m # 限制用户登录验证过程的时间(默认为2分钟)
#PermitRootLogin yes # 允许ROOT用户远程登录
PermitRootLogin without-password # 允许root在有秘钥主机登陆
#PermitEmptyPasswords no # 禁止密码为空的用户远程登录
#PubkeyAuthentication yes # 是否启用秘钥验证
#PasswordAuthentication yes # 是否启用密码验证
AuthorizedKeysFile .ssh/authorized_keys # 指定保存各用户公钥内容的数据文件位置,默认保存用户公钥信息的文件位于用户宿主目录
#PrintMotd yes # 登入后是否显示出一些信息,即打印出 /etc/motd这个文档的内容
#PrintLastLog yes # 显示上次登入的信息,如上次登入的时间、地点等
X11Forwarding yes # 是否允许用户使用 X 程序
Subsystem sftp /usr/libexec/openssh/sftp-server # 是否允许用户使用sftp
其他限制(需要在位置文件添加):
DenyUsers 用户名 # 拒绝指定用户远程登录系统,其他均允许
AllowUsers用户名 # 允许指定用户远程登录系统
AllowUsers 用户名 @ip_address # 允许指定某个账户来自指定的IP登录
c. 添加ssh登录信息
echo 'Warning! From now on,all of your operation has been record!' > /etc/motd
5、SSH_Client 远程连接
通过ssh命令可以远程登录sshd服务,为用户提供一个安全的shell环境,以便对服务器进行管理和维护。
a. ssh 命令
- 描述:远程登录
- 语法:ssh 用户名@服务器地址
-p 指定sshd服务端口
# 方式1:
ssh 用户名@服务器地址
#方式2:
ssh -l 用户名 服务器地址
#方式3: 缺省时会尝试以当前的本地用户名进行登录
ssh 服务器地址
当用户第一次使用SSH连接到ssh服务器时,必须接受服务器发来的公钥(根据提示输入yes)后才能继续验证。接收的公钥信息将保存到~/.ssh/known_hosts文件中
# 查看公钥信息
cat ~/.ssh/known_hosts
b. sshd 访问控制列表
/etc/hosts.allow和/etc/hosts.deny是tcpd服务器的配置文件,tcpd服务器可以控制外部IP对本机服务的访问。
/etc/hosts.allow
sshd:192.168.137.252:allow #允许 192.168.137.252 ip连接sshd服务
# sshd:192.168.137.*:allow #允许 192.168.137.0 网段连接sshd服务
/etc/hosts.deny
sshd:all:deny # 拒绝了所有sshd远程连接,:deny可以省略
- 当 hosts.allow 和 host.deny 相冲突时,以hosts.allow设置为准。
c. 重启 tcpd 服务
Xinetd是新一代的网络守护进程服务程序,又叫超级Internet服务器,常用来管理多种轻量级Internet服务。
yum install -y xinetd
systemctl restart xinetd
d. scp 命令
- 描述:远程复制文件/目录
- 语法:scp [选项] 本地文件/目录 用户名@服务器地址:目标路径
-r:递归复制整个目录
-p:留原文件的修改时间,访问时间和访问权限。
-P:port 注意是大写的P, port是指定数据传输用到的端口号
-q:不显示传输进度条
# 从客户端拉取文件至当前目录下
scp root@192.168.137.6:/opt/test_ssh.txt .
# 将文件推送至客户端
scp 999.sh root@192.168.137.6:/opt
- 以上操作均在服务端完成
6、SSH_Client 密钥登录
a. ssh-keygen 命令
- 描述:为当前用户创建密钥对文件,可用的加密算法为RSA或DSA
- 语法:ssh-keygen [选项]
-t 指定算法类型,默认使用RSA算法
# 在客户端生成密钥
ssh-keygen -t rsa
# 查看密钥对
ll /root/.ssh
- id_rsa是私钥文件,权限默认为600,对于私钥文件必须妥善保管,不能泄露给他人。
- id_rsa.pub是公钥文件,用来提供给ssh服务器。
b. ssh-copy-id 命令
- 描述:上传公钥到服务器
- 语法:ssh-copy-id [选项] 用户名@服务器地址
-i 选项指定公钥文件
-p 选项指定端口号
# 上传公钥到服务器
ssh-copy-id -i root@192.168.137.253
# 测试密钥登录
ssh 192.168.137.253
7、SSH 服务防止暴力破解
- 密码足够的复杂最好大于20位。密码要尽可能有数字、大小写字母和特殊符号混合组成。
- 修改默认端口号
- 不允许root账号密码登录,只能通过认证的秘钥来登录系统
- 添加普通账号,授予root的权限,不允许密码登录,只能通过认证的秘钥来登录系统。
a. 服务端创建admin并提权
# 服务端创建admin用户
useradd admin
echo "admin:123456" | chpasswd
# 给admin提权
vim /etc/sudoers
b. 客户端admin提交公钥
# 创建admin账户
useradd admin
su - admin
# 生成密钥
ssh-keygen -t rsa
# 提交公钥至服务器
ssh-copy-id -i root@192.168.137.253
# 测试
ssh admin@192.168.137.253 # admin 密码123456
c. SSH 服务器安全优化设置
# 修改端口为2222
Port 2222
# 修改监听IP为内网ip
ListenAddress 192.168.137.253
# 关闭DNS反向解析
UseDNS no
# 不允许 root 在没有密钥的主机上登录
PermitRootLogin without-password
# 启用密钥验证
PubkeyAuthentication yes
# 关闭密码验证
PasswordAuthentication no
# 重启 sshd 服务
systemctl restart sshd
# 查看 sshd 端口
netstat -antup | grep sshd
d. 使用密钥登录
# 使用admin秘钥登陆
ssh admin@192.168.137.253 -p 2222
# 使用root密钥登录
ssh root@192.168.137.253 -p 2222
e. Windows 测试密钥登录
分别使用admin账号和root账号远程登录,登录均被拒绝
f. XShell 测试密钥链接
# 安装lrzsz文件传输工具
yum install -y lrzsz
# 将公钥下载到windows桌面
sz /root/.ssh/id_rsa
新建XShell连接