データベースは長い間バランスのとれたアーキテクチャの重要な部分であり、おそらく最も重要な部分です。現在では、ほとんどが使い捨てでステートレスなインフラストラクチャに圧力がかかっており、他のすべてのサーバーが残りのデータとともに必然的にサーバー上に存在することになるため、データベースの信頼性と安全性の両方に大きな負担がかかっています。データベースに保存されます。
データベースはすべての攻撃者の宝物です。攻撃がより巧妙になり、ネットワークがより敵対的になるにつれて、データベースを強化するための追加の措置を講じることがこれまで以上に重要になっています。
MySQL は、その速度と全体的な使いやすさにより、開発者や管理者の間で最も人気があり、お気に入りのデータベースです。残念ながら、この使いやすさはセキュリティを犠牲にしています。 MySQL は厳密なセキュリティ制御を使用して構成できますが、通常のデフォルトの MySQL 構成ではそれらの制御が使用されない場合があります。この記事では、MySQL データベースを強化するために実行する必要がある 5 つの重要な手順について説明します。
すべてのデータベース ユーザーにとって、強力なパスワードを使用することが重要です。ほとんどの人は手動でデータベースに頻繁にログインしないことを考慮して、パスワード マネージャーまたはコマンド ライン ツール 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
匿名アカウントは両方ともユーザー名とパスワードのない 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)
がこれらのルートにあります。ユーザーの中の匿名ユーザー ( localhost )。「ユーザー」列は空です。次のコマンドを使用して、特定の匿名ユーザーをクリアできます。
> drop user ""@"localhost"; > flush privileges;
他に匿名ユーザーを見つけた場合は、必ず削除してください。
Just for アカウントはジョブの実行に必要なアクセスを提供するだけで、それ以上のアクセスは提供しません。
この原則は、さまざまな方法で MySQL に適用できます。まず、GRANT コマンドを使用して特定のユーザーにデータベース権限を追加するときは、ユーザーがデータベースにアクセスするために必要な権限のみを制限するようにしてください。> grant all privileges on mydb.* to someuser@"localhost" identified by 'astrongpassword'; > flush privileges;
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;
> grant all privileges on mydb.* to someuser@10.0.1.0/255.255.255.0 identified by 'astrongpassword'; > flush privileges;
设置强密码仅只有攻击者可以在网络上读取你的密码或者其他敏感数据的情况下才能达到此目的。因此,使用 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 を強化するために講じるべき 5 つの重要なセキュリティのヒントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。