Heim  >  Artikel  >  Datenbank  >  Wie richtet man die sicherste MySQL-Datenbank ein?

Wie richtet man die sicherste MySQL-Datenbank ein?

小云云
小云云Original
2017-11-18 13:46:382526Durchsuche

Bei der Projektentwicklung müssen wir eine Datenbank verwenden, daher ist die Sicherheit der Datenbank auch sehr wichtig. Die Datenbank ist eine Datenverwaltungsplattform, und ihre Sicherheit besteht aus der internen Sicherheit der System- und Netzwerksicherheitsteil zu entscheiden. Systemadministratoren müssen zunächst die Sicherheit des Systems selbst gewährleisten. Bei der Installation der MySQL-Datenbank muss die Basisumgebung gut konfiguriert sein. Erfahren Sie noch heute mehr über einige Sicherheitseinstellungen für MySQL-Datenbanken mit Duo Backup!

1. Ändern Sie das Passwort des Root-Benutzers und löschen Sie das leere Passwort.

Der Root-Benutzer von MySQL hat standardmäßig ein leeres Passwort. Aus Sicherheitsgründen muss es in ein sicheres Passwort geändert werden. Das sogenannte starke Passwort ist ein unregelmäßiges Passwort mit mindestens 8 Zeichen, bestehend aus Buchstaben, Zahlen und Symbolen. Verwenden Sie den mit MySQL gelieferten Befehl mysaladmin, um das Root-Passwort zu ändern. Sie können sich auch bei der Datenbank anmelden und den Feldinhalt der Benutzertabelle unter der Datenbank mysql ändern 🎜> 2. Löschen Sie die Standarddatenbank und den Datenbankbenutzer

# /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; //强制刷新内存授权表,否则用的还是在内存缓冲的口令
Unter normalen Umständen ist die MySQL-Datenbank lokal installiert und zum Lesen von MySQL ist nur das lokale PHP-Skript erforderlich, sodass viele Benutzer es nicht benötigen, insbesondere diese standardmäßig installiert. Nach der Initialisierung generiert MySQL automatisch eine leere Benutzer- und Testbibliothek. Dies stellt eine Gefahr für die Sicherheit der Datenbank dar. Im Endzustand ist nur ein einziger Root erforderlich Natürlich werden Benutzer und Datenbanken in Zukunft nach Bedarf hinzugefügt.

3. Ändern Sie das Standard-MySQL-Administratorkonto

 #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; //强制刷新内存授权表。
Der Administratorname des Systems MySQL ist root, aber unter normalen Umständen hat der Datenbankadministrator ihn nicht erstellt , was in gewissem Maße das erschöpfende böswillige Verhalten von Systembenutzern erleichtert. Wenn Sie zu diesem Zeitpunkt zu einem komplexen Benutzernamen wechseln, stellen Sie ihn bitte nicht auf admin oder Administrator ein, da diese auch im einfach zu bedienenden Bereich liegen. Ratet mal, Benutzerwörterbuch.

4. Informationen zur Passwortverwaltung

 mysql> update user set user="newroot" where user="root"; //改成不易被猜测的用户名
  mysql> flush privileges;
Passwörter sind ein sehr wichtiger Faktor bei der Datenbanksicherheitsverwaltung. Speichern Sie keine Klartext-Passwörter in der Datenbank. Wenn Ihr Computer kompromittiert ist, kann ein Eindringling alle Passwörter erhalten und verwenden. Verwenden Sie stattdessen MD5(), SHA1() oder eine Einweg-Hash-Funktion. Wählen Sie Passwörter auch nicht aus einem Wörterbuch, es gibt spezielle Programme, um sie zu knacken. Wählen Sie ein sicheres Passwort mit mindestens acht Zeichen, bestehend aus Buchstaben, Zahlen und Symbolen. Verwenden Sie beim Zugriff auf Passwörter die SQL-Anweisung der in MySQL integrierten Funktion „password()“, um das Passwort zu verschlüsseln und zu speichern. Beispielsweise wird die folgende Methode verwendet, um neue Benutzer zur Benutzertabelle hinzuzufügen.

5. Verwenden Sie einen unabhängigen Benutzer, um msyql auszuführen.

 #mysql> insert into users values (1,password(1234),'test');
Führen Sie den MySQL-Server niemals als Root-Benutzer aus. Dies ist sehr gefährlich, da jeder Benutzer mit FILE-Berechtigungen Dateien als Root erstellen kann (z. B. ~root/.bashrc). mysqld weigert sich, als Root ausgeführt zu werden, es sei denn, dies wird ausdrücklich mit der Option --user=root angegeben. Mysqld sollte als normaler, nicht privilegierter Benutzer ausgeführt werden. Erstellen Sie wie im vorherigen Installationsprozess ein unabhängiges MySQL-Konto unter Linux für die Datenbank. Dieses Konto wird nur zum Verwalten und Ausführen von MySQL verwendet.

Um mysqld als anderer Unix-Benutzer zu starten, fügen Sie die Benutzeroption hinzu, um den Benutzernamen der Gruppe [mysqld] in der Optionsdatei /etc/my.cnf oder der Optionsdatei my.cnf in den Serverdaten anzugeben Verzeichnis.

Dieser Befehl bewirkt, dass der Server mit dem angegebenen Benutzer startet. Unabhängig davon, ob Sie ihn manuell oder über mysqld_safe oder mysql.server starten, können Sie die Identität von MySQL sicherstellen. Sie können beim Starten der Datenbank auch Benutzerparameter hinzufügen.

 #vi /etc/my.cnf
  [mysqld]
  user=mysql
 # /usr/local/mysql/bin/mysqld_safe --user=mysql &

Um mysqld als anderer Linux-Benutzer ohne Root auszuführen, müssen Sie den Root-Benutzernamen nicht ändern die Benutzertabelle, da der Benutzername des MySQL-Kontos nichts mit dem Benutzernamen des Linux-Kontos zu tun hat. Stellen Sie sicher, dass mysqld beim Ausführen nur als Linux-Benutzer mit Lese- oder Schreibberechtigungen für das Datenbankverzeichnis ausgeführt wird.

6. Fernverbindung zur Datenbank verbieten

Unter der Befehlszeile netstat -ant können Sie sehen, dass der Standardport 3306 geöffnet ist. Zu diesem Zeitpunkt ist die Netzwerküberwachung von mysqld aktiviert aktiviert, sodass Benutzer aus der Ferne auf das Konto zugreifen können, um eine Verbindung zur lokalen Datenbank herzustellen. Um diese Funktion zu deaktivieren, aktivieren Sie Skip-Networking, überwachen Sie keine TCP/IP-Verbindungen von SQL, unterbrechen Sie die Fernzugriffsrechte und sorgen Sie für Sicherheit. Wenn Sie die Datenbank remote verwalten müssen, können Sie dies durch die Installation von PHPMyadmin tun. Wenn Sie wirklich eine Remote-Verbindung zur Datenbank herstellen müssen, ändern Sie zumindest den Standard-Listening-Port und fügen Sie Firewall-Regeln hinzu, um nur Daten vom MySQL-Listening-Port des vertrauenswürdigen Netzwerks durchzulassen.

7. Begrenzen Sie die Anzahl der verbundenen Benutzer

# 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
Mehrere Remoteverbindungen eines Benutzers der Datenbank führen zu Leistungseinbußen und beeinträchtigen den Betrieb anderer Benutzer. Daher ist eine Begrenzung erforderlich ihnen. Dies kann erreicht werden, indem die Anzahl der für ein einzelnes Konto zulässigen Verbindungen begrenzt wird, indem die Variable max_user_connections in mysqld in der Datei my.cnf festgelegt wird. Die GRANT-Anweisung kann auch Ressourcenkontrolloptionen unterstützen, um die zulässige Nutzung eines Kontos durch den Server einzuschränken.

8. Berechtigungsbeschränkungen für Benutzerverzeichnisse

  默认的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安全权限

Das obige ist der detaillierte Inhalt vonWie richtet man die sicherste MySQL-Datenbank ein?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn