Cloudfalredをaptからインストールしてrootlessで安全に動かす

Posted on Jul 5, 2024

あらすじ

Cloudflaredはとても便利なツールですがダッシュボードで紹介されてる方法でインストールすると色々危険です。

  • rootとして実行される
  • シークレットをコマンドライン引数として渡してるのでhtopとかで誰でも見れる
  • ↑お前本当にセキュリティ企業かよ

いい感じのインストール方法を探して見つけたので書いておきます

1. apt(もしくはdnf)リポジトリからCloudflaredのバイナリをインストール

公式ページ の指示に従ってリポジトリを追加してインストールします。jammyですが普通に24.04でも動きました。

# Add cloudflare gpg key
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null

# Add this repo to your apt repositories
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared jammy main' | sudo tee /etc/apt/sources.list.d/cloudflared.list

# install cloudflared
sudo apt-get update && sudo apt-get install cloudflared

2. Tunnelのトークン発行

ダッシュボードのTunnel新規作成画面から適当に名前を設定してトークンを生成します。
sudo cloudflared service install TOKENを実行しろとか出てきますが必要なのはTOKENの部分だけです。安全な場所にメモします。

3. サービスファイル生成

/etc/systemd/system/cloudflared.service のような適当な名前でサービスファイルを作って以下の内容を書き込みます。
systemdのセキュリティ機能を活用して安全性を高めています。

[Unit]
Description=Cloudflare Tunnel
After=network-online.target
Wants=network-online.target

[Service]
Type=notify

DynamicUser=true

# [YOUR_TOKEN]をダッシュボードで発行したトークンに変える
Environment=TUNNEL_TOKEN=[YOUR_TOKEN]
ExecStart=/usr/bin/cloudflared --no-autoupdate tunnel run --post-quantum

TimeoutStartSec=0
Restart=on-failure
RestartSec=5s

UMask=0077

LockPersonality=true
SystemCallArchitectures=native
SystemCallFilter=~ @privileged @clock @debug @module @mount @raw-io @reboot @swap @cpu-emulation @obsolete @chown @reboot
CapabilityBoundingSet=
RestrictNamespaces=true

MemoryDenyWriteExecute=true

PrivateDevices=true
PrivateTmp=true
ProtectHome=true
PrivateUsers=true
ProtectSystem=strict

NoNewPrivileges=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectKernelLogs=true
ProtectControlGroups=true
ProtectClock=true
ProtectHostname=true

RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
RestrictSUIDSGID=true
RestrictRealtime=true

ProtectProc=invisible
ProcSubset=pid

InaccessiblePaths=/var

IPAddressDeny=any
# localhost以外にプロキシする場合はそのアドレスを追加してください
IPAddressAllow=127.0.0.1
IPAddressAllow=127.0.0.53

# Cloudflaredがトンネル確立するときに使うCIDR
# ref: https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/deploy-tunnels/tunnel-with-firewall/
IPAddressAllow=198.41.128.0/17
IPAddressAllow=2606:4700::/32

[Install]
WantedBy=multi-user.target

4. Done

sudo systyemctl daemon-reloadしてからsudo systemctl enable --now cloudflaredを実行して有効化します。
これで完了です。