用户和组
GNU/Linux 通过用户和用户组实现访问控制 —— 包括对文件访问、设备使用的控制。Linux 默认的访问控制机制相对简单直接,不过还有一些更加高级的机制,包括 ACL 和 LDAP Authentication.
简述
用户一般指使用计算机的人。在本文语境中,该词指用来识别用户的用户名称,既可以是 Mary 或 Bill 这样的真名,也可以是 Dragonlady, Pirate 这样的昵称。关键是,计算机给每个账户分配了特定的名称,而用户则使用这些名称访问计算机。除了人之外,一些系统服务也以有部分限制,又享有部分特权的用户账户身份运行。
由于安全需要,「用户管理」应运而生,以加以明确限制各个用户账户的权限。超级用户 root 于计算机里拥有至高无上的管理权限,所以一般只作管理用。非特权用户则可以用 su 或sudo 程序以临时获得特权。
个体可以拥有多账户,只不过彼此名称当然不同。但有一些用户名称已事先被系统占用,比如 "root".
此外,任意用户可能从属某个「用户组」。此外用户也能够新加入某些已经存在的用户组,以获取该组所拥有的特权。
一、权限与属主
第一列是文件访问权限(例如,文件initramfs-linux.img的权限为-rw-r--r--),第三列和第四列分别是属主和属组(本例中所有文件属主都是root用户,属组都是root组)。
上述例子中,sf_Shared目录由root用户和vboxsf组所有。使用stat命令也可以查看文件所有权和权限:
$ stat -c %U /media/sf_Shared/
root
$ stat -c %G /media/sf_Shared/
vboxsf
$ stat -c %A /media/sf_Shared/
drwxrwx---
二、用户管理
使用who命令,可以查看目前已登陆的用户。
使用useradd命令添加用户:
# useradd -m -g [初始组] -G [附加组] -s [登陆shell] [用户]
-m:创建用户主目录/home/[用户名];在自己的主目录内,即使不是root用户也可以读写文件、安装程序等等。
-g:设置用户初始组的名称或数字ID;该组必须是存在的;如果没有设置该选项,useradd会根据/etc/login.defs文件中的USERGROUPS_ENAB环境变量进行设置。
-G:用户要加入的附加组列表;使用逗号分隔多个组,不要添加空格;如果不设置,用户仅仅加入初始组。
-s:用户默认登录shell的路径;Arch Linux的init脚本使用bash;启动过程结束后,默认启动的登录shell在此处设定;请确保使用的shell已经安装。
以典型的桌面系统为例,要添加一个名为archie的用户,并使用bash作为登录shell:
# useradd -m -g users -s /bin/bash archie
有关useradd的高级用法,参见man页:
$ man useradd
通过下列命令设置GECOS字段(用户信息,例如用户全名):
# chfn [用户名]
(这样将会以交互式模式启动chfn)
通过下列命令设置用户密码:
# passwd [用户名]
另一个交互式界面的添加用户的工具:
# adduser
adduser会询问一些常见的设置,并使用合适的默认值,调用useradd创建用户。该命令还会设置用户信息和密码,囊括了chfn和passwd两个命令的功能。
使用userdel命令删除用户:
# userdel -r [用户名]
-r选项表示一并删除用户主目录和邮件。
三、用户信息存储
本地用户信息储存在/etc/passwd文件中。要查看系统上所有用户账户:
$ cat /etc/passwd
一行代表一个用户,格式如下:
account:password:UID:GID:GECOS:directory:shell
此处:
§ account:用户名
§ password:用户密码
§ UID:用户的数字ID
§ GID:用户所在主组的数字ID
§ GECOS:可选的注释字段,通常记录用户全名
§ directory:用户的主目录($HOME)
§ shell:用户的登陆shell(默认为/bin/sh)
注意: Arch Linux 使用影子密码。passwd文件对所有人可读,在里面存储密码(无论是否加密过)是很不安全的。在password字段,通常使用一个占位字符(x)代替。加密过的密码储存在/etc/shadow文件,该文件对普通用户限制访问。
四、用户组管理
/etc/group文件储存了系统中用户组的信息,详情参见:man group。
使用groups命令查看用户所在组的名称:
$ groups [用户名]
若省略用户名,默认显示当前用户所在组。
id命令提供额外的信息,包括用户UID以及相关用户组GID:
$ id [用户名]
查看所有组:
$ cat /etc/group
使用groupadd创建新的组:
# groupadd [组名]
使用gpasswd将用户添加到组:
# gpasswd -a [用户名] [组名]
删除用户组:
# groupdel [组名]
将用户从组中移除:
# gpasswd -d [用户名] [组名]
如果用户已登录,必须重新登录使更改生效。
五、文件列表
警告: 不要手动编辑这些文件。有些工具可以更好的处理锁定、避免数据库错误。
文件 |
作用 |
/etc/shadow |
保存用户安全信息 |
/etc/passwd |
用户账户信息 |
/etc/gshadow |
保存组账号的安全信息 |
/etc/group |
定义用户所属的组 |
/etc/sudoers |
可以运行 sudo 的用户 |
/home/* |
主目录 |