【필수 사항】MySQL을 강화하기 위해 취해야 할 5가지 중요한 보안 팁

青灯夜游
풀어 주다: 2022-10-20 19:30:28
앞으로
1908명이 탐색했습니다.

【필수 사항】MySQL을 강화하기 위해 취해야 할 5가지 중요한 보안 팁

데이터베이스는 오랫동안 균형 잡힌 아키텍처의 중요한 부분이었으며 틀림없이 가장 중요한 부분입니다. 오늘날, 대부분의 일회용 및 상태 비저장 인프라에 대한 압력이 가해지고 있으며, 이는 다른 모든 서버가 필연적으로 나머지 데이터와 함께 서버에 있기 때문에 데이터베이스에 더 큰 부담을 가하고 있습니다. 데이터베이스에 저장됩니다.

귀하의 데이터베이스는 모든 공격자의 전리품입니다. 공격이 더욱 정교해지고 네트워크가 더욱 적대적으로 변하면서 데이터베이스를 강화하기 위한 추가 조치를 취하는 것이 그 어느 때보다 중요해졌습니다.

MySQL은 속도와 전반적인 사용 용이성으로 인해 개발자와 관리자 사이에서 가장 인기 있고 선호되는 데이터베이스입니다. 불행하게도 이러한 사용 편의성은 보안을 희생하는 대가로 발생합니다. MySQL은 엄격한 보안 제어로 구성될 수 있지만 일반적인 기본 MySQL 구성에서는 이를 사용하지 않을 수 있습니다. 이 글에서는 MySQL 데이터베이스를 강화하기 위해 취해야 할 다섯 가지 중요한 단계를 다룰 것입니다.

1단계: 강력한 비밀번호 설정

모든 데이터베이스 사용자는 강력한 비밀번호를 사용하는 것이 중요합니다. 대부분의 사람들은 수동으로 데이터베이스에 자주 로그인하지 않는다는 점을 고려하여 비밀번호 관리자나 명령줄 도구 pwgen을 사용하여 데이터베이스 계정에 대한 임의의 20자 비밀번호를 생성하세요. 이는 특정 계정이 로그인할 수 있는 위치를 제한하기 위해 추가 MySQL 액세스 제어를 사용하는 경우에도 여전히 중요합니다(예: 계정을 localhost로 엄격하게 제한).

비밀번호를 설정해야 하는 가장 중요한 MySQL 계정은 루트 사용자입니다. 기본적으로 많은 시스템에서 이 사용자에게는 비밀번호가 없습니다. 특히 Red Hat 기반 시스템은 MySQL을 설치할 때 비밀번호를 설정하지 않습니다. Debian 기반 시스템에서는 대화형 설치 중에 비밀번호를 묻는 메시지를 표시하지만, 비대화형 설치(Configuration Manager를 사용하여 수행할 수 있음)에서는 비밀번호를 건너뜁니다. 또한 대화형 설치 중에 비밀번호 설정을 건너뛸 수도 있습니다.

루트 사용자가 비밀번호를 입력하지 못하게 하는 것은 큰 보안 위험이 아니라고 생각할 수도 있습니다. 결국 사용자는 "root@localhost"로 설정됩니다. 이는 해당 사용자가 되기 전에 컴퓨터를 루팅해야 한다는 뜻이라고 생각할 수도 있습니다. 불행하게도 이는 localhost에서 MySQL 클라이언트를 트리거할 수 있는 모든 사용자가 다음 명령을 사용하여 MySQL 루트 사용자로 로그인할 수 있음을 의미합니다:

*$ mysql — user root**$ mysql — user root*

因此,如果你不为 root 用户设置密码,那么任何能够在您的 MySQL 机器上获得本地 shell 的人现在都可以完全控制你的数据库。

要修复此漏洞,请使用 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 ),它在 User 列中为空。你可以使用下面命令清除特定的匿名用户:

> drop user ""@"localhost";
> flush privileges;
로그인 후 복사

如果你发现任何其他匿名用户,请确保将其删除。

第三步:遵循最小特权原则

最小特权原则是一项安全原则,可以总结如下:

只为账户提供执行作业所需的访问权限,而不提供更多权限。

此原则可以通过多种方式应用于 MySQL。首先当使用 GRANT 命令向特定用户添加数据库权限时,请确保仅限制该用户需要访问数据库的权限:

> grant all privileges on mydb.* to someuser@"localhost" identified by 'astrongpassword';
> flush privileges;
로그인 후 복사

如果该用户只需要访问一个特定的表(例如,users 表),用mydb.users  或者任何你的表的名字替换 mydb.*

따라서 그렇지 않은 경우 루트 사용자의 비밀번호를 설정하면 이제 MySQL 시스템에서 로컬 셸을 얻을 수 있는 사람은 누구나 데이터베이스를 완전히 제어할 수 있습니다.

이 취약점을 해결하려면 mysqladmin 명령을 사용하여 루트 사용자의 비밀번호를 설정하세요.

$ sudo mysqladmin 비밀번호

불행히도 MySQL은 루트 사용자로 백그라운드 작업을 실행합니다. 비밀번호를 설정하면 /root/.my.cnf 파일에 비밀번호를 하드코딩하는 추가 단계를 수행하지 않는 한 이러한 작업이 중단됩니다. 🎜
> grant select privileges on mydb.* to someuser@"localhost" identified by 'astrongpassword';
> flush privileges;
로그인 후 복사
🎜 그러나 이는 호스트 상위에 비밀번호를 일반 텍스트로 저장해야 함을 의미합니다. 그러나 최소한 Unix 파일 권한을 사용하여 파일에 대한 액세스를 루트 사용자로만 제한할 수 있습니다. 🎜
> grant all privileges on mydb.* to someuser@"%"  identified by 'astrongpassword';
> flush privileges;
로그인 후 복사
🎜🎜2단계: 익명 사용자 제거 🎜🎜🎜익명 계정은 사용자 이름이나 비밀번호가 없는 MySQL 계정입니다. 공격자가 비밀번호 없이 데이터베이스에 접근하는 것을 원하지 않으므로 이 명령의 출력에서 ​​빈 사용자 이름으로 로그인한 MySQL 사용자를 찾아보십시오. 🎜
> grant all privileges on mydb.* to someuser@10.0.1.0/255.255.255.0 identified by 'astrongpassword';
> flush privileges;
로그인 후 복사
로그인 후 복사
🎜 이 익명 사용자 중에는 루트 사용자가 한 명 있습니다. ( localhost ), 이는 사용자 열에 비어 있습니다. 다음 명령을 사용하여 특정 익명 사용자를 삭제할 수 있습니다. 🎜
[mysqld]
ssl-ca=/path/to/ca.crt
ssl-cert=/path/to/server.crt
ssl-key=/path/to/server.key
로그인 후 복사
로그인 후 복사
🎜 다른 익명 사용자를 찾으면 반드시 삭제하세요. 🎜🎜🎜3단계: 최소 권한 원칙 따르기 🎜🎜🎜최소 권한 원칙은 다음과 같이 요약할 수 있는 보안 원칙입니다. 🎜🎜계정에 작업을 수행하는 데 필요한 액세스 권한만 부여하고 그 이상은 부여하지 않습니다. . 🎜🎜이 원칙은 MySQL에 다양한 방식으로 적용될 수 있습니다. 먼저 GRANT 명령을 사용하여 특정 사용자에게 데이터베이스 권한을 추가하는 경우 사용자가 데이터베이스에 액세스하는 데 필요한 권한만 제한해야 합니다. 🎜
> grant all privileges on mydb.* to someuser@10.0.1.0/255.255.255.0 identified by 'astrongpassword' REQUIRE SSL;

> flush privileges;
로그인 후 복사
로그인 후 복사
🎜 사용자가 특정 테이블에만 액세스하면 되는 경우(예: users 테이블), mydb <code>mydb.*를 .users 또는 테이블 이름으로 대체하십시오(모든 테이블에 대한 권한을 부여하려면). 🎜🎜많은 사람들이 사용자에게 데이터베이스에 대한 전체 액세스 권한을 부여하지만, 데이터베이스 사용자가 데이터를 변경하지 않고 읽기만 하면 되는 경우 데이터베이스에 대한 읽기 전용 액세스 권한을 부여하는 추가 단계를 수행해야 합니다. 🎜rrreee 🎜마지막으로, 많은 데이터베이스 사용자는 로컬 호스트에서 데이터베이스에 액세스하지 않습니다. 일반적으로 관리자는 다음과 같이 로컬 호스트를 생성합니다. 🎜rrreee🎜이렇게 하면 "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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:learnku.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!