zoukankan      html  css  js  c++  java
  • 第35章 安全的MYSQL 安装

    安全的MYSQL 安装:


    这个章节讨论 MYSQL 管理员面临的安全风险:


    1.操作系统安全


    2. 文件系统安全


    3.Log files 安全


    4. 网络安全


    5.结合存储引擎和安全




    35.1  安全问题




    存储在MYSQL 数据库里的信息必须确保安全来避免暴露数据


    MYSQL 安装风险有下面几种:




    1.  操作系统会有安全风险.


    MYSQL 通常有一个专用的账户。  然而,server机器可能会有其他用户邓丽,


    这些账户可能潜在的用于不利于 MYSQL 安装


    2.文件系统安全风险, 数据库信息是直接存储在目录和文件里的,server 也维护包含查询和


    客户端执行的信息。 因为这些目录和文件是文件系统的部分,它们必须被保护防止其他OS用户直接访问它们。




    MYSQL的安装也包括程序和脚本用于管理和访问数据库。


    3.网络安全预防。 MYSQL server 提供通过网络连接来访问数据库。


    客户端账户是存储在MYSQL数据库里,每个账号必须设置权限和提供账户只需要访问和修改的表




    账户必须设置密码




    下面的章节讨论 管理员能使用的技术来维护MYSQL安装的完整性






    MYSQL 安装的目录和文件可以通过改变属组合访问权限在运行前,






    设置MYSQL root账户的密码




    35.2   操作系统安全


    了解多用户操作系统比如UNIX, MYSQL 安装的所有组件必须有一个具有相应的管理权限的账户所拥有。


    来包含防止非认证的用户访问  安装对于其他用户只能是需要的访问程度




    为了完成这个目的,设置专用的账户来管理MYSQL 




    另外的设置这个账户的好事是 你可以来运行MYSQL SERVER,


    相比用root运行。




    这个章节假设有mysql用户和组存在作为管理账户。




    为了有一个安全的MYSQL 安装,下面的条件必须满足;


    1. 每个MYSQL 相关的目录和权限必须是mysql用户属组,这个包括MYSQL的程序 数据库的目录和文件


    日志,状态文件和篇日志文件。




    允许其他的所有的属组是mysql,可能是一些程序和库目录和文件属组是root


    原则是任何server 需要修改的 属组不能是root




    2. 文件只有server 可以访问的 属组应该是mysql账户,只有它可读。




    这些文件包含任何的文件包含复制的密码,master.info 复制文件在slave server上,也包含了复制的密码


    3.没有文件可以设置成可读的除了MYSQL用户  除了那么些其他用户需要访问的客户端程序。


    文件必须被其他用户访问的 包括 Unix socket 文件,全局选项文件,错误日志文件




    4.大多数情况下, 是合理的 客户端程序和其他公用的 可以执行的


    其他用户也可以运行  在某些条件下,你需要限制访问 只允许一类用户可以运行MYSQL程序




    5.mysql sever 不可以用root用户运行,有很多理由


    其中一个是通过server执行的操作可能调用了读写文件 在server主机上。


    (比如,LOAD DATA INFILE 和SELECT ... INTO OUTFILE )


    用root来运行是一个坏注意,因为这样做会使文件权限为root ,大量的增加了文件系统的程度






    6.下面的例子过程显示了如何安全的目录和文件。在使用这个步骤前,先停止mysql server.






    chown 和chgrp 命令 用root 用户执行,因为只有root 可以改变目录和文件的属组。


    当目录和文件已经被设置为mysql,你可以设置它们的权限通过执行chmod 用root或者mysql用户








    假设MYSQL的程序 安装在/usr/local/mysql 目录。为了保护咱庄的文件,


    提花相应的目录名字在下面的命令中。


    运行下面的命令用root来设置安装目录下的 属组是mysql:mysql




    chown -R mysql:mysql /usr/local/mysql








    限制安装目录的访问权限m只有mysql用户有权限来修改,它的子目录其他用户有访问权限


    chmod u=rwx,go=rx /usr/local/mysql  --755


    chmod u=rwx,go=rx /usr/local/mysql/bin  --755


    chmod u=rwx,go-rwx /usr/local/mysql/libexec --700
     
    chmod -R go-rwx /usr/local/mysql/data --700




    这些命令给出了完全的mysql user 用户访问但是限制了其他用户的访问。




    也决定了mysql的安装目录和bin目录 其他用户可以访问客户端程序但是不能修改,


    chown mysql /etc/my.cnf


    chgrp mysql  /etc/my.cnf




    chmod u=rw,go=r /etc/my.cnf




    在启动server前,你需要用mysql 账户登录执行。


    或者用root启动带上--user=mysql 选项来指示改变用户从root变为mysql 在启动时


    (允许以root用户启动,如果你这么做的话,你需要使用--user 选项告诉server 改变用户为mysql账户


    放弃它的root权限,否则,server会以root用户执行,那将是危险的)




    如果你有server 设置为自动启动在system启动阶段,系统用root 调用server 不允许你指定任何选项在命令行。


    为了可靠的启动server 用mysql用户,最好加上--user选项 在my.cnf文件中


    那样server 不管你是手动还是自动启动都会使用mysql启动


    [mysqld]
    user=mysql




    mysql    29496 29321 15 08:26 pts/7    00:00:04 /usr/local/mysql5.6/bin/mysqld --


    basedir=/usr/local/mysql5.6 --datadir=/mysql/data --plugin-dir=/usr/local/mysql5.6/lib/plugin --


    user=mysql --log-error=/mysql/data/master.err --pid-file=/mysql/data/master.pid




    35.4 Log Files 和安全




    文件系统安全包括log files,你需要保持log 内存安全。


    你不需要露出表数据因为log file 包含了数据值的语句。






    35.5.1 安全初始化MYSQL账户


    MySQL server 控制客户端访问使用mysql 数据库,mysql包含了授权表。




    权限在授权表里和账户关联,每条记录都包含username和hostname


    MYSQL 账户不只依赖你的username,还有你发起连接的客户端主机。




    注意:


    MySQL的Username 和passwords 账户是和系统登录账户没有关系的。


    比如,在Unix 上你个登录名不需要和你使用来确认你自己 当你连接MYSQL server的时候。




    MYSQL 安装过程设置了一个或者多个初始的账户在授权表里。


    默认的,这些账号没有密码。 你需要个自己设置密码,


    特别是那些有管理权限的, 






    最低限度,会有一个root@localhost的账号。在Unix上,还有一个root@host_name的账号,




    host_name 是server host的名字。






    授权表可能也包括匿名账号,username是空的 可以被任何用户使用。




    初始化Mysql 账户默认没有密码,你需要立即设置root账户来防止其他用户登录。




    设置密码的方式:


    1.使用GRANT 语句


    2.使用设置密码语句


    3.使用mysqladmin 密码命令


    4.直接用UPDATE语句








    通常的,优先选择前3种的一种方式,避免直接修改授权表。


    比如,当安装了MySQL 后,一个简单的方式来保护root账户是通过设置密码 使用


    mysqladmin 命令  rootpass 代表password host_name 是机器的主机名




    mysqladmin -u root password 'rootpass';


    mysqladmin -u root -h host_name password 'rootpass';


    然而,这些命令不关心匿名账号。下面的过程安全所有的初始化账户通过设置密码给任何root账户和


    删除任何的匿名账户。过程也包括直接修改授权表。


    1. 在server主机上,root 用户访问授权表 在mysql数据路里,初始化,


    假设root账户没有密码,你可以用下面不指定密码选项


    shell>mysql -u root mysql




    2.账号和密码存储在mysql数据库的user表里,修改任何用户表记录


    mysql>UPDATE user set passowrd =PASSWORD('rootpass') where user='root';


    3.在WINDOWS 上,user table 包含一条记录 'root'@'%' 账户允许 从任何机器上用root连接


    为了只允许从本地连接,删除这些账户:






    mysql>delete from user hwere user='root' and Host='%';






    4.  删除任何匿名账户,使用下面的语句:


    delete from user where user='';


    delete from db where user='';


    6.最后刷新权限表


    mysql>FLUSH PRIVILEGES; ---刷新权限表(手动操作权限表,需要此操作)






    需要刷新权限表是因为server 操作访问控制是基于权限表的内存拷贝的


    FLUSH 语句告诉server 来创建新的内存拷贝从磁盘权限表


    这个是必须的过程直接通过UPDATE 和DELETE 来改变权限表相比通过账号管理语句 比如SET PASSWORD


    只有后面的语句会使server 自动加载权限表




    mysql> select host,user,password from mysql.user;
    +------------+--------+-------------------------------------------+
    | host       | user   | password                                  |
    +------------+--------+-------------------------------------------+
    | localhost  | root   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    | mysql      | root   |                                           |
    | 127.0.0.1  | root   |                                           |
    | ::1        | root   |                                           |
    | localhost  |        |                                           |
    | mysql      |        |                                           |
    | localhost  | test   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    | %          | test   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    | %          | plms   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    | localhost  | plms   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    | 10.10.17.% | backup | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    | localhost  | jim    | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    +------------+--------+-------------------------------------------+
    12 rows in set (0.00 sec)




    执行脚本后:
    mysql> select host,user,password from mysql.user;
    +------------+--------+-------------------------------------------+
    | host       | user   | password                                  |
    +------------+--------+-------------------------------------------+
    | localhost  | root   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    | 127.0.0.1  | root   |                                           |
    | ::1        | root   |                                           |
    | localhost  | test   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    | %          | test   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    | %          | plms   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    | localhost  | plms   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    | 10.10.17.% | backup | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    | localhost  | jim    | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    +------------+--------+-------------------------------------------+
    9 rows in set (0.00 sec)






    在Unix 上,MYSQL 有一个mysql_secure_installation 脚本 可以执行安全相关的操作,包含下面的功能:
    [mysql@master ~]$ mysql_secure_installation 






    NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
          SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!


    In order to log into MySQL to secure it, we'll need the current
    password for the root user.  If you've just installed MySQL, and
    you haven't set the root password yet, the password will be blank,
    so you should just press enter here.


    Enter current password for root (enter for none): 
    OK, successfully used password, moving on...


    Setting the root password ensures that nobody can log into the MySQL
    root user without the proper authorisation.


    You already have a root password set, so you can safely answer 'n'.


    Change the root password? [Y/n] n
     ... skipping.


    By default, a MySQL installation has an anonymous user, allowing anyone
    to log into MySQL without having to have a user account created for
    them.  This is intended only for testing, and to make the installation
    go a bit smoother.  You should remove them before moving into a
    production environment.


    Remove anonymous users? [Y/n] Y
     ... Success!


    Normally, root should only be allowed to connect from 'localhost'.  This
    ensures that someone cannot guess at the root password from the network.


    Disallow root login remotely? [Y/n] Y
     ... Success!


    By default, MySQL comes with a database named 'test' that anyone can
    access.  This is also intended only for testing, and should be removed
    before moving into a production environment.


    Remove test database and access to it? [Y/n] N
     ... skipping.


    Reloading the privilege tables will ensure that all changes made so far
    will take effect immediately.


    Reload privilege tables now? [Y/n] Y
     ... Success!








    All done!  If you've completed all of the above steps, your MySQL
    installation should now be secure.


    Thanks for using MySQL!




    Cleaning up...






    1. 设置root用户的密码


    2. 删除任何能远程访问的root账户。 


    3.删除匿名账户


    4.删除test 数据库






    35.5.2  常规的权限预防




    这个章节描述常规的预防来观察当MYSQL账户授权的时候:


    1.不要给Mysql database授权, 给用户修改授权表的权限 相当于给用户授予了所有权限。




    2.有选择性的授予管理权限 下面描述了一些给非管理用户授予危险的权限






    1. FILE 权限 允许用户在MYSQL SERVER 上读取和写文件




    2.PROCESS 权限 允许用户SHOW PROCESSLIST 来查看客户端的连接




    3. SUPER 权限允许客户端来kill 其他客户端的连接



















































































































  • 相关阅读:
    hive中named_struct构造和使用
    hive非分区表导入csv数据
    hive常用的日期函数
    hive mapreduce reducer 调优
    Hive Analytics Functions row_number rank over partition by
    skip-grant-tables
    VC中的字符串转换宏
    CMAKE的使用
    VSCODE C/C++配置
    libcurl,多线程,gzip,共享DNS
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351706.html
Copyright © 2011-2022 走看看