가장 안전한 MySQL 데이터베이스를 설정하는 방법은 무엇입니까?

小云云
풀어 주다: 2017-11-18 13:46:38
원래의
2501명이 탐색했습니다.

프로젝트 개발을 할 때 데이터베이스를 사용해야 하기 때문에 데이터베이스의 보안도 매우 중요합니다. 데이터베이스는 데이터 관리 플랫폼이며, 보안은 내부 보안과 네트워크 보안으로 구성된다고 할 수 있습니다. 시스템을 결정합니다. 시스템 관리자라면 먼저 시스템 자체의 보안을 확보해야 한다. MySQL 데이터베이스를 설치하려면 기본 환경이 잘 구성돼 있어야 한다. 오늘 Duo Backup을 사용한 일부 MySQL 데이터베이스 보안 설정에 대해 알아 보겠습니다!

1. 루트 사용자 비밀번호를 수정하고 빈 비밀번호를 삭제하세요.

기본적으로 설치된 MySQL의 루트 사용자는 보안상의 이유로 빈 비밀번호를 사용해야 합니다. 문자와 숫자로 구성된 최소 8자리의 비밀번호입니다. MySQL과 함께 제공되는 mysaladmin 명령을 사용하면 데이터베이스에 로그인하여 mysql 데이터베이스 아래의 사용자 테이블의 필드 내용을 수정할 수도 있습니다. 수정 방법은 다음과 같습니다.

# /usr/local/mysql/bin/mysqladmin -u root password “upassword” //使用mysqladmin
  #mysql> use mysql;
  #mysql> update user set password=password('upassword') where user='root';
  #mysql> flush privileges; //强制刷新内存授权表,否则用的还是在内存缓冲的口令
로그인 후 복사

  2. 기본 데이터베이스 및 데이터베이스 사용자

  일반적인 상황에서 MySQL 데이터베이스는 로컬에 설치되며, mysql을 읽으려면 로컬 PHP 스크립트만 필요하므로 많은 사용자, 특히 기본적으로 설치된 사용자에게는 필요하지 않습니다. MySQL이 초기화되면 설치 테스트를 위한 빈 사용자 및 테스트 라이브러리가 자동으로 생성됩니다. 이는 데이터베이스 보안에 위협이 됩니다. 최종 상태에서는 루트 하나만 삭제해야 합니다. 물론, 향후 필요에 따라 사용자와 데이터베이스가 추가될 예정입니다.

 

 #mysql> show databases;
  #mysql> drop database test; //删除数据库test
  #use mysql;
  #delete from db; //删除存放数据库的表信息,因为还没有数据库信息。
  #mysql> delete from user where not (user='root') ; // 删除初始非root的用户
  #mysql> delete from user where user='root' and password=''; //删除空密码的root,尽量重复操作
  Query OK, 2 rows affected (0.00 sec)
  #mysql> flush privileges; //强制刷新内存授权表。
로그인 후 복사

  3. 기본 mysql 관리자 계정 변경

  시스템 mysql의 관리자 이름은 루트이며, 정상적인 상황에서는 데이터베이스 관리자가 어떠한 변경도 하지 않았습니다. 이는 어느 정도 철저한 악의적인 행위로부터 보호해 줍니다. 시스템 사용자의 편의를 위해 이때 복잡한 사용자 이름으로 변경하시기 바랍니다. admin이나 관리자도 추측하기 쉬운 사용자 이름으로 설정되어 있으므로 설정하지 마십시오.

 mysql> update user set user="newroot" where user="root"; //改成不易被猜测的用户名
  mysql> flush privileges;
로그인 후 복사

 4. 비밀번호 관리에 대하여

 비밀번호는 데이터베이스 보안 관리에 있어 매우 중요한 요소입니다. 일반 텍스트 비밀번호를 데이터베이스에 저장하지 마세요. 컴퓨터가 손상되면 침입자가 모든 암호를 알아내고 사용할 수 있습니다. 대신 MD5(), SHA1() 또는 단방향 해시 함수를 사용하세요. 사전에서 비밀번호를 선택하지 마세요. 비밀번호를 해독할 수 있는 전문 프로그램이 있습니다. 문자, 숫자, 기호로 구성된 최소 8자의 강력한 비밀번호를 선택하세요. 비밀번호에 접근할 때, mysql 내장 함수인 비밀번호()의 SQL 문을 사용하여 비밀번호를 암호화하고 저장한다. 예를 들어, users 테이블에 새로운 사용자를 추가하려면 다음 방법을 사용합니다.

 #mysql> insert into users values (1,password(1234),'test');
로그인 후 복사

5. 독립적인 사용자를 사용하여 msyql을 실행하세요.

MySQL 서버를 루트 사용자로 실행하지 마세요. FILE 권한이 있는 사용자라면 누구나 루트(예: ~root/.bashrc)로 파일을 생성할 수 있으므로 이는 매우 위험합니다. --user=root 옵션을 사용하여 명시적으로 지정하지 않는 한 mysqld는 루트로 실행을 거부합니다. Mysqld는 권한이 없는 일반 사용자로 실행되어야 합니다. 이전 설치 과정과 마찬가지로 Linux에서 데이터베이스용으로 독립적인 mysql 계정을 생성합니다. 이 계정은 MySQL을 관리하고 실행하는 데에만 사용됩니다.

다른 Unix 사용자로 mysqld를 시작하려면 /etc/my.cnf 옵션 파일이나 서버 데이터 디렉터리의 my.cnf 옵션 파일에 [mysqld] 그룹의 사용자 이름을 지정하는 user 옵션을 추가합니다.

 #vi /etc/my.cnf
  [mysqld]
  user=mysql
로그인 후 복사

 이 명령을 사용하면 서버가 지정된 사용자로 시작됩니다. 수동으로 시작하든, mysqld_safe 또는 mysql.server를 통해 시작하든, mysql의 ID가 사용되는지 확인할 수 있습니다. 데이터베이스를 시작할 때 사용자 매개변수를 추가할 수도 있습니다.

  # /usr/local/mysql/bin/mysqld_safe --user=mysql &

  루트가 없는 다른 Linux 사용자로 mysqld를 실행하려면 사용자 테이블에서 루트 사용자 이름을 변경할 필요가 없습니다. MySQL 계정의 사용자 이름은 Linux 계정의 사용자 이름과 동일합니다. mysqld가 실행될 때 데이터베이스 디렉토리에 대한 읽기 또는 쓰기 권한이 있는 Linux 사용자로만 실행되는지 확인하십시오.

 6. 데이터베이스에 대한 원격 연결을 금지합니다

 netstat -ant 명령줄에서 기본 포트 3306이 열려 있는 것을 확인할 수 있습니다. 이때 mysqld의 네트워크 모니터링이 켜져 있어 사용자가 원격으로 연결할 수 있습니다. 자신의 계정과 비밀번호를 통해 로컬 데이터베이스는 기본적으로 데이터의 원격 연결을 허용하는 것입니다. 이 기능을 비활성화하려면 스킵 네트워킹을 활성화하고 SQL의 TCP/IP 연결을 모니터링하지 않으며 원격 액세스 권한을 차단하고 보안을 유지해야 합니다. 데이터베이스를 원격으로 관리해야 하는 경우 PhpMyadmin을 설치하면 됩니다. 데이터베이스에 원격으로 연결해야 하는 경우 최소한 기본 수신 포트를 수정하고 방화벽 규칙을 추가하여 신뢰할 수 있는 네트워크의 mysql 수신 포트의 데이터만 통과하도록 허용하세요.

# vi /etc/my.cf
  将#skip-networking注释去掉。
  # /usr/local/mysql/bin/mysqladmin -u root -p shutdown //停止数据库
  #/usr/local/mysql/bin/mysqld_safe --user=mysql & //后台用mysql用户启动mysql
로그인 후 복사

  7. 연결 사용자 수를 제한하세요

  데이터베이스 사용자가 여러 번 원격 연결을 하면 성능 저하가 발생하고 다른 사용자의 작업에 영향을 미치므로 제한이 필요합니다. 이는 my.cnf 파일의 mysqld에 max_user_connections 변수를 설정하여 단일 계정에 허용되는 연결 수를 제한함으로써 수행할 수 있습니다. GRANT 문은 서버에서 허용되는 계정 사용을 제한하는 리소스 제어 옵션도 지원할 수 있습니다.

 #vi /etc/my.cnf
  [mysqld]
  max_user_connections 2
로그인 후 복사

8. 사용자 디렉토리 권한 제한

  默认的mysql是安装在/usr/local/mysql,而对应的数据库文件在/usr/local/mysql/var目录下,因此,必须保证该目录不能让未经授权的用户访问后把数据库打包拷贝走了,所以要限制对该目录的访问。确保mysqld运行时,只使用对数据库目录具有读或写权限的linux用户来运行。

 # chown -R root /usr/local/mysql/ //mysql主目录给root
 # chown -R mysql.mysql /usr/local/mysql/var //确保数据库目录权限所属mysql用户
로그인 후 복사

  9、命令历史记录保护

  数据库相关的shell操作命令都会分别记录在.bash_history,如果这些文件不慎被读取,会导致数据库密码和数据库结构等信息泄露,而登陆数据库后的操作将记录在.mysql_history文件中,如果使用update表信息来修改数据库用户密码的话,也会被读取密码,因此需要删除这两个文件,同时在进行登陆或备份数据库等与密码相关操作时,应该使用-p参数加入提示输入密码后,隐式输入密码,建议将以上文件置空。

 # rm .bash_history .mysql_history //删除历史记录
  # ln -s /dev/null .bash_history //将shell记录文件置空
  # ln -s /dev/null .mysql_history //将mysql记录文件置
로그인 후 복사

  10、禁止MySQL对本地文件存取

  在mysql中,提供对本地文件的读取,使用的是load data local infile命令,默认在5.0版本中,该选项是默认打开的,该操作令会利用MySQL把本地文件读到数据库中,然后用户就可以非法获取敏感信息了,假如你不需要读取本地文件,请务必关闭。

  测试:首先在测试数据库下建立sqlfile.txt文件,用逗号隔开各个字段

# vi sqlfile.txt
  1,sszng,111
  2,sman,222
  #mysql> load data local infile 'sqlfile.txt' into table users fields terminated by ','; //读入数据
  #mysql> select * from users;
  +--------+------------+----------+
  | userid | username | password |
  +--------+------------+----------+
  | 1 | sszng | 111 |
  | 2 | sman | 222 |
  +--------+------------+----------+
로그인 후 복사

  成功的将本地数据插入数据中,此时应该禁止MySQL中用“LOAD DATA LOCAL INFILE”命令。网络上流传的一些攻击方法中就有用它LOAD DATA LOCAL INFILE的,同时它也是很多新发现的SQL Injection攻击利用的手段!黑客还能通过使用LOAD DATALOCAL INFILE装载“/etc/passwd”进一个数据库表,然后能用SELECT显示它,这个操作对服务器的安全来说,是致命的。可以在my.cnf中添加local-infile=0,或者加参数local-infile=0启动mysql。

#/usr/local/mysql/bin/mysqld_safe --user=mysql --local-infile=0 &
  #mysql> load data local infile 'sqlfile.txt' into table users fields terminated by ',';
  #ERROR 1148 (42000): The used command is not allowed with this MySQL version
  --local-infile=0选项启动mysqld从服务器端禁用所有LOAD DATA LOCAL命令,假如需要获取本地文件,需要打开,但是建议关闭。
로그인 후 복사

  11、MySQL服务器权限控制

  MySQL 权限系统的主要功能是证实连接到一台给定主机的用户,并且赋予该用户在数据库上的SELECT、INSERT、UPDATE和DELETE等权限(详见 user超级用户表)。它的附加的功能包括有匿名的用户并对于MySQL特定的功能例如LOAD DATA INFILE进行授权及管理操作的能力。

  管理员可以对user,db,host等表进行配置,来控制用户的访问权限,而user表权限是超级用户权限。只把user表的权限授予超级用户如服务器或数据库主管是明智的。对其他用户,你应该把在user表中的权限设成'N'并且仅在特定数据库的基础上授权。你可以为特定的数据库、表或列授权,FILE 权限给予你用LOAD DATA INFILE和SELECT ... INTO OUTFILE语句读和写服务器上的文件,任何被授予FILE权限的用户都能读或写MySQL服务器能读或写的任何文件。(说明用户可以读任何数据库目录下的文件,因为服务器可以访问这些文件)。 FILE权限允许用户在MySQL服务器具有写权限的目录下创建新文件,但不能覆盖已有文件在user表的File_priv设置Y或N。,所以当你不需要对服务器文件读取时,请关闭该权限。

#mysql> load data infile 'sqlfile.txt' into table loadfile.users fields terminated by ',';
  Query OK, 4 rows affected (0.00 sec) //读取本地信息sqlfile.txt'
  Records: 4 Deleted: 0 Skipped: 0 Warnings: 0
  #mysql> update user set File_priv='N' where user='root'; //禁止读取权限
  Query OK, 1 row affected (0.00 sec)
  Rows matched: 1 Changed: 1 Warnings: 0
  mysql> flush privileges; //刷新授权表
  Query OK, 0 rows affected (0.00 sec)
  #mysql> load data infile 'sqlfile.txt' into table users fields terminated by ','; //重登陆读取文件
  #ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) //失败
  # mysql> select * from loadfile.users into outfile 'test.txt' fields terminated by ',';
  ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
로그인 후 복사

  为了安全起见,随时使用SHOW GRANTS语句检查查看谁已经访问了什么。然后使用REVOKE语句删除不再需要的权限。

  12、使用chroot方式来控制MySQL的运行目录

  Chroot是linux中的一种系统高级保护手段,它的建立会将其与主系统几乎完全隔离,也就是说,一旦遭到什么问题,也不会危及到正在运行的主系统。这是一个非常有效的办法,特别是在配置网络服务程序的时候。

  13、关闭对Web访问的支持

  如果不打算让Web访问使用MySQL数据库,没有提供诸如PHP这样的Web语言的时候,重新设置或编译你的PHP,取消它们对MySQL的默认支持。假如服务器中使用php等web程序,试试用Web形式非法的请求,如果得到任何形式的MySQL错误,立即分析原因,及时修改Web程序,堵住漏洞,防止 MySQL暴露在web面前。

  对于Web的安全检查,在MySQL官方文档中这么建议,对于web应用,至少检查以下清单:

  试试用Web形式输入单引号和双引号(‘'’和‘"’)。如果得到任何形式的MySQL错误,立即分析原因。

  试试修改动态URL,可以在其中添加%22(‘"’)、%23(‘#’)和%27(‘'’)。

  试试在动态URL中修改数据类型,使用前面示例中的字符,包括数字和字符类型。你的应用程序应足够安全,可以防范此类修改和类似攻击。

  试试输入字符、空格和特殊符号,不要输入数值字段的数字。你的应用程序应在将它们传递到MySQL之前将它们删除或生成错误。将未经过检查的值传递给MySQL是很危险的!

  将数据传给MySQL之前先检查其大小。

  用管理账户之外的用户名将应用程序连接到数据库。不要给应用程序任何不需要的访问权限。

  14、数据库备份策略

  一般可采用本地备份和网络备份的形式,可采用MySQL本身自带的mysqldump的方式和直接复制备份形式,

  直接拷贝数据文件最为直接、快速、方便,但缺点是基本上不能实现增量备份。为了保证数据的一致性,需要在备份文件前,执行以下 SQL 语句:FLUSH TABLES WITH READ LOCK;也就是把内存中的数据都刷新到磁盘中,同时锁定数据表,以保证拷贝过程中不会有新的数据写入。这种方法备份出来的数据恢复也很简单,直接拷贝回原来的数据库目录下即可。

  使用mysqldump可以把整个数据库装载到一个单独的文本文件中。这个文件包含有所有重建您的数据库所需要的SQL命令。这个命令取得所有的模式(Schema,后面有解释)并且将其转换成DDL语法(CREATE语句,即数据库定义语句),取得所有的数据,并且从这些数据中创建INSERT语句。这个工具将您的数据库中所有的设计倒转。因为所有的东西都被包含到了一个文本文件中。这个文本文件可以用一个简单的批处理和一个合适SQL语句导回到MySQL中。

  使用 mysqldump进行备份非常简单,如果要备份数据库” nagios_db_backup ”,使用命令,同时使用管道gzip命令对备份文件进行压缩,建议使用异地备份的形式,可以采用Rsync等方式,将备份服务器的目录挂载到数据库服务器,将数据库文件备份打包在,通过crontab定时备份数据:

#!/bin/sh
  time=`date +"("%F")"%R`
  $/usr/local/mysql/bin/mysqldump -u nagios -pnagios nagios | gzip >/home/sszheng/nfs58/nagiosbackup/nagios_backup.$time.gz
  # crontab -l
  # m h dom mon dow command
  00 00 * * * /home/sszheng/shnagios/backup.sh
로그인 후 복사

  恢复数据使用命令:

 gzip -d nagios_backup./(2008-01-24/)00/:00.gz
  nagios_backup.(2008-01-24)00:00
  #mysql –u root -p nagios < /home/sszheng/nfs58/nagiosbackup/nagios_backup./(2008-01-24/)12/:00
로그인 후 복사

  三、Mysqld安全相关启动选项

  下列mysqld选项影响安全:

 --allow-suspicious-udfs
로그인 후 복사

  该选项控制是否可以载入主函数只有xxx符的用户定义函数。默认情况下,该选项被关闭,并且只能载入至少有辅助符的UDF。这样可以防止从未包含合法UDF的共享对象文件载入函数。 --

local-infile[={0|1}]
로그인 후 복사

  如果用--local-infile=0启动服务器,则客户端不能使用LOCAL in LOAD DATA语句。  

--old-passwords
로그인 후 복사

  强制服务器为新密码生成短(pre-4.1)密码哈希。当服务器必须支持旧版本客户端程序时,为了保证兼容性这很有用。

  (OBSOLETE) --safe-show-database
로그인 후 복사

  在以前版本的MySQL中,该选项使SHOW DATABASES语句只显示用户具有部分权限的数据库名。在MySQL 5.1中,该选项不再作为现在的 默认行为使用,有一个SHOW DATABASES权限可以用来控制每个账户对数据库名的访问。

 --safe-user-create
로그인 후 복사

  如果启用,用户不能用GRANT语句创建新用户,除非用户有mysql.user表的INSERT权限。如果你想让用户具有授权权限来创建新用户,你应给用户授予下面的权限:

mysql> GRANT INSERT(user) ON mysql.user TO &#39;user_name&#39;@&#39;host_name&#39;;
로그인 후 복사

  这样确保用户不能直接更改权限列,必须使用GRANT语句给其它用户授予该权限。

--secure-auth
로그인 후 복사

  不允许鉴定有旧(pre-4.1)密码的账户。

 --skip-grant-tables
로그인 후 복사

  这个选项导致服务器根本不使用权限系统。这给每个人以完全访问所有的数据库的权力!(通过执行mysqladmin flush-privileges或mysqladmin eload命令,或执行FLUSH PRIVILEGES语句,你能告诉一个正在运行的服务器再次开始使用授权表。)

 --skip-name-resolve
로그인 후 복사

  主机名不被解析。所有在授权表的Host的列值必须是IP号或localhost。

--skip-networking
로그인 후 복사

  在网络上不允许TCP/IP连接。所有到mysqld的连接必须经由Unix套接字进行。

 -skip-show-database
로그인 후 복사

1.如果使用该选项,只允许有SHOW DATABASES权限的用户执行SHOW DATABASES语句,该语句显示所有数据库名。

2.如果不使用该选项,则允许所有用户执行SHOW DATABASES,但只显示用户有SHOW DATABASES权限或部分数据库权限的数据库名。请注意全局权限指数据库的权限。、

以上就是MySQL数据库安全设置的方法,有需要的小伙伴们赶紧收藏起来吧。

相关推荐:

Mysql安全性测试

怎样使MySQL安全以对

Windows下设置MySQL安全权限

위 내용은 가장 안전한 MySQL 데이터베이스를 설정하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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