【知っておくべき】MySQL を強化するために講じるべき 5 つの重要なセキュリティのヒント

青灯夜游
リリース: 2022-10-20 19:30:28
転載
1908 人が閲覧しました

【知っておくべき】MySQL を強化するために講じるべき 5 つの重要なセキュリティのヒント

データベースは長い間バランスのとれたアーキテクチャの重要な部分であり、おそらく最も重要な部分です。現在では、ほとんどが使い捨てでステートレスなインフラストラクチャに圧力がかかっており、他のすべてのサーバーが残りのデータとともに必然的にサーバー上に存在することになるため、データベースの信頼性と安全性の両方に大きな負担がかかっています。データベースに保存されます。

データベースはすべての攻撃者の宝物です。攻撃がより巧妙になり、ネットワークがより敵対的になるにつれて、データベースを強化するための追加の措置を講じることがこれまで以上に重要になっています。

MySQL は、その速度と全体的な使いやすさにより、開発者や管理者の間で最も人気があり、お気に入りのデータベースです。残念ながら、この使いやすさはセキュリティを犠牲にしています。 MySQL は厳密なセキュリティ制御を使用して構成できますが、通常のデフォルトの MySQL 構成ではそれらの制御が使用されない場合があります。この記事では、MySQL データベースを強化するために実行する必要がある 5 つの重要な手順について説明します。

ステップ 1: 強力なパスワードを設定する

すべてのデータベース ユーザーにとって、強力なパスワードを使用することが重要です。ほとんどの人は手動でデータベースに頻繁にログインしないことを考慮して、パスワード マネージャーまたはコマンド ライン ツール pwgen を使用して、データベース アカウント用にランダムな 20 文字のパスワードを作成します。これは、追加の MySQL アクセス制御を使用して、特定のアカウントがログインできる場所を制限する場合でも (アカウントをローカルホストに厳密に制限するなど)、依然として重要です。

パスワードを設定する最も重要な MySQL アカウントは root ユーザーです。デフォルトでは、多くのシステムでは、このユーザーにはパスワードがありません。特に、Red Hat ベースのシステムでは、MySQL のインストール時にパスワードが設定されません。Debian ベースのシステムでは、対話型インストール中にパスワードの入力を求められますが、非対話型インストール (Configuration Manager を使用する場合など) ではパスワードがスキップされます。さらに、対話型インストール中にパスワードの設定をスキップすることもできます。

root ユーザーにパスワードを入力させないことは、大きなセキュリティ リスクではないと考えるかもしれません。結局のところ、ユーザーは「root@localhost」に設定されています。これは、そのユーザーになる前にコンピューターを root 化する必要があることを意味すると思われるかもしれません。残念ながら、これは、localhost から MySQL クライアントをトリガーできるユーザーは、次のコマンドを使用して MySQL root ユーザーとしてログインできることを意味します:

*$ mysql — user root*

したがって、root ユーザーのパスワードを設定しない場合、MySQL マシン上でローカル シェルを取得できる人は誰でもデータベースを完全に制御できるようになります。

この脆弱性を修正するには、mysqladmin コマンドを使用して root ユーザーのパスワードを設定します:

$ sudo mysqladmin password

残念ながら、MySQL は実行されます。 root として ユーザーとしてバックグラウンド タスクを実行します。パスワードを設定すると、/root/.my.cnf ファイルにパスワードをハードコードする追加の手順を実行しない限り、これらのタスクは中断されます。

[mysqladmin]
user = rootpassword = yourpassword
ログイン後にコピー

ただし、これは、パスワードをプレーン テキストで設定する必要があることを意味します。フォームはホスト マシンに保存されます。ただし、少なくとも Unix ファイル権限を使用して、ファイルへのアクセスを root ユーザーのみに制限することはできます。

sudo chown root:root /root/.my.cnf
sudo chmod 0600 /root/.my.cnf
ログイン後にコピー

ステップ 2: 匿名ユーザーを削除する

匿名アカウントは両方ともユーザー名とパスワードのない MySQL アカウント。攻撃者がパスワードなしでデータベースにいかなる種類のアクセスもできないようにするため、このコマンドの出力で、空のユーザー名でログインした MySQL ユーザーを調べます。

> SELECT Host, User FROM mysql.user;
+ — — — — — — — — — — — — + — — — -+
| Host | User |
+ — — — — — — — — — — — — + — — — -+
| 127.0.0.1 | root |
| ::1 | root |
| localhost | |
| localhost | root |
+ — — — — — — — — — — — — + — — — -+
4 rows in set (0.00 sec)
ログイン後にコピー

がこれらのルートにあります。ユーザーの中の匿名ユーザー ( l​​ocalhost )。「ユーザー」列は空です。次のコマンドを使用して、特定の匿名ユーザーをクリアできます。

> drop user ""@"localhost";
> flush privileges;
ログイン後にコピー

他に匿名ユーザーを見つけた場合は、必ず削除してください。

#ステップ 3: 最小特権の原則に従う

最小特権の原則は、次のように要約できるセキュリティ原則です。

Just for アカウントはジョブの実行に必要なアクセスを提供するだけで、それ以上のアクセスは提供しません。

この原則は、さまざまな方法で MySQL に適用できます。まず、GRANT コマンドを使用して特定のユーザーにデータベース権限を追加するときは、ユーザーがデータベースにアクセスするために必要な権限のみを制限するようにしてください。

> grant all privileges on mydb.* to someuser@"localhost" identified by 'astrongpassword';
> flush privileges;
ログイン後にコピー
ユーザーが特定のテーブルにのみアクセスする必要がある場合 (たとえば、users テーブル)、

mydb.users またはテーブルの任意の名前を mydb.* に置き換えます (すべてのテーブルに権限を付与します)。

多くの人はユーザーにデータベースへのフル アクセスを許可しますが、データベース ユーザーがデータを読み取るだけでデータを変更する必要がない場合は、データベースへの読み取り専用アクセスを許可するという追加の手順を実行する必要があります。 :

> grant select privileges on mydb.* to someuser@"localhost" identified by 'astrongpassword';
> flush privileges;
ログイン後にコピー
最後に、多くのデータベース ユーザーはローカルホストからデータベースにアクセスしません。通常は管理者が次のように作成します:

> grant all privileges on mydb.* to someuser@"%"  identified by 'astrongpassword';
> flush privileges;
ログイン後にコピー
これにより、「someuser」はどこからでもデータベースにアクセスできるようになります。通信網。ただし、明確に定義された内部 IP のセットがある場合、またはすべてのアプリケーション サーバーが他のホストとは異なるサブネット上に存在するように VLAN が設定されている場合は、これを利用して "someuser" を制限できます。アカウントが特定のネットワークからのみデータベースにアクセスできるようにします:

> grant all privileges on mydb.* to someuser@10.0.1.0/255.255.255.0 identified by 'astrongpassword';
> flush privileges;
ログイン後にコピー

第四步:启用 TLS

设置强密码仅只有攻击者可以在网络上读取你的密码或者其他敏感数据的情况下才能达到此目的。因此,使用 TLS 保护你的所有网络流量比以往任何时候都更加重要。

MySQL 也不例外。

幸运的是,在 MySQL 中启用 TLS 比较简单。一旦你有了你的主机的有效证书,只需要在你的主 my.cnf 文件的 [mysqld]部分添加以下几行 :

[mysqld]
ssl-ca=/path/to/ca.crt
ssl-cert=/path/to/server.crt
ssl-key=/path/to/server.key
ログイン後にコピー

为了额外的安全性,还可以添加 ssl-cipher 配置选项,其中包含一个被认可的密码列表,而不是只接受默认的密码列表,这可能包括较弱的 TLS 密码。我推荐使用  Mozilla Security/Server Side TLS page 所推荐的现代或者中级密码套件。

一旦服务器端设置了 TLS ,你可以限制客户端必须采用 TLS 进行连接,通过在 GRANT 语句中添加 REQUIRE SSL :

> grant all privileges on mydb.* to someuser@10.0.1.0/255.255.255.0 identified by 'astrongpassword' REQUIRE SSL;

> flush privileges;
ログイン後にコピー

第五步:加密数据库密钥

虽然现在很多人都知道使用单向散列(理想情况下是像 bcrypt 这样慢速散列 ),保护用户数据库存储的密码有多重要,但通常没过多考虑使用加密来保护数据库上其他的敏感数据。事实上,许多管理员会告诉你他们的数据库是加密的,因为磁盘本身是加密的。这实际上会影响你的数据库加固,不是因为磁盘加固有缺陷或糟糕的做法,而是因为它会给你一种错误的信任感。

磁盘加密保护你的数据库数据,以防止有人从你的服务器窃取磁盘(或者你买了二手磁盘后忘记擦除磁盘),但是磁盘加密并不能在数据库本身运行时保护你,因为驱动器需要处于解密状态才能被读取。

要保护数据库中的数据,你需要采取额外的措施,在存储敏感字段之前对它们进行加密。这样如果攻击者找到了某种方法来转存完整的数据库,你的敏感字段仍然会受到保护。

有许多加密数据库中字段的方法,而且 MySQL 支持本地加密命令。无论你采取哪种加密方法,我都建议避免你需要将解密密钥存储在数据库本身的加密方法。

理想情况下,你会把解密的密钥存储在应用服务器上,作为本地GPG密钥(如果你使用GPG进行加密)或者将其存储为应用程序服务器上的环境变量。这样即使攻击者可能找到一种方法来破坏应用程序服务器的服务器,他也必须将攻击转换为本地shell访问,以此来获取你的解密密钥。

MySQL 加固原则:掌握最小权限原则

有很多方法来锁定你的MySQL服务器。确切地说,你如何实施这些步骤取决于你如何设置自己的数据库,以及它在网络中的位置。

虽然前面的五个步骤将有助于保护你的数据库,但我认为更需要掌握的最重要的整体步骤是最小权限原则。你的数据库可能存储来一些非常有用的数据,如果你确保用户和应用程序只具有执行其工作的所需的最小访问权限,那么你将限制攻击者能够做什么,如果黑客找到来危害该用户或者应用程序的方法。

【相关推荐:mysql视频教程

以上が【知っておくべき】MySQL を強化するために講じるべき 5 つの重要なセキュリティのヒントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
関連するチュートリアル
人気のおすすめ
最新のコース
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!