ホームページ データベース mysql チュートリアル MySQL セキュリティ ガイド (3) (リダイレクト)

MySQL セキュリティ ガイド (3) (リダイレクト)

Dec 17, 2016 pm 03:07 PM

MySQL セキュリティ ガイド (3)


2.4 GRANT を使用しないユーザーのセットアップ
MySQL バージョン 3.22.11 より前の場合、GRANT (または REVOKE) ステートメントを使用してユーザーとそのアクセス権を設定することはできませんが、認可テーブルの内容を直接変更することはできます。 GRANT ステートメントが付与テーブルをどのように変更するかを理解していれば、これは簡単です。その後、INSERT ステートメントを手動で発行することで、同じことを自分で行うことができます。

GRANT ステートメントを発行するときは、ユーザー名とホスト名、場合によってはパスワードを指定します。このユーザーに対してユーザー テーブル レコードが生成され、これらの値が User、Host、および PassWord 列に記録されます。 GRANT ステートメントでグローバル権限を指定すると、これらの権限はレコードの [権限] 列に記録されます。 GRANT ステートメントではパスワードが暗号化されますが、INSERT ではパスワードを暗号化するために PASSWORD() 関数を使用する必要がないことに注意してください。

データベースレベルの権限を指定すると、ユーザー名とホスト名が db テーブルの User 列と Host 列に記録されます。承認したデータベースは [Db] 列に記録され、付与したアクセス許可は [Permissions] 列に記録されます。

テーブルレベルと列レベルの権限の場合、効果は同様です。 tables_PRiv テーブルと columns_priv テーブルにレコードを作成して、ユーザー名、ホスト名、データベース、および関連するテーブルと列を記録します。付与された権限は、「権限」列に記録されます。

前の紹介を覚えていれば、GRANT ステートメントなしで GRANT の動作を実行できるはずです。認可テーブルを直接変更する場合は、サーバーに認可テーブルをリロードするように指示することになります。そうしないと、サーバーは変更を認識できません。 mysqladminを実行できます フラッシュ特権または mysqladmin reload コマンドはリロードを強制します。これを忘れると、なぜサーバーが期待通りの動作をしないのか疑問に思うことになります。

次の GRANT ステートメントは、所有権を持つスーパーユーザーを作成します。他の人に委任する機能を含む:

GRANT "passwd" によって識別された anyname@localhost に対して *.* をすべてオンにします
(許可付き) OPTION
このステートメントは、user テーブルに anyname@localhost のレコードを作成し、すべての権限を開きます。これは、ここにスーパー ユーザー (グローバル) 権限が保存されるためです。INSERT ステートメントで同じことを行うには、ステートメントは次のようになります。

に挿入 ユーザー VALUES("localhost","anyname",PASSWORD("passwd"),
"Y","Y","Y","Y","Y","Y","Y","Y" ,"Y","Y","Y","Y","Y","Y")
MySQLのバージョンによっては動作しない場合があります。権限テーブルの構造が変更されたため、ユーザー テーブルに 14 個の権限列が存在しない可能性があります。ショーを使用する COLUMNS 付与テーブルに含まれる各権限列を確認し、それに応じて INSERT ステートメントを調整します。 次の GRANT ステートメントでも、スーパーユーザー ステータスを持つユーザーが作成されますが、権限は 1 つだけです。

GRANT RELOAD ON *.* TO flash@localhost IDENTIFIED BY "flushpass"
この例の INSERT ステートメントは前のステートメントよりも単純で、列名を簡単にリストし、権限列を 1 つだけ指定します。他のすべての列はデフォルトの「N」に設定されます。

ユーザーに挿入 (ホスト、パスワード、リロード) VALUES("localhost","flush",PASSWORD("flushpass"),"Y")
データベースレベルの権限には ON を使用します 認可のための ON *.* の代わりに db_name.* 句:

GRANT ALL ON サンプル.* TO boris@localhost 識別者 "ruby"
これらの権限はグローバルではないため、ユーザー テーブルに保存されません (ユーザーが接続できるように) が、db テーブル レコードも作成する必要があります。データベースセットの権限を記録するには、次のようにします。

ユーザーに挿入 (ホスト、ユーザー、パスワード) VALUES("localhost","boris",PASSWORD("ruby"))

データベースに挿入 VALUES("localhost","sample_db","boris","Y","Y","Y","Y","Y","Y","N","Y","Y", "Y")

"N" 列は、最後のデータベース レベルの WITH を伴う GRANT 権限を表します。 付与 OPTION の GRANT ステートメントの場合、列を "Y" に設定する必要があります。

テーブルレベルまたは列レベルの権限を設定するには、tables_priv または columns_priv で INSERT ステートメントを使用します。もちろん、GRANT ステートメントがない場合、これらのテーブルはすべて MySQL に同時に表示されるため、これらのテーブルは存在しません。これらのテーブルがあり、何らかの理由でそれらを手動で操作したい場合は、個々の列に対して権限を有効にできないことに注意してください。

tables_priv.Table_priv または columns_priv.Column_priv 列を設定して、有効にする権限の値を含めます。たとえば、テーブルに対する SELECT および INSERT 権限を有効にするには、関連する tables_priv レコードで Table_priv を「Select,Insert」に設定します。

MySQL アカウントを持つユーザーの権限を変更する場合は、権限を追加するか取り消すかに関係なく、INSERT ではなく UPDATE を使用してください。ユーザーを完全に削除するには、ユーザーが使用しているすべてのテーブルからレコードを削除します。

全権限テーブルを直接変更するクエリを発行したくない場合は、MySQL に付属の mysqlaccess スクリプトと mysql_setpermissions スクリプトを参照してください。



付録 1 クイズ
MySQL サーバーをインストールし、MySQL への接続を許可されたユーザーを追加した後、次のステートメントを使用します:

GRANT ALL ON samp_db.* 宛先 fred@*.snake.net 識別されました "cocoa"

そして、fred はたまたまサーバー ホストにアカウントを持っていたため、サーバーに接続しようとしました:

%mysql -u fred -pcocoa samp_db
エラー 1045: ユーザーのアクセスが拒否されました: 'fred@localhost' (使用パスワード: はい)

なぜですか?

その理由は次のとおりです。

まず、mysql_install_db が初期権限テーブルを確立する方法と、サーバーが顧客の接続を照合するためにユーザー テーブル レコードを使用する方法を検討します。 mysql_install_db でデータベースを初期化すると、次のようなユーザー テーブルが作成されます:

Host ユーザー
localhost
pit.snake.net
localhost
pit.snake.net root
root



最初の 2 つのレコードでは、root がローカル サーバーに接続するための localhost またはホスト名を指定でき、最後の 2 つのレコードでは、匿名ユーザーがローカルから接続できるようになります。 fred ユーザーを追加した後、

ホスト ユーザー
localhost
pit.snake.net
localhost
pit.snake.net
%.snake.net ルート
ルート


フレッド

サーバーが起動すると、レコードを読み取って並べ替えます (最初はホストごと、次にホスト上のユーザーごと)。具体的であるほど上位にランクされます:

ホスト ユーザー
ローカルホスト
ローカルホスト
pit.snake.net
pit.snake.net
%.snake.net ルート

ルート

フレッド

localhost のレコードは 2 つ一緒にランク付けされていますが、root のレコードは null よりも具体的であるため、最初にランク付けされています。 pig.snake.net の記録も同様です。これらはすべて、ワイルドカードを含まないリテラルのホスト値であるため、fred のレコードの前、特に匿名ユーザーは fred の前にランク付けされます。

その結果、fred が localhost から接続しようとすると、[Host] 列に空のユーザー名を持つレコードが、%.snake.net を含むレコードの前に一致します。デフォルトの匿名ユーザーにはパスワードがないため、このレコードのパスワードは空です。 fred が接続時にパスワードを指定したため、不一致が発生し、接続に失敗しました。

ここで覚えておくべきことは、ユーザーが接続できるホストを指定するにはワイルドカードを使用すると便利ですが、ということです。ただし、テーブルに匿名ユーザー レコードを保持している限り、localhost からの接続に問題が発生します。

一般に、匿名ユーザー レコードを削除することをお勧めします。

mysql> ユーザーの場所から削除 User="";

さらに進んで、他の認可テーブルにある匿名ユーザーを削除します。User 列を持つテーブルは db、tables_priv、columns_priv です。

付録 2 新しい MySQL インストールをより安全にする
新しい MySQL サーバーを自分でインストールした後、MySQL root ユーザーのディレクトリを指定する必要があります (デフォルトではパスワードなし)。これを忘れると、MySQL が非常に危険な状態で失われます。 (少なくともしばらくの間は)。

Unix (linux) では、マニュアルの指示に従って MySQL をインストールした後、mysql_install_db スクリプトを実行して、認可テーブルと初期権限を含む mysql データベースを確立する必要があります。 Windows では、ディストリビューション内のセットアップ プログラムを実行して、データ ディレクトリと mysql データベースを初期化します。サーバーも稼働していると想定されます。

初めて MySQL をマシンにインストールすると、mysql データベース内の認証テーブルが次のように初期化されます:

パスワードを指定せずにローカルホスト (localhost) から root として接続できます。 root ユーザーはすべての権限 (管理者権限を含む) を持ち、何でもできます。 (ちなみに、MySQL のスーパーユーザーは Unix のスーパーユーザーと同じ名前であり、まったく関係ありません。)
匿名アクセスは、test という名前のデータベースおよび名前が test_ で始まるデータベースにローカルに接続できるユーザーに付与されます。匿名ユーザーはデータベースに対して何でも行うことができますが、管理権限はありません。
接続ユーザーがローカルホストのホスト名を使用するか実際のホスト名を使用するかに関係なく、ローカルホストから複数のサーバーへの接続が許可されます。例:

% mysql -h localhost テスト

% mysql -h pig.snake.net テスト

パスワードを指定せずに root として MySQL に接続しているという事実は、初期インストールが安全ではないことを意味するだけです。そのため、管理者として最初に行うべきことは、root パスワードを設定し、その後、パスワードに応じてパスワードを設定することです。パスワードの設定に使用するメソッドに加えて、サーバーにこの変更を認識させるために認可テーブルをリロードするように指示することもできます。 (サーバーが起動すると、テーブルがメモリに再ロードされるため、テーブルが変更されたことが認識されない可能性があります。)

MySQL の場合 バージョン 3.22 以降の場合、mysqladmin を使用してパスワードを設定できます:

% mysqladmin -u root パスワード yourpassword

MySQL のどのバージョンでも、mysql プログラムを使用して、mysql データベース内のユーザー認証テーブルを直接変更できます:

% mysql -u root mysql
mysql>UPDATE user SET パスワード=PASSWORD("あなたのパスワード") WHERE User="root";

古いバージョンの MySQL を使用している場合は、mysql と UPDATE を使用してください。

パスワードを設定した後、次のコマンドを実行して、サーバーに認証テーブルをリロードするように指示する必要があるかどうかを確認します:

% mysqladmin -u root ステータス

サーバーがパスワードを指定せずに root として接続できる場合は、認可テーブルをリロードします:

% mysqladmin -u root reload

root パスワードを設定した後 (必要に応じて認証テーブルをリロードした後)、root としてサーバーに接続するときは必ずパスワードを指定する必要があります。

上記は MySQL セキュリティ ガイド (3) (再版) の内容です。その他の関連記事については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Apacheのデータベースに接続する方法 Apacheのデータベースに接続する方法 Apr 13, 2025 pm 01:03 PM

Apacheはデータベースに接続するには、次の手順が必要です。データベースドライバーをインストールします。 web.xmlファイルを構成して、接続プールを作成します。 JDBCデータソースを作成し、接続設定を指定します。 JDBC APIを使用して、接続の取得、ステートメントの作成、バインディングパラメーター、クエリまたは更新の実行、結果の処理など、Javaコードのデータベースにアクセスします。

MySQL:世界で最も人気のあるデータベースの紹介 MySQL:世界で最も人気のあるデータベースの紹介 Apr 12, 2025 am 12:18 AM

MySQLはオープンソースのリレーショナルデータベース管理システムであり、主にデータを迅速かつ確実に保存および取得するために使用されます。その実用的な原則には、クライアントリクエスト、クエリ解像度、クエリの実行、返品結果が含まれます。使用法の例には、テーブルの作成、データの挿入とクエリ、および参加操作などの高度な機能が含まれます。一般的なエラーには、SQL構文、データ型、およびアクセス許可、および最適化の提案には、インデックスの使用、最適化されたクエリ、およびテーブルの分割が含まれます。

MySQLの場所:データベースとプログラミング MySQLの場所:データベースとプログラミング Apr 13, 2025 am 12:18 AM

データベースとプログラミングにおけるMySQLの位置は非常に重要です。これは、さまざまなアプリケーションシナリオで広く使用されているオープンソースのリレーショナルデータベース管理システムです。 1)MySQLは、効率的なデータストレージ、組織、および検索機能を提供し、Web、モバイル、およびエンタープライズレベルのシステムをサポートします。 2)クライアントサーバーアーキテクチャを使用し、複数のストレージエンジンとインデックスの最適化をサポートします。 3)基本的な使用には、テーブルの作成とデータの挿入が含まれ、高度な使用法にはマルチテーブル結合と複雑なクエリが含まれます。 4)SQL構文エラーやパフォーマンスの問題などのよくある質問は、説明コマンドとスロークエリログを介してデバッグできます。 5)パフォーマンス最適化方法には、インデックスの合理的な使用、最適化されたクエリ、およびキャッシュの使用が含まれます。ベストプラクティスには、トランザクションと準備された星の使用が含まれます

なぜMySQLを使用するのですか?利点と利点 なぜMySQLを使用するのですか?利点と利点 Apr 12, 2025 am 12:17 AM

MySQLは、そのパフォーマンス、信頼性、使いやすさ、コミュニティサポートに選択されています。 1.MYSQLは、複数のデータ型と高度なクエリ操作をサポートし、効率的なデータストレージおよび検索機能を提供します。 2.クライアントサーバーアーキテクチャと複数のストレージエンジンを採用して、トランザクションとクエリの最適化をサポートします。 3.使いやすく、さまざまなオペレーティングシステムとプログラミング言語をサポートしています。 4.強力なコミュニティサポートを提供し、豊富なリソースとソリューションを提供します。

MySQLの役割:Webアプリケーションのデータベース MySQLの役割:Webアプリケーションのデータベース Apr 17, 2025 am 12:23 AM

WebアプリケーションにおけるMySQLの主な役割は、データを保存および管理することです。 1.MYSQLは、ユーザー情報、製品カタログ、トランザクションレコード、その他のデータを効率的に処理します。 2。SQLクエリを介して、開発者はデータベースから情報を抽出して動的なコンテンツを生成できます。 3.MYSQLは、クライアントサーバーモデルに基づいて機能し、許容可能なクエリ速度を確保します。

DockerによるMySQLを開始する方法 DockerによるMySQLを開始する方法 Apr 15, 2025 pm 12:09 PM

DockerでMySQLを起動するプロセスは、次の手順で構成されています。MySQLイメージをプルしてコンテナを作成および起動し、ルートユーザーパスワードを設定し、ポート検証接続をマップしてデータベースを作成し、ユーザーはすべての権限をデータベースに付与します。

Laravelは紹介例 Laravelは紹介例 Apr 18, 2025 pm 12:45 PM

Laravelは、Webアプリケーションを簡単に構築するためのPHPフレームワークです。次のような強力な機能を提供します。インストール:Laravel CLIを作曲家にグローバルにインストールし、プロジェクトディレクトリにアプリケーションを作成します。ルーティング:ルート/web.phpのURLとハンドラーの関係を定義します。ビュー:リソース/ビューでビューを作成して、アプリケーションのインターフェイスをレンダリングします。データベース統合:MySQLなどのデータベースとのすぐ外側の統合を提供し、移行を使用してテーブルを作成および変更します。モデルとコントローラー:モデルはデータベースエンティティを表し、コントローラーはHTTP要求を処理します。

データベース接続の解決問題:Minii/DBライブラリを使用する実用的なケース データベース接続の解決問題:Minii/DBライブラリを使用する実用的なケース Apr 18, 2025 am 07:09 AM

小さなアプリケーションを開発する際には、軽量データベース操作ライブラリをすばやく統合する必要性という厄介な問題に遭遇しました。複数のライブラリを試した後、私はそれらがあまりにも多くの機能を持っているか、あまり互換性がないかのどちらかであることがわかりました。最終的に、私は問題を完全に解決したYii2に基づいた単純化されたバージョンであるMinii/DBを見つけました。

See all articles