Linux创建特定用户运行应用程序

发布时间 2023-11-04 12:34:38作者: youxin

我们知道Linxu分为内核态和用户态,用户态和内核态交互的桥梁就是shell,用户的应用程序通常运行在用户态,也就是用户空间,默认情况下,root用户拥有系统最高权限,很多时候我们在linux部署应用程序时,程序可能需要取得某些系统权限才能正常运行,比如在所属组为root的目录里新建一个*.pid文件,普通用户是没有权限的,所以我们一般直接使用root用户来运行应用程序,这样就不用担心权限不足的问题,但是root用户账户下运行应用程序可能存在安全风险,所以这样的做法是不安全的。

在安装一些应用时,比如Mysql,安装运行过程需要我们提供root权限,但是在安装完成并正常运行时,我们通过top命令查看进程信息时发现:

8534 mysql     20   0 1610988 175816  18328 S   0.3  4.3   8:12.66 mysqld

mysql安装程序自动给我们创建了一个用户mysql和相应的用户组mysql,并使用mysql这个特定的用户来运行mysql服务。这样做的好处就是使用特定的用户来运行程序,而不是最高权限的root用户。

很多服务启动需要root权限,但是服务启动后,root账户通常将其转移到服务账户,这里就是mysql账户,linux中的服务账户才是标准的用户账户,主要区别就是服务账户仅仅用来运行一个服务,该账户不需要拥有像登陆用户那样指定shell和类似/home/username的家目录,取而代之的是该用户的初始工作目录可能是应用程序安装目录。

 

https://yuuuuuy.top/2019/08/03/Linux%E5%88%9B%E5%BB%BA%E7%89%B9%E5%AE%9A%E7%94%A8%E6%88%B7%E8%BF%90%E8%A1%8C%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F/

 

创建不可登录的服务账号及启动定制服务

在服务器的管理中,我们经常需要启动mysql、elasticsearch、nginx服务,但又不希望以root的方式启动(有时候是强制性的,比如elasticsearch就禁止使用root账号启动服务),这时候就需要为它们创建单独的服务账号,同时为了安全性的考虑,一般都要禁止这些账号登录Shell,以nginx为例,详细的过程如下:

1. 创建用户组与用户
既然我们都不需要用户登录,所以也不用创建用户主目录,请注意useradd的“-M”参数。

# 创建nginx组
# -g代表直接指定group ID,可以省略
# -r 代表为系统账号
groupadd -g 2000 -r nginx

# 创建nginx用户
# -u表示直接指定user ID
# -M表示不创建用户目录,需要显示指定
useradd -u 2000 -g nginx -M
 

 

2. 屏蔽独立的shell
按照上面的方法创建用户,其实这一步完全不需要,现在nginx是完全不可能登录进入shell,请注意是不能登录shell,不代表没有执行shell脚本的权限

在这里,为了复习/sbin/nglogin的知识点,还是把此过程加入,用vi将/etc/passwd文件打开,将/home/nginx改为/sbin/nologin即可。

3. 创建nginx目录及解压
 

#   创建nginx目录
mkdir /opt/nginx
#   更改组所有者
chgrp nginx /opt/nginx
#   更改拥有者信息
chown nginx /opt/nginx
ls /opt/nginx
#   文件的目录信息如下
# drwxr-xr-x. 2 nginx nginx   22 Sep  9 21:55 nginx
#   解压过程略

 


4. 用nginx用户启动服务
这里最困扰初学者的是,不登陆shell,怎么能执行shell脚本?其实,通过su -c命令完全可以达到此效果,如下:

# 以nginx用户启动服务

# 以nginx用户启动服务
su -c /opt/nginx/nginx.sh nginx

 

su:

-c command, --command=command
Pass command to the shell with the -c option.

SYNOPSIS
su [options...] [-] [user [args...]]

DESCRIPTION
su allows to run commands with substitute user and group ID.


这里,还需要说明的是,启动服务时,我们一般都会对内存、进程数量、网络服务等进行设置与优化,为了简化每次重复的工作,强烈建议以shell脚本文件的方式执行启动操作。

结论
通过“su -c”可以以服务账号的身份执行服务的启动、配置与管理操作。
原文链接:https://blog.csdn.net/yiifaa/article/details/77918654