ジャンプ先

MySQL の強化の概要

セキュリティは機能ではなく、国際化やユーザー補助と同様に設計の不可欠な要素です。優れたセキュリティ設計は、可能性のあるすべての段階でシステムの侵害を困難にすることを目的としており、データベースの世界では、多くの場合、データベースの「セキュリティ強化」と呼ばれます。 

その中には、ソフトウェアを最新の状態に保つこと、システムへのアクセス場所を制限すること、パスワードを強化すること、定期的にアクセスを監査することなど、多くの手順があります。これらのヒントは広く適用できますが、Cloud SQL for MySQL データベース インスタンスが可能な限り侵害されないように、これらの手法を使用する方法について説明します。

MySQL インスタンスのセキュリティ強化

アクセス ポイントを最小にする

見せかけではありません。攻撃者は、インターネット全体を数分で簡単にスキャンし、パスワードを数秒でクラックできます。パブリック IP ネットワーク経由でデータベースにアクセスできるようにする必要が生じる場合もありますが、これにより、データベースの脆弱性が飛躍的に増大します。パブリック IP のリスクを軽減する方法の 1 つは、データベース アクセスを限られた IP アドレスセットに制限することです。

ただし、より良い解決策は、Virtual Private Cloud(VPC)内のみへのアクセスを許可し、踏み台インスタンス内のオペレータ接続のみを許可することです。Google Cloud では、このソリューションをプライベート IP と呼びます。 MySQL インスタンスに VPC 内でのみアクセスできる場合、攻撃者はインスタンスを侵害する前に、まず VPC を侵害する必要があります。

データベースを更新する

MySQL の各マイナー バージョンにはリリースノートがあり、ほとんどの場合、セキュリティ アップデートに関するセクションが含まれています。インスタンスの複数のバージョンが最新でない場合、データベースにないセキュリティ修正のバージョンは複数あります。

MySQL では、長期的なセキュリティ問題の修正に加え、まったく新しいセキュリティ機能が定期的に導入されています。たとえば、MySQL 8.0 では、ロール、ログイン トラッキングの失敗、ランダムなパスワード生成など、MySQL スキーマとユーザーを強化する多くの方法が導入されました。

TLS を適用する

コーヒー ショップで仕事をしていて、クエリを実行したいとします。この場合、ショップの無料 Wi-Fi ネットワークを介して MySQL に接続します。TLS(Transport Layer Security)を使用しなかった場合は、TCP(伝送制御プロトコル、インターネットの主なプロトコルの 1 つ)を介してユーザー名とパスワードを実質的に公にしているのです。MySQL インスタンスに TLS を適用すると、他のユーザーがネットワークをのぞき見しているかどうかを心配せずに、ラテを飲みながら仕事ができます。

アプリケーションを強化する

SQL インジェクション

多くの場合、データベースではなく、アプリケーションが攻撃に対して最も脆弱です。多くのアプリケーションが SQL インジェクション攻撃の標的になっています。この攻撃では、アプリケーションが有効な SQL ステートメントと見なす、悪意のある入力を攻撃者が挿入します。こうした攻撃に対する最善の保護策は、ユーザー入力を SQL ステートメントと連結するのではなく、SQL ステートメントを作成するときに準備済みステートメントを使用することです。

リポジトリ内のシークレット

開発者が意図せずユーザー名とパスワードをソースコード リポジトリに push したことで、無数のデータベースが侵害されています。代わりに、データベース パスワードを含むすべての種類のシークレットを管理する、Google Cloud の Secret Manager などのツールを使用してください。

パスワードのロギング

最後に、ロギング フレームワークのフィルタリング ツールを使用して、データベースのパスワードをアプリケーションのログから除外します。たとえば、Log4j FiltersRails ParameterFilter などがありますが、ほとんどのロギング フレームワークで同等のものを使用できます。使用しない場合は、データベースの安全性を確保するために、アプリケーション ログの安全性を確保する必要があります。

パスワードを強化する

データベース上のすべてのパスワードが十分に複雑になるように、パスワード検証を使用することを検討してください。アプリケーション パスワードは長く、複雑にし、頻繁にローテーションしてください。Secret Manager は、頻繁に変化する複雑なパスワードを覚える必要がない場合に便利です。

アプリケーションではなく人間がデータベース ユーザーを使用する場合は、NIST の標準に従い、長さを何よりも優先します。パスワードの有効期限や過度に複雑なパスワード要件によって、人々は平文ファイルや付箋に記憶を任せることが多く、これによりルール全体の目的に反することになります。

さらに、アプリケーション以外のユーザーには IAM 認証を利用することを検討してください。IAM 認証では、接続の確立が Google Cloud の IAM サービスにより委任されます。つまり、IAM ユーザーとデータベース ユーザーではなく、IAM ユーザーのみがリスクが軽減されます。

最後に、MySQL ではソルトではなくデータベース パスワードがデフォルトでハッシュされます。つまり、同じパスワードを使用しているユーザーは同じ認証文字列を持つため、レインボー テーブル攻撃によって脆弱なパスワードを容易に破ることができます。 以下の 2 つの MySQL ユーザーは、同じ authentication_string を持つことがわかります。

authentication_string の出力

フラグ default_authentication_plugin を caching_sha2_password に設定することを検討してください。これにより、同じパスワードを使用している 2 人のユーザーが異なるハッシュを持つことになります。以下の例では、2 人のユーザーが異なる authentication_string 値を使用しています。

authentication_string コマンドの出力

ユーザーの保護

アクセスを制限することは、外部からのアクセスを保護するだけでなく、また、内部からのアクセスを定期的に監査することでもあります。

アプリケーションを監査する: 課金テーブル、プロダクト テーブル、顧客テーブルのみを読み取る場合、それ以外のものには本当にアクセスする必要がありますか?データベースにルートアクセスを提供し続けると、攻撃者がデータベースに大きな損害を与える可能性があります。代わりに、インスタンスが必要とするすべての要件を考えて、必要な権限をアイテム化し、それぞれにデータベース ユーザーを作成します。そのようなデータベース ユーザーの 1 人の下で攻撃者がデータベースを侵害した場合、被害の範囲が限定されます。

ユーザーを監査する: データベースのユーザーのうち、インスタンスに対する管理者権限が本当に必要なのは何人ですか?それらのユーザーのうち、組織にまだ存在するか、アクティブでないプロジェクトに属しているか、またはアクティブではない人は何人いますか? アクセス トークンが漏えいする可能性があり、インサイダー脅威はほとんどのシステムで常に問題となっています。ユーザーをできるだけ少なくすることで、この種の問題に対してインスタンスを保護できます。

「管理者」を監査する: 「root」や「管理者」のようなユーザーを削除するか、名前を変更します。これらは攻撃者にとって容易な標的であり、存在しない場合、システムの侵害が少しだけ難しくなります。これは隠蔽によるセキュリティと呼ばれます。これを最前線の防御とすることはできませんが、MySQL データベースに薄いレイヤのセキュリティを追加できます。

バイナリ ロギングを有効にする

正常なデータベース管理を行うには、定期的なデータ バックアップと検証可能なデータ復旧プランが必要です。 ただし、定期的なバックアップを行っても、前回のバックアップ以降に書き込まれたすべてのデータが失われる可能性があります。MySQL エコシステムの利点の一つは、ポイントインタイム リカバリ(PITR)です。これにより、いつでもデータを復旧できます。PITR を有効にするには、Cloud SQL for MySQL インスタンスでバイナリログを有効にします。

監査ロギング

これらをすべて実施していれば、十分な準備と適切な保護がされています。その一方で、継続的な監視、つまりデータベース監査なしではセキュリティ設計は完了しません。 Cloud SQL for MySQL 監査プラグインを使用すると、侵害が発生した場合に異常な動作を追跡できます。

これらの変更後のインスタンス

以上を実施することにより、攻撃者がデータベース侵害への道筋を整えるのが難しくなります。攻撃者は、アプリケーションを侵害して、アプリケーションのデータベース ユーザーが攻撃に対して十分な権限を持っていることを期待するか、VPC を侵害して、既存のユーザー名を見つけ、パスワードを破り、攻撃を実行する十分な権限があることを期待します。その間、MySQL データベース ログまたは監査ログを表示してデータベースに対する通常の動作をモニタリングし、それに応じて対処できます。

これが、安全性を重視して設計の意味するものです。攻撃者は、マシンを悪用する方法を探し続けるでしょう。そのため、データベースを保護するために、可能な限り多くの保護レイヤを使用してシステムを設計することが重要です。

Google Cloud は、オンプレミスのデータセンターの廃止から SaaS アプリケーションの実行、基幹業務システムの移行まで、お客様のビジネスニーズに合わせて構築されたマネージド MySQL データベースを提供します。