Featured image of post CloudFlare ZTNA を設定して安全に宅内にアクセスする

CloudFlare ZTNA を設定して安全に宅内にアクセスする

Summary

Summary

Zero Trust のアカウント

今回は GitHub のアカウントで認証する。
MFAのアカウント増やしたくないし、 Google アカウントでやると @gmail.com になってしまったりログインする時に制約があるので GitHub に寄せておく。

そのさい、 Zero Trust では認証すると email フィールドに GitHub の Primary EMail が入るので Gmail などで label を使う設定をしていると ([email protected] など) のちのちしようとしている SSH のアクセスを ブラウザでする機能でユーザー認証できない、ため注意する。

GitHub では Email の登録画面で登録した連絡先の Primary が認証時に CloudFlare に返ってくるのでこれを変更する。課題やトピック通知などは Notifications の Default notifications email で選択された連絡先に送付されるため今まで通りとなった。

Tunnels を張る

今回は pfSense のライセンス形態が変更されて新規ライセンスが有料となってしまったので OPNsense の載せ替えを検討していて損タイミングでの導入になる(どうせならグローバルIPで晒してないキレイな状態で CloudFlare に向けたほうがリスクが少ないからである)

Topic

OPNsense の公式では cloudflared は FreeBSD で提供されていないが、 FreeBSD.org の ports でバイナリーパッケージが提供されているためこれを使う。 2024/02 現在配布されいてるバージョンは 2023.10 で若干古いのと service 化する rc.d のファイルが古く、 CloudFlare Dashboard で設定を管理できる接続方式に対応していなかったため合わせて対応した。

なお、下記のようなコマンドインストールする場合も 2024/02 現在ではうまくビルドできなかったのでこの方法になった

1
2
3
opnsense-code ports
cd /usr/ports/net/cloudflared/
make install

インストール

OPNsense 24.1 では FreeBSD.conf があるのでこれを使う

1
2
sed -ie 's/enabled: no/enabled: yes/g' /usr/local/etc/pkg/repos/FreeBSD.conf
cat /usr/local/etc/pkg/repos/FreeBSD.conf

/usr/local/etc/pkg/repos/FreeBSD.conf
1
FreeBSD: { enabled: yes }

update cache

1
pkg update -f

検索してみる

1
2
# pkg search cloudflared
cloudflared-2023.10.0_1    Cloudflare's Argo Tunnel client

インストール

1
pkg install cloudflared

認証

CloudFlare と接続するために証明書のダウンロード認証をする

1
cloudflared tunnel login

Service ファイルを作る

rc.d では名前がかぶると面倒なのでコピー先は /etc/rc.d/cloudflaredd とする

/etc/rc.d/cloudflaredd
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/sh

# PROVIDE: cloudflaredd
# REQUIRE: cleanvar DAEMON NETWORKING
#
# Options to configure cloudflaredd via /etc/rc.conf:
#
# cloudflaredd_enable (bool)    Enable service on boot
#                               Default: NO
#
# cloudflaredd_token (str)      Tunnel token.
#                               Default: Required

. /etc/rc.subr

name="cloudflaredd"
rcvar="cloudflaredd_enable"
logfile="/var/log/cloudflared.log"
pidfile="/var/run/cloudflared.pid"
procname="/usr/local/bin/cloudflared"

load_rc_config ${name}

: ${cloudflaredd_enable:="NO"}
: ${cloudflaredd_token:="<Required TOKEN>"}

if [ "${cloudflaredd_token}" = "<Required TOKEN>" ]; then
    echo -e "Required: 'cloudflaredd_token' must be set in /etc/rc.conf.d/${name}.\n\n"
    echo -e "cloudflaredd_token=\"<Required TOKEN>\"\n"
    echo -e "This command part"
    echo -e "> sudo cloudflared service install <TOKEN>"
    echo -e "cloudflaredd_token=\"<Required TOKEN>\"\n" > "/etc/rc.conf.d/${name}"
    exit 1
fi

command="/usr/sbin/daemon"
command_args="-o ${logfile} -p ${pidfile} -f ${procname} --no-autoupdate tunnel run --token ${cloudflaredd_token}"

run_rc_command "$1"

1
2
touch /etc/rc.d/cloudflaredd
vi /etc/rc.d/cloudflaredd

設定ファイルの配置

何もしてないと、設定をするように促すようにしたので、それ通り設定

1
2
3
4
5
6
7
8
root@OPNsense:/etc/rc.d # service cloudflaredd enable
Required: 'cloudflaredd_token' must be set in /etc/rc.conf.d/cloudflaredd.


cloudflaredd_token="<TOKEN>"

This command part
> sudo cloudflared service install <TOKEN>

Dashboard でトンネルを作ると、続きに sudo cloudflared service install から始まるコマンドが表示されるがこれは cloudflared がネイティブで対応している OS の場合 service ファイルの作成と登録を実施してくれるが、、 FreeBSD は恩恵に預かれないので後半の token を下記のファイルに貼り付けて保存する。

1
vi /etc/rc.conf.d/cloudflaredd
/etc/rc.conf.d/cloudflaredd
1
cloudflaredd_token="<Required TOKEN>"

起動と自動起動を設定する。 正しく完了すれば、 Dashboard に表示されるはず

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
root@OPNsense:/etc/rc.d # service cloudflaredd enable
cloudflaredd enabled in /etc/rc.conf

root@OPNsense:/etc/rc.d # service cloudflaredd status
cloudflaredd is not running.

root@OPNsense:/etc/rc.d # service cloudflaredd start
Starting cloudflaredd.

root@OPNsense:/etc/rc.d # service cloudflaredd status
cloudflaredd is running as pid 32664.

root@OPNsense:/etc/rc.d # service -e | grep cloudflaredd
/etc/rc.d/cloudflaredd

切断通知の設定

CloudFlare の機能として Tunnel の切断時などに通知ができるようなので設定しておく

Dashboard での設定

Login methods

GitHub の認証を追加

App Launcher

App Launcher の設定を追加

Access groups

Access groups の作成、最初に作っておくのが吉

Application の設定

弊宅では一般家庭なので 150 ほど Application を登録必要があるのがわかったのでいろいろ確認した結果、 Application ID を Tuneel の Public hostname に指定していくことで自動化しやすいので脳死で名前を決められるようにした。

そのため下記の順番で設定する必要がある

  1. Application を作る
  2. Public hostname の設定

Application を作る

Public hostname の設定

SSH もやる場合

2024/02 月現在は Beta だが利用できる。

  1. Short-lived certificates
  2. 接続先に linux ユーザーを Email のユーザー名と同一名で作る
  3. sshd の設定を更新する
  4. Application の作成(Browser rendering: SSH に設定する必要があるため新規作成が必要)
    1. Public hostname を設定して ssh を指定する

プログラムアクセスさせる場合

Service Auth という場所で HTTP header, TLS 証明, SSH と選べるのでどれかを選択。 API 系の同期が多いと思うので、 Service Tokens がみんな設定することになるのではないだろうか

参考情報

少し古いが概要を掴むには十分でボリュームのしっかりとあり大変参考になった

Built with Hugo
テーマ StackJimmy によって設計されています。