シンジです。インターネットの世界で匿名と言われると、まるで自分が発言しても自分だとは分からないとか、誰が何を書いてるか特定できないように感じるものですが、実際のところは2ちゃんねるからも逮捕者が出ているわけですし、サービス提供者が匿名ですと言ってたところで完全な匿名が担保されている世界ではなかったわけです。匿名度にはレベルがあって、どの程度の匿名性があるのかは、利用者が気をつける話になっているわけですが、今回は匿名とは無縁なSlackを匿名にした話しです。
匿名とはなんなのか
匿名と言うのを想像するとまるで、行動を起こした人物が誰なのか何物なのかが分からない、というイメージを想像しがちですが実際は、行動を起こした人物が自ら何物なのかを明かさないことを匿名と言うのであって、第三者の力によって対象が何物なのかを明かすことができない事が匿名とは言わない、という点がミソです。前述の通り、インターネットの世界における匿名度合いを上げていくためには、サービス提供者のさじ加減よりも利用者の工夫が重要になっているわけです。
まぁそこまでして人物を秘匿にして行動を起こそうとするなんて、後ろめたい事があるのかなとか思っちゃいますけどね。
匿名のメリデメと匿名の役割
サービスが匿名性を保証しているなら、その匿名性能に納得した上で個人が特定できないものだとしましょう。個人が特定できない一番のメリットは、個人のプライバシーが保護される点でしょう。行動や発言に個人が紐付かなければ、自身の利益を保護できます。
第三者から不要な詮索を受けたくない、売名だと思われたくない、話したいけど聞かれたくない、そんなこんなで匿名は告発によく使われます。不正を暴露したいけど組織的に潰されたらとか、退職に追い込まれたらとか、不利益は被りたくないわけです。
一方で匿名は、自分が何物か分からないので何をしても良いと勘違いさせる側面があります。誹謗中傷が分かりやすい事案だと思います。
匿名にはレベルがあり、どこでどのような機能を果たすために匿名が用いられるのかによっても変わります。匿名そのものはWikiでも見て下さい。俺も見ました。
Slackを匿名化するのは何故か
頼まれたからです。Slackを匿名で使おうなんて思ってもみませんでした。いや、コミュニティレベルのSlackワークスペースなら分かりますよ。本名書かなくても参加できますからね。利用者の工夫で匿名性を制御できます。今回のケースは、事業体の組織内での話しです。
用途的には告発ではなく、アンケート的な感じでした。他部署の行いごとに文句のひとつも言えない組織、わかるわかるって感じです。そういった壁を取っ払って物事を進めていこうというアプローチの為に、Slackを匿名化しようという話しでした。
Slackを匿名化できるのか
とりあえずググったら、いろんな人がチャレンジしていて、なんだそこそこ需要あるんだなんて感心してしまいました。様々なアプローチがあったものの、シンジ的には利用者のハードルが高かったり(都度コマンド発行が必要だったり)、誤爆して匿名性が解除される恐れがあったり、Slackを使ったことのないような人たちが使えるようにしなければと思った点もあり、再設計してみました。
結論としてSlackを匿名化するには、Slack Enterprise GRIDが必要です。誤爆を徹底的に防ぐためです。普段業務で使っているワークスペースはそのままに、匿名専用のワークスペースを用いることにしました。
- チャンネルは投稿も作成も出来ない、generalを見ることしか出来ない
- なんならリアクションしても消される
- アプリ追加もbotも動かない
- ユーザー名は自動生成される、プロフィール画像もランダム、24時間に1回変更される
- 匿名Appで発言したものが匿名化されてgeneralに投稿される。匿名化されなかった発言は絶対に投稿されない
- 実際は匿名Appに発言が集約されるので、App画面だけを開いて見てると普通に会話出来る
- スマホからも普通に匿名投稿できるし見られる
- URLも展開されるしプレビューもでるしスニペットも活用できる
Slackを事業体の組織内で利用している場合、必ず利用者を特定できるようにして利用しているわけなので、ここから更に一手間加えて匿名処理を走らせる必要があります。
こんな感じになりました
匿名Appへの接続が行われない限り、何をどう頑張っても投稿できません。読むことはできます。書きたい人は匿名Appに接続します。
Slack匿名化は管理者が頑張ればIDを特定できる
仕組みとして始めから投稿を特定できるようには作っていませんが、始めからそのように作れば簡単に特定する事も出来るでしょう。今回のは、すんごい頑張ればログを付け合わせて発言を特定する事もできます。ただし特定が可能なのはSlackの管理者のみです。
Slack Enterprise GRIDの統制配下において展開される匿名プラットフォームです。ポイントはここです。個人プライバシーを守るのは管理者です。
Slack匿名化の仕組み
匿名ワークスペースには、Slack Enterprise GRIDに参加しているメンバーのみが参加できます。ゲストを招待する事は出来ません。
このワークスペースでは、アプリの追加やコマンド発行、Slack Botなども全て利用禁止に設定しています。
GRIDの設定により、チャンネルへの投稿すら出来ないようにしてあります。チャンネルへ投稿できるのは、匿名Appのみです。
徹底的に操作を禁止しまくるのは、誤爆による匿名の解除を防ぐためです。
動作の詳細
匿名AppはAWS Lambdaで動作しています。
匿名Appが認証したユーザーのIMのIDと、User Tokenを保存し、ユーザーがAppに対して発言した内容をトリガーに、ユーザー名を匿名化し、全てのユーザの匿名AppのIMとgeneralチャンネルに対して発言を送信します。
- ユーザーは匿名AppによってSlackのOAuth2認証を行います
- RedirectによりCallbackがAPI Gatewayから返ります
- API GatewayからLambdaが呼ばれます
- Lambda内にてCallbackで返却されたUser TokenをSSM Parameter Storeに保管します
- 併せてユーザーと匿名App間のIMのチャンネルIDをSSM Parameter Storeに保管します
匿名化の動作
- ユーザーが匿名Appに対して発言を投稿します
- SlackのEnentSubscriptionsにてim.eventがAPI Gatewayに送られます
- API GatewayからLambdaが呼ばれます
- 保管しておいたUser TokenをSSM Parameter Storeから取得します
- 保管しておいたIMチャンネルIDの全ユーザー分をSSM Parameter Storeから取得します
- 発言したユーザーの名前を匿名化するために、HASH値にします
- このHASH値は日付とユーザー名を元に作成する為、24時間は維持されます
- ユーザーの特定を避けるために、直接HASH値を用いずにHASHを元に更に匿名値を算出しています
- HASH値を元にプロフィールのアイコン画像を取得します
- アイコン用の画像はSlackに登録されているemojiからランダムで取得されます
- 全ユーザーの匿名AppのIMとgeneralチャンネルに対して匿名化したメッセージを送信します。処理はスレッディングにて行います。
- 匿名Appに発言した元の発言を削除します
小技の実装
匿名化された発言に対してリアクションを付けると、リアクションを付けたアカウント名が表示されるので、リアクションがついても速攻で削除する、とかなんかいろんな小技を実装しています。
さすがにワークスペースまるごとリアクション無効化とかは標準で存在してないですね。ないですよね。そりゃね。
Slackが実装することはあるのかな?
匿名って文化によるところも大きいと思うので、一手間加えて匿名化を作ったわけですが、実際にこれがうまく機能するかどうかは組織の文化や国ごとの文化もあるでしょうし、誰にでもオススメできる代物ではありませんが、直感的に可能性を感じたのなら、おそらくその直感のまま機能すると思います。
当社には必要ない代物です。人数少ないですからね。匿名化されてても文字の雰囲気で分かっちゃう気がするし。そもそも、なんでもSlackにほいほい書いちゃう文化があるので使われなかったという。
匿名Appのインテグレーションと運用の面倒まで一緒にお願いって方はご連絡頂ければ売ります。これからGRIDを検討する材料にしてもらってもいいかもしれません。値段は決めてないので最初の顧客が決めると思います。いつも適当ですいません。