Cloudflare One 支持使用 Secure Web Gateway 和 Cloudflare One Client 进行 SSH 代理和命令日志记录。
您可以创建网络策略来管理和监控对应用程序的 SSH 访问。当设备通过 SSH 连接到您的源站服务器时,将生成会话日志,显示连接的用户、会话持续时间,并可选地显示该会话期间运行的所有命令的完整重放。
- 在最终用户设备上安装 Cloudflare One Client。
- 在最终用户设备上安装 Cloudflare 根证书。
Cloudflare Gateway 将从令牌中获取身份,并使用短期证书授权用户访问目标基础设施。
最简单的设置是用户的 Unix 用户名与其电子邮件地址前缀相匹配。颁发的短期证书将对用户的电子邮件地址前缀有效。例如,如果您的 Okta 或 GSuite 组织中的用户注册为 [email protected],他们将以 jdoe 身份登录到 SSH 服务器。
出于测试目的,您可以运行以下命令在机器上生成一个 Unix 用户:
sudo adduser jdoe高级设置:不同的用户名
SSH 证书在其签名中包含一个或多个 principals,这些主体指示允许该证书登录的 Unix 用户名。Cloudflare Access 始终会将主体设置为用户的电子邮件地址前缀。例如,当 [email protected] 尝试连接时,Access 会颁发一份针对主体 jdoe 授权的短期证书。
默认情况下, SSH 服务器会根据用户证书中列出的主体来验证 Unix 用户名。您可以配置您的 SSH 服务器以接受与 Unix 用户名不匹配的主体。
用户名与不同的电子邮件匹配
要允许 [email protected] 以用户 johndoe 身份登录,请将以下内容添加到服务器的 /etc/ssh/sshd_config:
Match user johndoe
AuthorizedPrincipalsCommand /bin/echo 'jdoe'
AuthorizedPrincipalsCommandUser nobody这会告诉 SSH 服务器,当有人尝试以用户 johndoe 身份进行身份验证时,检查其证书中是否包含主体 jdoe。这将允许用户 [email protected] 使用如下命令登录服务器:
ssh johndoe@server用户名匹配多个电子邮件
要允许多个电子邮件地址以 vmuser 身份登录,请将以下内容添加到服务器的 /etc/ssh/sshd_config:
Match user vmuser
AuthorizedPrincipalsFile /etc/ssh/vmusers-list.txt这会告诉 SSH 服务器从文件中加载主体列表。然后,在 /etc/ssh/vmusers-list.txt 中列出可以作为 vmuser 登录的电子邮件前缀,每行一个:
jdoe
bwayne
robin用户名匹配所有用户
要允许任何 Access 用户以 vmuser 身份登录,请将以下命令添加到服务器的 /etc/ssh/sshd_config:
Match user vmuser
AuthorizedPrincipalsCommand /bin/bash -c "echo '%t %k' | ssh-keygen -L -f - | grep -A1 Principals"
AuthorizedPrincipalsCommandUser nobody此命令使用用户出示的证书,并授权其中列出的任何主体。
允许所有用户
要允许任何 Access 用户以任何用户名登录,请将以下内容添加到服务器的 /etc/ssh/sshd_config:
AuthorizedPrincipalsCommand /bin/bash -c "echo '%t %k' | ssh-keygen -L -f - | grep -A1 Principals"
AuthorizedPrincipalsCommandUser nobody由于这将使服务器的安全性完全依赖于您的 Access 配置,请确保您的 Access 策略配置正确。
不同于传统的 SSH 密钥,Gateway 使用短期证书来验证 Cloudflare 与您的源站之间的流量。
要生成 Gateway SSH 代理 CA 并获取其公钥:
-
在 Cloudflare 仪表板 ↗中,转到 Zero Trust > Access controls(访问控制)> Service credentials(服务凭据)> SSH。
-
选择 Add a certificate(添加证书)。
-
在 SSH with Access for Infrastructure(使用 Access for Infrastructure 的 SSH) 下,选择 Generate SSH CA(生成 SSH CA)。短期证书表中将出现一个名为 SSH with Access for Infrastructure(使用 Access for Infrastructure 的 SSH) 的新行。
-
选择 SSH with Access for Infrastructure(使用 Access for Infrastructure 的 SSH) 证书。
-
复制其 CA public key(CA 公钥)。您可以随时返回复制此公钥。
-
类型 项目 权限 账户 Access: SSH Auditing 编辑 -
如果您尚未生成 Cloudflare SSH CA,请向 Cloudflare API 发送
POST请求:
Required API token permissions
At least one of the following token permissions is required:Access: SSH Auditing Write
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/gateway_ca" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"- 如果您已经创建了 Cloudflare SSH CA,或者收到错误消息
access.api.error.gateway_ca_already_exists,请改为发送GET请求:
Required API token permissions
At least one of the following token permissions is required:Access: SSH Auditing WriteAccess: SSH Auditing Read
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/gateway_ca" \
--request GET \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"- 复制响应中返回的
public_key值。
-
使用以下命令切换到远程目标机器上的 SSH 配置目录:
cd /etc/ssh -
到达该目录后,您可以使用以下命令生成文件并打开文本编辑器以输入/粘贴公钥。
vim ca.pub -
在
ca.pub文件中,粘贴公钥且不要进行任何修改。ca.pubtxt ecdsa-sha2-nistp256 <redacted> [email protected]ca.pub文件可以保存多个密钥,每行一个。也允许空行和以#开头的注释。 -
保存
ca.pub文件。在某些系统中,根据您的权限,您可能需要使用以下命令强制保存文件::w !sudo tee % :q!
通过更新远程目标机器上的 sshd_config 文件,将您的 SSH 服务器配置为信任 Cloudflare SSH CA。
-
在远程机器的
/etc/ssh目录中,打开sshd_config文件。sudo vim /etc/ssh/sshd_config -
按
i进入插入模式,然后在文件顶部、所有其他指令上方添加以下行:PubkeyAuthentication yes TrustedUserCAKeys /etc/ssh/ca.pub -
按
esc,然后输入:x并按Enter保存并退出。
Cloudflare 的 SSH 代理仅适用于在默认端口 22 上运行的服务器。打开 sshd_config 文件并验证是否未指定其他 Port 值。
cat /etc/ssh/sshd_config修改 sshd 配置后,在远程机器上重新加载 SSH 服务以使更改生效。
对于 Debian/Ubuntu:
sudo systemctl reload ssh对于 CentOS/RHEL 7 及更高版本:
sudo systemctl reload sshd-
在 Cloudflare 仪表板 ↗中,转到 Zero Trust > Traffic policies(流量策略)> Firewall policies(防火墙策略)。
-
在 **Network(网络)**选项卡中,选择 Add a network policy(添加网络策略)。
-
为策略命名并指定源站服务器的目的 IP。
您可以输入公网或私网 IP。要使用私网 IP,请参阅连接私有网络。
-
向您的策略添加任何其他条件。如果用户不符合条件,他们默认将被阻止。
-
在 **Action(操作)**下拉菜单中,选择 Audit SSH(审计 SSH)。
-
(可选)启用 SSH Command Logging(SSH 命令日志记录)。如果您尚未上传 SSH 加密公钥,请按照配置 SSH 命令日志记录中的步骤操作。
-
保存策略。
用户可以使用任何 SSH 客户端连接到目标资源,只要他们已在其设备上登录 Cloudflare One Client。Cloudflare One 将验证、代理并可选地通过 Gateway 加密和记录所有 SSH 流量。
作为 SSH 命令的一部分,用户必须指定其要连接的用户名:
ssh <username>@<hostname>要记录 SSH 命令,您需要生成一个 HPKE 密钥对,并将公钥上传到 Cloudflare。
-
下载 ↗ Cloudflare
ssh-log-cli实用程序。 -
使用
ssh-log-cli实用程序生成公钥和私钥对。./ssh-log-cli generate-key-pair -o sshkeyREADME.md ssh-log-cli sshkey sshkey.pub此命令会输出两个文件:
sshkey.pub公钥和匹配的sshkey私钥。 -
在 Cloudflare 仪表板 ↗中,转到 Zero Trust > Traffic policies(流量策略) > Traffic settings(流量设置)。
在 SSH log encryption public key(SSH 日志加密公钥) 中,粘贴
sshkey.pub的内容,然后选择 Save(保存)。请注意,这与您用于配置 SSH 服务器的ca.pub文件是不同的公钥。
所有代理的 SSH 命令都会使用此公钥立即加密。需要匹配的私钥才能查看日志。
-
在 Cloudflare 仪表板 ↗中,转到 Zero Trust > Insights(洞察)> Logs(日志)> SSH command logs(SSH 命令日志)。
-
如果您启用了 **SSH Command Logging(SSH 命令日志记录)**功能,您可以 **Download(下载)**会话的命令日志。
要解密日志,请按照 SSH Logging CLI 仓库 ↗中的说明进行操作。在以下示例中,
sshkey是与上传到 Cloudflare 的公钥匹配的私钥。./ssh-log-cli decrypt -i sshlog -k sshkey此命令会输出一个包含已解密日志的
sshlog-decrypted.zip文件。
SSH 命令日志记录不支持 SFTP,因为它无法被检测和记录日志。