SSH
secure shell,protocol,22/tcp,安全的远程登录
具体的软件实现
OpenSSH:ssh协议的开源实现,CentOS默认安装
dropbear:另一个开源实现
SSH协议版本
- v1:基于CRC-32做MAC,不安全;man-in-middle
- v2:双方主机协议选择安全的MAC方式
基于DH算法做密钥交换,基于RSA或DSA实现身份认证
两种方式的用户登录认证:
- 基于password
- 基于key
Openssh软件组成
相关包
- openssh
- openssh-clients
- openssh-server
工具
基于C/S结构
- Client:ssh,scp,sftp,slogin
Windows客户端:
xshell,putty,securecrt,sshsecureshellclient - Server:sshd
ssh客户端
- 客户端组件:
ssh,配置文件:/etc/ssh/ssh_config
Host PATTERN
StrictHostKeyChecking no 首次登录不显示检测提示 - 格式:
ssh [user@]host [COMMAND]
ssh [-l user] host [COMMAND]
-p port
:远程服务器监听的端口
-b
:指定连接的源IP
-v
:调试模式
-C
:压缩方式
-X
:支持x11转发
-Y
:支持信任x11转发
ForwardX11Trusted yes
-t
:强制伪tty分配
ssh -t remoteserver1 ssh remoteserver2
- 允许实现对远程系统经验证地加密安全访问
- 当用户远程连接ssh服务器时,会复制ssh服务器
/etc/ssh/ssh_host*key.pub
(CentOS 7 默认是 ssh_host_ecdsa_key.pub)文件中的公钥到客户机的~/.ssh/know_hosts
中。下次连接时,会自动匹配相应私钥,不能匹配,将拒绝连接
ssh服务登录验证
- ssh服务登录验证方式:
- 用户/口令
- 基于密钥 key
基于用户和口令登录验证
- 客户端发起 ssh 请求,服务器会把自己的公钥发送给用户
- 用户会根据服务器发来的公钥对密码进行加密
- 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功
基于密钥 key 的登录方式
- 首先在客户端生成一对密钥(ssh-keygen)
- 并将客户端的公钥 ssh-copy-id 拷贝到服务端
- 当客户端再次发送一个连接请求,包括 ip、用户名
- 服务端得到客户端的请求后,会到 authorized_keys 中查找,如果有相应的 IP 和用户,就会随机生成一个字符串,例如:acdf
- 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
- 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
- 服务端接收到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录
基于 key 认证步骤:
- 在客户端生成密钥对
ssh-keygen -t rsa [-P ""] [-f "~/.ssh/id_rsa"]
- 把公钥文件传输至远程服务器对应用户的家目录
ssh-copy-id [-i [identity_file]] [user@]host
- 测试
- 在 SecureCRT 或 Xshell 实现基于 key 验证
- 在 SecureCRT 工具 --> 创建公钥 --> 生成 Identity.pub 文件
转化为 openssh 兼容格式(适合 SecureCRT,Xshell 不需要转化格式),并复制到需登录主机上相应文件 authorized_keys 中,注意权限必须为600,在需登录的 ssh 主机上执行:
ssh-keygen -i -f Identity.pub >> .ssh/authorized_keys
- 在 SecureCRT 工具 --> 创建公钥 --> 生成 Identity.pub 文件
- 重设私钥口令
ssh-keygen -p
- 验证代理(authentication agent)保密解密后的密钥
- 这样口令就只需要输入一次
- 在GNOME中,代理被自动提供给root用户
- 否则运行
ssh-agent bash
- 钥匙通过命令添加给代理
ssh-add
SSH端口转发
SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH 的连接,也能够通过将 TCP 端口转发来使用 SSH 进行通讯
SSH 端口转发能够提供两大功能:
- 加密 SSH Client 端至 SSH Server 端之间的通讯数据
- 突破防火墙的限制完成一些之前无法建立的 TCP 连接
本地转发:
ssh -L localport:remotehost:remotehostport sshserver
- 选项:
-f
:后台启用
-N
:不打开远程shell,处于等待状态
-g
:启用网关功能 - 示例:
~]# ssh -L 9527:telnetsrv:23 -N sshsrv
-
telnet 127.0.0.1 9527
当访问本机的9527的端口时,被加密后转发到sshsrv的ssh服务,再解密被转发到 telnetsrv:23
- 流程:
data <- -> localhost:9527 <- -> localhost:XXXXX <- -> sshsrv:22 <- -> sshsrv:YYYYY <- -> telnetsrv:23
远程转发:
ssh -R sshserverport:remotehost:remotehostport sshserver
- 示例:
ssh -R 9527:telnetsrv:23 -N sshsrv
让 sshsrv 侦听9527端口的访问,如果有访问,就加密后通过 ssh 服务转发请求到本机 ssh 客户端,再由本机解密后转发到 telnetsrv:23 - 流程:
Data <- -> sshsrv:9527 <- -> sshsrv:22 <- -> localhost:XXXXX <- -> localhost:YYYYY <- -> telnetsrv:23
动态端口转发:
- 当用 firefox 访问 internet 时,本机的1080端口做为代理服务器,firefox的访问请求被转发到 sshserver上,由 sshserver 替之访问 internet
ssh -D 1080 root@sshserver
在本机 firefox 设置代理 socket proxy:127.0.0.1:1080
curl --socks5 127.0.0.1:1080 http://www.qq.com
X协议转发
- 所有图形化应用程序都是X客户程序
- 能够通过 tcp/ip 连接远程x服务器
- 数据没有加密机,但是它通过ssh连接隧道安全进行
-
ssh -X user@remotehost gedit
remotehost主机上的gedit工具,将会显示在本机的X服务器上传输的数据将通过ssh连接加密
ssh服务器
服务器端:
- sshd,配置文件:
/etc/ssh/sshd_config
- 常用参数:
- Port:端口
- ListenAddress ip:绑定监听地址
- LoginGraceTime 2m
- PermitRootLogin yes
- StrictModes yes:检查.ssh/文件的所有者,权限等
- MaxAuthTries 6
- MaxSessions 10:同一个连接最大会话
- PubkeyAuthentication yes
- PermitEmptyPasswords no
- PasswordAuthentication yes
- GatewayPorts no
- ClientAliveInterval:单位(秒)
- ClientAliveCountMax:默认3
- UseDNS yes
- GSSAPIAuthentication yes:提高速度可改为no
- MaxStartups:未认证连接最大值,默认值10
- Banner /path/file:提示信息,写入文件里
- 限制可登录用户的办法(黑名单优先级高于白名单):
AllowUsers user1 user2 user3
DenyUsers
AllowGroups
DenyGroups
ssh服务的最佳实践
- 建议使用非默认端口
- 禁止使用 protocol version 1
- 限制可登录用户
- 设定空闲会话超时时长
- 利用防火墙设置ssh访问策略
- 仅监听特定的IP地址
- 基于口令认证时,使用强密码策略
tr -dc 'A-Za-z0-9_' < /dev/urandom | head -c 30 | xargs
- 使用基于密钥的认证
- 禁止使用空密码
- 禁止root用户直接登录
- 限制ssh的访问频度和并发在线数
- 经常分析日志(lastb命令)
网友评论