0x01 MySQL 用户分析

Linux一切皆文件,每个进程、服务都有其对应的文件,每个文件又有其对应的属主和属组。mysql也不例外,在配置mysql时我们通过以下命令为mysql创建了一个无法登录的用户群及用户作为其属组和属主。

groupadd mysql
useradd -M -g mysql -s /sbin/nologin mysql
chown -R mysql:mysql /usr/local/mysql

配置完成后我们可以使用命令/usr/loacl/mysql/bin/mysql -u root登录mysql并为其设置密码(初次登录)。设置密码后再次登录需使用命令/usr/local/mysql/bin/mysql -u root -p。登录成功便进入mysql控制台。

此处初学者易将其与linux的root搞混。虽然登录linux用的是root,登录mysql用的也是root,但两者并不是同一个root。虽然是以root登录的mysql,但mysql的basedir的user:group仍是之前配置的mysql:mysql,这点是不会随之改变的。

在这里mysql是建立在linux之上的。我们首先使用的是linux的root登录了linux,进入了linux下root的shell。可以使用命令echo $SHELL查看用户当前使用的shell的类型。

mysql怎么打开以组提交 mysql用户组_linux


可以使用命令ls -ld /bin/bash查看目录的权限和归属。

mysql怎么打开以组提交 mysql用户组_nginx_02


使用命令ls -ld /root查看root主目录的权限和归属。

mysql怎么打开以组提交 mysql用户组_MySQL_03


然后我们使用的是mysql的root登录了mysql,进入了mysql的控制台,也可以理解为mysql下root的shell。

mysql怎么打开以组提交 mysql用户组_nginx_04


而linxu下mysql的shell是我们之前配置的/sbin/nologin。我们可以使用命令cat /etc/passwd查看用户默认shell。

mysql怎么打开以组提交 mysql用户组_nginx_05


此shell是无法用来登录的。

mysql怎么打开以组提交 mysql用户组_mysql_06


使用命令ls -ld /usr/local/mysql查看目录的权限和归属。

mysql怎么打开以组提交 mysql用户组_nginx_07


我们可以使用命令cat /etc/shells查看系统支持的shell类型。

mysql怎么打开以组提交 mysql用户组_MySQL_08


其实这就类似与高中物理的参考系问题。以linux为参考系,mysql的user:group就是我们最初配置的mysql:mysql。以mysql为参考系,mysql的user就是我们登录mysql时的用户,在我所举的例子中是root。

关于目录权限的应用在我之前的文章MySQL 文件读写中有所体现。例如通过上面所查看的权限得知,mysql不具有对/root目录的读写权。

0x02 Nginx 用户分析

nginx运行后可以指定用户。比如说一个静态网页服务器的文件目录的不同用户拥有不同的访问权限,使用nginx指定的用户就可以有权限对此目录进行读写。但是运行nginx的时候并没有像mysql一样要求输入用户名、密码之类的。那nginx是怎么指定用户的呢?

启动时,Nginx 主进程(master process)会以root权限运行,之后主进程会读取nginx.conf文件中user模块的配置,nginx会使用这个user模块中指定的用户启动工作进程( worker process)。

那为什么主进程需要使用root来运行呢?

因为只有root可以监听小于1024的端口。而通常webserver使用80/443端口,这也就是为什么需要使用root来运行了。

我们可以使用命令ps aux|grep nginx查看nginx相关进程

mysql怎么打开以组提交 mysql用户组_mysql怎么打开以组提交_09


这里可以看到nginx的主进程和工作进程。主进程主要读取和评估配置文件的正确性以及管理工作进程。而工作进程才是真正的网络请求处理的进程。如果主进程使用root运行,那么nginx将会调用setuid()和setgid()去设置user和group。如果group没有特别指定,那么nginx将使用user的名称设置group。user和group默认为nobody和nogroup。安装nginx的时候,可以使用命令./configure --user=USER --group=GROUP指定user和group。也可以在nginx安装结束后,使用命令vi nginx.conf设置user参数为user user [group];

mysql怎么打开以组提交 mysql用户组_mysql怎么打开以组提交_10


此处关于php的配置同nginx,我前面的文章中有详细的配置过程,此处不再赘述。同样地,使用命令ps aux|grep nginx查看mysql相关进程。

mysql怎么打开以组提交 mysql用户组_linux_11


这里可以看到第一个进程的用户为root,对应mysqld_safe。第二个进程的用户才是mysql,对应mysqld。这又是为什么呢?

这里需要介绍几个概念。

1.mysqld_safe(启动mysqld服务)
在unix机器上,MySQL官方推荐使用mysqld_safe启动mysqld服务。mysqld_safe增加了一些安全特性,比如它会在遇到错误时重启mysqld服务,并把运行时的信息记录到error log中。

mysqld_safe is the recommended way to start a mysqld server on Unix. mysqld_safe adds some safety features such as restarting the server when an error occurs and logging runtime information to an error log.

2.mysqld(启动mysql服务)

是SQL后台程序(即MySQL服务器)。要想使用客户端程序 mysql,该程序必须运行。因为客户端通过连接服务器来访问数据库。总之,mysqld是mysql的守护进程,是服务端程序。

it's a server daemon. this is the database server main binary (executable).

3.mysql(命令行工具)

交互式输入SQL语句或从文件以批处理模式执行它们的命令行工具。总之,mysql是命令行客户端程序。

it's a commandline (administration) tool.

mysql的默认端口号是3306(可以编辑用户目录下的my.cnf文件进行修改)。综上,我们不难理解为什么第一个进程为root,而第二个进程才为mysql。

MySQL 权限管理

关于MySQL权限管理的具体操作,网上有很多相关资料可供大家学习。