本番データベースで誤ってジャッキングするのを防ぐにはどうすればよいですか?


31

つい最近、ステージングコピーに復元すべきだったときに、開発者が誤ってデータベースを本番環境に復元しようとしました。データベース名が類似している場合(CustomerName_StagingとCustomerName_Production)であれば、簡単に実行できます。

理想的には、これらを完全に別々のボックスに入れますが、それは非常にコストがかかり、厳密に言えば、ユーザーが間違ったボックスに接続した場合に同じことが起こるのを防ぐことはできません。

これ自体はセキュリティの問題ではありません。ステージングデータベースを操作するのは正しいユーザーであり、運用データベースで実行する作業があれば、それも彼の問題になります。これらの懸念を分離するために、展開担当者が必要ですが、チームはそのために十分な大きさではありません。

これを防ぐ方法について、練習、構成、および制御の観点からアドバイスを聞きたいです。


25
開発者は、本番データベースへの書き込みアクセス、またはできれアクセスを許可しないでください。
マイケルハンプトン

12
@MichaelHampton-私と彼です。私も開発者です。何を指示してるんですか?
クリスB. Behrens

10
各ロールの個別のユーザーアカウント(dev vs ops / DBA)。そして、十分な注意。
マイケルハンプトン

2
実稼働環境を別のボックスに置くことを強くお勧めします。それ以外の場合、ステージングとプロダクションはリソース(ディスク、CPUなど)を共有する必要があり、ステージングがリソースを独占している場合、プロダクション環境が影響を受ける可能性があります。
トールビョールンラヴンアンデルセン

1
それらのデータベースに対して個別のユーザー/パスワードを用意するだけです。
ニュートリヌス

回答:


32

これが頻繁に行われると思われる場合は、自動化します。そして、あなたは両方の開発者なので、いくつかのコードを書くことはあなたの操舵室にあるべきです。:)まじめに...それを自動化することで、次のようなことができます:

  • 正しいサーバーで復元していることを確認します(つまり、dev-> prodの復元はありません)
  • データベースの正しい「タイプ」であることを確認します(あなたの場合、「ステージング」と「プロダクション」)
  • msdbのバックアップテーブルを見て、自動的に復元するバックアップを見つけます。

など。あなたの想像力によってのみ制限されます。


1
これは興味深いアイデアです... dbの復元を管理するコードが既にあります(自動テスト用)。私達は...しか生産に復元することは全く別のプロセスだったので、ステージングで指摘している間に抽象化レイヤーを入れることができます
クリスB.ベーレンス

11
今、あなたはポータルを考えています。:)
ベンスル

4
生産に影響を与える自動化されたジョブの場合、ユーザーが「生産」という単語を入力する必要がある手動のステップを追加して、たとえばステージング同等物を見ていると考える可能性を減らします。
ジョーリーモイエ

2
誰もデフォルトで本番環境にアクセスするべきではないので、私は投票しました。prodパスワードを取得するには、特別なプロセスが必要です。それは不便ですが、本当に最小限です。
オリバーズ

1
@BenThul prodアクセス用に別のアカウントを追加し、もう1ステップ不便にすることは、依然として正しい解決策です。ビジネス上のニーズは、DEVに2分間保存するのではなく、prodアカウントに完全に移動できるDBを復元することです。
オリバーズ

32

私は質問の前提に同意しません—これセキュリティです— しかし、自動化がそれ自体で一日を節約することになることにも同意しません。私は問題から始めます:

本番環境に対して誤って何かをすることはできません!

それには、自動化されたものを誤って実行することが含まれます。

システムのセキュリティを「誰が何をすることを許可されているか」などの概念と混同しています。開発アカウントは、そのコピー、バージョン管理サーバー、および開発データベースにのみ書き込みができる必要があります。プロダクションの読み取り/書き込みができる場合、ハッキングされて顧客データを盗むために悪用されたり、(実証したように)顧客データを失ってしまう可能性があります。

ワークフローを整理することから始める必要があります。

  • 開発者アカウントは、独自のコピーに書き込み、バージョン管理を行い、バージョン管理からテスト環境にプルできる必要があります。

  • バックアップユーザーは、運用環境からの読み取りとバックアップストアへの書き込みのみを行う必要があります(適切に保護する必要があります)。

  • 本番環境で他の読み取り/書き込みを行うには、特別で不便な認証が必要です。ログインしたり忘れたりしてはいけません。ここでは物理的なアクセス制御が便利です。スマートカード、アカウントを「アーム」するフリップスイッチ、同時ターンデュアルキーアクセス。

    本番環境へのアクセスは、毎日行う必要があるものではありません。作業の大部分は、テストプラットフォームで行われ、綿密な精査の後、本番環境への時間外の展開が行われます。少し不便でもあなたを殺すことはありません。

自動化はソリューションの一部です。

完全なターンアラウンド(VCSへのアップロード、カバレッジの確認、テストサーバーへのプル、自動テストの実行、再認証、バックアップの作成、VCSからのプル)が長いプロセスであるという事実に目をつぶっていません。

それはだベンの答えごとに、どこオートメーション缶の助け。特定のタスクをはるかに簡単に実行できるさまざまなスクリプト言語があります。バカなことをしすぎないようにしてください。あなたの再認証手順は、まだ彼らは(と危険な場合)と発音しなければならない必要がある思考せずに行うことが不便と難しいかも。

しかし、単独では、自動化は役に立たないよりも悪いです。それはあなたがより少ない考えでより大きな間違いをするのを助けるでしょう。

あらゆる規模のチームに適しています。

チームの規模を指摘していることに気付きました。私は一人の男であり、事故に遭うのはたった1人で済むので、私はこれを経験しました。オーバーヘッドがありますが、それだけの価値があります。最終的には、はるかに安全で安全な開発および運用環境になります。


2
また、ユーザーごとに2つの名前付きアカウントを使用するのが好きです。1つは通常のユーザーログイン、操作、日常業務などのためのもので、2つ目のアカウント(通常は+やアンダースコアなどの種類のサフィックスを持つ)は、ユーザーが必要とするprodおよびdevに対する完全な権限を持ちます。そのようにして、ユーザーはdevではなくprodにプッシュする積極的な決定を行わなければなりません。これは上記の箇条書き3に似ていますが、価値を実証するために大幅な追加インフラストラクチャや費用を必要としません。
user24313

3
prodアカウントでprodのメンテナンス以外のことを行う習慣を身に付けないようにすることも重要です。そのためには、prodがソースコードを表示できないこと、IDEを起動できないことなどを確認してください。
Eric Lloyd

これらの同時ターンデュアルキーの仕掛けの1つはどこで入手できますか?USBには付属していますか?
リリエンタール

他に役立つのは、ステージングと開発の手順を完全に自動化(1回または2回クリック)することですが、運用展開を完全に自動化することではありません。提案されているように、他の環境ではなく本番環境で何かを行うために手動でボックスにリモート接続する必要があることは、利便性の大きな違いです。(関連するステップのスクリプトを作成し、すべての環境でそのスクリプトを使用できます。つまり、本番用のスクリプトの実行を手動で起動する必要があります。)もちろん、認証の種類に加えて、それを行うことができます推奨する手順。
-jpmc26

1
@Lilienthalこれは、高度なセキュリティシアターの隠wasでしたが、安価な攻撃USBスティックを各開発者にエミュレートし、危険なものを実行するときに少なくとも2つのシリアル番号の自動化チェックを行うことができます。大規模なチームでは、誰がプロダクションに干渉しているのかをログに記録し、問題が発生した場合に適切な人に責任を持たせることができます。
オリ

12

私の同僚の一人は、これに対して興味深いアプローチをしています。彼の制作の最終的な配色はfuいです。灰色でピンク色で読みにくい。理論的には、彼が書くものは何でも、彼が本当に書くことを意図したものであることが保証されている。

あなたの走行距離は異なる場合があります...そして、おそらくそれだけでは防弾ではないと言う必要はありません。:)


2
また、本番サーバーへのターミナル/ db接続では大きな赤い背景色を使用し、PCの管理者アカウントには明るい赤の壁紙を使用しています...
Falco

ええ、私はそれを考えていました。生産消防車を赤くする...
クリスB.ベーレンス

色分けが役立ちます。IDEと同じです。
トールビョーンラヴンアンダーセン

1

開発者は、本番データベースへのパスワードを知らないでください。prodのパスワードはランダムで覚えやすいものではなく、キーボードマッシングの結果(Z^kC83N*(#$Hx)のようなものでなければなりません。あなたのdevのパスワードが可能$YourDog'sNameか、correct horse battery stapleまたは何でも。

確かに、特に小さなチームの場合は、クライアントアプリケーションの構成ファイルを見ることで、パスワードが何であるかを知ることができます。prodパスワードが存在する唯一の場所です。これにより、prodパスワードを取得するための意図的な努力が必要になります。

(いつものように、実稼働データベースのポイントインタイムバックアップが必要です。たとえば、MySQLの場合、バイナリログを増分バックアップとしてアーカイブします。PostgreSQLの場合、先行書き込みログをアーカイブします。自己災害またはその他のあらゆる種類の災害)


私はこれに完全に同意することはできません。現実的な大規模な環境では、開発者/管理者が実稼働データベースにアクセスする必要がある場合がかなり定期的に存在するからです。これが起こることはありません非の打ち所のないシステムとの完璧な世界では確かに、しかし、私はあなたが私はオリとよだから、生産のログインは不便なことが、実現可能なはずです...手でいくつかの生産の重要なデータを修正する必要があります知っているほとんどのシステムで
ファルコ

1
@Falcoそれはまさに私が提案していることです。不便だが実行可能。
200_success

アプローチの問題は、緊急事態が発生して生産が停止した場合にのみ、時間をカウントすることです。そのため、開発者はパスワードの入手先を把握して、パスワードをすばやく取得する必要があります。彼らが周りに尋ねなければならない場合、リポジトリと設定ファイルを検索し、あなたが貴重な時間=お金を失っているのを試しましょう。私はむしろ、誰もが見に知っている場所にパスワードを持っていると思いますが、必要であれば、それは速く、まだ不便ですが、そう
ファルコ

2
@Falco prod環境はdev環境を厳密にミラー化する必要があるため、構成ファイルは、devマシン上と同様にprodサーバー上の類似した場所にあります。有能な開発者はどこを見るべきかを知っている必要があり、どこを見るべきかわからない場合は、その遅延が必要です。それは、質問で述べられているタイプの損傷を防ぐためです。
200_success

パスワードを知らなくても、事故を防ぐことはできません。それどころか、パスワードの検索を1回だけ行うモチベーションが生まれ、その後、開発者はbash履歴の使用を開始したり、データベースに接続するためのエイリアスを作成することもあります。そして、事故が発生する可能性が高くなります。
k0pernikus

0

短い答えはRBAC-ロールベースのアクセス制御です。

すべての環境に対するアクセス許可は異なる必要があります。UACのようなものと同じくらいうっとうしいものですが、特にPROD環境の場合は必要です。

がある 開発者がProdに直接アクセスできる理由決してません-組織/チームの規模にかかわらず。「Dev」も「Stage」と「Prod」の帽子をかぶっていますが、異なる環境にアクセスするには異なるクレデンシャルとプロセスが必要です。

迷惑ですか?絶対に。しかし、それはあなたの環境を壊すのを防ぎますか?絶対に。


0

すばやく簡単なソリューション:2つの異なるユーザーアカウントを使用します。1つは開発データベースにのみアクセスする通常の開発作業用で、もう1つは運用データベースで実際に操作し、完全にアクセスできる別のアカウントです。このように、本番環境で変更を加える前に、使用しているアカウント積極的に変更する必要があります。これは、偶発的なミスを防ぐのに十分なはずです。

2つのWebサイト、2つのサーバー、または2つの環境がある場合、同じアプローチを使用できます。1つは開発用のユーザーアカウント、運用環境へのアクセス権(または少なくとも書き込みアクセス権なし)、運用システムで作業するための別のユーザーアカウント( s)。


これは、日常業務(電子メールの読み取り、Webサーフィン、チケットの追跡、タイムシートの提出、ドキュメントの作成など)のための標準の非管理者アカウントと、実際に操作するときに使用される個別の完全管理者アカウントを持つシステム管理者と同じアプローチですサーバーおよび/またはActive Directory上。

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