Linux命令行与Shell脚本编程
第七章 Linux文件权限
七,Linux文件权限
·理解Linux的安全性
·理解文件权限
·使用Linux组
7.1,Linux的安全性
用户权限是通过创建用户时分配的用户ID(UID)来跟踪的。
UID是个数值,每个用户都有一个唯一的UID。
7.1.1,用户信息 /etc/passwd文件
文件/etc/passwd来匹配登录名与对应的UID值。该文件包含 用户有关的信息:
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
· 登录用户名
· 用户密码
· 用户账户的UID(数字形式)
· 用户账户的组ID(数字形式)
· 用户账户的文本描述(称为备注字)
· 用户$HOME目录的位置
· 用户的默认shell
root用户账户是Linux系统的管理员,为其固定分配的UID是0。
Linux系统会为 各种功能创建不同的用户账户,并非真正的人类用户。为系统账户,是系统中运行的各种服务进程访问资源使用的特殊账户。
所有运行在后台的服务都需要通过一个系统用户账户登录到Linux系统中。
Linux 为系统账户预留了500以下的UID。有些服务 要用特定的UID才能正常工作。
为普通用户创建账户时,大多数Linux系统会从500开始,将第一个可用UID分配给这个账户。(Ubuntu从1000开始)
7.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日到当时的天数表(=)。
预留给以后使用的字段。
7.1.3,useradd 添加新用户
useradd 向Linux系统添加新用户,创建新用户账户并设置用户的$HOME目录结构
useradd命令使用系统的默认值以及命令行参数来设置用户账户。
查看所使用的Linux发行版的系统默认值,可以使用加入了-D选项的useradd命令。
-D选项显示了在命令行中创建新用户账户时,如果不明确确指明具体值,useradd命令所使用的默认值:
·新用户会被添加到GID为100的公共组。
·新用户的主目录会位于/home/loginname。
·新用户账户密码在过期后不会被禁用。
·新用户账户不设置过期日期。
·新用户账户将bash shell作为默认shell。
·系统会将/etc/skel目录的内容复制到用户的$HOME目录录。
·系统会为该用户账户在mail目录下创建一个用于接收邮件的文件。
# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
useradd命令的默认值使用 /etc/default/useradd 文件设置。进一步的安全设置在/etc/login.defs文件中定义。调整这些文件,改变默认安全行为。
useradd 命令允许管理员创建默认的 $HOME目录配置,将其作为创建新用户$HOME目录的模板。自动在每个新用户的 $HOME 目录里放置默认的系统文件。
在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 目录。可以在/etc/login.defs文件中更改该行为。
可以使用相应的命令行选项 改变创建新用户时 的 默认值或默认行为.
选项 描述 -c comment 给新用户添加备注 -d home_dir 为主目录指定一个名字(如果不想用登录名作为主目录名的话) -e expire_date 用YYYY-MM-DD格式指定账户过期日期 -f inactive_days 指定账户密码过期多少天后禁用该账户;0表示密码一过期就立即禁用,-1表示不使用这个功能 -g initial_group 指定用户登录组的GID或组名 -G group … 指定除登录组之外用户所属的一个或多个附加组 -k 必须和-m一起使用,将/etc/skel目录的内容复制到用户的$HOME目录 -m 创建用户的$HOME目录 -M 不创建用户的$HOME目录,即便默认设置里要求创建 -n 创建一个与用户登录名同名的新组 -r 创建系统账户 -p passwd 为用户账户指定默认密码 -s shell 指定默认的登录shell -u uid 为账户指定一个唯一的UID
使用-D选项来修改系统默认的新用户设置
# useradd -D -s /bin/tsch
# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/tsch
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
选项 描述 -g group 修改默认的组名称或GID -b default_home 修改用户$HOME目录默认创建的位置 -f inactive 修改从密码过期到账户被禁用的默认天数 -e expiration_date 修改新账户的默认过期日期 -s shell 修改默认的登录shell
7.1.4,userdel 删除用户
默认情况下,userdel命令只删除/etc/passwd和/etc/shadow文件中的用户信息,属于该账户的文件会被保留。
userdel -r选项, 会删除用户的$HOME目录以及邮件目录。然而,系统中仍可能存有已删除用户的其他文件。
# userdel -r test
# ls -al /home/test
ls: cannot access /home/test: No such file or directory
大量用户的环境中使用-r选项要小心,用户可能在个人的$HOME目录中存放了其他用户或程序要用到的重要文件
7.1.5, 修改用户
Linux提供了一些工具来修改已有用户账户的信息
工具 描述 usermod 修改用户账户字段,还可以指定主要组(primarygroup)以及辅助组(secondarygroup)的所属关系 passwd 修改已有用户的密码 chpasswd 从文件中读取登录名及密码并更新密码 chage 修改密码的过期日期 chfn 修改用户账户的备注信息 chsh 修改用户账户的默认登录shell
1,usermod
usermod命令是用户账户修改工具中最强大的一个,提供了修改 /etc/passwd 文件中大部分字段的相关选项,只需指定相应的选项即可。
大部分选项与 useradd 命令的选项一样(-c用于修改备注字段,-e用于修改过期日期,-g用于修改默认的登录组)。
额外选项:
·-l:修改用户账户的登录名。
·-L:锁定账户,禁止用户登录。
·-p:修改账户密码。
·-U:解除锁定,恢复用户登录。
·-L:选项尤为实用。该选项可以锁定账户,使用户无法登录,无须删除账户和用户数据。要恢复账户,只需使用-U选项即可。
·-G group user : 将该组加入该用户的属组列表
2,passwd,chpasswd
passwd 命令可以 修改用户密码:
# passwd test
Changing password for user test.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
系统中的任何用户都能修改自己的密码,但只有root用户才有权限修改别人的密码。
-e选项 可以强制用户下次登录时修改密码。可以先给用户设置一个简单的密码,之后强制用户在下次登录时改成更复杂的密码。
chpasswd命令可以 为系统中的大量用户修改密码。
chpasswd命令能从标准输入自动读取一系列以冒号分隔的登录名和密码对,自动对密码加密,然后为用户账户设置密码。也可以用重定向命令将包含username:password对 的文件重定向给该命令
# chpasswd < users.txt
3,chsh,chfn,chage
chsh、chfn和chage用于修改特定的账户信息。
1,chsh命令可以快速修改默认的用户登录shell。使用时必须用shell的全路径名作为参数.
# chsh -s /bin/csh test
Changing shell for test.
Shell changed.
2,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.
# grep test /etc/passwd
test:x:504:504:Ima Test,Director of Technology,(123)555-
1234,(123)555-9876:/home/test:/bin/csh
3,chage命令可用于帮助管理用户账户的有效期。
chage命令的日期值可以用下面两种方式中的任意一种表示。
·YYYY-MM-DD格式的日期
·代表从1970年1月1日起的天数
chage命令 功能是设置账户的过期日期。创建在特定日期自动过期的临时用户,不用删除用户。过期的账户仍然存在,但用户无法用其登录。
选项 描述 -d 设置自上次修改密码后的天数 -E 设置密码过期日期 -I 设置密码过期多少天后锁定账户 -m 设置更改密码的最小间隔天数 -M 设置密码的最大有效天数 -W 设置密码过期前多久开始出现提醒信息
7.2,Linux组
组权限允许多个用户对系统对象共享一组权限.
每个组都有唯一的GID和唯一的组名,在系统中是唯一的。除了GID。
7.2.1,/etc/group文件
/etc/group文件包含系统中每个组的信息
四个字段
·组名
·组密码
·GID
·属于该组的用户列表
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:
组密码允许非组内成员使用密码临时性地成为该组成员.
对于系统账户组,为其分配的GID值低于500,而普通用户组的GID则从500开始分配。
使用 usermod命令 向组中添加用户。在将用户添加到不同的组之前,必须先创建组。
!!!!当一个用户在 /etc/passwd 文件中指定某个组作为主要组时,该用户不会作为该组成员再出现在/etc/group文件中
7.2.2,groupadd 创建新组
groupadd 命令可用于创建新组
# /usr/sbin/groupadd shared
# tail /etc/group
... ...
shared:x:505:
groupadd命令 没有提供向组中添加用户的选项,但可以用usermod命令来解决
# usermod -G shared rich
# usermod -G shared test
# tail /etc/group
... ...
shared:x:505:rich, test
更改了已登录系统的用户所属的组,则该用户必须 注销后重新登录,新的组关系才能生效。
-g选项,则指定的组名会替换掉在/etc/passwd文件中为该用户分配的主要组。-G选项则会将该组加入该用户的属组列表,不会影响主要组。
7.2.3, 修改组
groupmod命令可以修改已有组的GID(使用-g选项)或组名(使用-n选项):
# groupmod -n sharing shared
# tail /etc/group
... ...
sharing:x:505:test,rich
7.3 文件权限
7.3.1, 文件权限符号
$ ls -l
total 68
-rw-rw-r-- 1 rich rich 50 2010-09-13 07:49 file1.gz
drwxrwxr-x 2 rich rich 4096 2010-09-03 15:12 test1
输出结果的 第一个字段 描述文件和目录权限的编码。这个字段的第一个字符表示对象的类型。
-代表文件
d代表目录
l代表链接
c代表字符设备
b代表块设备
p代表具名管道
s代表网络套接字
3组三字符的编码。每一组定义了3种访问权限。
r代表对象是可读的
w代表对象是可写的
x代表对象是可执行的
如果没有某种权限,则在该权限位会出现连字符。这3组权又限分别对应对象的3个安全级别。
对象的属主
对象的属组
系统其他用户
7.3.2,umask 默认文件权限
touch 命令使用分配给当前用户的默认权限创建了新文件。umask命令可以显示和设置默认权限:
$ touch newfile
$ ls -al newfile
-rw-r--r-- 1 rich rich 0 Sep 20 19:16 newfile
第一位代表一项特别的安全特性
后三位代表 对应三个安全级别(属主、属组和其他用户)的权限 rwx 000~111(0~7)
对文件而言,全权限值是666(所有用户都有读取和写入的权限);对目录而言,全权限值则是777(所有用户都有读取、写入和执行权限)。
查看掩码
$ umask
0022
例子中,文件一开始的权限是666,减去umask值022之后,剩下的文件权限就成了644。
umask值通常会被设置在/etc/profile启动文件中,可以使用umask命令指定其他的umask默认值.
使用umask命令指定其他的umask默认值:
$ umask 026
$ touch newfile2
$ ls -l newfile2
-rw-r----- 1 rich rich 0 Sep 20 19:46 newfile2
将umask值设成026后,默认的文件权限变成了640.
umask值同样会作用在新创建的目录上
目录的默认权限是777,因此umask作用后的目录权限不同于文件权限。umask值026会从777中减去,留下来751作为目录权限设置.
7.4,更改安全设置(文件权限…)
修改文件和目录的已有权限、默认属主以及默认属组。
7.4.1, chmod 修改权限
chmod命令可以修改文件和目录的安全设置
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...
-R选项能够以递归方式修改文件和目录的权限。可以使用通配符指定多个文件名,然后用单个命令批量修改权限。
mode 参数 允许使用八进制模式或符号模式来进行安全设置。八进制模式设置非常直观,直接用打算赋予文件的标准3位八进制权限编码即可:
$ chmod 760 newfile
$ ls -l newfile
-rwxrw---- 1 rich rich 0 Sep 20 19:16 newfile
在符号模式下指定权限的格式
chmod [ugoa...][[+-=][rwxXstugo...] FILE
u 用户
g 组
o 其他用户
a 所有
+ 增加权限
- 移除权限
= 设置权限
r/w/x 读/写/执行
X 仅当对象是目录或者已有执行权限时才赋予执行权限。
s 在执行时设置SUID或SGID。
t 设置粘滞位(sticky bit)。
u 设置属主权限。
g 设置属组权限。
o 设置其他用户权限。
$ chmod o+r newfile
$ chmod u-x newfile
7.4.2,chown chgrp改变文件属主
chown 可以修改文件的属主, chgrp 可以修改文件的默认属组。
只有root用户能修改文件的属主。任何用户都可以修改文件的属组,但前提是该用户必须是原属组和新属组的成员。
格式:
chown options owner[.group] file
修改属主
# chown dan newfile
# ls -l newfile
-rw-rw-r-- 1 dan rich 0 Sep 20 19:16 newfile
修改文件的默认属组
# chown .rich newfile
# ls -l newfile
-rw-rw-r-- 1 dan rich 0 Sep 20 19:16 newfile
修改属主和属组
# chown dan.shared newfile
# ls -l newfile
-rw-rw-r-- 1 dan shared 0 Sep 20 19:16 newfile
使用与用户登录名相同的组名,则可以同时修改二者
# chown test. newfile
# ls -l newfile
-rw-rw-r-- 1 test test 0 Sep 20 19:16 newfile
-R选项与通配符相配合可以递归地修改子目录和文件的所属关系。
-h选项可以修改文件的所有符号链接文件的所属关系。
chgrp命令可以方便地修改文件或目录的默认属组:
$ chgrp shared newfile
$ ls -l newfile
-rw-rw-r-- 1 rich shared 0 Sep 20 19:16 newfile
7.5,共享文件
Linux为每个文件和目录存储了3个额外的信息位。
SUID(set user ID):当用户执行该文件时,程序会 以文件属主的权限 运行。
SGID(set group ID):对文件而言,程序会 以文件属组的权限 运行;对目录而言,该目录中创建的新文件会 以目录的属组 作为默认属组。
粘滞位(sticky bit):应用于目录时,只有 文件属主 可以删除或重命名 该目录中的文件。
启用SGID位后,可以强制在共享目录中创建的新文件都属于该目录的属组,这个组也就成了每个用户的属组。
通过 chmod命令设置SGID,将其添加到标准3位八进制值之前(组成4位八进制值),或者在符号模式下用符号s。
SUID,SGID,粘滞位 000~111 (0~7)
使目录中的所有新文件都沿用目录的属组,只需设置该目录的SGID位
$ mkdir testdir
$ ls -l
drwxrwxr-x 2 rich rich 4096 Sep 20 23:12 testdir/
$ chgrp shared testdir
$ chmod g+s testdir
$ ls -l
drwxrwsr-x 2 rich shared 4096 Sep 20 23:12 testdir/
$ umask 002
$ cd testdir
$ touch testfile
$ ls -l
total 0
-rw-rw-r-- 1 rich shared 0 Sep 20 23:13 testfile
7.6 访问控制列表 (access control list,ACL)
Linux的基本权限方法有一个缺点:局限性。
只能将文件或目录的权限分配给单个组或用户账户。
!!!对于文件和目录,不同的组需要不同的权限,基本权限方法解决不了。
ACL允许指定包含 多个用户或组 的列表以及为其分配的权限。和基本安全方法一样,ACL权限使用相同的 读取、写入和执行权限位。
使用 setfacl 命令和 getfacl 命令在Linux中实现ACL特性。
getfacl命令能够查看分配给文件或目录的ACL:
$ touch test
$ ls -l
total 0
-rw-r----- 1 rich rich 0 Apr 19 17:33 test
$ getfacl test
# file: test 文件
# owner: rich 属主
# group: rich 属组
user::rw-
group::r--
other::---
setfacl命令可以为用户或组分配权限:
setfacl [options] rule filenames
-m选项 修改分配给文件或目录的权限,
-x选项 删除特定权限。
可以使用 3种格式定义规则:
u[ser]:uid:perms
g[roup]:gid:perms
o[ther]::perms
-m 为用户分配权限,可以使用user格式;要为组分配权限,可以使用group格式;要为其他用户分配权限,可以使用other格式。对于uid或gid,可以使用数字值或名称:
$ setfacl -m g:sales:rw test == 为test文件添加了sales组的读写权限
$ ls -l
total 0
-rw-rw----+ 1 rich rich 0 Apr 19 17:33 test
$ getfacl test
# file: test
# owner: rich
# group: rich
user::rw-
group::r--
group:sales:rw-
mask::rw-
other::---
权限列的末尾多了一个加号(+),指明该文件 应用了ACL
-x 删除权限:
$ setfacl -x g:sales test
$ getfacl test
# file: test
# owner: rich
# group: rich
user::rw-
group::r--
mask::r--
other::---
Linux允许对目录设置默认ACL,在该目录中创建的文件会自动继承。这个特性称为ACL继承。
设置目录的默认ACL,在规则定义前加上 d:
$ sudo setfacl -m d:g:sales:rw /sales