🤖

DenoでSlack Botが書けるnext-gen Slack Platformのセキュリティについて

2023/10/21に公開

TL;DR

  • .envは公開しないように(当たり前)
  • console.log(env)も危険なのでやめよう
  • Botが使うトークンのスコープは細かく割り当てできるけど、あくまでBot単位での制御しか無理っぽいです

はじめに

2022-09-20 にオープンベータで発表されたDenoでSlack botが書けるというnext-generation Slack platformですが、

https://slack.com/intl/ja-jp/blog/developers/make-work-flow-faster-with-slacks-new-platform

私の知らないうちに 2023-04-24 にGA版出てました。


https://slack.com/intl/ja-jp/blog/developers/next-gen-platform-launch?_gl=17i1h5j_gcl_auMTU0MzM4MjU2MC4xNjk3ODA1Njgy_gaMTkzODkwOTgzMS4xNjU3Njg3NTQx_ga_QTJQME5M5D*MTY5NzgwNTY4Mi44LjEuMTY5NzgwNjE1OC40Ny4wLjA.

Our next-generation platform for automating and integrating everything with Slack is out of beta for developers and gradually rolling out to all teams over the next two weeks.

// Google 翻訳に突っ込んだ結果

すべてを自動化し、Slack と統合するための次世代プラットフォームは、開発者向けのベータ版が終了し、今後 2 週間かけて段階的にすべてのチームに展開されます。

オープンベータかーー、と思って触っていませんでしたが、一般公開されているならということで、軽く遊んでみました。

Trigger, Workflow あたりの説明は他記事に譲るとして、セキュリティまわりについての記述がある記事が少ないなーという印象だったので、そのあたりについてまとめます。

確認環境

❯ slack --version
Using slack v2.10.0
❯ deno --version
deno 1.37.1 (release, x86_64-apple-darwin)
v8 11.8.172.6
typescript 5.2.2

Security best practices

ご丁寧に専用ページがあります。ありがたい。
https://api.slack.com/automation/security

まとめると

  • アプリの編集者を指定できるから、適切な権限管理をしてね
  • 入力値は検証してね。関数は再配布できるし、データストアを使うときはサニタイズしてね
  • 機密データは環境変数を使ってね
  • Slack CLIのcredentialは~/.slack/credentials.jsonに保存するからこの中身は秘密にしてね
  • 安全なライブラリを使ってね
  • manifest.tsのなかのoutgoingDomainsで外部ネットワーク制限かけられるよ。信頼しているドメインだけアクセスしようね
  • トークンには適切なスコープだけ許可しようね

みたいなことを言ってるぽいです。

詳細は趣味で触る程度なら気にしないといけないかな〜ってところだけ紹介します。

環境変数の利用

env["<環境変数名>"]みたいに書くと環境変数を参照できます。

https://github.com/mirko-san/slack-sample-deno/blob/6f86979f24460955cd2bc19a9544e42402dc116c/functions/get_asana_project.ts#L39

localで動かしているときは.envの内容を参照して、deployしたらslack env <ENV_NAME> <VALUE> で登録してある環境変数を参照します。

ただ、ローカル実行時に

console.log(env);

みたいに書いたら、もちろんenvの設定値はslack activityで閲覧できるログで丸見えでした。

なので、.envファイルの取り扱いとconsole.log()の内容は注意が必要です。

トークンのスコープ

manifests.tsでBotに許可するスコープを指定できます。
https://api.slack.com/automation/manifest

設定できるスコープの一覧はこちら。
https://api.slack.com/scopes?filter=granular_bot

スコープは細かく切られているようですが、スコープの割り当て先はBot単位しか無理そうです。
一つのBotでいろんなことをさせようとするより、こまやかな権限管理をしたいときはBot単位で分ける必要がありそうです。

おわり

ドキュメントの日本語翻訳がかなり追いついてないので、もっとドキュメントが日本語化されたらSlack Platform流行る気がします。

https://api.slack.com/community

あたりを眺めてみましたが、残念ながらドキュメントのコントリビュートはできなさそうなのでSlack公式が日本語翻訳してくれるのを待つしかなさそうです。がんばって〜〜〜!(他力本願)

GitHubで編集を提案

Discussion