IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

Ruby on Rails 海外事情コラム

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  OpenStack  システムトラブルシュート 

第40回 Railsで機密情報を保護するために (野田貴子) 2019年2月

こんにちはー。野田貴子です。 海外のコラムで面白いものがあったので、意訳してお届けします。 ご参考ください。

###

残念なことに、2018年も情報漏洩のニュースは枚挙にいとまがありませんでしたね。今回は、機密情報をRuby on Railsで保護する方法をまとめたブログをご紹介します。元のページではコードの書き方など詳しい方法が載っていますが、文字数の都合上、こちらでは簡単な紹介にとどめました。詳しい方法についてはぜひリンク先をたどってください。

Securing Sensitive Data in Rails
https://ankane.org/sensitive-data-rails

毎週のように情報漏洩のニュースを見かけている気がします。もしみなさんがまだ機密情報の格納方法を見直していないならば、今がおそらく良いチャンスでしょう。ユーザーの信頼は自分の情報のプライバシーとセキュリティに基づいています。

このガイドでは、機密情報とは何か、機密情報を保存するためのベストプラクティス、そして避けるべき落とし穴について説明していきます。

機密情報とは何か

アメリカ国立標準技術研究所は、個人を特定できる情報(PII)を次のように定義しています。

  1. 個人の身元を識別あるいは追跡するために使用できる情報
  2. 個人にリンクされているか、リンク可能なその他の情報

そしてGDPRは、個人データを「識別された、または識別可能な自然人に関するあらゆる情報」と定義してします。

個人を特定できるデータの例をいくつか示します。

  • 氏名
  • メールアドレス
  • 住所
  • 電話番号
  • クレジットカード番号
  • 社会保障番号、パスポート番号、または運転免許証番号
  • IPアドレス

そして以下の例は、必ずしもそれ自体が機密情報ではありませんが、人にリンクされている場合がある情報です。

  • 生年月日
  • 位置情報
  • 身元調査
  • 医療記録

この2種類の間の境界線は必ずしも明確ではありません。たとえば、位置情報を使用して人物を特定できるケースもあります。

これらのデータはまた、引き起こす可能性がある被害のレベルに応じてそれぞれ機密レベルがあります。被害とは、金銭的(本人詐称など)、社会的(混乱など)、あるいは身体的なものまであります。みなさんは状況に応じたレベルの定義をする必要がありますが、以下を参考に始めてみてください。

  • (相対的に)低い:IPアドレス
  • :氏名、メールアドレス
  • :住所、電話番号、生年月日、位置情報
  • 非常に高い:クレジットカード番号、社会保障番号、パスポート番号、運転免許証番号、身分証明書、医療記録

もし今の時点でこれらのデータすべてに対する強力な保護策が取られていない場合は、最も機密レベルが高いものから始めて順に対応してください。

データの送信

ユーザーは通常、ブラウザやネイティブアプリを通じて情報を送信します。データが転送中に暗号化されていることを確認してください。最も人気のあるブラウザであるGoogle Chromeは、HTTPSを使用していないWebサイトにアクセスしたときにアドレスバーに警告を表示するようになりました。

参考

データの保存

データが送信されたら、それを保存する場所が必要です。一般的な保存場所は3つあります。

  • サードパーティー
  • データベース
  • ファイル

それぞれのベストプラクティスを見ていきましょう。

サードパーティー

機密データの保存を専門とするサービスがあります。 可能であれば、これらのサービスのいずれかを使用しましょう。

データベース

データを自分で保存する必要がある場合は、データベースが適切であることがあります。保存時にデータを暗号化することが重要です。これを実現する方法はさまざまなセキュリティ上の観点からいくつかあります。

ストレージレベル

最も簡単なのはフルディスク暗号化です。これにより、保存中のすべてのデータが暗号化されます。データベースはデータが暗号化されていることを認識する必要すらありません。

このアプローチはデータを物理的な盗難から保護します。ただしデータベースへの接続に成功した攻撃者から保護することはできません。

アプリケーションレベル

そのためには、データベースにデータを送信する前にデータを暗号化する必要があります。これはアプリケーションレベルの暗号化として知られています。すべてのデータにストレージレベルの暗号化を使用し、機密データにはアプリケーションレベルの暗号化を使用します。

参考

暗号化と復号化

復号化を制限することは、優れたセキュリティにとって不可欠です。システムの一部は暗号化だけをできるようにしておくべきです。ユーザーに表示する必要がない限り、データベースのデータを復号化する必要はありません。

参考

監査証跡

これまで説明してきた両方のアプローチの大きな欠点は、セキュリティにとって重要な信頼できる監査証跡がないことです。違反が発生した場合にどのデータがアクセスされたかを確実に知る必要があります。攻撃者がキーにアクセスすると、追跡なしでオフラインですべてのデータを復号化できてしまいます。Rubyに監査証跡を追加することもできますが、攻撃者がデータベースをダウンロードし、キーを盗み、オフラインで復号化すればよいだけなので、これは簡単に迂回されます。他に何か必要です。

サービスとしての暗号

これを解決する1つの方法は、サービスを使用して暗号化と復号化をすることです。このサービスはキー、監査、そして権限を管理できます。これらはキー管理サービス(KMS)として知られています。

参考

データの検索

データが暗号化されていると検索がはるかに困難になりますが、いくつかのテクニックがあります。

参考

パスワード

パスワードは元に戻せてはいけないため、パスワードに暗号化を使用しないでください。代わりにbcryptを使用してパスワードをハッシュします。

参考

  • Devise
  • has_secure_password(Railsの機能)
匿名化

暗号化せずにデータを保護する1つの方法は匿名化です。

参考

データベースの機能

まだ議論していない選択肢の1つは、データベースの組み込み機能を暗号化に使用することです。ただし、鍵と暗号化されていないデータの両方が短時間の間データベースサーバーに存在し、そこで全アクセス権を持つユーザーがそれらを傍受する可能性があります。代わりにアプリケーションレベルの暗号化を使用してください。

バックアップ

バックアップも必ず暗号化してください。また、誰がバックアップにアクセスできるかを制限しましょう。

ファイル

ファイルは、機密情報を格納できるもう1つの場所です。データベースと同様に、すべてのデータにストレージレベルの暗号化を使用し、機密データにはアプリケーションレベルの暗号化を使用します。

ストレージレベル

ストレージサービスはこれをサーバー側の暗号化と呼びます。繰り返しますが、これは物理的な盗難の場合に役立ちます。また、直接アップロードするのにもいい方法です。

参考

  • Amazon S3
  • Google Cloud Storage

いつファイルがアクセスされるかを確認するためにロギングをオンにしておきましょう。

アプリケーションレベル

アプリケーションレベルで暗号化すると、ストレージサービスは暗号化されていないファイルを見ることができなくなります。これにより、データが漏洩するような設定ミスを防ぐことができます。誰かが中を覗いても、鍵なしでデータにアクセスすることはできません。ストレージサービスはこれをクライアント側の暗号化と呼びます。

データを漏洩させないこと

機密データに関する主な懸念事項の1つは、漏洩です。データが漏れるよくある場所は次のとおりです。

  • ログ
  • 監査
  • サードパーティー
  • キャッシュストア
  • メール

ログにはたくさんの情報があります。ログはかなりの期間保存されることがあるため、妥協される可能性があります。

Railsは各リクエストとそのパラメータを記録します。機密項目をconfig/initializers/filter_parameter_logging.rbに追加しましょう。これにより、ログ内の機密データが[FILTERED]に置き換えられます。

参考

監査

Auditedのような監査ライブラリを使用している場合は、機密性の高いデータを取り込まないようにしてください。特定の項目を監査から除外することができます。

サードパーティー

分析、計測、エラー報告サービスはすべて、データが漏れる可能性がある場所です。GDPRのおかげでこれらのサービスの多くにはこれを防ぐための選択肢が用意されています。

キャッシュストア

誤って機密情報をキャッシュしないようにしてください。

メール

機密情報を電子メールに含めないでください。代わりに、URLリンクを使用しましょう。これは管理者への電子メールにも当てはまります。

システムの堅牢化
コード

ruby-security-annを購読して、Ruby、Rails、Rubygems、Bundler、その他のRubyエコシステムプロジェクトに関するセキュリティアナウンスを入手しましょう。

参考

内部トラフィック

内部ネットワーク上のすべてのトラフィックを暗号化することを検討してください。これは盗聴から保護します。前述したように、機密情報はデータベースやジョブキューに渡す前にアプリで暗号化する必要がありますが、これはすべてのデータを保護するための優れた方法です。多くのホストサービスプロバイダでは簡単な設定でこの機能を使えます。

まとめ

ユーザーデータには大いなる責任が伴います。機密情報をアプリケーションレベルで暗号化し、残りのデータをストレージレベルで暗号化します。 鍵、監査、権限を管理するためのサービスモデルとして暗号方式を使用してください。 ログ、監査、サードパーティー、キャッシュストア、電子メールに情報を漏らさないように注意してください。機密情報にアクセスできる人を制限し、問題を検出するための適切な監視を設定しましょう。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  OpenStack  システムトラブルシュート