Linux shell 学习笔记(5)— 文件权限(添加、修改、删除用户及创建、修改群组)

1. Linux的安全性

Linux 安全系统的核心是用户账户。每个能进入 Linux 系统的用户都会被分配唯一的用户账户。用户对系统中各种对象的访问权限取决于他们登录系统时用的账户。

用户权限是通过创建用户时分配的用户 ID(User ID,通常缩写为 UID)来跟踪的。UID 是数值,每个用户都有唯一的 UID,但在登录系统时用的不是 UID,而是登录名。

1.1 etc/passwd 文件

Linux 系统使用一个专门的文件来将用户的登录名匹配到对应的 UID 值。这个文件就是 /etc/passwd文件。

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
....
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin
gdm:x:42:42::/var/gdm:/sbin/nologin
rich:x:500:500:Rich Blum:/home/rich:/bin/bash
mama:x:501:501:Mama:/home/mama:/bin/bash
katie:x:502:502:katie:/home/katie:/bin/bash
jessica:x:503:503:Jessica:/home/jessica:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
$

root 用户账户是 Linux 系统的管理员,固定分配给它的 UID 是 0。就像上例中显示的,Linux 系统会为各种各样的功能创建不同的用户账户,而这些账户并不是真的用户。这些账户叫作系统账户,是系统上运行的各种服务进程访问资源用的特殊账户。所有运行在后台的服务都需要用一个系统用户账户登录到 Linux 系统上。

Linux 为系统账户预留了 500 以下的 UID 值。

/etc/passwd文件的字段包含了如下信息:

  • 登录用户名
  • 用户密码
  • 用户账户的UID(数字形式)
  • 用户账户的组ID(GID)(数字形式)
  • 用户账户的文本描述(称为备注字段)
  • 用户HOME目录的位置
  • 用户的默认shell

/etc/passwd 文件中的密码字段都被设置成了 x,这并不是说所有的用户账户都用相同的密码。

绝大多数 Linux 系统都将用户密码保存在另一个单独的文件中(叫作 shadow 文件,位置在 /etc/shadow)。只有特定的程序(比如登录程序)才能访问这个文件。

1.2 /etc/shadow 文件

/etc/shadow 文件对 Linux 系统密码管理提供了更多的控制。只有 root 用户才能访问 /etc/shadow文件,这让它比起 /etc/passwd 安全许多。

/etc/shadow 文件为系统上的每个用户账户都保存了一条记录,如下所示:

rich:$1$.FfcK0ns$f1UgiyHQ25wrB/hykCn020:11627:0:99999:7:::

在 /etc/shadow 文件的每条记录中都有 9 个字段:

  • 与 /etc/passwd 文件中的登录名字段对应的登录名

  • 加密后的密码

  • 自上次修改密码后过去的天数密码(自1970年1月1日开始计算)

  • 多少天后才能更改密码

  • 多少天后必须更改密码

  • 密码过期前提前多少天提醒用户更改密码

  • 密码过期后多少天禁用用户账户

  • 用户账户被禁用的日期(用自1970年1月1日到当天的天数表示)

  • 预留字段给将来使用

使用 shadow 密码系统后,Linux 系统可以更好地控制用户密码。它可以控制用户多久更改一次密码,以及什么时候禁用该用户账户,

1.3 添加新用户

useradd 命令使用系统的默认值以及命令行参数来设置用户账户。系统默认值被设置在 /etc/default/useradd 文件中。可以使用加入了 -D 选项的 useradd 命令查看所用 Linux 系统中的这些默认值。

# /usr/sbin/useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
#

在创建新用户时,如果你不在命令行中指定具体的值,useradd 命令就会使用 -D 选项所显示的那些默认值。这个例子列出的默认值如下:

  • 新用户会被添加到 GID 为100的公共组;
  • 新用户的 HOME 目录将会位于 /home/loginname;
  • 新用户账户密码在过期后不会被禁用;
  • 新用户账户未被设置过期日期;
  • 新用户账户将 bash shell 作为默认 shell;
  • 系统会将 /etc/skel 目录下的内容复制到用户的 HOME 目录下;
  • 系统为该用户账户在 mail 目录下创建一个用于接收邮件的文件;

可以用默认系统参数创建一个新用户账户,然后检查一下新用户的 HOME 目录。

# useradd -m test
# ls -al /home/test
total 24
drwxr-xr-x 2 test test 4096 2010-09-23 19:01 .
drwxr-xr-x 4 root root 4096 2010-09-23 19:01 ..
-rw-r--r-- 1 test test 220 2010-04-18 21:51 .bash_logout
-rw-r--r-- 1 test test 3103 2010-04-18 21:51 .bashrc
-rw-r--r-- 1 test test 179 2010-03-26 08:31 examples.desktop
-rw-r--r-- 1 test test 675 2010-04-18 21:51 .profile
#

默认情况下,useradd 命令不会创建 HOME 目录,但是 -m 命令行选项会使其创建 HOME 目录。

要想在创建用户时改变默认值或默认行为,可以使用命令行参数,下图列出了这些参数。
useradd命令行参数

在创建新用户账户时使用命令行参数可以更改系统指定的默认值。但如果总需要修改某个值的话,最好还是修改一下系统的默认值。

可以在 -D 选项后跟上一个指定的值来修改系统默认的新用户设置。参数列表如下图所示
useradd更改默认值的参数

更改默认值非常简单:

# useradd -D -s /bin/tsch
# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/tsch
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
# useradd命令会将tsch shell作为所有新建用户的默认登录shell。

1.4 删除用户

要删除用户可以使用 userdel 命令,默认情况下,userdel 命令会只删除 /etc/passwd 文件中的用户信息,而不会删除系统中属于该账户的任何文件。

如果加上 -r 参数,userdel 会删除用户的 HOME 目录以及邮件目录。然而,系统上仍可能存有已删除用户的其他文件。这在有些环境中会造成问题。

# /usr/sbin/userdel -r test
# ls -al /home/test
ls: cannot access /home/test: No such file or directory
#

1.5 修改用户

Linux提供了一些不同的工具来修改已有用户账户的信息。
用户账户修改工具

  1. usermod

    usermod命令是用户账户修改工具中最强大的一个。它能用来修改/etc/passwd文件中的大部分字段,只需用与想修改的字段对应的命令行参数就可以了。参数大部分跟useradd命令的参数一样(比如,-c修改备注字段,-e修改过期日期,-g修改默认的登录组)。除此之外,还有另外一些可能派上用场的选项。

     -l 修改用户账户的登录名。
     -L 锁定账户,使用户无法登录。
     -p 修改账户的密码。
     -U 解除锁定,使用户能够登录。

  2. passwd 和 chpasswd

    改变用户密码的一个简便方法就是用passwd命令:

    # passwd test
    Changing password for user test.
    New UNIX password:
    Retype new UNIX password:
    passwd: all authentication tokens updated successfully.
    #
    

    如果只用 passwd 命令,它会改你自己的密码。系统上的任何用户都能改自己的密码,但只有root 用户才有权限改别人的密码。

    -e 选项能强制用户下次登录时修改密码。你可以先给用户设置一个简单的密码,之后再强制在下次登录时改成他们能记住的更复杂的密码。

    如果需要为系统中的大量用户修改密码,chpasswd 命令可以事半功倍。chpasswd 命令能从标准输入自动读取登录名和密码对(由冒号分割)列表,给密码加密,然后为用户账户设置。你也可以用重定向命令来将含有 userid:passwd 对的文件重定向给该命令。

    # chpasswd < users.txt
    #
    
  3. chsh、chfn 和 chage

    chsh 命令用来快速修改默认的用户登录 shell。使用时必须用 shell 的全路径名作为参数,不能只用 shell 名。

    # chsh -s /bin/csh test
    Changing shell for test.
    Shell changed.
    #
    

    chfn 命令提供了在 /etc/passwd 文件的备注字段中存储信息的标准方法。chfn 命令会将用于 Unix 的 finger 命令的信息存进备注字段,而不是简单地存入一些随机文本(比如名字或昵称之类的),或是将备注字段留空。finger 命令可以非常方便地查看 Linux 系统上的用户信息。

    # finger rich
    Login: rich Name: Rich Blum
    Directory: /home/rich Shell: /bin/bash
    On since Thu Sep 20 18:03 (EDT) on pts/0 from 192.168.1.2
    No mail.
    No Plan.
    #
    

    如果在使用 chfn 命令时没有参数,它会向你询问要将哪些适合的内容加进备注字段。

    # chfn test
    Changing finger information for test.
    Name []: Ima Test
    Office []: Director of Technology
    Office Phone []: (123)555-1234
    Home Phone []: (123)555-9876
    Finger information changed.
    
    # finger test
    Login: test Name: Ima Test
    Directory: /home/test Shell: /bin/csh
    Office: Director of Technology Office Phone: (123)555-1234
    Home Phone: (123)555-9876
    Never logged in.
    No mail.
    No Plan.
    #
    

    查看 /etc/passwd 文件中的记录,你会看到下面这样的结果。

    # grep test /etc/passwd
    test:x:504:504:Ima Test,Director of Technology,(123)555-
    1234,(123)555-9876:/home/test:/bin/csh
    #
    

    chage 命令用来帮助管理用户账户的有效期。
    chage命令参数
    chage命令的日期值可以用下面两种方式中的任意一种:

    • YYYY-MM-DD格式的日期
    • 代表从1970年1月1日起到该日期天数的数值

    chage 命令中有个好用的功能是设置账户的过期日期。有了它,你就能创建在特定日期自动过期的临时用户,再也不需要记住删除用户了!过期的账户跟锁定的账户很相似:账户仍然存在,但用户无法用它登录。

2. 使用Linux组

组权限允许多个用户对系统中的对象(比如文件、目录或设备等)共享一组共用的权限。

每个组都有唯一的 GID——跟 UID 类似,在系统上这是个唯一的数值。除了 GID,每个组还有唯一的组名。

/etc/group文件包含系统上用到的每个组的信息。

root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
rich:x:500:
mama:x:501:
katie:x:502:
jessica:x:503:
mysql:x:27:
test:x:504:

和 UID 一样,GID 在分配时也采用了特定的格式。系统账户用的组通常会分配低于 500 的 GID值,而用户组的 GID 则会从 500 开始分配。/etc/group 文件有 4 个字段:

​ * 组名
​ * 组密码
​ * GID
​ * 属于该组的用户列表

组密码允许非组内成员通过它临时成为该组成员。这个功能并不很普遍,但确实存在。

说明 用户账户列表某种意义上有些误导人。你会发现,在列表中,有些组并没有列出用户。这并不是说这些组没有成员。当一个用户在 /etc/passwd 文件中指定某个组作为默认组时,用户账户不会作为该组成员再出现在 /etc/group 文件中。多年以来,被这个问题难倒的系统管理员可不是一两个呢。

2.1 创建新组

groupadd 命令可在系统上创建新组。

# /usr/sbin/groupadd shared
# tail /etc/group
haldaemon:x:68:
xfs:x:43:
gdm:x:42:
rich:x:500:
mama:x:501:
katie:x:502:
jessica:x:503:
mysql:x:27:
test:x:504:
shared:x:505:
#

在创建新组时,默认没有用户被分配到该组。groupadd 命令没有提供将用户添加到组中的选项,但可以用 usermod 命令来弥补这一点。

# /usr/sbin/usermod -G shared rich
# /usr/sbin/usermod -G shared test
# tail /etc/group
haldaemon:x:68:
xfs:x:43:
gdm:x:42:
rich:x:500:
mama:x:501:
katie:x:502:
jessica:x:503:
mysql:x:27:
test:x:504:
shared:x:505:rich, test
#

shared 组现在有两个成员:test和rich。usermod 命令的 -G 选项会把这个新组添加到该用户账户的组列表里。

说明 如果更改了已登录系统账户所属的用户组,该用户必须登出系统后再登录,组关系的更改才能生效。

警告 为用户账户分配组时要格外小心。如果加了 -g 选项,指定的组名会替换掉该账户的默认组。-G 选项则将该组添加到用户的属组的列表里,不会影响默认组。

2.2 修改组

groupmod 命令可以修改已有组的 GID(加-g选项)或组名(加-n选项)。

# /usr/sbin/groupmod -n sharing shared
# tail /etc/group
haldaemon:x:68:
xfs:x:43:
gdm:x:42:
rich:x:500:
mama:x:501:
katie:x:502:
jessica:x:503:
mysql:x:27:
test:x:504:
sharing:x:505:test,rich
# 
# 修改组名时,GID和组成员不会变,只有组名改变。

3. 理解文件权限

待续

4. 改变安全性设置

待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wohu007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值