Linux学习笔记(七)

第七章 理解Linux文件权限

1.Linux的安全性

Linux沿用了Unix文件权限的办法,即允许用户和组根据每个文件和目录的安全性设置来访问文件。Linux安全系统的核心是用户账户。每个能进入Linux系统的用户都会被分配唯一的用户账户。用户对系统中各种对象的访问权限取决于他们登录系统时用的账户。用户权限是通过创建用户时分配的用户ID(User ID,通常缩写为UID)来跟踪的。UID是数值,每个用户都有唯一的UID,在登录系统时用的不是UID,而是登录名。登录名时用户用来登录系统的最长八字符的字符串(字符可以使数字或字母),同时会关联一个对应的密码。

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
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

root用户是Linux系统的管理员,固定分配给他的UID是0。Linux系统会为各种各样的功能创建不同的用户账户,而这些账户并不是真正的用户。这些账户叫做系统账户,是系统上运行的各种服务进程访问资源用的特殊账户。Linux为系统账户预留了500以下的UID值。为普通用户创建账户时,大多数Linux系统会从500开始。

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

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

/etc/passwd文件中的密码字段都被设置成了x,说明密码被加密。Linux将用户密码保存在另一个单独的文件中(/etc/shadow),只有特定程序(比如登录程序)才能访问这个文件。

/etc/passwd是一个标准的文本文件,可以使用任何文本编辑器在其中直接手动进行用户管理(添加/修改/删除用户)。但是这样做存在风险,如果/etc/passwd文件损坏,系统就无法读取他的内容,这样会导致用户无法正常登录。使用标准的Linux用户管理工具去执行这些用户管理功能就会安全很多。

/etc/shadow文件为系统上的每个用户账户都保存了一条记录,只有root用户才能访问/etc/shadow文件。

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

/etc/shadow文件的每条记录都有9个字段:
与/etc/shadow文件中的登录名字段对应的登录名
加密后的密码
自上次修改密码后过去的天数密码(自1970年1月1日开始计算)
多少天后才能更改密码
多少天后必须修改密码
密码过期前提前多少天提醒用户更改密码
密码过期多少天禁用用户账户
用户账户被禁用的日期
预留字段给将来使用

添加新用户

向Linux系统添加新用户的主要工具是useradd,该命令简单快捷,可以一次性创建新用户账户以及设置用户HOME目录结构。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目录下创建一个用于接收邮件的文件。

在Ubuntu Linux系统上,/etc/skel目录有下列文件:

$ ls -al /etc/skel
total 32
drwxr-xr-x 2 root root 4096 2010-04-29 08:26 .
drwxr-xr-x 135 root root 12288 2010-09-23 18:49 ..
-rw-r--r-- 1 root root 220 2010-04-18 21:51 .bash_logout
-rw-r--r-- 1 root root 3103 2010-04-18 21:51 .bashrc
-rw-r--r-- 1 root root 179 2010-03-26 08:31 examples.desktop
-rw-r--r-- 1 root root 675 2010-04-18 21:51 .profile

可以使用默认系统参数创建一个新用户账户,然后查看一下新用户的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命令创建了新的HOME目录,并将/etc/skel目录中的文件复制了过来。

要想在创建用户时改变默认值或默认行为,可以使用命令行参数,具体可使用man useradd命令查看。可以在-D选型后跟上一个指定的值来修改系统默认的新用户设置。

删除用户

如果想从系统中删除用户,使用userdel命令。默认情况下,uerdel命令只删除/etc/passwd文件中的用户信息,而不会删除系统中属于该账户的任何文件。使用-r参数,usrdel会删除用户的HOME目录以及邮件目录,但是,系统上仍可能存有已删除用户的其他文件。

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

修改用户

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

命令描述
usermod修改用户账户的字段,还可以指定主要组以及附加组的所属关系
passwd修改已有用户的密码
chpasswd从文件中读取登录名密码对,并更新密码
chage修改密码的过期日期
chfn修改用户账户的备注信息
chsh修改用户账户的默认登录shell

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

-l修改用户账户的登录名。

-L锁定账户,使用户无法登录。

-p修改账户的密码。

-U解除锁定,使用户能够登录。

passwdchpasswd:使用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

chshchfnchage:此三个命令用来修改特定的账户信息。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.

出于安全性考虑,很多Linux系统管理员会在系统上禁用finger命令,不少Linux甚至都没有默认安装该命令。如果在使用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文件中的记录,所有的指纹信息都存在/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命令用来管理用户账户的有效期。需要对每个值设置多个参数,日期格式可以使用以下格式两者中的一个:YYYY-MM-DD,从1970年1月1日起到该日期天数的数值。chage命令可以设置账户的过期日期,该功能可以创建特定日期自动过期的临时用户,过期后的账户跟锁定的账户很像,账户仍然存在,单用户无法登录。

2.使用Linux组

用户账户在控制单个用户安全性方面很好用,涉及在共享资源的一组用户时,Linux采用了另一个安全概念–组(Group)。组权限允许多个用户对系统中的对象(文件,目录,设备等)共享一组共用的权限。每个组都有唯一的GID,与UID类似,在系统上这个是唯一的数值。除了GID,每个组还有唯一的组名。Linux系统上有一些组工具可以创建和管理你自己的组。

/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/group文件来添加用户到一个组,要用usermod命令。

创建新组:使用groupadd命令。

# /usr/sbin/groupadd shared
# tail /etc/group
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
jessica:x:503:
mysql:x:27:
test:x:504:
shared:x:505:rich, test

shared组现在有两个成员:testrichusermod命令的-G会把这个新组添加到该用户账户的组列表里。如果更改了已登录系统账户所属的用户组,该用户必须登出系统后再登录,组关系的更改才能生效。在为用户账户分配组时,如果加了-g选项,指定的组名会替换掉该账户的默认组,-G选项则将该组添加到用户的属组的列表里,不会影响默认组。

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

# /usr/sbin/groupmod -n sharing shared
# tail /etc/group
mysql:x:27:
test:x:504:
sharing:x:505:test,rich

修改组名时,GID和组成员不会变,只有组名改变。由于所以的安全权限都是基于GID的,你可以随意改变组名而不会影响文件的安全性。

3.理解文件权限
$ ls –l
total 68
-rw-rw-r-- 1 rich rich 50 2010-09-13 07:49 file1.gz
-rw-rw-r-- 1 rich rich 23 2010-09-13 07:50 file2
-rw-rw-r-- 1 rich rich 48 2010-09-13 07:56 file3
-rw-rw-r-- 1 rich rich 34 2010-09-13 08:59 file4
-rwxrwxr-x 1 rich rich 4882 2010-09-18 13:58 myprog
-rw-rw-r-- 1 rich rich 237 2010-09-18 13:58 myprog.c
drwxrwxr-x 2 rich rich 4096 2010-09-03 15:12 test1
drwxrwxr-x 2 rich rich 4096 2010-09-03 15:12 test2

输出的结果的第一个字段就是描述文件和目录权限的编码。这个字段第一个字符代表了对象的类型:

-代表文件

d代表目录

l代表链接

c代表字符型设备

b代表块设备

n代表网络设备

之后有3组三字符的编码,每一组定义了3中访问权限:

r代表对象是可读的

w代表对象是可写的

x代表对象是可执行的

若没有某种权限,在该权限位会出现-,3组权限分别对应对象的3个安全级别:对象的属主,对象的属组,系统其他用户。

在这里插入图片描述

默认文件权限umask命令用来设置所创建文件和目录的默认权限。

$ touch newfile
$ ls -al newfile
-rw-r--r-- 1 rich rich 0 Sep 20 19:16 newfile

touch命令用分配给我的用户账户的默认权限创建了这个文件。umask命令可以显示和设置这个默认权限。

$ umask
0022

第一位代表了一项特别的安全特性,叫做黏着位(sticky bit)。后3位表示文件或目录对应的umask八进制值。八进制模式的安全性设置先获取这3个rwx权限值,然后将其转换成3位的二进制值,用一个八进制值来表示。在这个二进制表示中,每个位置代表了一个二进制位。如果读权限是唯一的位置权限,权限值就是r--,转换成为禁止值就是100,代表的八进制是4。下表列出了可能会遇到的组合。

权限二进制值八进制值描述
0000没有任何权限
–x0011只有执行权限
-w-0102只有写权限
-wx0113有写入和执行权限
r–1004只有读权限
r-x1015有读取和执行权限
rw-1106有读取和写入权限
rwx1117有全部权限

八进制模式是先取得权限的八进制值,然后再把这三组安全级别的八进制值顺序列出。**umask值是个掩码,他会屏蔽掉不想授予该安全级别的权限。**对文件来说,全权限的值是666(所有用户都有读和写的权限),对于目录来说,则是777(所有用户都有读,写,执行权限)。所以,文件一开始的权限是666,减去umask值022后,剩下的文件权限就变成了644。

在大多数Linux发行版本中,umask值通常会设置在/etc/profile启动文件中,不过有些是设置在/etc/login.defs文件中(Ubuntu)。可以使用umask命令为默认umask设置指定一个新值。

$ umask 026
$ touch newfile2
$ ls -l newfile2
-rw-r----- 1 rich rich 0 Sep 20 19:46 newfile2

umask值设成026后,默认的文件权限变成了640。umask值同样会作用在创建目录上。

$ mkdir newdir
$ ls -l
drwxr-x--x 2 rich rich 4096 Sep 20 20:11 newdir/

由于目录的默认权限是777,umask作用后生产的目录权限不同于生成的文件权限。umask值026会从777中减去,留下来751作为目录权限设置。

4.改变安全性设置

改变权限:chmod命令用来改变文件和目录的安全性设置。

chmod options mode file

mode参数可以使用八进制模式或符号模式进行安全性设置。八进制模式设置非常至关,直接用期望赋值文件的标准3位八进制权限码即可。

$ chmod 760 newfile
$ ls -l newfile
-rwxrw---- 1 rich rich 0 Sep 20 19:16 newfile

符号模式指定权限的格式: [ugoa...] [+-=] [rwxXstugo...]

第一组字符定义了权限作用的对象:

u代表用户

g代表组

o代表其他

a代表上述所有

第二组字符含义:

+表示想在现有权限的基础上增加权限

-表示想在现有权限的基础上移除权限

=表示想把现有的权限设置为后面的值

第三组符号含义:

代表作用到设置的权限。除了rwx外,还有其他的几项:

X:如果对象是目录或者它已有执行权限,赋予执行权限。

s:运行时重新设置UID或GID。

t:保留文件或目录。

u:将权限设置为跟属主一样。

g:将权限设置为跟属组一样。

o:将权限设置为跟其他用户一样。

$ chmod o+r newfile
$ ls -lF newfile
-rwxrw-r-- 1 rich rich 0 Sep 20 19:16 newfile*

不管其他用户在这一安全级别之前都有什么权限,o+r都给这一级别添加读取权限。

$ chmod u-x newfile
$ ls -lF newfile
-rw-rw-r-- 1 rich rich 0 Sep 20 19:16 newfile

u-x移除了属主已有的执行权限。optionchmod命令提供了另外一些功能。-R选项可以让权限的改变递归地作用到文件和子目录。

改变所属关系

chown命令用来改变文件的属主,chgrp命令用来改变文件的默认属组。

chown options owner[.group] file

可以用登录名或UID来指定文件的新属主。

# chown dan newfile
# ls -l newfile
-rw-rw-r-- 1 dan rich 0 Sep 20 19:16 newfile

chown也支持同时改变文件的属主和属组。

# chown dan.shared newfile
# ls -l newfile
-rw-rw-r-- 1 dan shared 0 Sep 20 19:16 newfile

chgrp命令可以更改文件或目录的默认属组。

$ chgrp shared newfile
$ ls -l newfile
-rw-rw-r-- 1 rich shared 0 Sep 20 19:16 newfile

用户账户必须是这个文件的属主,必须用于更换此文件属组的权限,用户必须是新组的成员。

5.共享文件(看不太懂)

Linux系统上共享文件的方法就是创建组。创建新文件时,Linux会用你默认的UID和GID给文件分配权限。要让其他人也能访问文件,要么改变其他用户所在安全组的访问权限,要么给文件分配一个包含其他用户的新默认属组。

Linux还为每个文件和目录存储了3个额外的信息位:

设置用户ID(SUID):当文件被用户使用时,程序会以文件属主的权限运行。

设置组ID(SGID):对文件来说,程序会以文件属组的权限运行。对于目录来说,目录中创建的新文件会以目录的默认属组作为默认属组。

粘着位:进程结束后文件还驻留(粘着)在内存中。

SGID对文件共享非常重要。启用SGID位后,可以强制一个共享目录下创建的新文件都属于该目录的属组,这个组就成了每个用户的数组。

本章小结
​ 1.Linux用户管理
​ 2.Linux用户组管理
​ 3.Linux文件权限
​ 4.Linux文件权限修改
​ 5.共享文件的设置

参考文献:Linux命令行与shell脚本编程大全(第三版)Richard Blum Christine Bresnahan著 门佳 武海峰译

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

搬砖小张

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

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

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

打赏作者

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

抵扣说明:

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

余额充值