Maison > Article > base de données > Comment configurer la base de données MySQL la plus sécurisée ?
Lors du développement de projets, nous devons utiliser une base de données, donc la sécurité de la base de données est également très importante. La base de données est une plate-forme de gestion de données, et sa sécurité peut être considérée comme composée à la fois de la sécurité interne de la base de données. système et la sécurité du réseau à décider. Pour les administrateurs système, ils doivent d'abord assurer la sécurité du système lui-même. Lors de l'installation de la base de données MySQL, l'environnement de base doit être bien configuré. Découvrons dès aujourd'hui certains paramètres de sécurité de la base de données MySQL avec Duo Backup !
1. Modifiez le mot de passe de l'utilisateur root et supprimez le mot de passe vide
L'utilisateur root de MySQL installé par défaut a un mot de passe vide Pour des raisons de sécurité, il doit être remplacé par un mot de passe fort. Le mot de passe dit fort. Un mot de passe irrégulier d'au moins 8 caractères composé de lettres, de chiffres et de symboles. Utilisez la commande mysaladmin fournie avec MySQL pour changer le mot de passe root. Vous pouvez également vous connecter à la base de données et modifier le contenu des champs de la table utilisateur sous la base de données mysql. La méthode de modification est la suivante :
# /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. Supprimez la base de données par défaut et l'utilisateur de la base de données
Dans des circonstances normales, la base de données MySQL est installée localement et seul le script php local est requis pour lire MySQL, donc de nombreux utilisateurs n'en ont pas besoin, en particulier ceux installé par défaut. Une fois MySQL initialisé, il générera automatiquement une bibliothèque d'utilisateurs et de tests vide pour les tests d'installation. Cela constituera une menace pour la sécurité de la base de données. Dans l'état final, une seule racine sera nécessaire. conservés Bien entendu, des utilisateurs et des bases de données seront ajoutés selon les besoins à l'avenir.
#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. Changez le compte administrateur mysql par défaut
Le nom de l'administrateur du système mysql est root, mais dans des circonstances normales, l'administrateur de la base de données n'a pas fait tout changement. , ce qui facilite dans une certaine mesure le comportement malveillant exhaustif des utilisateurs du système. À l'heure actuelle, lorsque vous passez à un nom d'utilisateur complexe, veuillez ne pas le définir sur admin ou administrateur, car ils sont également faciles à utiliser. devinez le dictionnaire utilisateur.
mysql> update user set user="newroot" where user="root"; //改成不易被猜测的用户名 mysql> flush privileges;
4. À propos de la gestion des mots de passe
Les mots de passe sont un facteur très important dans la gestion de la sécurité de la base de données. N'enregistrez pas les mots de passe en texte brut dans la base de données. Si votre ordinateur est compromis, un intrus peut obtenir tous les mots de passe et les utiliser. Utilisez plutôt MD5(), SHA1() ou une fonction de hachage unidirectionnelle. Ne choisissez pas non plus les mots de passe dans un dictionnaire, il existe des programmes spécialisés pour les déchiffrer, choisissez un mot de passe fort d'au moins huit caractères, composé de lettres, de chiffres et de symboles. Lorsque vous accédez aux mots de passe, utilisez l'instruction SQL de la fonction password() intégrée de MySQL pour crypter le mot de passe et le stocker. Par exemple, la méthode suivante est utilisée pour ajouter de nouveaux utilisateurs à la table des utilisateurs.
#mysql> insert into users values (1,password(1234),'test');
5. Utilisez un utilisateur indépendant pour exécuter msyql
N'exécutez jamais le serveur MySQL en tant qu'utilisateur root. Ceci est très dangereux car tout utilisateur disposant des autorisations FILE peut créer des fichiers en tant que root (par exemple, ~root/.bashrc). mysqld refuse de s'exécuter en tant que root à moins d'être explicitement spécifié à l'aide de l'option --user=root. Mysqld doit être exécuté en tant qu'utilisateur normal et non privilégié. Comme dans le processus d'installation précédent, créez un compte mysql indépendant sous Linux pour la base de données. Ce compte est uniquement utilisé pour gérer et exécuter MySQL.
Pour démarrer mysqld en tant qu'autre utilisateur Unix, ajoutez l'option utilisateur pour spécifier le nom d'utilisateur du groupe [mysqld] dans le fichier d'options /etc/my.cnf ou le fichier d'options my.cnf dans les données du serveur annuaire.
#vi /etc/my.cnf [mysqld] user=mysql
Cette commande provoque le démarrage du serveur avec l'utilisateur spécifié. Que vous le démarriez manuellement ou via mysqld_safe ou mysql.server, vous pouvez garantir l'identité de mysql. Vous pouvez également ajouter des paramètres utilisateur lors du démarrage de la base de données.
# /usr/local/mysql/bin/mysqld_safe --user=mysql &
Pour exécuter mysqld en tant qu'autre utilisateur Linux sans root, vous n'avez pas besoin de modifier le nom d'utilisateur root dans la table user , car le nom d'utilisateur du compte MySQL n'a rien à voir avec le nom d'utilisateur du compte Linux. Assurez-vous que lorsque mysqld est exécuté, il est uniquement exécuté en tant qu'utilisateur Linux disposant d'autorisations de lecture ou d'écriture sur le répertoire de la base de données.
6. Interdire la connexion à distance à la base de données
Sous la ligne de commande netstat -ant, vous pouvez voir que le port 3306 par défaut est ouvert. À ce moment, la surveillance réseau de mysqld est activée. activé, permettant aux utilisateurs d'accéder à distance au compte. Mot de passe pour se connecter à la base de données locale. Par défaut, la connexion à distance aux données est autorisée. Afin de désactiver cette fonction, activez le saut de réseau, ne surveillez aucune connexion TCP/IP de SQL, coupez les droits d'accès à distance et assurez la sécurité. Si vous devez gérer la base de données à distance, vous pouvez le faire en installant PhpMyadmin. Si vous avez vraiment besoin de vous connecter à la base de données à distance, modifiez au moins le port d'écoute par défaut et ajoutez des règles de pare-feu pour autoriser uniquement le passage des données du port d'écoute MySQL du réseau de confiance.
# 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. Limiter le nombre d'utilisateurs connectés
Plusieurs connexions à distance par un utilisateur de la base de données entraîneront une dégradation des performances et affecteront les opérations des autres utilisateurs, il est donc nécessaire de limiter eux. Cela peut être accompli en limitant le nombre de connexions autorisées pour un seul compte en définissant la variable max_user_connections dans mysqld dans le fichier my.cnf. L'instruction GRANT peut également prendre en charge des options de contrôle des ressources pour limiter l'utilisation autorisée d'un compte par le serveur.
#vi /etc/my.cnf [mysqld] max_user_connections 2
8. Restrictions d'autorisation de l'annuaire des utilisateurs
默认的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 'user_name'@'host_name';
这样确保用户不能直接更改权限列,必须使用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数据库安全设置的方法,有需要的小伙伴们赶紧收藏起来吧。
相关推荐:
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!