開発者からの機密データの保護


61

MySQLMongoDBの両方のデータストアを使用するエンタープライズアプリケーションを実行しています。私の開発チームはすべて、アプリケーションのリリース、メンテナンスなどを実行するために、マシンへのSSHアクセスを持っています。

ユーザーがアプリケーションに非常に機密性の高いデータを保存し始めたときに、開発者がこのデータに間接的にアクセスしているために嵐が発生したため、最近ビジネスでリスクを提起しました。アクセス可能。

私には、アプリケーションがデータベースにアクセスできる場合、マシンとアプリケーションソースにアクセスできる開発者は常にデータにアクセスできるため、これは不可能に思えます。


30
ユーザーは、暗号化された形式でのみ機密データを保存する必要があります。一致するキーが適切に保護されている限り、開発者が暗号化されたフォームにアクセスできれば、大きな問題はありません。
MSalters

3
@Clinton管理チームと開発チームは別々ですか?サーバー管理者は常にデータを読み取ることができ、暗号化は簡単にキーを取得できるため、役に立ちません。
CodesInChaos 14

14
完全に正直に言うと、これは複雑な問題であり、正しく実行するにはデータセキュリティに関する多くの専門知識が必要です。何をすべきかを正確に知っていたとしても、ビジネス上の反対、政治的および技術的な障害に直面します。データセキュリティコンサルタントを連れてくることを強くお勧めします。彼らはここで何をすべきかを知っているだけでなく、上級管理職は通常、第三者が変更するように言っているときにより多くの信用を与えます。上級管理職は一般に、内部の専門家が彼らに言っているほど多くの在庫を置いていません。
maple_shaft

3
情報セキュリティスタック交換について尋ねる価値があるかもしれません。この質問には
paj28 14

23
人間がサーバーに触れてコードを展開するのはなぜですか?
ワイアットバーネット14

回答:


89

セキュリティは、プロジェクトの終わりに手を振ることができる魔法の杖ではありません。1日目から検討して組み込む必要があります。システム全体の一部として定期的に、これは最も弱いリンクと同じくらい強いだけです。

現状では、セキュリティの懸念事項にフラグを立てていますが、これは良い第一歩です。今、最低限、以下を定義する必要があります。

  • 保護しようとしているデータは何ですか?
  • そのデータを誰から保護しようとしていますか?
  • 実際に何にいつアクセスする必要がありますか?
  • そのデータが侵害された場合の法的/財務/ビジネスへの影響は何ですか?
  • データへのアクセス権を持つ個人/グループに法的/財務/ビジネス上のニーズは何ですか?
  • ビジネスが以前はビジネス要件でなかった場合に、ビジネスは「セキュリティを確保し、セキュリティを維持する」戦略にどのくらいの予算を割り当てますか?
  • システムはデータにどのようなアクセスを必要としますか?
  • このアプリケーションとこのプロセスが依存するプロセスとシステムは何ですか?
  • これらの環境を保護するために何が行われますか?
  • 誰がそれを実装し、プロセス全体をレビューする責任を負いますか?

これらすべてを詳細に知るまで、実際に作業するものはありません。その情報は、適用できる(およびできない)脅威とその理由を定義します。

最善のことは、必要な経験がないことを認識し、その経験を持つ新しい人を連れて行くのが最善であるということかもしれません。予算がないという回答をよく耳にします。もしそれが本当に重要だと考えられるなら、予算が見つかります。


33
おっと...それはセキュリティを鳴らします...非自明です。(皮肉のためごめんなさい。私は多くの人々がこれに驚いたのを見た。)
ポールドレイパー14

4
多くの人make-application-secureが、実行するだけの魔法のコマンドがあると思っていると思います。
TMH 14

27

あなたが正しいです。ユーザーが毎回追加情報を渡すことなく、アプリケーションが企業のマシンに保存されたコンテンツにアクセスできる場合、サービスプロバイダーのプログラマー、メンテナー、システム管理者などはそのコンテンツにアクセスできます。これは基本的に避けられないことであり、不安の主な原因です(エドワードスノーデンはシステム管理者であり、単に「トップシークレット」以上の特別な権限がありました。単に付与しない方法がないためです)。

これを回避する唯一の方法は、企業のマシンに決して届かない情報をユーザーに提供することを要求することです。安全なアクセスバリアを形成するのに十分な情報を誰も覚えていない可能性があるため、これは退屈でエラーが発生しやすく、したがって、人々はすぐにどこかで資格情報を電子的に保存し始め、それが新しい攻撃の標的になります(そしておそらく維持しているターゲットよりも弱いターゲット)。しかし、「当社の従業員はユーザーのコンテンツに物理的にアクセスできない」と正直に主張したい場合は、それが唯一の方法です。

(また、そのようなビジネスモデルは政治的に受け入れられなくなっているように思われることに注意してください。企業はまさにこれを行うためにセキュリティサービスによって強制的に運用を停止されています。ビジネスにとどまるという基本的な目標よりもビジネス価値)


6
複数の独立した人々の共同作業なしに破壊することができなかったようなアクセスの永続的な記録を作成せずに、特定のデータにアクセスすることは物理的に不可能であるようにハードウェアを設計することが可能であり、これさえも、このようなコラボレーションでは破壊されませんでした意図的な破壊の明確な証拠を残すことなく。ただし、要件の変化に対応するためにそのようなシステムを更新することは、ソフトウェアベースのセキュリティシステムを更新することに比べて非常に高価になりがちです。
supercat 14

5
あなたは正しい、私は完全にゼロ知識ホスティングに代わる可能として監査可能について言及するのを忘れていました。それは達成するのがいくぶん簡単で、多くの場合、ビジネスケースに十分です。
キリアンフォス14

最後の段落。LavaBitタイプのストーリーを参照していますか?よくわかりません。
jpmc26 14

1
@supercatまた、ハードウェアの作成者が言ったことをハードウェアの作成者が実行したことを信頼する必要があります。
user253751 14

2
@immibis:本当ですが、安全なハードウェアの設計と製造は、複数の独立した人々によって監査されるでしょう。さらに、従来のシステムでは、「卑劣な」コードが何かを実行し、トレースなしでそれ自体を削除することは可能ですが、セキュアなハードウェアが書き込み可能なコントロールストアを持たない場合、不可能でしょう。卑劣なコードがコントロールストアに永続的に存在するか、コントロールストアが永続的に配線された変更手段を備えている必要があります。どちらも事後的に検出可能です。
supercat

15

あなたはまったく正しいです。運用上の問題を診断するためだけに、一部の開発者は常にライブデータにアクセスする必要があります。あなたができる最善のことは、関与する人々の数を減らすことによって、潜在的な損害を制限することです。

With great power comes great ... opportunity to really, *really* foul things up. 

多くの開発者はその責任や他の人を望んでおらず、単にそれを保持する「準備」ができていないので、そうすべきではありません。

質問:開発チームがライブリリースを実行しているのはなぜですか?
リリース管理の「チーム」が必要であることをお勧めします(チームのほんの一部であるだけでなく、「Go / No-Go」のような当日の「意思決定」を行うためのビジネス表現も必要です)。これにより、開発者がLiveのあらゆるものに触れるための「必要性」の多くがなくなります。

開発者と会社の間で機密保持契約を結んでいますか?重いですが、いくつかのメリットがあるかもしれません。


これは、決定された不正行為者がアプリケーションのバックドアを隠すのを止めることはできませんが、泥棒を作る機会を減らします。
Jan Hudec 14

はい、開発チーム全体ではなく、サブセット/リリース管理チームです。雇用契約には、あなたがすべきではないデータをaround索することに関する条項が確かにあります。これは却下可能な犯罪です。
クリントンボッシュ14

@JanHudec特にコードを追加してから、アプリケーションはバージョン管理に痕跡を残します。
CodesInChaos 14

@CodesInChaos:優れたプログラマーは、バックドアを正直な間違いのように見せることができます。あなたはそれらを疑いますが、あなたは彼らに対して訴訟を起こすことは決してないでしょう。しかし、はい、それは別の防衛線です。
ジャン・ヒューデック

@Jan:これが、すべてのコード変更をレビューし、リリースブランチに入れる前に承認する必要がある理由です。
SilverlightFox 14

9

問題は、開発者がシステムにアクセスできることです。デバッグのために本番データが必要な場合は、機密情報がすべて削除されたデータベースダンプを提供します。その後、開発者はそのダンプを使用できます。

新しいバージョンの展開には、開発者が関与するべきではありません-それは純粋な管理者タスク、あるいはそれ以上に-完全に自動化されたタスクです。また、リリースとデプロイは2つの非常に異なるタスクであることに注意してください。プロセスがそれを認識していない場合は、それに応じて変更します。


1
我々はそのためにダンプサニタイズデータを持っていますが、時々展開がリリース管理チームの一部の開発者によって運営されているなど、さまざまなデータ移行が必要です(しかし、彼らはまだ開発されている)、デバッグから生産データを必要としない
クリントンボッシュ

2
@ClintonBosch次に、管理者と開発者の役割を明確に分離していません。また、もう1つ質問する必要があります。リリースされたソフトウェアも実際に展開されるようにするにはどうすればよいでしょうか。リリースにサインオンし、本番環境でのみ署名済みパッケージの展開を許可する必要があります。また、自動化はあなたの友人です。移行には手動の手順は必要ありません。
SpaceTrucker 14

4
@ClintonBosch機密性の高いデータフィールドを特定し、暗号化します。どのユーザーIDがキーファイルを読み取っているかにアクセスして、アプリケーションユーザー以外がこれを行っていないことを確認できるように、運用OSのセキュリティを設定してください。開発者にアプリのユーザーパスワードを与えないでください。それらをsudoにして、実動の権限を取得し、何をしているかを記録します。これはおそらく、アクセスできる少数の人々をベビーシッターに入れ、彼らが意図しないデータを偶然または誤って見ることがないようにするための最も安全な方法です。
maple_shaft

6

セキュリティのルール#1:誰かが情報にアクセスできる場合、その情報にアクセスできます

そのトートロジーは迷惑ですが、それは本当です。個人にアクセス権を付与すると、データにアクセスできます。ユーザーにとっては、これは通常、アクセス制御を意味しますが、開発者にとっては...まあ...彼らはアクセス制御を書かなければなりません。

これがあなたにとって大きな問題である(そしてそのように聞こえる)場合、ソフトウェアにセキュリティを組み込むことを検討してください。一般的なパターンは、安全なソフトウェアをレイヤーで設計することです。最下層では、信頼できる開発チームが最も裸のアクセス制御を管理するソフトウェアを設計します。そのソフトウェアは、できるだけ多くの人々によって検証および検証されます。そのコードを設計する誰もがすべてにアクセスできるため、信頼が不可欠です。

その後、開発者はそのコア層の上に、より柔軟なアクセス制御を構築できます。このコードはまだV&Vdである必要がありますが、本質をカバーするためにコアレイヤーに常に依存できるため、それほど厳密ではありません。

パターンは外側に広がります。

難しいのは、確かに芸術これらのシステムを設計するのは、開発者はまだあなたが期待するセキュリティであなたの会社を提供しながら、開発とデバッグを続けることができるように、それぞれの層を構築する方法です。特に、デバッグには必要以上の特権が必要であり、ロックダウンしようとすると、非常に怒っている開発者がいることに同意する必要があります。

副次的な解決策として、開発者がすべての安全メカニズムをリッピングして本格的なデバッグを行えるテスト目的で「安全な」データベースを作成することを検討してください。

最終的に、あなたとあなたの開発者の両方がセキュリティの重要な教義を理解する必要があります。すべてのセキュリティはセキュリティとユーザビリティのバランスです。会社として自分のバランスをとる必要あります。システムは完全に安全ではなく、完全には使用できません。会社の成長や開発者への要求の変化に応じて、おそらくそのバランスは動くでしょう。あなたがこの現実に開かれているなら、あなたはそれに取り組むことができます。


3

別々のデータベース展開も使用するアプリケーションの2つの展開を設定します。1つは運用展開で、もう1つはテスト展開です。

テスト展開には、テストデータのみを含める必要があります。これは、その目的のために作成された空想データか、開発者がデータの背後にある実在の人物やエンティティを見つけられないように匿名化された実動データのコピーのいずれかです。


はい、これはまさに私たちが持っているシナリオです。しかし、ある時点で、誰かが運用環境で作業して、展開/データ移行を促進する必要があります
クリントンボッシュ14

3

2つの金融会社では、開発者は生産マシンにアクセスできませんでした。生産マシンの変更要求はすべて、スクリプトを使用して承認プロセスを経る必要があり、マネージャーによって承認されました。dev-opsチームは実際の展開を完了しました。このチームは従業員のみであり、経歴確認に合格したと思います。また、開発者の知識もなかったため、必要に応じてスヌープできませんでした。これに加えて、環境変数に保存された秘密キーを使用してすべてのデータベースエントリを暗号化します。データベースが公に漏洩したとしても、誰も読むことができませんでした。このキーはさらにパスワードで保護(PBKDF)できるため、エグゼクティブのみがロックを解除できます。システムは、起動時にエグゼクティブパスワードを要求する可能性があります(または、dev-opsまたはdev-opsマネージャーに委任される可能性が高い)。基本的に、戦略は知識を分散させることで、必要な知識の重要な塊が一人の人間に存在せず、チェックとバランスがあるようにします。これが、コカコーラがその処方を保護する方法です。正直なところ、これらの答えのいくつかは警戒です。


-1

MongoDBのセキュリティ制御は制限されており、安全な環境に依存しています。特定のIPおよびポート(および2.2以降のSSL)へのバインド、および粗雑な認証、それが提供するものです。MYSQLはGRANT o ON db.t TO ...を保存します。保存データは暗号化されず、デフォルトではsslは使用されません。フェンスを作成します。アプリケーション関連のログファイルへの開発者の読み取り専用アクセスは、デバッグに十分なはずです。アプリケーションのライフサイクルを自動化します。

Ansibleは、多くのシングルテナント環境での標準操作(展開、アップグレード、復元)を自動化する一方で、個別の暗号化されたボールトを使用して、ホスト、ポート、資格情報などの機密環境変数を保存しました。記録された操作のために、各ボールトが異なる役割によってのみ、要塞ホストでのみ復号化できる場合、監査可能性は許容できるセキュリティを提供します。SSHを付与する場合は、selinuxを使用してキーの改ざんを避け、管理にldap / kerberos認証を使用した要塞ホストを使用し、sudoを賢明に使用してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.