Quantumleap
1096 words
5 minutes
CloudflareのShortLived Certが便利だった件
2024-06-25

Short-lived certificates#

Short-lived certificatesは短時間だけ有効な証明書を発行するシステムです。

本来、SSHでホストからクライアントに接続するためにはクライアント側のauthorized_keysにホストの秘密鍵に対応する公開鍵を登録する必要がありました。

で、ここで困るのは初期状態ではホストからクライアントに公開鍵方式で接続する方法がないので、なんとかしてクライアントに繋いでからホストの公開鍵を登録する必要があります。

公開鍵方式が使えないならパスワード認証をするしかないのですが、それはそれで短期間とはいえパスワード認証が有効化されてしまっているのはセキュリティ上の懸念があります。

また、ホストの公開鍵をどうやってクライアントに伝えるのかという問題もあります。

一応copy-ssh-idというコマンドはあるのですがこれはGNU/UNIX向けのパッケージなのでWindowsやmacOSでは利用できません。

となると、クライアントにログインするのもSSH公開鍵をコピーするのもめんどくさいわけです。

自分だけがログインするならともかく、多くの人がそのサーバーを利用するのであればいちいち登録するのもめんどくさいわけですね。

そしてそれを解消するのがShort-lived certificatesです。

クライアント側の設定#

詳しくは公式ドキュメントに書いてあるのでドキュメントを読みます。

これを読むとサーバーをCloudflare Accessの裏側におくことによりセキュアにする仕組みのようです。

まあこれだけでは何のことかわからんので実際にやってみましょう。

なお、ここからの作業はクライアント側のPCで実行する必要があります。

まず、Zero Trustのダッシュボードから新しくTunnelを貼ります。

services:
  cloudflare_tunnel:
    restart: always
    image: cloudflare/cloudflared
    command: tunnel --autoupdate-freq 12h run
    environment:
      TUNNEL_TOKEN: $TUNNEL_TOKEN
      NO_AUTOUPDATE: false
    extra_hosts:
      - host.docker.internal:host-gateway

自分はDockerでしかCloudflaredを立てないので、上のようなdocker-compose.yamlを作成してdocker compose up -dで立ち上げます。

Applications#

次にAccess > Applicationsからアプリケーションを作成します。

ここではSSHでログインを許可するロールを設定します。

設定したら適当な名前で保存します。

Service Auth#

次にAccess > Service Auth > SSHから公開鍵を作成します。

Service AuthenticationからSSHを指定し、Applicationから先ほど作成したアプリケーションを選択します。

ここからGenerate certificateを選択して公開鍵を作成します。

ca.pub#

/etc/ssh/ca.pubを作成します。

Ubuntuなどであればsudoeditが利用できるので、これを使って編集するとreadonlyなファイルであっても編集できて便利です。

sudoedit /etc/ssh/ca.pubで先ほど作成した公開鍵の内容をコピペして保存します。

SSHD config#

最後に/etc/ssh/sshd_configを編集します。

PubkeyAuthentication yes
TrustedUserCAKeys /etc/ssh/ca.pub

のようにPubkeyAuthentication yesの行のコメントアウトを外します。

再起動#

Debian/Ubuntuであればsudo service ssh restartでSSHサーバーを再起動できます。

ホスト側の設定#

最後にホスト側の設定をします。

Cloudflare Tunnelを利用しているので、ホスト側にもCloudflaredがインストールされている必要があります。

cloudflared access ssh-config --hostname vm.example.com --short-lived-certのコマンドを実行するとテンプレートが出力されるので、それを~/.ssh/configに保存します。

このとき表示されるコマンドではUserが指定されておらず、そのまま実行すると現在ログインしているユーザーでログインを試みてしまうので適時User XXXXXXの項目を設定するようにしましょう。

これで設定は完了です。

クライアント側の設定が終わってしまえば、ホスト側から秘密鍵を交換する必要がないというのがShort-lived certificatesのメリットですね。

感想#

最近、記事が書けていなかったのですが久しぶりに書いてみると面白かったです。

Cloudflareにはまだまだ利用できていない機能がたくさんあるので、いろいろ使えるようになっていきたいですね。

記事は以上。

CloudflareのShortLived Certが便利だった件
https://fuwari.vercel.app/posts/2024/06/shortlived_cert/
Author
tkgling
Published at
2024-06-25