Linux用户、组和权限管理详解

用户管理简要说明:

    1.越是对服务器安全性要求高的服务器,越需要建立合理的用户权限等级制度和服务器操作规范。

    2.在Linux中主要是通过用户配置文件来查看和修改用户信息。

初始组和附加组

    初始组:就是指用户一登录就立刻拥有这个用户组的相关权限,每个用户的初始组只能有一个,一般就是和这个用户的用户名相同的组名作为这个用户的初始组。

    附加组:指用户可以加入多个其他的用户组,并拥有这些组的权限,附加组可以有多个。

在Linux系统上,用户管理是基于用户名和密码的方式进行资源的分配,Linux上的用户Username/UID分为以下类别

    管理员:root,0

    普通用户:1-65535

普通用户又分为:系统用户和登录用户两种:

    系统用户:1-499(centos6系统),1-199(centos7系统)对守护进程获取资源进行权限分配;

    登录用户:500+(centos6系统),1000+(centos7系统)通过交互式方式登录

Linux组:Groupname/GID

    管理员组:root,0

    普通组:1-65535

普通组又分为:又分为系统组和非系统组,我们通常把非系统组叫做普通组。

    系统用户:1-499(centos6系统),1-199(centos7系统)

    登录用户:500+(centos6系统),1000+(centos7系统)通过交互式方式登录

    对于一个用户而言可以有多个不的组,分别称之为用户的基本组(主组)和附加组;基本组组名和用户名相同,且仅包含一个用户,也叫私有组。基本组以外的组属于用户的附加组(或者额外组)

接下来介绍下Linux用户和组的主要配置文件:

    /etc/passwd:用户及其属性信息(名称、UID、基本组ID等)

    /etc/group/:组及其属性信息

    /etc/shadow/:用户密码及其相关属性

    /etc/gshadow/:组密码及其相关属性

详细介绍各个配置文件的内容:

/etc/passwd/

    通过which passwd 来查看其对应的配置文件信息或者man 5 passwd 也可查看到该配置文件的帮助信息

    passwd文件格式

    name:password:UID:GID:GECOS:directory:shell,对应的含义是

    用户名:密码:UID:GID:用户的详细信息说明:用户的家目录:用户的默认shell

/etc/shadow/

    shadow文件格式说明:用户名:加了密的密码:最近一次更改密码的日期;密码的最小使用期限;密码的最大使用期限密码的警告时间段;密码禁用期:账户的过期日期:保留字段

/etc/group

    group文件格式说明:群组名称:群组密码(通常不需要设定,密码是被记录在/etc/gshadow):GID :组中附加用户

/etc/gshadow

    gshadow文件格式说明:群组名称:群组密码:组管理员列表(管理员的列表,更改组密码和成员):以当前组为附加组的用户列表(分隔符为逗号)

用户和组相关的管理命令
    命令名称:useradd
    命令所在路径:/usr/sbin/useradd
    执行权限:root
    语法:useradd [用户名]
    功能描述:添加新用户
    useradd [options] LOGIN
    -u UID: [UID_MIN, UID_MAX]定义在/etc/login.defs
    -o 配合-u 选项,不检查UID的唯一性
    -g GID:指明用户所属基本组,可为组名,也可以GID
    -c "COMMENT":用户的注释信息
    -d HOME_DIR: 以指定的路径(不存在)为家目录
    -s SHELL: 指明用户的默认shell程序,可用列表在/etc/shells文件中
    -G GROUP1[,GROUP2,...]:为用户指明附加组,组必须事先存在
    -N 不创建私用组做主组,使用users组做主组
    -r 创建系统用户 CentOS 6: ID<500, CentOS 7: ID<1000
    -D 表示修改用户的默认选项;(修改的是/etc/default/useradd中的选项)
    -s 修改用户的默认shell信息
[root@wzc ~]# useradd libai
[root@wzc ~]# grep 'libai' /etc/passwd
libai:x:1005:1008::/home/libai:/bin/bash
[root@wzc ~]# grep 'libai' /etc/group
libai:x:1008:
[root@wzc ~]# grep 'libai' /etc/shadow
libai:!!:17016:0:99999:7:::
[root@wzc ~]# grep 'libai' /etc/gshadow
libai:!::
[root@wzc ~]# ll -d /home/libai/
drwx------. 3 libai libai 74 Aug  3 17:35 /home/libai/
[root@wzc ~]# ll /var/spool/mail/libai 
-rw-rw----. 1 libai mail 0 Aug  3 17:35 /var/spool/mail/libai
#当创建好一个用户后,会在这些目录下自动生成用户的基本信息
[root@wzc ~]# groupadd distro
[root@wzc ~]# groupadd linux
[root@wzc ~]# useradd wu -G distro,linux -s /bin/bash -c "wu zhong cheng jml"
[root@wzc ~]# tail -n 1 /etc/passwd
wu:x:1004:1007:wu zhong cheng jml:/home/wu:/bin/bash
#使用大G选项,组必须要事先创建好

[root@wzc ~]# getent group distro
distro:x:1005:wu
[root@wzc ~]# getent group linux
linux:x:1006:wu
#查看‘wu’用户的附加组

创建组
    groupadd [OPTION]... group_name
    -g GID: 指明GID号; [GID_MIN, GID_MAX]
    -r: 创建系统组;
    CentOS 6: ID<500
    CentOS 7: ID<1000
[root@wzc ~]# groupadd wzcfzd
[root@wzc ~]# tail -n 1 /etc/group
wzcfzd:x:1009:
#增加一个wzcfzd组
[root@wzc ~]# groupadd -g 1028 wzcfzd2
[root@wzc ~]# tail -n 1 /etc/group
wzcfzd2:x:1028:
#‘-g’选项可以定义自己的组id
修改和删除组
    组属性修改: groupmod
    groupmod [OPTION]... group
    -n group_name: 新名字
    -g GID: 新的GID;
    组删除: groupdel
groupdel GROUP
[root@wzc ~]# groupmod -g 1029 wzcfzd2
[root@wzc ~]# tail -n 1 /etc/group
wzcfzd2:x:1029:
#更改组id
[root@wzc ~]# groupdel wzcfzd2
[root@wzc ~]# grep 'wzcfzd2' /etc/group
#删除组
更改组密码
    组密码: gpasswd
    gpasswd [OPTION] GROUP
    -a user: 将user添加至指定组中;
    -d user: 从指定组中移除用户user
    -A user1,user2,...: 设置有管理权限的用户列表
    newgrp命令:临时切换基本组;
    如果用户本不属于此组,则需要组密码
更改和查看组成员
    groupmems [options] [action]options:
    -g, --group groupname 更改为指定组 (只有root)
    Actions:
    -a, --add username 指定用户加入组
    -d, --delete username 从组中删除用户
    -p, --purge 从组中清除所有成员
    -l, --list 显示组成员列表
   groups [OPTION].[USERNAME]... 查看用户所属组列表删除用户
    userdel [OPTION]... login
    -r: 删除用户家目录;
[root@wzc ~]# ls /home/
libai  user2  wangcai  wu  wzc
[root@wzc ~]# userdel -r user2 
[root@wzc ~]# ls /home/
libai  wangcai  wu  wzc
#‘-r'选项是连带家目录账户一起删除,所有创建用户时自动生成的基本信息一起删除

设置密码
     passwd [OPTIONS] UserName: 修改指定用户的密码,仅root用户权限
 passwd: 修改自己的密码;
 常用选项:
    -l:锁定指定用户
    -u:解锁指定用户
    -e:强制用户下次登录修改密码
    -n mindays: 指定最短使用期限
    -x maxdays:最大使用期限
    -w warndays:提前多少天开始警告
    -i inactivedays:非活动期限;
    --stdin:从标准输入接收用户密码;
    echo "PASSWORD" | passwd --stdin USERNAME
[root@wzc ~]# passwd -S libai
libai LK 2016-08-03 0 99999 7 -1 (Password locked.)
#查看密码状态

[root@wzc ~]# passwd -l wzc
Locking password for user wzc.
passwd: Success
[root@wzc ~]# passwd -u wzc
Unlocking password for user wzc.
passwd: Success
#锁定用户与解锁用户

[root@wzc ~]# echo "123" |passwd --stdin wzc
Changing password for user wzc.
passwd: all authentication tokens updated successfully.
#修改用户密码
修改用户密码策略
    chage [OPTION]... LOGIN
    -d LAST_DAY
    -E, --expiredate EXPIRE_DATE
    -I, --inactive INACTIVE
    -m, --mindays MIN_DAYS
    -M, --maxdays MAX_DAYS
    -W, --warndays WARN_DAYS
    –l,显示密码策略
 下一次登录强制重设密码
    chage -d 0 tom
 chage -m 0 –M 42 –W 14 –I 7 tom
 chage -E 2016-09-10 tom
[root@wzc ~]# chage -d 0 wangcai
[root@wzc ~]# tail -n 3 /etc/shadow
wangcai:$6$384ACS81$gUWa2VZ0OIuSVvML8YXy2dcDPyC3uU1TIw0I3nOHNFhm2eQP/kQDPUoULBCqCK7.9bkp9frPyaUJ10ObcKfy4.:0:0
:99999:7:::
wu:!!:17016:0:99999:7:::
libai:!!:17016:0:99999:7:::
#把密码修改日期归0了,(/etc/shadow第三字段),这样用户一登录就要修改密码了

用户属性修改
    usermod [OPTION] login
    -u UID: 新UID
    -g GID: 新基本组
    -G GROUP1[,GROUP2,...[,GROUPN]]]:新附加组,原来的附加组将会被覆盖;若保留原有,则要同时使用-a选项,
    表示append;
    -s SHELL:新的默认SHELL;
    -c 'COMMENT':新的注释信息;
    -d HOME: 新家目录不会自动创建,原家目录中的文件不会同时移动至新的家目录;若要创建新家目录并移动原家数据,
    同时使用-m选项
    -l login_name: 新的名字;
    -L: lock指定用户,在/etc/shadow 密码栏的增加 !
    -U: unlock指定用户,将 /etc/shadow 密码栏的 ! 拿掉
    -e YYYY-MM-DD: 指明用户账号过期日期;
    -f INACTIVE: 设定非活动期限;
[root@wzc ~]# usermod -c "wzc linuxer" libai
[root@wzc ~]# grep 'libai' /etc/passwd
libai:x:1005:1008:wzc linuxer:/home/libai:/bin/bash
#修改用户的注释说明

[root@wzc ~]# usermod -aG wzcfzd libai
[root@wzc ~]# grep 'libai' /etc/group
libai:x:1008:
wzcfzd:x:1009:libai
#把用户‘libai’加入到‘wzcfzd’组

[root@wzc ~]# usermod -L libai
[root@wzc ~]# grep 'libai' /etc/shadow
libai:!$6$19uK6NM4$OzMVGOIjEJ49SZrpE8eZCIaGcBWbnxK.eLnBIG5BHcZFwg0ekvnk9OLWqH.u.x4E1R2oGBXHn9aLZ8L1nvr.e0:17016
:0:99999:7:::
[root@wzc ~]# usermod -U libai
[root@wzc ~]# grep 'libai' /etc/shadow
libai:$6$19uK6NM4$OzMVGOIjEJ49SZrpE8eZCIaGcBWbnxK.eLnBIG5BHcZFwg0ekvnk9OLWqH.u.x4E1R2oGBXHn9aLZ8L1nvr.e0:17016:
0:99999:7:::
#锁定用户与解锁用户
用户相关的其他用户其他命令
	chfn 指定个人信息
	chsh 指定shell
	inger
[root@wzc ~]# chfn libai
Changing finger information for libai.
Name [wzc linuxer]: www
Office []: wwwoffice
Office Phone []: 123456789
Home Phone []: 123456789

Finger information changed.
[root@wzc ~]# grep 'libai' /etc/passwd
libai:x:1005:1008:www,wwwoffice,123456789,123456789:/home/libai:/bin/bash
#‘chfn’ 命令可以修改用户的findger信息,比如name, office, office phone 以及 Home phone.修改完后,
就会在/etc/passwd文件中的libai的那一行第五个字段中看到相关信息了,默认是空的
查看看用户相关ID信息
     id [OPTION]... [USER]
    -u: UID
    -g: GID
    -G: Groups
    -n: Name
[root@wzc ~]# id -u libai
1005
[root@wzc ~]# id -g libai
1008
[root@wzc ~]# id -un libai
libai
[root@wzc ~]# id -gn libai
libai
[root@wzc ~]# grep 'libai' /etc/passwd
libai:x:1005:1008:www,wwwoffice,123456789,123456789:/home/libai:/bin/bash
[root@wzc ~]# grep 'libai' /etc/group
libai:x:1008:
wzcfzd:x:1009:libai
#'-g'选项和'-u'选项可以和'-n'选项连用,分别是查看组名和用户名
切换用户或其他用户身份执行命令
    su [options...] [-] [user [args...]]
 切换用户的方式:
        su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录
        su - UserName:登录式切换,会读取目标用户的配置文件,切换至家目录,完全切换root su至其他用户
        无须密码;非root用户切换时需要密码
 换个身份执行命令:
        su [-] UserName -c 'COMMAND'
        选项: -l --login
               -c 仅执行一次命令,而不用切换用户身份
[root@wzc ~]# su - wzc
Last login: Tue Aug  2 14:49:18 CST 2016 on pts/1
[wzc@wzc ~]$ pwd
/home/wzc
[wzc@wzc ~]$ su -
Password: 
Last login: Wed Aug  3 13:32:27 CST 2016 from 10.1.250.38 on pts/1
#管理员切换到普通用户不用输入密码;反之,要输入密码。选项‘-’代表连用户的环境变量一起切换


[root@wzc ~]# su - libai
[libai@wzc ~]$ pwd
/home/libai
[libai@wzc ~]$ su - root -c "useradd user1"
Password: 
[libai@wzc ~]$ ls /home/
libai  user1  wangcai  wu  wzc
#'-c'选项不切换成root,但执行useradd命令添加用户
文件权限
    文件属性
    文件属性操作
    chown 设置文件的所有者
    chgrp 设置文件的属组信息
修改文件的属主和属组
    修改文件的属主: chown
    chown [OPTION]... [OWNER][:[GROUP]] FILE...
    用法:
    OWNER
    OWNER:GROUP
         :GROUP
    命令中的冒号可用.替换;
    -R: 递归
    chown [OPTION]... --reference=RFILE FILE...
 修改文件的属组: chgrp
    chgrp [OPTION]... GROUP FILE...
    chgrp [OPTION]... --reference=RFILE FILE...
    -R 递归
[root@wzc date]# mkdir yangmi
[root@wzc date]# useradd fangbingbing
[root@wzc date]# touch yangmi/xiaoyangmi
[root@wzc date]# chown fangbingbing yangmi/
[root@wzc date]# ls -ld yangmi/
drwxr-xr-x. 2 fangbingbing root 23 Aug  3 20:10 yangmi/
[root@wzc date]# ls -l yangmi/
total 0
-rw-r--r--. 1 root root 0 Aug  3 20:10 xiaoyangmi
[root@wzc date]# groupadd fangbingbing
groupadd: group 'fangbingbing' already exists
[root@wzc date]# groupadd libingbing
[root@wzc date]# chown -R fangbingbing:libingbing yangmi/
[root@wzc date]# ls -l yangmi/
total 0
-rw-r--r--. 1 fangbingbing libingbing 0 Aug  3 20:10 xiaoyangmi
[root@wzc date]# ls -ld yangmi/
drwxr-xr-x. 2 fangbingbing libingbing 23 Aug  3 20:10 yangmi/
[root@wzc date]#
#‘-R’选项把目录及子目录下文件所属主都修改成fangbingbing,属组修改成libingbing
chgrp
    命令名称:chgrp
    命令原意:change group ownership
    命令所在路径:/usr/bin/chgrp
    语法:chgrp [所属组] [文件或目录]
    功能描述:改变文件或目录所属组
[root@wzc date]# groupadd testgroup
[root@wzc date]# touch test.file
[root@wzc date]# ls -l test.file 
-rw-r--r--. 1 root root 0 Aug  3 20:26 test.file
[root@wzc date]# chgrp testgroup test.file 
[root@wzc date]# ls -l test.file 
-rw-r--r--. 1 root testgroup 0 Aug  3 20:26 test.file
#chgrp不仅能更改文件,还能更改目录,请看下面例子

[root@wzc date]# pwd
/date
[root@wzc date]# ls -l dirb/
total 0
drwxr-xr-x. 2 root root 6 Aug  3 20:30 dirc
-rw-r--r--. 1 root root 0 Aug  3 20:33 test.txt
[root@wzc date]# ls -ld dirb/
drwxr-xr-x. 3 root root 32 Aug  3 20:33 dirb/
[root@wzc date]# chgrp testgroup dirb/
[root@wzc date]# ls -ld dirb/
drwxr-xr-x. 3 root testgroup 32 Aug  3 20:33 dirb/
[root@wzc date]# ls -l dirb/
total 0
drwxr-xr-x. 2 root root 6 Aug  3 20:30 dirc
-rw-r--r--. 1 root root 0 Aug  3 20:33 test.txt
[root@wzc date]# chgrp -R testgroup dirb/
[root@wzc date]# ll -ld dirb/
drwxr-xr-x. 3 root testgroup 32 Aug  3 20:33 dirb/
[root@wzc date]# ls -l dirb/
total 0
drwxr-xr-x. 2 root testgroup 6 Aug  3 20:30 dirc
-rw-r--r--. 1 root testgroup 0 Aug  3 20:33 test.txt
#‘-R’选项不仅能更改目录本身所属组,还能更改目录下的子目录或文件的所属组
文件权限
    文件的权限主要针对三类对象进行定义:
        owner: 属主, u
        group: 属组, g
        other: 其他, o
        all:代表所有人
 每个文件针对每类访问者都定义了三种权限:
        r: Readable
        w: Writable
        x: eXcutable
    对于文件文件来说:
        r: 可使用文件查看类工具获取其内容
        w: 可修改其内容
        x: 可以把此文件提请内核启动为一个进程
 对于目录来说:
        r: 可以使用ls查看此目录中文件列表
        w: 可在此目录中创建文件,也可删除此目录中的文件
        x: 可以使用ls -l查看此目录中文件列表,可以cd进入此目录:
        X:只给目录x权限,不给文件x权限
权限表示方法:
    权限、二进制、八进制表示对应的表示方法如下:
        --- 000 0
        --x 001 1
        -w- 010 2
        -wx 011 3
        r-- 100 4
        r-x 101 5
        rw- 110 6
        rwx 111 7
    例如:
        640: rw-r-----
        755:rwxr-xr-x
修改文件权限
    命令名称:chmod
    命令原意:chmod file mode bit
    命令所在路径:/usr/bin/chmod
    执行权限:所有用户
    功能描述:改变文件或目录权限
    chmod [OPTION]... OCTAL-MODE FILE...
        -R: 递归修改权限
    chmod [OPTION]... MODE[,MODE]... FILE...
        MODE:
修改一类用户的所有权限:
    u= g= o= ug= a= u=,g=
修改一类用户某位或某些位权限
    u+ u- g+ g- o+ o- a+ a- + -
    chmod [OPTION]... --reference=RFILE FILE...
    参考RFILE文件的权限,将FILE的修改为同RFILE;
补充:在Linux系统中,默认一个目录权限是755,默认文件权限是644,这是因为umask值的设定,后面会介绍umask。
[root@wzc date]# ls -ld dirb/
drwxr-xr-x. 3 root testgroup 32 Aug  3 20:33 dirb/ #目录权限默认755
[root@wzc date]# ls -l dirb/
total 0
drwxr-xr-x. 2 root testgroup 6 Aug  3 20:30 dirc
-rw-r--r--. 1 root testgroup 0 Aug  3 20:33 test.txt  #文件默认权限644
[root@wzc date]# chmod 750 dirb/
[root@wzc date]# ls -ld dirb/
drwxr-x---. 3 root testgroup 32 Aug  3 20:33 dirb/
[root@wzc date]# ls -l dirb/test.txt 
-rw-r--r--. 1 root testgroup 0 Aug  3 20:33 dirb/test.txt
[root@wzc date]# chmod -R 700 dirb/
[root@wzc date]# ls -ld dirb/
drwx------. 3 root testgroup 32 Aug  3 20:33 dirb/
[root@wzc date]# ls -l dirb/test.txt 
-rwx------. 1 root testgroup 0 Aug  3 20:33 dirb/test.txt
#chmod命令也支持‘-R’选项,逐级更改,连同目录下的子目录或文件权限一起改为700


[root@wzc date]# chmod u=rwx,og=rx dirb/test.txt 
[root@wzc date]# ll -l dirb/test.txt 
-rwxr-xr-x. 1 root testgroup 0 Aug  3 20:33 dirb/test.txt
#可以使用u、g、o、a、增加某个权限,当然也就可以减少某个权限,请看下面例子


[root@wzc date]# chmod u-x dirb/test.txt 
[root@wzc date]# ls -l dirb/
total 0
drwx------. 2 root testgroup 6 Aug  3 20:30 dirc
-rw-r-xr-x. 1 root testgroup 0 Aug  3 20:33 test.txt
[root@wzc date]# chmod a-x dirb/test.txt 
[root@wzc date]# ls -l dirb/
total 0
drwx------. 2 root testgroup 6 Aug  3 20:30 dirc
-rw-r--r--. 1 root testgroup 0 Aug  3 20:33 test.txt
[root@wzc date]# chmod u+x dirb/test.txt 
[root@wzc date]# ls -l dirb/test.txt 
-rwxr--r--. 1 root testgroup 0 Aug  3 20:33 dirb/test.txt
#这里的‘a’代表所有人,加某个权限,u、g、o都加上某个权限;反之,都减去某个权限或者等于某个权限

补充:

文件目录的权限总结

       代表字符            权限        对文件的含义        对目录的含义
           r          读权限      可以查看文件内容     可以列出目录中的内容
           w          写权限      可以修改文件内容 可以在目录中创建、删除文件
           x          执行权限        可以执行文件         可以进入目录
umask
新建文件和默认的目录权限
    命令名称:umask
    命令原意:the user file-creation umask
    命令所在路径:shell内置命令
    执行权限:所有用户
    功能描述:显示、设置文件的缺省权限
    umask值 可以用来保留在创建文件权限
    新建FILE权限: 666-umask
    如果所得结果某位存在执行(奇数)权限,则将其权限+1
    新建DIR权限: 777-umask
    非特权用户umask是 002
    root的umask 是 022
    umask: 查看
    umask #: 设定
    umask 002
    umask –S 模式方式显示
    umask –p 输出可被调用
    全局设置: /etc/bashrc 用户设置: ~/.bashrc
[root@wzc date]# umask 
0022
#系统默认umask值是是022,umask值是可以修改的
unmask预设是0022,其代表什么含义?先看一下下面的规则:
    用户建立为普通文件,则预设 ‘没有可执行权限’, 只有’rw’两个权限。最大为666 (‘-rw-rw-rw-‘)
    若用户建立为目录,则预设所有权限均开放,即777 (‘drwxrwxrwx’)
umask数值代表的含义为,上边两条规则中的默认值(文件为666,目录为777)需要减掉的权限。所以目录的权限为
'rwxrwxrwx' - '----w--w-' = 'rwxr-xr-x',普通文件的权限为 'rw-rw-rw-' - '----w--w-' = 'rw-r--r--'. 
 umask的值是可以自定义的,比如设定umask 为 002,你再创建目录或者文件时,默认权限分别为 'rwxrwxrwx' - '
 -------w-' = 'rwxrwxr-x' 和 'rw-rw-rw-' - '-------w-' = 'rw-rw-r--'
[root@wzc date]# umask 002
[root@wzc date]# mkdir gyy
[root@wzc date]# ls -ld gyy/
drwxrwxr-x. 2 root root 6 Aug  3 21:26 gyy/
[root@wzc date]# touch fengjie
[root@wzc date]# ls -l fengjie 
-rw-rw-r--. 1 root root 0 Aug  3 21:26 fengjie
#umask值改了,因此创建目录和文件的权限都不和系统预设一样,怎么得到这个权限值这里我就不再细说了,
现在把umask值改回来,这里需要注意的是,umask值只要不写入配置文件的话只是临时生效,登出当前终端
在进入umask值就会变回系统预设的022
[root@wzc date]# umask 022
[root@wzc date]# touch zly
[root@wzc date]# ls -l zly 
-rw-r--r--. 1 root root 0 Aug  3 21:30 zly
#root的umask为022,而一般使用者为002,因此可写的权限非常重要,因此会预设去掉写权限
[root@wzc date]# umask -S
u=rwx,g=rx,o=rx
#以rwx形式显示新建文件缺省权限
Linux文件系统上的特殊权限
在Linux系统上有三个特殊权限:SUID、SGID、Sticky
1.Linux权限模型是由mode和owner组成
mode有:r,w,x
owner有:user,group,other
2.安全上下文
    前提:进程有属主和属组;文件有属主和属组
    (1) 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
    (2) 启动为进程之后,其进程的属主为发起者;进程的属组为发起者所属的组
    (3) 进程访问文件时的权限,取决于进程的发起者
    (a) 进程的发起者,同文件的属主:则应用文件属主权限
    (b) 进程的发起者,属于文件属组;则应用文件属组权限
    (c) 应用文件“其它”权限
可执行文件上SUID权限:Set UID
    SetUID功能:1.只有可以执行的二进制程序才能设定SUID权限
                2.命令执行者对改程序具有x(执行)权限
                3.命令执行者在执行该程序时获得改程序文件属主的身份
                4.SetUID权限只在改程序执行过程中有效
                5.passwd命令拥有SetUID权限所以普通用户可以修改自己的密码
[root@wzc date]# which passwd 
/usr/bin/passwd
[root@wzc date]# ll /usr/bin/passwd 
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd
    前提:此类文件有可执行权限的命令
    任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
    启动为进程之后,其进程的属主为原程序文件的属主
    SUID只对二进制可执行程序有效
    SUID设置在目录上无意义
权限设定:
    chmod u+s FILE...
    chmod u-s FILE...
执行文件上SGID权限:Set GID
    默认情况下,用户创建文件时,其属组为此用户所属的主组
    一旦某目录被设定了SGID,则对此目录有写权限的用户在此
    目录中创建的文件所属的组为此目录的属组
    通常用于创建一个协作目录
权限设定:
    chmod g+s DIR...
    chmod g-s DIR...
Sticky:粘着位
    对于一个多人可写的目录,如果设置了sticky,则每个用户仅能删除自己的文件
    具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
    在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
    sticky 设置在文件上无意义
权限设定:
    chmod o+t DIR...
    chmod o-t DIR...
例如:
    ls -ld /tmp
    drwxrwxrwt 12 root root 4096 Nov 2 15:44 /tmp
特殊权限数字法
    SUID SGID STICKY
    000 0
    001 1
    010 2
    011 3
    100 4
    101 5
    110 6
    111 7
 chmod 4777 /tmp/a.txt
几个权限位映射
    SUID: user,占据属主的执行权限位
    s: 属主拥有x权限
    S:属主没有x权限
SGID: group,占据属组的执行权限位
    s: group拥有x权限
    S: group没有x权限
Sticky: other,占据other的执行权限位
    t: other拥有x权限
    T:other没有x权限
设定文件特殊属性
    chattr
        语法:chattr [+-=] [选项] 文件或目录名
        '+-=' 分别是增加、删除、等于
        选项:
         i:如果对文件设置i属性,不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置i属性,
         那么只能修改目录下文件的数据,但不允许建立和删除文件。
         a:如果对文件设置a属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置a属
         性,那么只允许在目录中建立和修改文件,但是不允许删。
         A:增加该属性后,文件或目录的atime将不可修改
         S:增加该属性后,会将数据同步写入磁盘中
         c:自动压缩该文件,读取时会自动解压
[root@wzc date]# chattr +i dirb
[root@wzc date]# touch dirb/test
touch: cannot touch ‘dirb/test’: Permission denied
[root@wzc date]# chattr -i dirb
[root@wzc date]# touch dirb/test
[root@wzc date]# chattr +i dirb
[root@wzc date]# rm -rf dirb/test
rm: cannot remove ‘dirb/test’: Permission denied
#丢'dirb'目录增加‘i'权限后,即使是root账户也不能在也不在’dirb'进行删除和创建文件
[root@wzc date]# chattr -i dirb
[root@wzc date]# touch dirb/test1
[root@wzc date]# ls -l dirb
total 0
drwx------. 2 root testgroup 6 Aug  3 20:30 dirc
-rw-r--r--. 1 root root      0 Aug  3 22:02 test
-rw-r--r--. 1 root root      0 Aug  3 22:07 test1
-rwxr--r--. 1 root testgroup 0 Aug  3 20:33 test.txt
[root@wzc date]# chattr +a dirb
[root@wzc date]# rm -rf dirb/test1
rm: cannot remove ‘dirb/test1’: Operation not permitted
[root@wzc date]# touch dirb/test2
[root@wzc date]# ls -l dirb/
total 0
drwx------. 2 root testgroup 6 Aug  3 20:30 dirc
-rw-r--r--. 1 root root      0 Aug  3 22:02 test
-rw-r--r--. 1 root root      0 Aug  3 22:07 test1
-rw-r--r--. 1 root root      0 Aug  3 22:09 test2
-rwxr--r--. 1 root testgroup 0 Aug  3 20:33 test.txt
#'dirb'目录增加'a'权限后,只能在里面创建文件,而不能删除文件,文件同意适用这些权限
[root@wzc date]# chattr +a dirb/test
[root@wzc date]# echo 111 > dirb/test
-bash: dirb/test: Operation not permitted
[root@wzc date]# echo 111 >> dirb/test
[root@wzc date]# cat dirb/test
111
[root@wzc date]# chattr +i dirb/test1
[root@wzc date]# echo 111 > dirb/test1
-bash: dirb/test1: Permission denied
[root@wzc date]# echo 111 >> dirb/test1
-bash: dirb/test1: Permission denied
[root@wzc date]# rm -rf dirb/test1
rm: cannot remove ‘dirb/test1’: Operation not permitted

查看文件或目录特殊权限
    lsattr
    语法:lsattr [选项] [文件或目录]
    选项:
     -a:显示所有文件或目录,包括隐藏文件
     -R:连同子目录下的数据一同列出
     -d:只列出目录本身的属性
[root@wzc date]# lsattr dirb/
---------------- dirb/dirc
---------------- dirb/test.txt
-----a---------- dirb/test
----i----------- dirb/test1
---------------- dirb/test2
[root@wzc date]# lsattr -aR dirb/
-----a---------- dirb/.
---------------- dirb/..
---------------- dirb/dirc
dirb/dirc:
---------------- dirb/dirc/.
-----a---------- dirb/dirc/..
---------------- dirb/test.txt
-----a---------- dirb/test
----i----------- dirb/test1
---------------- dirb/test2
[root@wzc date]# lsattr -d dirb/
-----a---------- dirb/
访问控制列表
    ACL: Access Control List,实现灵活的权限管理
    除了文件的所有者,所属组和其它人,可以对更多的用户设置权限
    CentOS7.0默认创建的xfs和ext4文件系统有ACL功能。
    CentOS7.X之前版本,默认手工创建的ext4文件系统无ACL功能。需手动增加:
    tune2fs –o acl /dev/sdb1
    mount –o acl /dev/sdb1 /mnt
    ACL生效顺序:所有者,自定义用户,自定义组,其他人

为多用户或者组的文件和目录赋予访问权限rwx
    1.mount -o acl /directory
    2.getfacl file |directory
    3.setfacl -m u:wang:rwx file|directory
    4.setfacl -Rm g:sales:rwX directory
    5.setfacl -M file.acl file|directory
    6.setfacl -m g:salesgroup:rw file| directory
    7.setfacl -m d:u:wang:rx directory
    8.setfacl -x u:wang file |directory
    9.setfacl -X file.acl directory
    ACL文件上的group权限是mask 值(自定义用户,自定义组,拥有组的最大权限) ,而非传统的组权限getfacl 
    可看到特殊权限:flags
    默认ACL权限给了x,文件也不会继承x权限。
    base ACL 不能删除
    setfacl -k dir 删除默认ACL权限
    setfacl -b file1清除所有ACL权限
    getfacl file1 | setfacl --set-file=- file2 复制file1的acl权限给file2
查看ACL命令
    getfacle 文件名 
#查看acl权限
设定ACL权限命令
    setfacl 选项 文件名
选项:
   -m 设定acl权限
   -x  删除指定的acl权限
   -b  删除所有acl权限
   -d  设定默认acl权限
   -k  删除默认acl权限
   -R  递归设定acl权限
[root@wzc date]# mkdir lzl
[root@wzc date]# useradd xlzl
[root@wzc date]# useradd dlzl
[root@wzc date]# groupadd stgroup
[root@wzc date]# gpasswd -a xlzl stgroup
Adding user xlzl to group stgroup
[root@wzc date]# gpasswd -a dlzl stgroup
Adding user dlzl to group stgrou
[root@wzc date]# tail -n 1 /etc/group
stgroup:x:1019:xlzl,dlzl
[root@wzc date]# chown root:stgroup lzl/
[root@wzc date]# chmod 770 lzl/
[root@wzc date]# ls -ld lzl/
drwxrwx---. 2 root stgroup 6 Aug  4 19:30 lzl/
[root@wzc date]# useradd cangls
[root@wzc date]# passwd cangls
Changing password for user cangls.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@wzc date]# setfacl -m u:cangls:rx lzl/
[root@wzc date]# ll -ld lzl/
drwxrwx---+ 2 root stgroup 6 Aug  4 19:30 lzl/
[root@wzc date]# getfacl lzl/
# file: lzl/
# owner: root
# group: stgroup
user::rwx
user:cangls:r-x
group::rwx
mask::rwx
other::---
[root@wzc date]# setfacl -m g:stgroup:rx lzl/
[root@wzc date]# getfacl lzl/
# file: lzl/
# owner: root
# group: stgroup
user::rwx
user:cangls:r-x
group::rwx
group:stgroup:r-x
mask::rwx
other::---
#设定与查看ACL权限
msk简介
  mask是用来指定最大有效权限的。如果我们给用户赋予了ACL权限,是需要和mask“相与”才能得到用户的真正权限
[root@wzc date]# getfacl lzl/
# file: lzl/
# owner: root
# group: stgroup
user::rwx
user:cangls:r-x
group::rwx
group:stgroup:r-x
mask::rwx
other::---
#默认mask的值为最大rwx,ACL权限用户cangls权限为r-x,与mask相与的结果是没有权限的,我们可以通过调整mask的
最大有效权限来达到控制ACL用户权限的特征,请看下面例子。
[root@wzc date]# setfacl -m m:rx xlzl/
[root@wzc date]# getfacl xlzl/
# file: xlzl/
# owner: root
# group: wugroup
user::rwx
user:wangwu:r-x
group::rwx                      #effective:r-x
group:wcgroup:rwx               #effective:r-x
mask::r-x
other::---
#虽然所属组wcgroupACL权限有rwx,但是mask得权限为rx,所以所属组的权限为rx。注:mask最大有效权限不影响
当前用户的所有者
  mask只影响除所有者和other的之外的人和组的最大权限
    Mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)
    用户或组的设置必须存在于mask权限设定范围内才会生效。
    setfacl -m mask::rx file
    --set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGO的设置,不能象-m一样只是添加ACL就可以.
    如:
  setfacl --set u::rw,u:wang:rw,g::r,o::- file1

mask最大有效权限总结

             A                B                 and
             r                r                  r
             r                –                  –
             –                r                  –
             –                –                  –

说明:当A和B都有读权限时,与出来的结果才有读权限;当有一个没有读权限时,与出来的结果是没有读权限的。

备份和恢复ACL
    主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但是tar等常见的备份工具是不会保留目录和文件的ACL信息
    #getfacl -R /tmp/dir1 > acl.txt
    #setfacl -R -b /tmp/dir1
    #setfacl -R --set-file=acl.txt /tmp/dir1
    #getfacl -R /tmp/dir1
[root@wzc date]# ls
xlzl
[root@wzc date]# cd xlzl/
[root@wzc xlzl]# touch wj303
[root@wzc xlzl]# touch wj304
[root@wzc xlzl]# setfacl -m u:wangwu:rx /date/xlzl/
[root@wzc xlzl]# ll
total 0
-rw-r--r--. 1 root root 0 Aug  4 20:53 wj303
-rw-r--r--. 1 root root 0 Aug  4 20:53 wj304
[root@wzc xlzl]# ls -ld /date/xlzl/
drwxrwx---+ 2 root wugroup 30 Aug  4 20:53 /date/xlzl/
[root@wzc xlzl]# setfacl -m u:wangwu:rx -R /date/xlzl/
[root@wzc xlzl]# ll
total 8
-rw-r-xr--+ 1 root root 0 Aug  4 20:53 wj303
-rw-r-xr--+ 1 root root 0 Aug  4 20:53 wj304
#'-R'选项是递归的意思,把目录下的文件直接赋予ACL权限,注意:'-R选项只能放在后面'

原创文章,作者:RecallWzc,如若转载,请注明出处:http://www.178linux.com/27929