Linux 用户管理简介

一、创建用户

Linux 系统可以使用 useradd 命令创建新用户:
$ sudo useradd -m -c 'description' <username>

  • -m 选项表示创建用户的同时自动在 /home 目录下创建该用户的主目录(/home/<username>
  • -c 选项用于给新用户添加描述,该描述将保存在 /etc/passwd 文件中

默认情况下,新创建的用户并未分配密码,需要使用 passwd <username> 命令为新用户设置密码。

PS:在为新用户自动创建主目录时,可以同时复制一部分初始文件(如 .bashrc.vimrc 等)到该目录下,复制的源文件默认位于 /etc/skel 目录下。
即创建新用户时,/etc/skel/ 目录下的所有文件都将自动复制到新用户的主目录中。

在 Ubuntu 系统中,useradd 命令默认不自动创建用户主目录,所以需要带上 -m 选项。而 Centos 系统中,useradd 命令默认会自动创建用户主目录,可以加上 -M 选项表示不创建用户主目录。

useradd 的部分命令选项:

选项 描述
-c, --comment 添加用户描述
-d, --home-dir 指定用户的主目录位置
-m, --create-home 自动创建用户的主目录
-M, --no-create-home 不自动创建用户主目录(CentOS)
-N, --no-user-group 不创建同名的组
-s, --shell 指定用户使用的 shell
-g, --gid 指定新账户主组的名称或 ID
-G, --groups 指定新账户的附加组列表
-e, --expiredate 指定新账户的过期日期
-f, --inactive 用户密码过期后的重置密码期限
-r, --system 创建一个系统账户
-k, --skel 指定骨架目录(默认为 /etc/skel)

PS:其中的 INACTIVEEXPIRE 选项用于设置用户账号的过期时间。INACTIVE 用于指定一个期限(单位为),在该期限内,密码失效后的用户可以重置自己的密码。该选项值为 -1 时则禁用此特性。
EXPIRE 用于指定一个截止日期(格式为 YYYY-MM-DD),超过该期限后用户账号即被禁用。

$ sudo useradd -e 2018-10-01 temp_account # 创建一个临时账户

用户默认设置

新用户在创建时会使用一些预先定义的默认设置,useradd 命令从 /etc/default/useradd 文件中获取这些默认设置。当前的默认配置可以通过 useradd -D 命令显示:

$ useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no

可以直接通过 useradd -D 命令修改 useradd 的默认设置,如:
$ sudo useradd -D -s /bin/bash # 将新建用户的默认 shell 设置为 /bin/bash

二、用户组

在 Linux 系统中,任何一个用户都必须属于至少一个用户组。对于大多数 Linux 发行版,创建新用户时会自动创建一个同名的用户组。
初始创建的同名用户组叫做基础属组(primary group),用户还可以同时属于其他用户组,这些用户组叫做附加属组(supplementary group)。如:

$ id starky
uid=1000(starky) gid=1000(starky) 组=1000(starky),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),122(sambashare)

每一个用户和用户组在创建时都会关联于一个唯一的 UID 和 GID。UID 和 GID 的取值范围都是 0-65535 。root 用户的 UID 和 GID 永远都是 0 。

$ id root
uid=0(root) gid=0(root) 组=0(root

Ubuntu 系统中 1-99 的 ID 只用于分配给系统用户(如运行服务的 www-data),100-999动态地分配给系统守护进程的用户(在创建用户时使用 --system 选项)。而第一个普通用户则分配值为 1000 的 UID 和 GID。

使用 useradd 命令创建新用户时,可以同时为该用户关联附加属组。用户创建完成后也可以使用 usermod 命令修改该用户的附加属组。如:

$ sudo useradd test -G lpadmin,sambashare    # 创建用户 test 并将其添加至 lpadmin 和 sambashare 组
$ id test
uid=1004(test) gid=1004(test) 组=1004(test),116(lpadmin),122(sambashare)
$
$ sudo usermod test -a -G sudo    # 将用户 test 添加(-a)至 sudo 用户组
$ id test
uid=1004(test) gid=1004(test) 组=1004(test),27(sudo),116(lpadmin),122(sambashare)

usermod 命令用于修改已经存在的用户。常用命令选项如下:

$ usermod
用法:usermod [选项] 登录

选项:
  -c, --comment 注释            GECOS 字段的新值
  -d, --home HOME_DIR           用户的新主目录
  -e, --expiredate EXPIRE_DATE  设定帐户过期的日期为 EXPIRE_DATE
  -f, --inactive INACTIVE       过期 INACTIVE 天数后,设定密码为失效状态
  -g, --gid GROUP               强制使用 GROUP 为新主组
  -G, --groups GROUPS           新的附加组列表 GROUPS
  -a, --append GROUP            将用户追加至上边 -G 中提到的附加组中,
                                并不从其它组中删除此用户
  -h, --help                    显示此帮助信息并退出
  -l, --login LOGIN             新的登录名称
  -L, --lock                    锁定用户帐号
  -m, --move-home               将家目录内容移至新位置 (仅与 -d 一起使用)
  -o, --non-unique              允许使用重复的(非唯一的) UID
  -p, --password PASSWORD       将加密过的密码 (PASSWORD) 设为新密码
  -R, --root CHROOT_DIR         chroot 到的目录
  -s, --shell SHELL             该用户帐号的新登录 shell
  -u, --uid UID                 用户帐号的新 UID
  -U, --unlock                  解锁用户帐号
  -Z, --selinux-user  SEUSER    用户账户的新 SELinux 用户映射

具体可参考命令:man usermod

三、删除用户(组)

userdel 命令可用于删除用户,groupdel 命令可用于删除用户组。
默认不带选项的 userdel 命令只会删除用户,并不会同时删除该用户的主目录(可以通过加上 -r 选项强制删除用户主目录)。

删除某个用户后,所有原本属于该用户的文件都将失去属主,而被对应的 UID 所代替。如果之后又新建一个用户,而该用户使用了之前已删除账户的 UID,则新账户会替代已删除的账户并获取其文件的权限。

可以使用 find / -user UID -o -group GID 命令定位已删除账户拥有的所有文件

四、密码

使用 useradd 命令创建新用户时,是不自动提示创建密码的(Ubuntu系统中的 adduser 命令可以交互地创建新用户)。
需要使用 passwd 命令为用户设置或修改密码。

密码时效

可以使用 chage 命令设置用户密码的有效期限,如:
$ sudo chage -M 30 test
30 天后,用户 test 的密码将会过期,并收到提示需要输入新的密码。

chage 命令的常用选项:

选项 描述
-m days 设置用户修改密码的最小间隔时间,值为 0 时表示可以在任何时间修改密码
-M days 设置密码保持有效的最长期限,即修改密码的最大间隔时间
-E date 设置用户账户过期并自动被禁用的日期
-W days 设置密码过期前多少天用户被警告需要修改密码
-I days 设置密码失效多长时间后账户被锁定

不带任何选项的 chage 命令可以交互地修改密码时效:

$ sudo chage test
正在为 test 修改年龄信息
请输入新值,或直接敲回车键以使用默认值

    最小密码年龄 [0]:
    最大密码年龄 [99999]: 60
    最近一次密码修改时间 (YYYY-MM-DD) [2018-09-03]:
    密码过期警告 [7]:
    密码失效 [-1]:
    帐户过期时间 (YYYY-MM-DD) [-1]:
$

用户可以使用 chage -l 命令查看自己的密码时效设置:

chage -l test
最近一次密码修改时间           : 9月 03, 2018
密码过期时间                  : 11月 02, 2018
密码失效时间                  : 从不
帐户过期时间                  : 从不
两次改变密码之间相距的最小天数   :0
两次改变密码之间相距的最大天数   :60
在密码过期之前警告的天数        :7
账户禁用

可以使用 passwd -l <user> 命令禁用用户账号,使用 passwd -u <user> 命令解除账户禁用。
但是这个命令并不能完全禁止用户的访问(如该用户还可以通过 SSH 远程登录主机)。

如需完全禁用某用户,可使用如下命令:
sudo usermod --expiredate 1 <user>
该命令会将用户账号的失效日期设置为 1970 年 1月 1 日(即立即禁用)。

或者将用户登录时的 shell 修改为 /bin/false/usr/sbin/nologin
$ sudo usermod -s /bin/false <user>
该命令不会锁定账户,但该账户对 shell 的访问已被限制。

五、用户信息

Linux 系统将用户、群组等信息保存在以下三个文件中:
/etc/passwd/etc/shadow/etc/group

/etc/passwd 文件中包含了所有用户的列表及详细信息:

root:x:0:0:root:/root:/bin/bash
...
starky:x:1000:1000:starky,,,:/home/starky:/bin/bash
sshd:x:112:65534::/run/sshd:/usr/sbin/nologin
postgres:x:113:123:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
skitar:x:1001:1001::/home/skitar:/bin/bash
mysql:x:114:124:MySQL Server,,,:/nonexistent:/bin/false

该文件的格式为:username:password:UID:GID:GECOS:Home:Shell
其中的 password 项都为 x ,而实际的密码保存在 /etc/shadow 文件中。

/etc/group 文件的格式为:groupname:password:GID:member,member

六、sudo

sudo 命令可以使普通用户以 root 用户身份执行命令。
使用 useradd 命令新建的用户默认没有使用 sudo 命令的权限,需要先将其加入 sudo 用户组
$ sudo usermod <user> -a -G sudo

sudo 的本意是以其他用户的身份执行命令。可以使用 -u 选项指定“其他”身份。默认即为 root 用户。

配置 sudo

sudo 命令通过检查 /etc/sudoers 中的配置来确定授权规则。可以通过编辑 sudoers 文件将 sudo 的授权限制为指定的用户,指定的主机,或只能执行特定的命令。

sudoers

sudoers 文件的格式为:username host = command
如:test ALL=/bin/userdel,/bin/useradd

可以将授权使用的命令限定为某个目录中的所有命令(但不包含其子目录),如:
test ALL=/bin/*,/sbin/*

有些时候需要将使用某个命令的权限授予一个用户,但该命令又需要使用另外一个用户的身份执行(如 MySQL 的系统守护进程)。可以使用下面的格式:
test ALL=(mysql) /usr/bin/mysqld

还可以通过用户组信息完成对 sudo 的授权:
%groupname ALL=(ALL) ALL
上面的配置表示该组的所有用户可以在任何主机使用 sudo 执行任何命令。

别名设置

/etc/sudoers 文件中允许定义和使用别名,包括用户别名(User_Alias)、主机别名(Host_Alias)和命令别名(Cmnd_Alias)。如:

User_Alias ADMIN = skitar,test
Cmnd_Alias USER_COMMANDS = /bin/userdel,/bin/useradd
ADMIN ALL=/bin/groupadd,USER_COMMANDS

上面的配置表示用户 skitar 和 test 可以在所有主机上通过 sudo 执行 userdel、useradd 和 groupadd 命令。

还可以在别名前加上感叹号(!)表示拒绝:

Cmnd_Alias DENIED_COMMANDS = /bin/su,/bin/mount/,/bin/umount
test ALL=/bin/*,!DENIED_COMMANDS

上面的配置表示 test 用户可以在所有主机上通过 sudo 执行除了 su、mount 和 umount 以外的所有 /bin 目录下的命令。

参考资料

Pro Linux System Administration: Learn to Build Systems for Your Business Using Free and Open Source Software 2nd Edition

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容