nologin user---请不要上我,好好干活!

当我们在linux中安装一些软件的时候,比如nginx等,都会自动创建相应的用户,如nginx等,当软件运行时,也是以相应的用户身份运行的。但是这些用户是怎么被创建的?有密码吗?安全吗?命令是怎么运行起来的?本文尝试解决这些问题。

nologin user

如果你的机子上跑着nginx,你ps一下进程,你会发现nginx worker进程是以nginx用户运行的。(至于master进程为什么以root用户运行,可以参考这篇文章。)

nologin.png

关于nginx用户在/etc/passwd中看到的信息是下面这个样子。

nginx:x:497:498:nginx user:/var/cache/nginx:/sbin/nologin

这行信息的意思从左到右分别是:
用户名:密码:User Id:Group Id:备注:用户目录:默认shell

最后这个默认shell/sbin/noligin,普通用户一般是/bin/bash,从nologin字面上我们可以猜测这个用户是不能用来登录,具体解释就是不能启动shell来执行命令,也就不能用来ssh登录或者通过su命令来切换。

那这些用户还能做啥呢?在运行命令的时候可以指定以该用户身份运行,具体方法见下文。好处显而易见,即便nginx软件有漏洞了,黑客也不能借机做什么大坏事,因为它是以nginx用户来运行的,权限是很小的。(请先忽略root运行的master进程,呵呵)

nologin user创建

该类用户的创建过程很简单,只要将用户的默认shell指定为/sbin/nologin就可以了,如下面所示。

useradd -d /home/test -s /sbin/nologin test

nologin user使用

nologin用户有了,那么如何使用这些用户来运行命令呢?有下面两种方式。

一是命令行方式,如下所示

sudo -u [nologin user name] CMD 或者
su - [nologin user name] -c "CMD"

此时CMD命令的执行者便是你所创建饿nologin user了。

二是程序原生支持的方式。

比如nginx的配置文件中user这一行即可以指定运行用户,memcached提供了-u选项可以指定运行用户等。

该方式是成熟软件常用的方式,因为这样用户操作起来简单,只要创建好对应用户,然后再配置一下就可以了,不需要记住第一种方式的命令。
在编程实现上借助系统调用setuidsetgid就可以实现了。

小结

nologin用户是出于安全考虑创建的用户,比如ftp用户等等,禁止该类用户进行远程登录,但可以以他们的身份去执行命令,例如ftp中读取相应用户目录下的文件等等。

在实际线上服务器安装软件的过程中,我们应该学会创建和使用该类用户,比如elasticsearch、redis、memcached这类不需要root用户运行的命令,使用nologin类型的用户运行即可,可以增强系统的安全性,避免不必要的事故。

之前我配置线上elasticsearch的时候,是以root用户运行的。由于配置问题,将9200端口直接暴露在公网中,被人扫了端口,某天又开启了elasticsearch的script特性,即可以远程执行java代码的功能,被黑客攻击了,由于是root用户执行,黑客可以做任何事情,教训惨痛。(啊,多么痛的领悟!)如果当时使用了elasticsearch的nologin用户运行,应该可以将损失降到很小。

参考资料

  1. Why does nginx starts processes as root?

标签: devops

添加新评论