十三、配置和保护SSH服务-灵析社区

秋月无边

📜13.1 ssh 服务介绍

ssh: secure shell, protocol, 22/tcp, 安全的远程登录,实现加密通信,代替传统的 telnet 协议

具体的软件实现:

  • OpenSSH:ssh协议的开源实现,rhel、centos 默认安装
  • dropbear:另一个ssh协议的开源项目的实现

SSH 协议版本:

  • v1:基于CRC-32做MAC,不安全;man-in-middle
  • v2:双方主机协议选择安全的MAC方式,基于DH算法做密钥交换,基于RSA或DSA实现身份认证

📑13.1.1 公钥交换原理

  • 客户端发起链接请求
  • 服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
  • 客户端生成密钥对
  • 客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
  • 客户端发送加密后的值到服务端,服务端用私钥解密,得到Res
  • 服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)
  • 最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密

📑13.1.2 ssh加密通讯原理


📜13.2 openssh 服务

OpenSSH是SSH (Secure SHell) 协议的免费开源实现,一般在各种Linux版本中会默认安装,基于C/S结构

Openssh软件相关包:

  • openssh
  • openssh-clients
  • openssh-server

服务器:/usr/sbin/sshd

Unit 文件:/usr/lib/systemd/system/sshd.service

客户端:

  • Linux Client: ssh, scp, sftp,slogin
  • Windows Client:xshell, MobaXterm,putty, securecrt, sshsecureshellclient

📑13.2.1 客户端 ssh 命令

ssh命令是ssh客户端,允许实现对远程系统经验证地加密安全访问

当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub文件中的公钥到客户机的

~/.ssh/know_hosts中。下次连接时,会自动匹配相应私钥,不能匹配,将拒绝连接

格式:

ssh [user@]host [COMMAND]
ssh [-l user] host [COMMAND]


常见选项

-p port:远程服务器监听的端口
-b 指定连接的源IP
-v 调试模式
-C 压缩方式
-X 支持x11转发
-t 强制伪tty分配,如:ssh -t remoteserver1 ssh -t remoteserver2 ssh
remoteserver3
-o option 如:-o StrictHostKeyChecking=no
-i <file> 指定私钥文件路径,实现基于key验证,默认使用文件: ~/.ssh/id_dsa,
~/.ssh/id_ecdsa, ~/.ssh/id_ed25519,~/.ssh/id_rsa等


范例:远程执行命令

[root@servera .ssh]# ssh 192.168.137.129  ls -l
root@192.168.137.129's password: 
total 4
-rw-------. 1 root root 1624 Apr  2 13:51 anaconda-ks.cfg


📑13.2.2 ssh 登录验证

🔖ssh登录验证方式介绍

ssh服务登录的常用验证方式

  • 用户/口令
  • 基于密钥

基于用户和口令登录验证


  1. 客户端发起ssh请求,服务器会把自己的公钥发送给用户
  2. 用户会根据服务器发来的公钥对密码进行加密
  3. 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功

基于密钥的登录方式


  • 首先在客户端生成一对密钥(ssh-keygen)
  • 并将客户端的公钥ssh-copy-id 拷贝到服务端
  • 当客户端再次发送一个连接请求,包括ip、用户名
  • 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串
  • 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
  • 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
  • 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录

🔖实现基于密钥的登录方式

在客户端生成密钥对

ssh-keygen -t rsa [-P 'password'] [-f “~/.ssh/id_rsa"]


把公钥文件传输至远程服务器对应用户的家目录

ssh-copy-id [-i [identity_file]] [user@]host


重设私钥口令:

ssh-keygen -p


📑13.2.3 ssh服务器配置

服务器端:sshd

服务器端的配置文件: /etc/ssh/sshd_config

服务器端的配置文件帮助:man 5 sshd_config

常用参数:

Port   #更改端口先关selinux,setenforce 0
ListenAddress ip
LoginGraceTime 2m
PermitRootLogin yes 		#默认ubuntu不允许root远程ssh登录
StrictModes yes 			#检查.ssh/文件的所有者,权限等
MaxAuthTries 6 
MaxSessions 10				#同一个连接最大会话
PubkeyAuthentication yes 	#基于key验证
PermitEmptyPasswords no 	#空密码连接
PasswordAuthentication yes 	#基于用户名和密码连接
GatewayPorts no
ClientAliveInterval 10 		#单位:秒
ClientAliveCountMax 3 		#默认3
UseDNS yes 					#提高速度可改为no
GSSAPIAuthentication yes 	#提高速度可改为no
MaxStartups 				#未认证连接最大值,默认值10
Banner /path/file

#以下可以限制可登录用户的办法:
AllowUsers user1 user2 user3
DenyUsers
AllowGroups
DenyGroups


范例:设置ssh 空闲60s 自动注销

Vim /etc/ssh/sshd_config
ClientAliveInterval 60
ClientAliveCountMax 0
Service sshd restart
#注意:新开一个连接才有效


范例:解决ssh登录缓慢的问题

vim /etc/ssh/sshd_config
UseDNS no
GSSAPIAuthentication no
systemctl restart sshd


范例:启用/禁用root 远程ssh登录

#修改sshd服务配置文件
vim /etc/ssh/sshd_config
#PermitRootLogin prohibit-password 注释掉此行
PermitRootLogin yes/no 修改为下面形式(yes启用/no禁用)
systemctl restart sshd


ssh服务的最佳实践

建议使用非默认端口
禁止使用protocol version 1
限制可登录用户
设定空闲会话超时时长
利用防火墙设置ssh访问策略
仅监听特定的IP地址
基于口令认证时,使用强密码策略,比如:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 12|xargs
使用基于密钥的认证
禁止使用空密码
禁止root用户直接登录
限制ssh的访问频度和并发在线数
经常分析日志


阅读量:1289

点赞量:0

收藏量:0