当社のCCPAソフトウェアとは
昨年、私とビジネスパートナーは、ウェブフォームとToll-Free Numberを通じてプライバシーリクエストを管理し、企業がカリフォルニア州消費者プライバシー法(CCPA)の要件を遵守できるようにするコンプライアンスソフトウェアソリューションの提供を始めることにしました。それ以来、保存データの100%暗号化、セキュリティを強化する多要素認証、全ユーザー向けのプライバシーリクエスト期限リマインダーなど、エンタープライズレベルの機能を追加してきました。パートナーは本職が弁護士で、私はエンジニアとして866-I-OPT-OUT(866-467-8688)プライバシーホットラインのソフトウェアソリューションの構築に携わりました。
当社のSaaSソリューションの内部の仕組みにご興味があれば、ぜひ続きをお読みください。
CCPATollfree.comは、3つの部分で構成されています。第一に、ダッシュボードがユーザーのアカウント設定と管理情報をPostgresデータベースに書き込みます。第二に、それらの情報の一部を使って、TwilioのProgrammable Voiceによる通話体験と、プライバシーリクエストを当社データベースに送信するウェブフォーム連携を実現しています。第三に、バックグラウンドジョブを使って、ユーザーへのレポート送信や各アカウントの通話使用量の計算を行っています。それでは、3つの部分をそれぞれ詳しく見ていきましょう。
アカウントの設定と管理
ダッシュボードでは、Service Codeを作成できます。Service Codeは、消費者がプライバシーに関する意思を登録できる個別の保管場所のようなものと考えてください。プライバシーリクエストを論理的に区分するための手段です。たとえば、エンタープライズのお客様が複数のブランドを所有し、同じ電話番号を異なるService Codeとともに別々のウェブサイトに掲載することはよくあります。プライバシーリクエストの区分に加えて、Service Codeごとに挨拶メッセージをカスタマイズできるため、Service Codeごとに異なる電話体験を提供できます。これらの設定はすべて、リアルタイムでPostgresデータベースに反映・保存されます。挨拶メッセージはAmazon S3バケットに保存され、消費者が御社のToll-Free Numberに電話をかけた際にリアルタイムで利用できるようになっています。
ダッシュボードに表示される各タブは、当社バックエンド上のリソースであり、それぞれに特定のアクションが関連付けられています。バックエンドはRuby on Railsアプリケーションです。共有データベースに保存されたデータが異なるお客様のアカウント間で漏えいしないことは、すべてのお客様にとって極めて重要です。各リソースのコントローラーは、現在ログインしているユーザーのアカウントに属するデータのみを返すことができます。これはデータの水平分割と呼ばれるもので、他のアカウントに属するデータベースのレコードが表示されることを防ぎます。もう一つの分割方法が垂直分割で、ユーザーインターフェースに絶対に必要な列のみをそのユーザーインターフェースで利用できるようにします。この動作を徹底するため、各エンドポイントをテストし、水平分割・垂直分割のいずれにも違反するデータがないことを確認しています。最高レベルの保証を必要とするエンタープライズのお客様には、共有データベースではなく専用のデータベースに接続したプライベートクラウドインスタンスを提供しています。
Twilioとウェブフォームの体験
Twilioは、Programmable Voiceという製品を提供しています。Twilioのアーキテクチャでは着信の処理能力に上限がなく、1秒あたりの同時着信数を無制限に受け付けられます。これは、規模を問わず数百社のお客様で共有番号を利用できるようにする、当社アーキテクチャの重要な要素です。TwilioはUberのようなユーザーの共有電話番号での通話もサポートしているため、当分の間は当社にとって十分な性能だと考えています。
TwilioのProgrammable Voiceは、消費者による操作ごとにHTTPリクエストを送信します。通話体験は、消費者が当社の電話番号1-866-467-8688または1-866-I-OPT-OUTに電話をかけたところから始まります。リクエストが当社バックエンドに届くと、Twilioの動作を指示するXMLを返します。たとえば、Service Codeとして1#が入力されると、バックエンドはダッシュボードの設定データを使い、次のステップ、つまりService Code 1の挨拶メッセージの再生に進むようTwilioに指示します。
御社のウェブサイトに当社サービスを組み込むと、ウェブフォームをご利用いただけます。このウェブフォームは、Toll-Free Numberで受け付けたリクエストと同じダッシュボードに、プライバシーリクエストを送信します。ウェブフォームにRECAPTCHAが含まれていることにお気づきでしょうか。これは、ウェブフォームを保護するためのGoogleの無料ツールです。Googleのバックエンドでトークンが生成され、当社のウェブフォームで受け取ったトークンを当社バックエンドに渡します。その後、GoogleのRECAPTCHAサービスでトークンの有効性を確認します。実際、当社はすべてのエンドポイントを保護しています。Deviseと呼ばれるRuby gemを使い、データへのアクセスを許可する前にすべてのユーザーが認証されていることを確認しています。Webhookについては、タイムスタンプチェック付きの署名技術を用いてリプレイ攻撃を防いでいます。また、第三者が御社のダッシュボードにリクエストを送信するウェブフォームを提供できないよう、オリジンをホワイトリストで管理しています。御社のドメインがHTTPSで当社アプリケーションと通信できるよう設定するために、メールでご依頼いただく必要があるのはこのためです。
バックグラウンドジョブ
当社アーキテクチャの最後の重要な要素は、バックグラウンドジョブです。バックグラウンドジョブは、全アカウントの通話使用量の非同期計算などに使用しており、その結果を毎日Stripeに送信しています。また、ダッシュボードで選択された設定に基づいて送信するレポートメールも作成しています。これらのジョブはHerokuで構築された当社インフラ上で実行され、データがアカウント間で漏えいしないよう、アカウントごとに分割されています。メールでは集計データのみを送信するため、機密情報が含まれることはありません。
非同期処理のもう一つの重要な要素は、ネットワークや計算処理に障害が発生した場合にデータストリームを再実行できることです。アカウントの使用量(通話件数など)を追跡するために、データベーストランザクションを開始して使用量を「処理済み」に更新し、集計した使用量を毎日Stripeに送信します。送信が成功すればトランザクションをコミットします。何か問題が発生した場合は、使用量を「未処理」にロールバックします。Stripeへの送信後、トランザクションが完了する前にエラーが発生した場合は、各アカウントの1日あたりの通話件数を再計算することで、CAP定理が予測する問題に対処できます。
バックグラウンドジョブはPapertrailとNew Relicで監視しており、問題が発生すると常にアラートを受け取ります。実際、システムのすべての部分に同じレベルのアラートを設けています。Twilio、バックエンド、ウェブフォーム、メールサーバー、Stripeの決済のいずれかで問題が発生するとアラートを受け取るため、問題が起きたらすぐに対処できます。これは、お客様にエンタープライズレベルのサポートを提供するという当社の約束の一環です。
CCPA Toll Freeは、創業当初から掲げてきたセキュリティと監視のモデルに沿って、機能を拡充し続けています。ロードマップには、数多くのパートナーシップや連携などが予定されています。ご質問や機能のご要望は、お気軽にsupport@optacy.comまでお寄せください。