由于 Linux 是一个多用户的操作系统(允许多个用户通过不同主机或者终端访问一个独立系统),因此你需要知道如何才能有效地管理用户:如何添加、编辑、禁用和删除用户账户,并赋予他们足以完成自身任务的必要权限。

(LCTT 译注:本篇原文章节顺序有误,根据理解做了调整。)

添加用户账户

添加新用户账户,你需要以 root 运行以下两条命令中的任意一条:

# adduser [new_account]
# useradd [new_account]

当新用户账户添加到系统时,会自动执行以下操作:

  1. 自动创建用户家目录(默认是 /home/username)。
  2. 自动拷贝下列隐藏文件到新建用户的家目录,用来设置新用户会话的环境变量。

    .bash_logout
    .bash_profile
    .bashrc
  3. 自动创建邮件缓存目录 /var/spool/mail/username。

  4. 自动创建与用户名相同的用户组。

理解 /etc/passwd 中的内容

/etc/passwd 文件中存储了所有用户账户的信息,每个用户在里边都有一条对应的记录,其格式(每个字段用冒号隔开)如下:

[username]:[x]:[UID]:[GID]:[Comment]:[Home directory]:[Default shell]
  • 字段 [username] 和 [Comment] 是不言自明的。
  • 第二个字段中 x 表明通过用户名 username 登录系统是有密码保护的, 密码保存在 /etc/shadow 文件中。
  • [UID] 和 [GID] 字段用整数表示,代表该用户的用户标识符和对应所在组的组标志符。
  • 字段 [Home directory] 为 username 用户家目录的绝对路径。
  • 字段 [Default shell] 指定用户登录系统时默认使用的 shell。

理解 /etc/group 中的内容

/etc/group 文件存储所有用户组的信息。每行记录的格式如下:

[Group name]:[Group password]:[GID]:[Group members]
  • [Group name] 为用户组名称。
  • 字段 [Group password] 为 x 的话,则说明不使用用户组密码。
  • [GID] 与 /etc/passwd 中保存的 GID 相同。
  • [Group members] 用户组中的用户使用逗号隔开。

添加用户账户

修改用户信息

添加用户账户之后,你可以使用 usermod 命令来修改用户信息中的部分字段,该命令基本语法如下:

# usermod [options] [username]

设置账户的过期时间

通过 –expiredate 标记后边接 年-月-日 格式的日期,如下:

# usermod --expiredate 2014-10-30 tecmint

将用户添加到其他组

使用 -aG 或者 –append –groups 选项,后边跟着用户组,如果有多个用户组,每个用户组之间使用逗号隔开。

# usermod --append --groups root,users tecmint

改变用户家目录的默认位置

使用 -d 或者 –home 选项,后边跟着新的家目录的绝对路径。

# usermod --home /tmp tecmint

改变用户的默认 shell

使用 –shell 选项,后边跟着新 shell 的路径。

# usermod --shell /bin/sh tecmint

下面,我们一次运行上述命令:

# usermod --expiredate 2014-10-30 --append --groups root,users --home /tmp --shell /bin/sh tecmint

usermod 命令例示

扩展阅读

锁定和解锁账户

对于已有用户账户,我们还可以:

通过锁定密码来禁用账户

使用 -L (大写 l)或者 –lock 选项来锁定用户密码。

# usermod --lock tecmint

解锁用户密码

使用 –u 或者 –unlock 选项来解锁我们之前锁定的账户。

# usermod --unlock tecmint

锁定用户账户

删除用户账户

你可以通过 userdel --remove 命令来删除用户账户。这样会删除用户拥有的家目录和家目录下的所有文件,以及邮件缓存目录。

# userdel --remove [username]

用户组管理

每次添加新用户,系统会为该用户创建同名的用户组,此时用户组里边只有新建的用户,其他用户可以随后添加进去。建立用户组的目的之一,就是为了通过对指定资源设置权限来完成对这些资源和文件进行访问控制。

比如,你有下列用户:

  • user1 (主组 user1)
  • user2 (主组 user2)
  • user3 (主组 user3)

他们都需要对你系统里边某个位置的 common.txt 文件,或者 user1 用户刚刚创建的共享进行读写。你可能会运行下列命令:

# chmod 660 common.txt

# chmod u=rw,g=rw,o= common.txt [注意最后那个 = 号和文件名之间的空格]

然而,这样仅仅给文件所属的用户和用户组(本例为 user1)成员的提供了读写权限。你还需要将 user2 和 user3 添加到 user1 组,打这样做也将 user1 用户和用户组的其他文件的权限开放给了 user2 和 user3。

这时候,用户组就派上用场了,下面将演示怎么做。

显示用户所属的用户组

# groups tecmint
# id tecmint

为需要对指定文件进行读写的多个用户建立用户组

运行下列几条命令来完成:

# groupadd common_group # 添加新用户组
# chown :common_group common.txt # 将 common.txt 的用户组修改为 common_group
# usermod -aG common_group user1 # 添加用户 user1 到 common_group 用户组
# usermod -aG common_group user2 # 添加用户 user2 到 common_group 用户组
# usermod -aG common_group user3 # 添加用户 user3 到 common_group 用户组

删除用户组

通过以下命令删除用户组:

# groupdel [group_name]

属于这个 group_name 用户组的文件是不会被删除的,而仅仅是删除了用户组。

Linux 文件权限

除了我们在 LFCS 系列第三讲:归档/压缩文件及目录、设置文件属性和搜索文件[3] 中说到的基本的读取、写入和执行权限外,文件还有一些不常用却很重要的的权限设置,有时候把它当做“特殊权限”。

就像之前我们讨论的基本权限,这里同样使用八进制数字或者一个字母(象征性符号)表示该权限类型。

理解 Setuid 位

当为可执行文件设置 setuid 位之后,用户运行程序时会继承该程序属主的有效特权。由于这样做会引起安全风险,因此设置 setuid 权限的文件及程序必须尽量少。你会发现,当系统中有用户需要访问属于 root 用户的文件是所运行的程序就带有了 setuid 权限。

也就是说,用户不仅仅可以运行这个可执行文件,而且能以 root 权限来运行。比如,让我们来看看 /bin/passwd 的权限,这个可执行文件用于改变账户的密码,修改 /etc/shadow 文件。超级用户可以改变任意账户的密码,但是其他用户只能改变自己账户的密码。

passwd 命令例示

因此,所有用户都有权限运行 /bin/passwd,但只有 root 用户可以指定改变指定用户账户的密码。其他用户只能改变其自身的密码。

修改用户密码

# chmod o+u [filename]

以八进制形式来设置 setuid 位,在当前基本权限(或者想要设置的权限)前加上数字 4 就行了。

# chmod 4755 [filename]

理解 Setgid 位

设置 setgid 位之后,真实用户的有效 GID 变为属组的 GID。因此,任何用户都能以属组用户的权限来访问文件。另外,当目录置了 setgid 位之后,新建的文件将继承其所属目录的 GID,并且新建的子目录会继承父目录的 setgid 位。通过这个方法,你能够以一个指定的用户组身份来访问该目录里边的文件,而不必管文件属主的主属组。

# chmod g+s [filename]

以八进制形式来设置 setgid 位,在当前基本权限(或者想要设置的权限)前加上数字 2 就行了。

# chmod 2755 [filename]

给目录设置 Setgid 位

给命令设置 setgid 位

理解黏连Sticky位

文件设置了黏连位是没有意义,Linux 会忽略该位。如果设置到目录上,会防止其内的文件被删除或改名,除非你是该目录或文件的属主、或者是 root 用户。

# chmod o+t [directory]

以八进制形式来设置黏连位,在当前基本权限(或者想要设置的权限)前加上数字 1 就行了。

# chmod 1755 [directory]

若没有黏连位,任何有权限读写目录的用户都可删除和重命名其中的文件。因此,黏连位通常出现在像 /tmp 之类的目录,这些目录是所有人都具有写权限的。

给目录设置黏连位

Linux 特殊文件属性

文件还有其他一些属性,用来做进一步的操作限制。比如,阻止对文件的重命名、移动、删除甚至是修改。可以通过使用chattr 命令[4] 来设置,并可以使用 lsattr 工具来查看这些属性。设置如下:

# chattr +i file1
# chattr +a file2

运行这些命令之后,file1 成为不可变状态(即不可移动、重命名、修改或删除),而 file2 进入“仅追加”模式(仅在追加内容模式中打开)。

通过 Chattr 命令来包含文件

访问 root 账户并启用 sudo

访问 root 账户的方法之一,就是通过输入:

$ su

然后输入 root 账户密码。

倘若授权成功,你将以 root 身份登录,工作目录则是登录前所在的位置。如果是想要一登录就自动进入 root 用户的家目录,请运行:

$ su -

然后输入 root 账户密码。

用户通过 su 切换

执行上个步骤需要普通用户知道 root 账户的密码,这样会引起非常严重的安全问题。于是,系统管理员通常会配置 sudo 命令来让普通用户在严格控制的环境中以其他用户身份(通常是 root)来执行命令。所以,可以在严格控制用户的情况下,又允许他运行一条或多条特权命令。

普通用户通过他自己的用户密码来完成 sudo 授权。输入命令之后会出现输入密码(并不是超级用户密码)的提示,授权成功(只要赋予了用户运行该命令的权限)的话,指定的命令就会运行。

系统管理员必须编辑 /etc/sudoers 文件,才能为 sudo 赋予相应权限。通常建议使用 visudo 命令来编辑这个文件,而不是使用文本编辑器来打开它。

# visudo

这样会使用 vim(你可以按照 LFCS 系列第二讲:如何安装和使用纯文本编辑器 vi/vim[6] 里边说的来编辑文件)来打开 /etc/sudoers 文件。

以下是需要设置的相关的行:

Defaults    secure_path="/usr/sbin:/usr/bin:/sbin"
root ALL=(ALL) ALL
tecmint ALL=/bin/yum update
gacanepa ALL=NOPASSWD:/bin/updatedb
%admin ALL=(ALL) ALL

来更加深入了解这些项:

Defaults    secure_path="/usr/sbin:/usr/bin:/sbin:/usr/local/bin"

这一行指定 sudo 将要使用的目录,这样可以阻止使用某些用户指定的目录,那样的话可能会危及系统。

下一行是用来指定权限的:

root        ALL=(ALL) ALL
  • 第一个 ALL 关键词表明这条规则适用于所有主机。
  • 第二个 ALL 关键词表明第一个字段中所指定的用户能以任何用户身份的权限来运行相应命令。
  • 第三个 ALL 关键词表明可以运行任何命令。

tecmint ALL=/bin/yum update

如果 = 号后边没有指定用户,sudo 则默认为 root 用户。本例中,tecmint 用户能以 root 身份运行 yum update 命令。

gacanepa    ALL=NOPASSWD:/bin/updatedb

NOPASSWD 关键词表明 gacanepa 用户不需要密码,可以直接运行 /bin/updatedb 命令。

%admin      ALL=(ALL) ALL

% 符号表示该行应用于 admin 用户组。其他部分的含义与对于用户的含义是一样的。本例表示 admin 用户组的成员可以通过任何主机连接来运行任何命令。

通过 sudo -l 命令可以查看,你的账户拥有什么样的权限。

Sudo 访问规则

总结

对于系统管理员来说,高效能的用户和文件管理技能是非常必要的。本文已经涵盖了这些内容,我们希望你将这些作为一个开始,然后慢慢进步。随时在下边发表评论或提问,我们会尽快回应的。

原文链接

LFCS 系列第八讲:管理用户和用户组、文件权限和属性以及启用账户 sudo 访问权限的更多相关文章

  1. Linux用户和权限——管理用户和用户组的命令

    Linux用户和权限——管理用户和用户组的命令 摘要:本文主要学习了在Linux系统中管理用户和用户组的命令. useradd命令 useradd命令可以用来创建新用户. 基本语法 useradd [ ...

  2. 八、Linux 用户和用户组管理

    Linux 用户和用户组管理 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统. 用户的账号一方面可以帮助 ...

  3. linux用户管理 用户和用户组信息

    用户管理配置文件 用户信息文件  /etc/passwd 密码文件 /etc/shadow 用户配置文件 /etc/login.defs /etc/default/useradd 新用户信息文件 /e ...

  4. Linux—管理用户、用户组及权限

    管理用户 添加用户 [root@localhost ~]# useradd myuser [root@localhost ~]# useradd -m myuser # -d 目录:指定用户主目录,如 ...

  5. ubuntu中管理用户和用户组

    1. 添加一个用户组并指定id为1002 sudo groupadd -g 1002 www 2. 添加一个用户到www组并指定id为1003 sudo useradd wyx -g 1002 -u ...

  6. linux用户管理 用户和用户组管理

    用户组的基本命令 groupadd [选项] [参数] -g 指定新建工作的id -r 创建系统工作组,系统工作组的ID小于500,非系统工作组大于500 -K 覆盖配置文件"/etc/lo ...

  7. ubuntu用户及用户组文件信息

    1.用户帐号文件 /etc/passwd中存放当前系统的用户列表及用户基本的设置信息: 文件中每一行对应一个用户信息,用户信息用":"来分隔,各项内容含义如下: 用户名:用户密码: ...

  8. Azure DevOps Server 设置项目管理用户,用户组

    一,引言 Azure DevOps Server 搭建完成后,关于如何进行项目管理,项目成员管理等,我们接着上一篇文章,继续讲解 Azure DevOps Server 的用户,用户组.首先,我们需要 ...

  9. Linux系列教程(十五)——Linux用户和用户组管理之用户管理命令

    上篇博客我们介绍了用户管理的相关配置文件,包括用户信息文件/etc/passwd,用户密码文件/etc/shadow:然后介绍了用户组信息文件/etc/group,用户组密码文件/etc/gshado ...

随机推荐

  1. OM-销售订单行【订购项目】配置参数文件控制

    ONT_RESTRICT_CUST_ITEMS OM:限制行层收货地址的客户项目 ONT_USE_MVIEW_FOR_ITEMS_LOV OM:为项目值列表使用物化视图(遵守项目可订购性规则)

  2. 普通项目转换成maven项目

    参看文档:http://czj4451.iteye.com/blog/1983889 maven仓库:http://mvnrepository.com/     基本步骤如下: Configue--& ...

  3. mysql 碎片清理

    在MySQL中,我们经常会使用VARCHAR.TEXT.BLOB等可变长度的文本数据类型.不过,当我们使用这些数据类型之后,我们就不得不做一些额外的工作——MySQL数据表碎片整理. 那么,为什么在使 ...

  4. JS中eval函数的使用

    /*************************************************注册用户证件号 复选框 combox循环赋值**************************** ...

  5. python2和python3的编码问题

    python2中有两种类型 str字符串和unicode字符串 python3则改成了 bytes和str字符串 在python2中‘xxx’和b‘xxx’都是str字符串,u‘xxx’是unicod ...

  6. [转载]抓包工具Charles乱码解决办法

    FROM: http://blog.csdn.net/huanghanqian/article/details/52973651 安装 SSL 证书 Mac 端 首先去 http://www.char ...

  7. Java 根据IP获取地址

    用淘宝接口:(源码:java 根据IP地址获取地理位置) pom.xml: <!-- https://mvnrepository.com/artifact/net.sourceforge.jre ...

  8. centos6.8服务器配置之SVN配置

    version 1.6.11 一.安装:因对版本要求不高,所以采用yum安装 yum install -y svn 二.配置 1.创建仓库,以后所有代码都放在这个下面,创建成功后在svn下面多了几个文 ...

  9. JVM类加载机制详解(一)JVM类加载过程

    http://blog.csdn.net/zhangliangzi/article/details/51319033 http://chenzhou123520.iteye.com/blog/1597 ...

  10. 封装自用的脚本ajax.js

    function createxmlhttp() { xmlhttpobj = false; try{//创建对象,一个一个的试,哎,要是能统一标准都好.. xmlhttpobj = new XMLH ...