跳转到内容
搜索文档

SSH 代理和命令日志(旧版)

最后更新 查看 MarkdownAgent 设置

Cloudflare One 支持使用 Secure Web Gateway 和 Cloudflare One Client 进行 SSH 代理和命令日志记录。

您可以创建网络策略来管理和监控对应用程序的 SSH 访问。当设备通过 SSH 连接到您的源站服务器时,将生成会话日志,显示连接的用户、会话持续时间,并可选地显示该会话期间运行的所有命令的完整重放。

前提条件

1. 确保 Unix 用户名与用户 SSO 身份匹配

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 策略配置正确。

2. 生成 Gateway SSH 代理 CA

不同于传统的 SSH 密钥,Gateway 使用短期证书来验证 Cloudflare 与您的源站之间的流量。

要生成 Gateway SSH 代理 CA 并获取其公钥:

  1. Cloudflare 仪表板中,转到 Zero Trust > Access controls(访问控制)> Service credentials(服务凭据)> SSH

  2. 选择 Add a certificate(添加证书)

  3. SSH with Access for Infrastructure(使用 Access for Infrastructure 的 SSH) 下,选择 Generate SSH CA(生成 SSH CA)。短期证书表中将出现一个名为 SSH with Access for Infrastructure(使用 Access for Infrastructure 的 SSH) 的新行。

  4. 选择 SSH with Access for Infrastructure(使用 Access for Infrastructure 的 SSH) 证书。

  5. 复制其 CA public key(CA 公钥)。您可以随时返回复制此公钥。

  1. 创建具有以下权限的 API 令牌

    类型 项目 权限
    账户 Access: SSH Auditing 编辑
  2. 如果您尚未生成 Cloudflare SSH CA,请向 Cloudflare API 发送 POST 请求:

Required API token permissions

At least one of the following token permissions is required:
  • Access: SSH Auditing Write
Add a new SSH Certificate Authority (CA)bash
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/gateway_ca" \
	--request POST \
	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"
  1. 如果您已经创建了 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 Write
  • Access: SSH Auditing Read
List SSH Certificate Authorities (CA)bash
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/gateway_ca" \
	--request GET \
	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"
  1. 复制响应中返回的 public_key 值。

3. 保存公钥

  1. 使用以下命令切换到远程目标机器上的 SSH 配置目录:

    cd /etc/ssh
  2. 到达该目录后,您可以使用以下命令生成文件并打开文本编辑器以输入/粘贴公钥。

    vim ca.pub
  3. ca.pub 文件中,粘贴公钥且不要进行任何修改。

    ca.pubtxt
    ecdsa-sha2-nistp256 <redacted> [email protected]

    ca.pub 文件可以保存多个密钥,每行一个。也允许空行和以 # 开头的注释。

  4. 保存 ca.pub 文件。在某些系统中,根据您的权限,您可能需要使用以下命令强制保存文件:

    :w !sudo tee %
    :q!

4. 修改您的 sshd_config 文件

通过更新远程目标机器上的 sshd_config 文件,将您的 SSH 服务器配置为信任 Cloudflare SSH CA。

  1. 在远程机器的 /etc/ssh 目录中,打开 sshd_config 文件。

     sudo vim /etc/ssh/sshd_config
  2. i 进入插入模式,然后在文件顶部、所有其他指令上方添加以下行:

    PubkeyAuthentication yes
    TrustedUserCAKeys /etc/ssh/ca.pub
  3. esc,然后输入 :x 并按 Enter 保存并退出。

5. 检查您的 SSH 端口号

Cloudflare 的 SSH 代理仅适用于在默认端口 22 上运行的服务器。打开 sshd_config 文件并验证是否未指定其他 Port 值。

cat /etc/ssh/sshd_config

6. 重启您的 SSH 服务器

修改 sshd 配置后,在远程机器上重新加载 SSH 服务以使更改生效。

对于 Debian/Ubuntu:

sudo systemctl reload ssh

对于 CentOS/RHEL 7 及更高版本:

sudo systemctl reload sshd

7. 创建一条 Audit SSH 策略

  1. Cloudflare 仪表板中,转到 Zero Trust > Traffic policies(流量策略)> Firewall policies(防火墙策略)

  2. 在 **Network(网络)**选项卡中,选择 Add a network policy(添加网络策略)

  3. 为策略命名并指定源站服务器的目的 IP

    您可以输入公网或私网 IP。要使用私网 IP,请参阅连接私有网络

  4. 向您的策略添加任何其他条件。如果用户不符合条件,他们默认将被阻止。

  5. 在 **Action(操作)**下拉菜单中,选择 Audit SSH(审计 SSH)。

  6. (可选)启用 SSH Command Logging(SSH 命令日志记录)。如果您尚未上传 SSH 加密公钥,请按照配置 SSH 命令日志记录中的步骤操作。

  7. 保存策略。

8. 建立用户连接

用户可以使用任何 SSH 客户端连接到目标资源,只要他们已在其设备上登录 Cloudflare One Client。Cloudflare One 将验证、代理并可选地通过 Gateway 加密和记录所有 SSH 流量。

作为 SSH 命令的一部分,用户必须指定其要连接的用户名:

ssh <username>@<hostname>

(可选) 配置 SSH 命令日志记录

要记录 SSH 命令,您需要生成一个 HPKE 密钥对,并将公钥上传到 Cloudflare。

  1. 下载 Cloudflare ssh-log-cli 实用程序。

  2. 使用 ssh-log-cli 实用程序生成公钥和私钥对。

    ./ssh-log-cli generate-key-pair -o sshkey
    README.md    ssh-log-cli    sshkey    sshkey.pub

    此命令会输出两个文件:sshkey.pub 公钥和匹配的 sshkey 私钥。

  3. Cloudflare 仪表板中,转到 Zero Trust > Traffic policies(流量策略) > Traffic settings(流量设置)

  4. SSH log encryption public key(SSH 日志加密公钥) 中,粘贴 sshkey.pub 的内容,然后选择 Save(保存)。请注意,这与您用于配置 SSH 服务器的 ca.pub 文件是不同的公钥。

所有代理的 SSH 命令都会使用此公钥立即加密。需要匹配的私钥才能查看日志。

查看 SSH 日志

  1. Cloudflare 仪表板中,转到 Zero Trust > Insights(洞察)> Logs(日志)> SSH command logs(SSH 命令日志)

  2. 如果您启用了 **SSH Command Logging(SSH 命令日志记录)**功能,您可以 **Download(下载)**会话的命令日志。

  3. 要解密日志,请按照 SSH Logging CLI 仓库中的说明进行操作。在以下示例中,sshkey 是与上传到 Cloudflare 的公钥匹配的私钥。

    ./ssh-log-cli decrypt -i sshlog -k sshkey

    此命令会输出一个包含已解密日志的 sshlog-decrypted.zip 文件。

限制

SSH 命令日志记录不支持 SFTP,因为它无法被检测和记录日志。

这篇文档对您有帮助吗?