SSTエンジニアブログ

SSTのエンジニアによるWebセキュリティの技術を中心としたエンジニアブログです。

とくめいチャット

こんにちは!寝ぐせを指摘されたので「寝ぐせではなく阿良々木くんの真似ですよ」って誤魔化したけど、ぜんぜん話が通じなくて悲しいCTOのはせがわです。

社内Slackの心理的安全性を高めるため匿名で投稿できるチャンネルを作ったよという記事が昨年話題になっていました。

qiita.com

匿名で好きなことを遠慮なく書けるようになるってのはおもしろそうなので、弊社でも同じようなのを動かしてみたので今回のブログではそれを紹介します。

どうやって匿名を保とう…

先に紹介した記事のLambdaによる実装では、投稿者のIPアドレス等によって管理者は投稿者をある程度調べることができてしまいます。管理者が「いや、普段は調べていないし、IPアドレスじゃ個人の特定までは困難でしょ」といくら主張したところで、私のように普段から社内での信用が低い者(要出典)の発言では全く信用性に乏しいという受け取られ方をしてしまいます。 そこで、もうちょっと客観的に信用してもらえる方法で投稿者の匿名性を守るため、G SuiteによってログインされたGoogle フォーム経由でSlackに投稿できる仕組みを作りました。Googleフォームでは、G Suiteの管理者であってもアクセスログを見る方法は提供されておらず、そのため「管理者(はせがわ)にも匿名を保ったまま投稿できますよ」と胸を張って言うことができます。

(なお、G Suiteを前提に記事を書いていますが、G Suiteでない無償版のGoogleフォームでもほぼ同じことはおそらくできると思います。フォーム送信を組織内限定にすることができないとは思いますが…。)

投稿フォーム

Googleフォームで以下のような画面を作ります。

Googleフォームの作成Googleフォームの作成

フォームは「メールアドレスを収集する」のチェックを外し、G Suiteなら「(自組織)と信頼できる組織のユーザーに限定する」にチェックを入れておくと完全な第三者からの投稿は防ぐことができるでしょう。

Googleフォームの設定
Googleフォームの設定

フォームが出来上がれば、フォーム編集画面の右上 をクリックし、 < >  スクリプトエディタ をクリックしGoogle Apps Scriptのエディターを立ち上げ、以下のコードを貼り付けます。

Google Forms経由で匿名でSlackに投稿するGoogle Apps Script · GitHub

ソースコード内の config.slack.tokenchat:write:bot Scopeの権限を持ったトークンです。また、必要に応じて config.slack.iconEmojiconfig.channel を変更してください。 ソースコードを写経し終えたら、スクリプトエディタの 編集現在のプロジェクトのトリガー から 新しいトリガーを作成します。 を選択します。

トリガー設定
トリガー設定

実行する関数を選択 には formSubmit を、イベントのソースを選択 には フォームからイベントの種類を選択 には フォーム送信時 を選び保存します。これで、フォームが送信されたときにスクリプトが動作するようになりました。

以上で準備は完了です。これで作成したGoogleフォームから、組織内の人であれば誰でも匿名でSlackにメッセージを投稿することができるようになりました!

動かしてみたところ

実際に匿名でSlackに投稿してみたところです。

匿名で投稿できるようになったよ!
匿名で投稿できるようになったよ!

もちろんトリップも使えます。

トリップも使えるよ!
トリップも使えるよ!
が、Googleフォームではアクセスしている人のIPアドレス等を取得することはできないため、fusianasan は実装されていません。

匿名で投稿たのしー。

ラーメン食べたい
ラーメン食べたい

ソースコード解説

Googleフォームで送信が押されたときの処理のソースコードを簡単に解説しておきます。

Google Forms経由で匿名でSlackに投稿するGoogle Apps Script · GitHub

といっても、そんなに説明が必要なほどのことはやっていません。フォームが送信されたときにはトリガーとして設定した関数に様々な情報が引数として渡されますが、そのなかの response プロパティがフォームの実行結果を表す FormResponse です。 getItemResponsse メソッドを使って各項目に入力された値を取得し、Slackの chat.postMessage APIを使って投稿する、という感じです。 最後に、受け取ったフォームのレスポンスはどこにも記録する必要はないので source.deleteAllResponses メソッドを呼び出し削除しています。

まとめ

後日談、というか今回のオチ。

そもそも匿名でなくても弊社では圧倒的に社内Slackの心理的安全性が高いため、匿名で投稿できる仕組みを作ってみたものの、最初のころに何名かがおもしろがって少し使った以外にはけっきょく誰も日常的には匿名で投稿することはありませんでした!