Linux命令行与Shell脚本编程
第七章 Linux文件权限
文章目录
Linux命令行与Shell脚本编程 七,Linux文件权限 7.1,Linux的安全性 7.1.1,用户信息 /etc/passwd文件 7.1.2,用户密码 /etc/shadow文件 7.1.3,useradd 添加新用户 7.1.4,userdel 删除用户 7.1.5, 修改用户 1,usermod 2,passwd,chpasswd 3,chsh,chfn,chage
7.2,Linux组 7.2.1,/etc/group文件 7.2.2,groupadd 创建新组 7.2.3, 修改组
7.3 文件权限 7.3.1, 文件权限符号 7.3.2,umask 默认文件权限
7.4,更改安全设置(文件权限...) 7.4.1, chmod 修改权限 7.4.2,chown chgrp改变文件属主
7.5,共享文件 7.6 访问控制列表 (access control list,ACL)
七,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