Linux中的用户、组和权限管理

1、用户和组的概念

Linux是多用户多任务(Multi-Users,Multi-tasks)的操作系统,对于每个使用者,使用用户标识(ID)、密码(Passwd)来唯一标识用户。对于用户的管理有3A认证:Authentication(认证)、Authorization(授权)、Audition(审计)。

用户类别分为管理员和普通用户,普通用户又分为系统用户和登录用户。
在此要说明一下,Linux中的进程以其发起者的身份运行,进程对文件的访问权限取决于发起此进程的用户及其所属组的权限。在Linux中,系统用户是普通用户,Linux为了能够让那些后台进程或服务类进程以非管理员的身份运行,通常需要为此创建多个普通用户,这类用户从不用登录系统,但是执行的是Linux后台的进程或服务,这样的用户为系统用户。Linux中的这个机制叫做安全上下文。

用户标识,英文全称为UserID,简写为UID,是16位的二进制数字,范围0-65535。管理员的UID为0,普通用户UID的范围为1-65535,其中系统用户的UID范围为1-499(CentOS6),1-999(CentOS7),登录用户的UID范围为500-60000(CentOS6),1000-60000(CentOS7)。Linux通过查询/etc/passwd来进行Username和对应的UID之间的转换。

而用户组即是多个用户的容器。
组的按照是不是管理员组可分为管理员组和普通用户组,而普通用户组又分为系统组和登录组。
组标识,英文全称GroupID,简写为GID。管理员组的GID为0,普通用户组的GID范围为1-65535,其中系统用户组的范围为1-499(CentOS6),1-999(CentOS7),登录用户组的范围为500-60000(CentOS6), 1000-60000(CentOS7) 。Linux通过查询/etc/group来进行GroupName和GID之间的转换。
按照是不是用户的主组,可以将组分类为用户的基本组和用户的附加组。
按照组中有的用户的个数,可以将组分类为私有组(组名同用户名,且只包含一个用户)和公共组(组内包含了多个用户)。

2、用户和组的认证管理

认证信息:通过比对事先存储的用户信息与登录时提供的信息是否一致来进行用户和组的认证。
用户密码的存放文件:/etc/shadow;
组密码的存放文件/etc/gshadow。
单向加密算法:md5、sha1、sha224、sha256、sha384、sha512
密码的使用策略:

  1. 使用随机密码(没有规律的密码);
  2. 最短长度不要低于8位;
  3. 应该使用大写字母、小写字母、数字和特殊字符四类字符中至少三类;
  4. 定期更换,不要使用最近曾经使用过的密码。

MD5加密例:

[root@localhost ~]# echo "How are you?" | md5sum
2f065f71bdbbfe3637ae14b43f1ae015  -

MD5输出密文128bits。
雪崩效应:

[root@localhost ~]# echo "How are you." | md5sum
054cac27898d2b0dd9bacebbeb7777f4  -

SHA加密例:

[root@localhost ~]# echo "How are you." | sha

SHA分为以下类型:
sha1sum、sha224sum、sha256sum、sha384sum、sha512sum。
SHA1Sum输出密文为160bits。
SHA512加密例:

[root@localhost ~]# echo "How are you." | sha512sum
b4cc87f93105567c448f0146b7e66a14a1578f5d2df2a8fa8dbb1cf493f6b35e1a52b15b8163c24fd8d3f91fb75a7562d83010493f6f26b1ab20491059d471ab  -

SHA512输出密文为十六进制数字。

文件/etc/passwd是用户的信息库,文件格式:
name:password:UID:GID:GECOS:directory:shell
文件格式说明:
1)name:用户名;
2)password:可以是加密的密码,也可是占位符x;
3)UID:用户标识;
4)GID:用户所属的主组的ID号;
5)GECOS:注释信息;
6)directory:用户的家目录(即用户的主目录,是一个概念);
7)shell:用户的默认shell,登录时默认shell程序。
通过whatis passwd可以查看该配置文件的帮助信息,也可以通过man 5 passwd来查看该配置文件的帮助信息。

文件/etc/shadow存放用户密码,文件格式:
用户名:加密的密码:最近一次修改密码的时间:最短使用期限:最长使用期限:警告期段:密码禁用期:账户过期期限:保留字段
文件格式说明:
1)加密的密码以 分 割 , 第 一 个 和 第 二 个 分割,第一个和第二个 之间的数字代表加密算法,1:md5, 2:sha1, 3:sha224, 4:sha256, 5:sha384, 6:sha512;第二个和第三个 之 间 的 字 符 为 随 机 数 s a l t ; 第 二 个 和 第 三 个 之间的字符为随机数salt;第二个和第三个 salt之间的字符为加密后的密码;
2)最近一次修改密码的时间:从1970年1月1日到上一次修改密码所经过的天数;0代表用户应该在下次登录系统时更改密码;
3)密码禁用期:密码过期后,仍然接受此密码的天数(在此期间,用户应该在下次登录时修改密码)。密码到期并且过了这个宽期限之后,使用用户的当前密码将会不能登录;
4)账户过期期限:账户过期不同于密码过期,账户过期时,用户将不被允许登录,时间处于宽限期之后;密码过期时,用户将不被允许使用其密码登录,时间处于密码过期之后的宽限期;
5)保留字段:保留作将来使用。

文件/etc/group是组的信息库,文件格式:
group_name:password:GID:user_list
文件格式说明:
1)组的password保存在/etc/gshadow中;
2)user_list:该组的用户成员,即以此组为附加组的用户的用户列表(用户的基本组保存在/etc/passwd文件的GID属性中)。、

3、用户和组管理的常用命令

(1)groupadd命令
该命令用于添加组。命令格式:

groupadd [选项] group_name
-g GID:指定GID;默认是上一个组的GID+1;
-r: 创建系统组;
[root@localhost ~]# groupadd mygrp
[root@localhost ~]# groupadd -r testgrp
[root@localhost ~]# groupadd -g 2000 grp1
[root@localhost ~]# groupadd -r -g 306 mariadb

(2)groupmod命令
该命令用于修改组属性。命令格式:

groupmod [选项] GROUP
-g GID:修改GID;
-n new_name:修改组名;
[root@localhost ~]# groupmod -g 702 mariadb
[root@localhost ~]# groupmod -n perconaserver mariadb
		                                               new_name    old_name

(3)groupdel命令
该命令用于删除组。命令格式:

groupdel [选项] GROUP
[root@localhost ~]# groupdel perconaserver

(4)useradd命令
该命令用于创建用户。命令格式:

useradd [选项] 登录名
-u, --uid UID:指定UID,[UID_MIN,UID_MAX],定义在/etc/login.defs中;
-g, --gid GROUP:指定基本组ID,此组得事先存在,如果没有指定,则使用与用户名相同的组名;
-G, --groups GROUP1[,GROUP2,...[,GROUPN]]]:指明用户所属的附加组,多个组之间用逗号分隔;
-c, --comment COMMENT:指明注释信息,可以写用户全名;
-d, --home HOME_DIR:以指定的路径为用户的家目录;通过复制/etc/skel目录并重命名实现;指定的家目录路径如果事先存在,则不会为用户复制环境配置文件;
-s, --shell SHELL:指定用户的默认shell,可用的所有shell列表存储在/etc/shells文件中;
-r, --system:创建系统用户;
-m, --create-home:如果不存在,则创建用户主目录。骨架目录中的文件和目录(可以使用-k选项指定),将会复制到主目录;
-M, :不创建用户主目录,即使系统在/etc/login.defs中的设置(CREATE_HOME)为yes;
-f, --inactive INACTIVE:密码过期后,账户被彻底禁用的天数。0表示立即禁用,-1表示禁用这个功能;如果未指定,useradd将使用/etc/default/useradd中的INACTIVE指定的默认禁用周期,或者默认为-1;
-D:表示修改用户的默认选项;(修改的是/etc/default/useradd中的选项)

创建用户时的诸多默认设定配置文件为/etc/login.defs。

useradd -D:显示创建用户的默认配置;
useradd -D 选项: 修改默认选项的值;
修改的结果保存于/etc/default/useradd文件中;也可以通过直接编辑此文件实现修改useradd;
[root@localhost ~]# which adduser
/usr/sbin/adduser
[root@localhost ~]# file `which adduser`          `   ` 命令引用,查看该命令的类型
/usr/sbin/adduser: symbolic link to `useradd'
[root@localhost ~]# useradd -u 3000 openstack
[root@localhost ~]# useradd -g cloud cloudstack
[root@localhost ~]# useradd -c "MogileFS DFS" mogilefs
[root@localhost ~]# groupadd mygrp
[root@localhost ~]# useradd -G mygrp archlinux
[root@localhost ~]# useradd -d /exercise/moosefs moosefs
[root@localhost exercise]# mkdir mytest
[root@localhost exercise]# useradd -d /exercise/mytest mytest
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
[root@localhost exercise]# ls -a /exercise/mytest/
.  ..
[root@localhost exercise]# ls -a /etc/skel
.  ..  .bash_logout  .bash_profile  .bashrc  .mozilla
[root@localhost exercise]# useradd -s /bin/csh keystone
[root@localhost exercise]# useradd -D
GROUP=100              创建用户时,要为其添加一个与用户同名的私有组
HOME=/home             用户创建时,是否为其创建家目录,如果创建,家目录的起始位置
INACTIVE=-1            非活动期限,-1代表禁用
EXPIRE=                过期期限,没有时间代表永不过期,默认为99999
SHELL=/bin/bash        默认SHELL
SKEL=/etc/skel         从哪复制用户的骨架信息
CREATE_MAIL_SPOOL=yes  是否给用户创建邮件缓冲队列,yes代表每创建一个用户,会在/var/spool/mail中为用户创建一个邮筒,用以接收邮件

(5)usermod命令
该命令用于修改用户属性。命令格式:

usermod [选项] 登录
-u, --uid UID:修改用户的ID为此处指定的新UID;
-g, --gid GROUP:修改用户所属的基本组;该组必须事先存在;
-G, --groups GROUP1[,GROUP2,...[,GROUPN]]]:修改用户所属的附加组;原来的附加组会被覆盖,若保留原有,则要同时使用-a选项,表示追加;附加组必须事先存在;
-a, --append:与-G一同使用,用于为用户追加新的附加组;
-c, --comment COMMENT:修改注释信息;
-d, --home HOME_DIR:修改用户的家目录;用户原有家目录中的文件不会被转移至新位置,若要移动,则要同时使用-m选项;
-m, --move-home:只能与-d选项一同使用,用于将原来家目录中的文件移动到新的家目录中;
-l, --login NEW_LOGIN:修改用户名;
-s, --shell SHELL:修改用户的默认shell;
-L, --lock:锁定用户密码;即在用户原来的密码字符串之前添加一个"!";
-U, --unlock:解锁用户的密码;去掉"!";
-e YYYY-MM-DD:指定用户账号的过期日期;
-f INACTIVE:指定非活动期限;

(6) userdel命令
该命令用于删除用户。命令格式:

userdel [选项] 登录
-r:删除用户时一并删除其家目录;默认不会删除用户的家目录;

例1:创建用户gentoo,UID为4001,基本组为gentoo,附加组为distro(GID为5000)和peguin(GID为5001)。

[root@localhost exercise]# groupadd -g 5000 distro
[root@localhost exercise]# groupadd -g 5001 peguin
[root@localhost exercise]# useradd -u 4001 -G distro,peguin gentoo

例2:创建用户fedora,其注释信息为"Fedora Core",默认shell为/bin/tcsh。

[root@localhost exercise]# useradd -c "Fedora Core" -s /bin/tcsh fedora

例3:修改gentoo用户的家目录为/var/tmp/gentoo;要求其原有文件仍能被用户访问。

[root@localhost tmp]# usermod -d /var/tmp/gentoo -m gentoo

例4:为gentoo新增附加组netadmin。

[root@localhost exercise]# usermod -a -G netadmin gentoo

(7)passwd命令
命令格式:

passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username]
-l, -u:锁定和解锁用户;
-d:清除用户密码串;
-e DATE: 过期期限,日期;
-i DAYS:非活动期限;
-n DAYS:密码的最短使用期限;
-x DAYS:密码的最长使用期限;
-w DAYS:提前多少天开始警告;
--stdin:从标准输入读入新密码,该标准输入可以是一个管道

passwd:修改用户自己的密码;
passwd USERNAME:修改指定用户的密码,但仅root有此权限,管理员修改任何用户的密码都不需要知道原来的密码。

[root@localhost home]# passwd -d keystone
Removing password for user keystone.
passwd: Success
[root@localhost exercise]# echo "mageedu" | passwd --stdin keystone
Changing password for user keystone.
passwd: all authentication tokens updated successfully.
[root@localhost exercise]# echo "mageedu" | passwd --stdin keystone &> /dev/null
[root@localhost exercise]# echo $?
0

(8)gpasswd命令
命令格式:

gpasswd [选项] group
-a USERNAME:向组中添加用户,让用户以此组为附加组
-d USERNAME:从组中移除用户
-A userlist:设置有组管理权限的用户列表

给组设置密码,可以防止用户随意将其基本组切换为该组,如果该组没有密码,用户则不能将其基本组切换为该组,如果该组为用户的附加组,则切换不需要密码。
(9)newgrp命令
该命令用于临时切换指定的组为基本组,如果用户不属于此组,则需要组的密码;使用exit退出切换。
命令格式:

newgrp [-] [group]
-: 会模拟用户重新登录以实现重新初始化其工作环境;

(10)chage命令
该命令用于更改用户密码过期信息。命令格式:

chage [选项] 登录名
-d DAYS:修改用户最近一次修改密码的时间
-E EXPIRE_DATE:修改用户的过期时间
-W
-m
-M
-I INACTIVE:修改用户的非活动期限

(11)id命令
该命令用于显示用户的真实和有效ID。

id [OPTION]... [USER]
-u: 仅显示有效的UID;
-g: 仅显示用户的基本组ID; 
-G:仅显示用户所属的所有组的ID;
-n: 显示名字而非ID;

(12)su命令
该命令用于切换用户。

  1. 登录式切换:会通过读取目标用户的配置文件来重新初始化;
su - USERNAME
su -l USERNAME
  1. 非登录式切换:不会读取目标用户的配置文件进行初始化;
su USERNAME

管理员可无密码切换至其它任何用户,非管理员切换至任何用户时都必须给定目标用户的密码。

su [-] UserName -c 'COMMAND'
-c 'COMMAND':仅以指定用户的身份运行此处指定的命令;

(13)chsh命令
该命令用于修改当前用户或指定用户的shell,只有管理员才可以修改其他用户的shell。
(14)chfn命令
该命令用于修改finger信息。
(15)finger命令
该命令用于用户信息查询。

[root@localhost exercise]# finger
bash: finger: command not found...
[root@localhost exercise]# yum install finger
Complete!
[root@localhost exercise]# finger keystone
Login: keystone       			Name: 
Directory: /home/keystone           	Shell: /bin/csh
Last login Sun Nov 20 12:27 (CST) on pts/0
No mail.
No Plan.

(16)pwck命令
该命令用于检查用户密码是否存在异常。
(17)grpck命令
该命令用于检查组是否存在异常。
pwck和grpck这两个命令用来做用户的健康状态审计。

4、权限管理

ls -l 
rwxrwxrwx

左三位:定义user(owner)的权限,即属主权限;
中三位:定义group的权限,即属组权限;
右三位:定义other的权限,即其他人权限。

进程安全上下文
进程的属主与文件的属主是否相同:
如果相同,则应用属主权限;
否则,则检查进程的属主是否属于文件的属组:
如果是,则应用属组权限;
否则,就只能应用other的权限;
(进程的属主:进程的发起者,即当前运行进程命令的用户)

其中,
r:readable, 读
w:writable, 写
x:excutable,执行
对于文件:
r 代表可获取文件的数据,即可执行cat, head, tail, more, less命令;
w 代表可修改文件的数据;
x 代表可将此文件运行为进程。
对于目录:
r 代表可使用ls命令获取其下的所有文件列表;不能获取详细信息,即不能使用ls -l命令;
w 代表可修改此目录下的文件列表,即创建或删除文件,也可以创建或删除其子目录;
x 代表可cd至此目录中,且可使用ls -l来获取所有文件的详细属性信息。

权限组合机制:
— 000 0
–x 001 1
-w- 010 2
-wx 011 3
r-- 100 4
r-x 101 5
rw- 110 6
rwx 111 7

5、权限管理常用命令

(1)chmod命令

chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...

chmod [OPTION]... MODE[,MODE]... FILE...
MODE表示法:
1)赋权表示法:直接操作一类用户的所有权限位rwx。
u=,g=,o=,a=,ug=

[root@localhost exercise]# ll fstab
-rw-r--r--. 1 root root 689 Nov 20 16:44 fstab
[root@localhost exercise]# chmod g=rw fstab
[root@localhost exercise]# chmod ug=r fstab
[root@localhost exercise]# chmod u=rwx,g=rw,o= fstab
[root@localhost exercise]# ll fstab
-rwxrw----. 1 root root 689 Nov 20 16:44 fstab

2)授权表示法:直接操作一类用户的一个权限位r,w,x;
u+,u-,g+, g-,o+,o-,a+,a-

[root@localhost exercise]# chmod +x fstab
[root@localhost exercise]# ll fstab
-r-xr-xr-x. 1 root root 689 Nov 20 16:44 fstab
[root@localhost exercise]# chmod -x fstab
[root@localhost exercise]# ll fstab
-r--r--r--. 1 root root 689 Nov 20 16:44 fstab
[root@localhost exercise]# chmod +w fstab             全局写仅对属主有效
[root@localhost exercise]# ll fstab
-rw-r--r--. 1 root root 689 Nov 20 16:44 fstab

chmod [OPTION]... OCTAL-MODE FILE...

[root@localhost exercise]# chmod 660 fstab
[root@localhost exercise]# ll fstab
-rw-rw----. 1 root root 689 Nov 20 16:44 fstab
[root@localhost exercise]# chmod 66 fstab
[root@localhost exercise]# ll fstab
----rw-rw-. 1 root root 689 Nov 20 16:44 fstab           66左侧补零

chmod [OPTION]... --reference=RFILE FILE...
根据参考文件RFILE修改FILE的权限。

[root@localhost exercise]# chmod --reference=/var/log/messages fstab
[root@localhost exercise]# ll fstab
-rw-------. 1 root root 689 Nov 20 16:44 fstab								
选项:
-R, --recursive:递归修改,修改该目录及该目录下的子目录、文件的权限为该权限;

一般在上述授权表示法、赋权表示法中使用,目录一般有x权限,文件不应有x权限。一般用于创建许多空目录,形成目录树。
用户仅能修改属主为自己的那些文件的权限。
(2)chown命令

chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...
选项:
-R:递归修改,修改该目录及该目录下的子目录、文件的权限;
[root@localhost exercise]# chown -R keystone skel                   修改属主
[root@localhost exercise]# chown -R archlinux:mygrp skel            修改属主和属组,:分割
[root@localhost exercise]# chown -R root.root skel                  修改属主和属组,.分割
[root@localhost exercise]# chown :mygrp mytest                      可以用来只改属组
[root@localhost exercise]# chown -R --reference=/exercise/mytest skel

(3)chgrp命令

chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...
选项:
-R:递归修改,修改该目录及该目录下的子目录、文件的权限;

仅管理员可修改文件的属主和属组。
用户对目录有写权限,但对目录下的文件没有写权限时,不能修改文件内容,但可以删除此文件。
(4)umask命令
umask为文件的权限反向掩码,遮罩码。
对于文件,666-umask得到文件的默认权限;
对于目录,777-umask得到目录的默认权限。
(注:之所以文件用666去减,表示文件默认不能拥有执行权限;如果减得的结果中有执行权限,则需要将其加1;
例umask为023,对于文件:666-023=644,对于目录:777-023=754)

umask:查看当前umask值
umask MASK: 设置umask值

此类设定仅对当前shell进程有效;
(5) install命令
该文件用于拷贝命令并设置属性。
单源复制:
install [OPTION]... [-T] SOURCE DEST
多源复制:
install [OPTION]... SOURCE... DIRECTORY
install [OPTION]... -t DIRECTORY SOURCE...
创建目录:
install [OPTION]... -d DIRECTORY...

常用选项:
-m, --mode=MODE:设定目标文件权限,默认为755;
-o, --owner=OWNER:设定目标文件属主;
-g, --group=GROUP:设定目标文件属组;
[root@localhost exercise]# install -o archlinux -g mygrp -m 640 /etc/inittab ./inittab
[root@localhost exercise]# ll inittab
-rw-r-----. 1 archlinux mygrp 511 Nov 20 19:46 inittab
[root@localhost exercise]# install -d hello                     创建空目录
[root@localhost exercise]# ll -d hello
drwxr-xr-x. 2 root root 4096 Nov 20 19:46 hello

(6)mktemp命令
该命令用于创建临时文件或临时目录。

mktemp [OPTION]... [TEMPLATE]
常用选项:
-d:创建临时目录;
-u: 只是写个名字,不会真正创建该文件;用来测试,可否创建;

注意:mktemp会将创建的临时文件名直接返回,因此,可直接通过命令引用保存起来。创建的临时文件一个月后会被删除,但应在/tmp下创建,其他目录下可能不会被删除;文件后缀名至少有三个X。

6、综合练习

  1. 新建系统组mariadb, 新建系统用户mariadb, 属于mariadb组,要求其没有家目录,且shell为/sbin/nologin;尝试root切换至用户,查看其命令提示符。
[root@localhost ~]# groupadd -r mariadb
[root@localhost ~]# useradd  -r -M -g mariadb -s /sbin/nologin mariadb
[root@localhost ~]# tail /etc/passwd
chrony:x:990:985::/var/lib/chrony:/sbin/nologin
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
yanyan:x:1000:1000:yanyan:/home/yanyan:/bin/bash
mariadb:x:988:983::/home/mariadb:/sbin/nologin
[root@localhost ~]# cd /home
[root@localhost home]# ls
centos  docker  gentoo  lost+found  yanyan
[root@localhost home]# su - mariadb
su: warning: cannot change directory to /home/mariadb: No such file or directory
This account is currently not available.
  1. 新建GID为5000的组mageedu,新建用户gentoo,要求其家目录为/users/gentoo,密码同用户名。
[root@localhost home]# groupadd -g 5000 mageedu
[root@localhost home]# mkdir /users
[root@localhost home]# useradd -m -d /users/gentoo gentoo
[root@localhost home]# passwd gentoo
Changing password for user gentoo.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.

  1. 新建用户fedora,其家目录为/users/fedora,密码同用户名。
[root@localhost home]# useradd -m -d /users/fedora fedora
[root@localhost home]# passwd fedora
Changing password for user fedora.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
  1. 新建用户www, 其家目录为/users/www;删除www用户,但保留其家目录。
[root@localhost home]# useradd -m -d /users/www www
[root@localhost home]# userdel www
  1. 为用户gentoo和fedora新增附加组mageedu。
[root@localhost home]# usermod -a -G mageedu gentoo
[root@localhost home]# usermod -a -G mageedu fedora
  1. 复制目录/var/log至/tmp/目录,修改/tmp/log及其内部的所有文件的属组为mageedu,并让属组对目录本身拥有写权限。
[root@localhost home]# cp -r /var/log /tmp
[root@localhost home]# chown -R :mageedu /tmp/log
[root@localhost home]# ll -d /tmp/log
drwxr-xr-x. 17 root mageedu 4096 Nov 20 21:32 /tmp/log
[root@localhost home]# chmod g+w /tmp/log
[root@localhost home]# ll -d /tmp/log
drwxrwxr-x. 17 root mageedu 4096 Nov 20 21:32 /tmp/log

7、Linux系统上的特殊权限

特殊权限:SUID, SGID, STICKY。
(1)安全上下文

  1. 任何一个可执行程序文件能不能启动为进程,取决于发起者对程序文件是否拥有执行权限;
  2. 进程以某用户的身份运行; 进程是发起此进程用户的代理,因此以此用户的身份和权限完成所有操作;
  3. 权限匹配模型
    1)判断进程的属主,是否为被访问的文件属主;如果是,则应用属主的权限;否则进入第2步;
    2)判断进程的属主,是否属于被访问的文件属组;如果是,则应用属组的权限;否则进入第3步;
    3)应用other的权限。

(2)SUID
1)SUID的作用
默认情况下:用户发起的进程,进程的属主是其发起者;因此,其以发起者的身份在运行。用户运行某程序时,如果此程序拥有SUID权限,那么程序运行为进程时,进程的属主不是发起者,而是程序文件自己的属主。
2)管理文件的SUID权限

chmod u+|-s FILE...

3)展示位置
使用ls -l查看时,属主的执行权限位,如果属主原本有执行权限,显示为小写s,如果属主原本没有执行权限,则显示为大写S。

[fedora@localhost ~]$ ll /bin/cat
-rwxr-xr-x. 1 root root 54048 Nov 20  2015 /bin/cat
[root@localhost ~]chmod u+s /tmp/cat                      运行/tmp/cat命令,普通用户才可以访问/etc/shadow文件,因为/tmp/cat是以属主root身份在运行
[root@localhost ~]# ll /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /bin/passwd    普通用户才可以用passwd命令修改自己的密码,因为passwd进程是以属主root的身份在运行

(3)SGID
1)SGID的作用
默认情况下,用户创建文件时,其属组为此用户所属的基本组。一旦某目录被设定了SGID,则当目录属组有写权限,且有SGID权限时,那么所有属于此目录属组的用户在该目录中创建文件时,新文件的属组不是用户的基本组,而是此目录的属组。
2)管理文件的SGID权限

chmod g+|-s DIR...

3)展示位置
属组的执行权限位,如果属组原本有执行权限,显示为小写s,否则,显示为大写S。

[root@localhost ~]# useradd fedora
[root@localhost ~]# useradd centos
[root@localhost ~]# groupadd mygrp
[root@localhost ~]# usermod -a -G mygrp centos
[root@localhost ~]# usermod -a -G mygrp fedora
[root@localhost ~]# id fedora
uid=1004(fedora) gid=1004(fedora) groups=1004(fedora),5001(mygrp)
[root@localhost ~]# id centos
uid=1005(centos) gid=1005(centos) groups=1005(centos),5001(mygrp)
[root@localhost ~]# mkdir /exercise/test
[root@localhost ~]# chown :mygrp /exercise/test
[root@localhost ~]# ll -d /exercise/test
drwxr-xr-x. 2 root mygrp 4096 Dec  1 20:07 /exercise/test
[root@localhost ~]# chmod g+w /exercise/test
[root@localhost ~]# ll -d /exercise/test
drwxrwxr-x. 2 root mygrp 4096 Dec  1 20:07 /exercise/test
[root@localhost ~]# su - fedora
[fedora@localhost ~]$ cd /exercise/test
[fedora@localhost test]$ touch a.fedora
[fedora@localhost test]$ ll
total 0
-rw-rw-r--. 1 fedora fedora 0 Dec  1 20:10 a.fedora
[fedora@localhost test]$ exit
logout
[root@localhost ~]# su - centos
[centos@localhost ~]$ cd /exercise/test
[centos@localhost test]$ touch a.centos
[centos@localhost test]$ ll
total 0
-rw-rw-r--. 1 centos centos 0 Dec  1 20:11 a.centos
-rw-rw-r--. 1 fedora fedora 0 Dec  1 20:10 a.fedora
[centos@localhost test]$ exit
logout
[root@localhost ~]# chmod g+s /exercise/test
[root@localhost ~]# ll -d /exercise/test
drwxrwsr-x. 2 root mygrp 4096 Dec  1 20:11 /exercise/test
[root@localhost ~]# su - centos
Last login: Thu Dec  1 20:10:37 CST 2016 on pts/0
[centos@localhost ~]$ cd /exercise/test
[centos@localhost test]$ touch b.centos
[centos@localhost test]$ ll
total 0
-rw-rw-r--. 1 centos centos 0 Dec  1 20:11 a.centos
-rw-rw-r--. 1 fedora fedora 0 Dec  1 20:10 a.fedora
-rw-rw-r--. 1 centos mygrp  0 Dec  1 20:13 b.centos
[centos@localhost test]$ exit
logout
[root@localhost ~]# su - fedora
Last login: Thu Dec  1 20:09:00 CST 2016 on pts/0
[fedora@localhost ~]$ cd /exercise/test
[fedora@localhost test]$ touch b.fedora
[fedora@localhost test]$ ll
total 0
-rw-rw-r--. 1 centos centos 0 Dec  1 20:11 a.centos
-rw-rw-r--. 1 fedora fedora 0 Dec  1 20:10 a.fedora
-rw-rw-r--. 1 centos mygrp  0 Dec  1 20:13 b.centos
-rw-rw-r--. 1 fedora mygrp  0 Dec  1 20:14 b.fedora

(4)Sticky
1)Sticky的作用
对于属组为全局可写的目录,组内的所有用户或系统上的所有用户在此目录中都能创建新文件或删除所有的已有文件;如果为此类目录设置Sticky权限,则每个用户能创建新文件,且只能删除自己为属主的文件。
2)管理文件的Sticky权限

chmod o+|-t DIR...

3)展示位置
其它用户的执行权限位,如果其它用户原本有执行权限,显示为小写t,否则,显示为大写T。
系统上的/tmp和/var/tmp目录默认均有sticky权限。

[root@localhost ~]# chmod o+t /exercise/test
[root@localhost ~]# ll -d /exercise/test
drwxrwsr-t. 2 root mygrp 4096 Dec  1 20:14 /exercise/test

(5)管理特殊权限的另一方式
suid sgid sticky 八进制权限
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7
基于八进制方式赋权时,可于默认的三位八进制数字左侧再加一位八进制数字。例如:chmod 1777 。

几个权限位映射:
SUID:user,占据属主的执行权限位;
s:属主拥有x权限;
S:属主没有x权限;
SGID:group,占据属组的执行权限位;
s:属组拥有x权限;
S:属组没有x权限;
Sticky:other,占据other的执行权限位;
t:other拥有x权限;
T:other没有x权限。

(6)facl
facl为file access control lists,文件访问控制列表。
文件的额外赋权机制:在原来的u,g,o之外,另一层让普通用户能控制赋权给另外的用户或组的赋权机制。
1)getfacl命令: 查看某文件的访问控制列表

getfacl FILE...
user:USERNAME:MODE
group:GROUPNAME:MODE

2)setfacl命令
赋权给用户:

setfacl  -m  u:USERNAME:MODE  FILE...

赋权给组:

setfacl  -m  g:GROUPNAME:MODE FILE...

撤销赋权:

setfacl  -x u:USERNAME  FILE...
setfacl  -x  g:GROUPNAME  FILE...

例:

setfacl -m u:hadoop:--- test.centos
[centos@localhost exercise]$ cd /tmp
[centos@localhost tmp]$ ll -d
drwxrwxrwt. 18 root root 4096 Dec  1 20:26 .
[centos@localhost tmp]$ touch test.centos
[centos@localhost tmp]$ getfacl test.centos
# file: test.centos
# owner: centos
# group: centos
user::rw-
group::rw-
other::r--

[centos@localhost tmp]$ setfacl -m u:fedora:rw test.centos
[centos@localhost tmp]$ getfacl test.centos
# file: test.centos
# owner: centos
# group: centos
user::rw-
user:fedora:rw-
group::rw-
mask::rw-
other::r--

[centos@localhost tmp]$ setfacl -m g:mygrp:rw test.centos
[centos@localhost tmp]$ getfacl test.centos
# file: test.centos
# owner: centos
# group: centos
user::rw-
user:fedora:rw-
group::rw-
group:mygrp:rw-
mask::rw-
other::r--

[centos@localhost tmp]$ ll test.centos
-rw-rw-r--+ 1 centos centos 0 Dec  1 20:28 test.centos
[centos@localhost tmp]$ exit
logout
[root@localhost ~]# su - fedora
Last login: Thu Dec  1 20:14:01 CST 2016 on pts/0
[fedora@localhost ~]$ vim /tmp/test.centos
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页