始める前の基本情報:
出典:Center for Internet Security(CIS)のOracle MySQL Community Server 5.7
オペレーティングシステム: Windows 10
実行場所: コマンドライン
mysql -u USERNAME -p
ターゲットアプリケーション: Oracle MySQL Community Server 5.7
情報システムの監査とログ記録
サイバー攻撃が疑われる場合、ログはセキュリティにとって重要な役割を果たします。ログの手動レビューはセキュリティ担当者にとって骨の折れる作業であり、情報を抽出して分析するにはログレビューツールを使用する必要があります。ログは、破損やログデータの損失を防ぐために、WORM(write once read many)ストレージテクノロジと暗号化を使用する必要があります。また、ログは、保守、アクセス、および比較を容易にするために、標準化された形式にする必要があります。
「log_error」が空でないことを確認してください
コマンド:
SHOW variables LIKE ‘log_error’;
エラーログには、mysqldが開始または停止したときのイベントに関するデータが含まれています。また、テーブルをいつ評価または修復する必要があるかを示します。 「値」を生成する必要があります。エラーロギングを有効にする理由は、MySQLやその他の重要なメッセージに対する悪意のある試みを検出する能力を高めるのに役立つためです。
ログファイルが非システムパーティションに保存されていることを確認します
コマンド:
SELECT @@global.log_bin_basename;
MySQLのログファイルは、ファイルシステムのどこにでも保存でき、MySQL構成を使用して設定できます。また、ベストプラクティスは、ファイルシステム内のログがアプリケーションログなどの他のログで乱雑にならないようにすることです。返される値が、ルート「(‘/’)」、「/ var」、または「/usr」にあることを示していないことを確認する必要があります。これは、オペレーティングシステムで使用可能なディスク領域が使い果たされた場合に、パーティショニングによってサービス拒否の可能性が低くなるためです。
「log_error_verbosity」が「1」に設定されていないことを確認します
コマンド:
SHOW GLOBAL VARIABLES LIKE ‘log_error_verbosity’;
このチェックは、MySQLログがエラーメッセージで有効にしている、または有効にしている機能に関する追加情報を提供します。値1は、エラーメッセージのログを有効にします。値が2の場合、エラーメッセージと警告メッセージの両方のログが有効になります。値3を使用すると、エラー、警告、およびメモメッセージのログを記録できます。これは、通信エラーと中止された接続をログに記録することにより、悪意のある動作を検出するのに役立ちます。
監査ログが有効になっていることを確認します
監査ログを有効にすることは、インタラクティブなユーザーセッションとアプリケーションセッションの実稼働環境にとって非常に重要です。監査ログを使用すると、誰がいつ何を変更したかを特定するのに役立ちます。また、攻撃者が何をしたかを特定するのに役立ち、調査の証拠としても使用できます。
コマンド:
SELECT NAME FROM performance_schema.setup_instruments WHERE NAME LIKE ‘%/alog/%’;
コマンド:
SET GLOBAL general_log = ‘ON’ ;
コマンド: パスワード「not-so-secret」で識別されるユーザー「user1」@「localhost」を作成します;
Windows 10でのログのパスは、サービスアプリケーションを使用して、MySQLが実行されているかどうかを確認し、プロパティを右クリックすることで見つけることができます。
作成者のシステムのログは、C:\ ProgramData \ MySQL \ MySQL Server 5.7 \ Data \ DJ-JASON-CLARK.log
にありました。情報システムの認証
認証により、ユーザーまたはマシンによって提供された資格情報が、ローカルオペレーティングシステムまたは認証サーバー内の許可されたユーザーのデータベースと一致することが確認されます。次に、認証の後に承認が続きます。承認は、管理者によってユーザーまたはマシンに付与されます。プライベートネットワークとパブリックネットワークの両方で一般的に使用される認証は、パスワードベースの認証です。
パスワードがグローバル構成に保存されていないことを確認してください
MySQL構成ファイルの[client]セクションでは、ユーザーとパスワードの作成を設定できます。構成ファイルでユーザーとパスワードを許可すると、ユーザーのパスワードの機密性に悪影響が及ぶため、このチェックは重要です。
監査するには、MySQL構成ファイルを開き、[client]セクションを調べます。パスワードが保存されていない必要があります。作成者のシステムにパスワードが設定されていません(下の図を参照)。構成ファイルにパスワードが設定されている場合は、mysql_config_editorを使用して、パスワードを暗号化された形式で.mylogin.cnfに保存します。
「sql_mode」に「NO_AUTO_CREATE_USER」が含まれていることを確認します
「no_auto_create_user」は、認証情報が提供されていない場合にユーザーが自動作成されないようにするオプションです。
コマンド:
SELECT @@global.sql_mode;
コマンド:
SELECT @@session.sql_mode;
すべてのMySQLアカウントにパスワードが設定されていることを確認してください
ユーザーは空白のパスワードを作成できます。誰もがユーザーのIDを推測し、ユーザーのloginIDを入力してサーバーに接続できるため、パスワードが空白になると危険です。これは認証をバイパスしますが、これは悪いことです。
コマンド:
SELECT User,host FROM mysql.user WHERE authentication_string=’’;
「default_password_lifetime」が「90」以下であることを確認します
パスワードの有効期間を90日に変更すると、攻撃者がパスワードを侵害するために利用できる時間が短縮されるため、攻撃を受ける可能性が低くなります。
コマンド:
SHOW VARIABLES LIKE ‘default_password_lifetime’;
コマンド:
SET GLOBAL default_password_lifetime=90;
パスワードの複雑さが適切に設定されていることを確認します
パスワードの複雑さは、認証にセキュリティ強度を追加し、長さ、大文字と小文字、数字、および特殊文字の追加または増加を含みます。パスワードが複雑になるほど、攻撃者がブルートフォースを使用してパスワードを取得するのが難しくなります。弱いパスワードは、パスワード辞書で簡単に取得できます。
コマンド:
SHOW VARIABLES LIKE ‘validate_password%’;
ワイルドカードのホスト名を持っているユーザーがいないことを確認します
ワイルドカードホスト名(%)を持つユーザーには、任意の場所へのアクセス許可が付与されます。ワイルドカードホスト名の作成は避けるのが最善です。代わりに、ユーザーを作成し、特定のユーザーがデータベースに接続して操作できる特定の場所をユーザーに提供します。
コマンド:
SELECT user, host FROM mysql.user WHERE host = ‘%’;
匿名アカウントが存在しないことを確認してください
ユーザーは匿名(空または空白)のユーザー名を持つことができます。これらの匿名ユーザー名にはパスワードがなく、他のユーザーはその匿名ユーザー名を使用してMySQLサーバーに接続できます。これらの匿名アカウントを削除すると、識別され信頼できるユーザーのみがMySQLサーバーにアクセスできるようになります。
コマンド:
SELECT user,host FROM mysql.user WHERE user = ‘’;
MySQLサーバーへのネットワーク接続
ネットワーク接続は、ユーザーとMySQLサーバー間の通信に重要な役割を果たします。安全でないネットワーク接続は、攻撃に対して非常に脆弱です。以下は、ネットワーク接続のセキュリティのチェックです。
「have_ssl」が「YES」に設定されていることを確認します
悪意のある攻撃者がシステム内を覗き見するのを防ぐために、信頼できないネットワークを使用する場合は、すべてのネットワークトラフィックにSLL/TLSを使用するのが最善です。
コマンド:
WHERE variable_name = ‘have_ssl’;
「ssl_type」が「ANY」、「X509」に設定されていることを確認します。またはすべてのリモートユーザーの場合は「SPECIFIED」
SSL/TLSはユーザーごとに構成する必要があります。これにより、悪意のある攻撃者の盗聴をさらに防ぐことができます。
コマンド:
SELECT user, host, ssl_type FROM mysql.user WHERE NOT HOST IN (‘::1’, ‘127.0.0.1’, ‘localhost’);
レプリケーション
レプリケーションステータスを確認すると、パフォーマンスとセキュリティの脆弱性を監視できます。 Microsoft SQL Server Management Studioには、レプリケーションを監視するための次のツールがあります。
- スナップショットエージェントのステータスを表示する
- ログリーダーエージェントのステータスを表示し、
- 同期ステータスを表示します。
レプリケーショントラフィックが保護されていることを確認します
レプリケーション サーバー間のトラフィックを保護する必要があります。レプリケーションの転送中に、パスワードが漏洩する可能性があります。
監査するには、プライベートネットワーク、VPN、SSL / TLS、またはSSHトンネルを使用しているかどうかを確認します。うまくいけば、作者のシステムはプライベートネットワークを使用しています。それ以外の場合は修正し、プライベートネットワーク、VPN、SSL / TLS、またはSSHトンネルを使用してセキュリティで保護します。
「MASTER_SSL_VERIFY_SERVER_CERT」が「YES」または「1」に設定されていることを確認します
「MASTER_SSL_VERIFY_SERVER_CERT」は、レプリカがプライマリの証明書を検証する必要があるかどうかを確認します。レプリカは、接続を続行する前に、プライマリの証明書を検証してプライマリを認証する必要があります。
コマンド:
SELECT ssl_verify_server_cert FROM mysql.slave_master_info;
「master_info_repository」が「TABLE」に設定されていることを確認します
「master_info_repository」は、レプリカがプライマリのステータスと接続情報をログに記録する場所を決定します。パスワードは、プレーンテキストファイルであるプライマリ情報リポジトリに保存されます。 TABLEmaster_infoにパスワードを保存する方が安全です。
コマンド:
SHOW GLOBAL VARIABLES LIKE ‘master_info_repository’;
レプリケーションユーザーの「super_priv」が「Y」に設定されていないことを確認します
「mysql.user」テーブルにある「SUPER」特権(「super_priv」)には、「CHANGE」、「MASTER TO」、「KILL」、「mysqladmin kill」、「PURGE BINARY LOGS」、「SETGLOBAL」などの機能があります。 「mysqladmindebug」、およびその他のログ制御。ユーザーに「SUPER」特権を与えると、ユーザーは、パスワード管理の場合でも、現在実行中のSQLステートメントを表示および終了できます。攻撃者が「SUPER」特権を悪用して取得した場合、ログデータを無効化、変更、または破壊する可能性があります。
コマンド:
SELECT user, host FROM mysql.user WHERE user=’repl’ and Super_priv = ‘Y’;
レプリケーションユーザーがワイルドカードホスト名を持っていないことを確認します
MySQLでは、ワイルドカードホスト名にアクセス許可を付与できます。ワイルドカードのホスト名は避け、ユーザーを作成または変更して、特定のユーザーがデータベースに接続して操作できる特定の場所をユーザーに与える必要があります。
結論
以下のチェックは、アプリケーション側とユーザー側の両方で情報システムとしてMySQLを使用する単一の作業環境に対して行われます。
この評価は、MySQLの標準ロギングをチェックし、追加のロギング機能を有効にするために不可欠です(認証の脆弱性のチェックも可能になります)。ネットワークチェックは、悪意のある他のユーザーがネットワークを覗き見するのを防ぐために重要です。暗号化には常にSSL/TLSを実装してください。片道転送の確保が必要です。レプリケーショントラフィックを保護すると、防御層が追加されます。
評価の結果は、システムが信頼レベルで動作できるかどうかを通知することができます。
私のブログを読んでくれてありがとう!これで、MySQLデータベースを保護するためのパスが開始されました。=)