Cloudflare が SSH サーバーに対して提供可能なサービスまとめ

# Summary

| Product | Spectrum | Client-side cloudflared | Browser-rendered terminal | WARP-to-Tunnel | Access for Infrastructure |
|:-:|:-:|:-:|:-:|:-:|:-:|
| WARP Client Agent Required? | No  | No | No | Yes  | Yes |
| DDoS Protection | :white_check_mark:  | :white_check_mark: | :white_check_mark: | :x:  | :x: |
| Load Balancing | :white_check_mark:  | :white_check_mark: | :white_check_mark: | :white_check_mark:  | :white_check_mark: |
| Arbitrary SSH Port | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| Authentication | :x: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| Polices | :white_check_mark:<br>IP Access rules | :white_check_mark:<br>Access Application policies | :white_check_mark:<br>Access Application policies | :white_check_mark:<br>Gateway Network policies | :white_check_mark:<br>Access Application policies<br>+<br>Gateway Network policies |
| SSH Command Logs | :x: | :x: | :x: | :white_check_mark:<br>Audit SSH<br>Port 22 Only | :white_check_mark:<br>Custom SSH ports<br>+<br>Logpush|
| SSH Public Key Authentication | :white_check_mark:<br>Managed by user | :white_check_mark:<br>Managed by user | :white_check_mark:<br>Managed by user | :white_check_mark:<br>Managed by user | :x: |
| SSH Certificate Authentication | :white_check_mark:<br>Managed by user | :white_check_mark:<br>Short-lived certificates | :x: | :white_check_mark:<br>Managed by user | :white_check_mark:<br>Managed by Cloudflare |

# Spectrum
- Spectrum を使うことで SSH サーバーに対して L3/4 DDoS Protection を提供できます。

- TCP での任意のポートアクセスや Load Balancing を経由したアクセスも提供できます。

https://developers.cloudflare.com/spectrum/protocols-per-plan/

https://developers.cloudflare.com/spectrum/about/load-balancer/

```mermaid:
graph LR

subgraph Cloudflare
    Spectrum["Spectrum<br>(L3/4 DDoS Protection)"]
    LB1["Load Balancing<br>(Optional)"]
end

subgraph DC[DC or Cloud]
    Tunnel1
    Origin
end

User --> Spectrum --> LB1 --> Tunnel1["Cloudflare Tunnel<br>(Optional)"] --> Origin[SSH Server]
```

# Client-side cloudflared / Browser-rendered terminal
- SSH クライアント側で `cloudflared` コマンドを使うことで、Cloudflare に登録された公開ドメイン内のパブリックホスト名に対して SSH アクセスが可能です。

- SSH サーバーに対しては、プライベート IP と任意のポートを宛先に使用できます。

- Access と SAML / OIDC 連携した IdP を経由して認証します。

- ブラウザを経由したレンダリングオプションも提供可能です。

- その他、任意の TCP 接続に対して同様の構成を提供できます。

https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/use-cases/ssh/ssh-cloudflared-authentication/

https://developers.cloudflare.com/cloudflare-one/applications/non-http/browser-rendering/

```mermaid:
graph LR

subgraph Cloudflare
subgraph Domain ["Public Zone (example.com)"]
    CDN["CDN<br>(L7 DDoS Protection)"]
    Access
    LB1["Load Balancing<br>(Optional)"]
end
end

subgraph DC[DC or Cloud]
    Tunnel1
    Origin
end

CLI -->|cloudflared access ssh<br>--hostname ssh.example.com|CDN --> Access --> LB1 --> Tunnel1["Cloudflare Tunnel"] --> |x.x.x.x:port|Origin[SSH Server]
Browser --> |Browser-rendered terminal|CDN
Access <---> |Authentication|IdP

```

# WARP-to-Tunnel

- WARP クライアントを導入することで、任意の TCP / UDP 通信に対してプライベートネットワークへのルーティングパスを実現できます。

- Network Firewall Policies によって、SSH サーバーに対するアクセス制御が可能です。

- ポート 22 番を宛先とした SSH アクセスでは、SSH コマンドログを取得できます。

https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/use-cases/ssh/ssh-warp-to-tunnel/

https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/private-net/cloudflared/
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/5824689f-2623-79b5-aa53-00e521809b96.png)


```mermaid:
graph LR

subgraph PC
    SSH[SSH Client]
    WARP[Cloudflare WARP]
end

subgraph Cloudflare
subgraph Domain ["Zero Trust"]
    Enroll[Device enrollment permissions]
    Resolver["Resolver Policies<br>(Optional)"]
    Network["Network Policies<br>(Audit SSH)"]
    LB1["Load Balancing<br>(Optional)"]
end
end

subgraph DC[DC or Cloud]
    Tunnel1
    PrivateDNS[Private DNS]
    Origin
end

WARP -->|Enroll|Enroll <---> |Authentication|IdP
SSH --> WARP -->|DNS query|Resolver --> |DNS query|Tunnel1["Cloudflare Tunnel"] --> |DNS query|PrivateDNS

WARP --> |SSH traffic|Network --> LB1 --> Tunnel1["Cloudflare Tunnel"] --> Origin[SSH Server]

```

# Access for Infrastructure

- [BastionZero の買収](https://blog.cloudflare.com/ja-jp/cloudflare-acquires-bastionzero/) により統合された機能になります。

- 任意のカスタム SSH ポートに対して、SSH コマンドログを取得することができ、Logpush にも対応します。

- 証明書認証の仕組みをマネージドで提供するため、公開鍵認証における鍵管理の運用負担を軽減できます。

https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/use-cases/ssh/ssh-infrastructure-access/

https://developers.cloudflare.com/cloudflare-one/applications/non-http/infrastructure-apps/

```mermaid:
graph LR

subgraph PC
    SSH[SSH Client]
    WARP[Cloudflare WARP]
end

subgraph Cloudflare
subgraph Domain ["Zero Trust"]
    Enroll[Device enrollment permissions]
    Resolver["Resolver Policies<br>(Optional)"]
    Network[Network Policies]
    Access["Access for Infrastructure<br>(Audit SSH)"]
    LB1["Load Balancing<br>(Optional)"]
end
end

subgraph DC[DC or Cloud]
    Tunnel1
    PrivateDNS[Private DNS]
    Origin
end

WARP -->|Enroll|Enroll <----> |Authentication|IdP
SSH --> WARP -->|DNS query|Resolver --> |DNS query|Tunnel1["Cloudflare Tunnel"] --> |DNS query|PrivateDNS

WARP --> |SSH traffic|Network --> Access --> LB1 --> Tunnel1["Cloudflare Tunnel"] --> |Target|Origin[SSH Server]

```

# 番外編：Apache Guacamole
以下の例では RDP を検証していますが、同様の構成で SSH もサポートしているため、Apache Guacamole を構築・運用できる方にとってはこちらの構成も選択肢の一つになるかと思います。

https://qiita.com/khayama/items/25cf51be5feda96356e9