Linux学习笔记:权限管理
目录
文件/目录的基本属性
更改文件/目录属性
1. chown:更改属主
2. chgrp:更改属组
3. chmod:更改权限属性
数字类型更改权限
符号类型更改权限
特殊权限:setuid、setgid、粘滞位
用户管理
用户分类
创建用户
创建新的用户信息
设置用户密码
修改用户
删除用户
用户切换和提权
用户切换(su)
用户提权(sudo)
第一步:root授权(visudo)
第二步:普通用户行权(sudo)
文件/目录的基本属性
Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定,控制系统不同用户对数据管理能力。
首先我们来看Linux系统中目录和文件的基本属性。
我们可以使用 ls –l (可简写为 ll)命令来显示一个文件/目录的属性、所属的用户和组以及最后更改时间,如:
[root@test testfile]# ll total 4 -rw-r--r--. 1 root root 4 Sep 26 11:40 a.txt drwxr-xr-x. 2 root root 6 Sep 26 11:39 adir
文件/目录属性信息包括几个部分:

第一部分(左边10个字符):文件/目录的属性(详见下文介绍)。
第二部分(中间3组):链接数,用户名,用户所在的组名。
第三部分(后面5组):文件/目录大小,最后更改时间,文件/目录名。
每个文件/目录的属性由左边第一部分的 10 个字符来确定:

- 第0位:确定文件类型,- 表示文件,d 表示目录。
- 第1-3位:确定属主(该文件/目录的所有者)拥有该文件/目录的权限。
- 第4-6位:确定属组(所有者的同组用户)拥有该文件/目录的权限。
- 第7-9位:确定其他用户拥有该文件/目录的权限。
第1-9位字符中,以三个为一组,且均为 rwx 的三个参数的组合。
- r 代表可读(readable),具有读取查看权限
- w 代表可写(writable),具有编辑修改权限
- x 代表可执行(executable),具有执行或运行权限
- - 代表没有权限
对于文件来说,必须要具有的是读权限(特殊文件除外),只有在具有读权限前提下,写权限和执行权限才能发挥作用,并且对于一般文件只有属主具有编写权限,其他用户和属组用户均只有查看权限或执行权限。
对于目录来说,必须要具有的是执行权限(特殊文件除外),只有在具有执行限前提下,写权限和读权限才能发挥作用,并且对于一般目录只有属主具有编写权限,其他用户和属组用户均只有查看权限或执行权限。
更改文件/目录属性
1. chown:更改属主
语法:
chown [–R] 属主名 文件名
chown [-R] 属主名:属组名 文件名
例1:进入 /root 目录(~)将install.log的拥有者改为bin这个账号:
[root@test ~] cd ~ [root@test ~]# chown bin install.log [root@test ~]# ls -l -rw-r--r-- 1 bin users 68495 Sep 26 11:53 install.log
例2:将install.log的拥有者与群组改回为root:
[root@test ~]# chown root:root install.log [root@test ~]# ls -l -rw-r--r-- 1 root root 68495 Sep 26 11:53 install.log
2. chgrp:更改属组
语法:
chgrp [-R] 属组名 文件名
参数-R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。
3. chmod:更改权限属性
Linux文件属性有两种设置方法,一种是数字,一种是符号。
——数字类型改变文件权限——
语法:
chmod [-R] xyz 文件或目录名
选项与参数:
- xyz : 数字类型的权限属性,为三种身份的 rwx 属性数值的相加。
- -R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更
可以使用数字来代表各个权限,各权限的分数对照表如下:
- r=4
- w=2
- x=1
- -=0
每种身份(owner/group/others)各自的权限(r/w/x/-)分数是需要累加的,例如当权限为: -rwxrwx--- 分数则是:
- owner = rwx = 4+2+1 = 7
- group = rwx = 4+2+1 = 7
- others= --- = 0+0+0 = 0
所以设定权限的变更时,该文件的权限数字就是 770:
# ls -al test1 // 查看 test1 权限 -rwxr-xr-- 1 root root 0 Sep 26 12:35 test1 # chmod 770 test1 // 修改 test1 权限 # ls -al test1 // 查看 test1 权限 -rwxrwx--- 1 root root 0 Sep 26 12:35 test1
如果要将权限变成 -rwxr-xr-- ,那么权限的分数就成为 [4+2+1][4+0+1][4+0+0]=754。
——符号类型改变文件权限——
语法:
chmod 用户+权限 文件或目录名
用户的符号:
- u:代表user,即用户
- g:代表group,即组
- o:代表others,即其他用户
- a:代表all,即全部以上三种用户
权限就是上面介绍的无权限、读取、写入和执行:-、r、w、x。
用户和权限之间用符号连接:
- +:代表加入权限
- -:代表除去权限
- =:代表设定权限
例:
# touch test1 // 创建 test1 文件 # ls -al test1 // 查看 test1 默认权限 -rw-r--r-- 1 root root 0 Sep 26 12:32 test1 # chmod u=rwx,g=rx,o=r test1 // 修改 test1 权限 # ls -al test1 -rwxr-xr-- 1 root root 0 Sep 26 12:32 test1 # chmod a-x test1 //拿掉全部人的可执行权限 # ls -al test1 -rw-r--r-- 1 root root 0 Sep 26 12:32 test1
4.特殊权限概念
以上介绍是常规权限:-、r、w、x,还有以下几种特殊权限
——setuid——
对于命令文件赋予特殊权限,让所有普通用户可以拥有属主用户能力。
//赋予setuid的方式: chmod u+s /目录/文件 //例: //普通用户在加s权限前,cat命令文件权限为:-rwxr-xr-x //加s权限: chmod u+s /usr/bin/cat //普通用户在加s权限后,cat命令文件权限为:-rwsr-xr-x //用户加s权限后,在x位显示,原来有x权限的显示为小s,原来无x权限的显示为大S
//取消权限用 u-s 即可
【请勿随意操作授权!】
——setgid——
对于命令文件赋予特殊权限,让所有用户组可以拥有属组权限能力
chmod g+s /目录/文件
——粘滞位Stickybit——
将一些设置共享权限的目录赋予粘滞位,只有共享数据的用户或者root才能删除或移动该文件,其他人只能进行查看,不能有删除或者重命名操作。
//给共享文件夹设置粘滞位:
chmod o+t /目录/
//例:
//在加t权限前,共享文件夹share权限为:drwxr-xrwx
//给其他用户other加t权限:
chmod o+t /share/
//加t权限后,共享文件夹share权限为:drwxr-xrwt
//取消权限用 o-t 即可
实际应用中,粘滞位一般用于/tmp/目录,以防止普通用户删除或移动其他用户的文件。
注:粘滞位权限只能针对⽬录设置,对于⽂件⽆效。
用户管理
Linux系统是一个多用户多任务的分时操作系统,要使用系统资源,必须有一个账号进入系统。每个用户账号都拥有一个唯一的用户名和各自的口令。用户的角色是通过UID和GID识别的,UID相当于我们的身份证号,用户名就相当于我们的名字。
Linux系统有以下三种用户:
- 超级用户:默认是root用户,其UID和GID均是0。root为超级管理员账号,可以操作系统中任何文件和命令,拥有最高的管理权限。
- 虚拟用户:UID值为1-999,安装系统后默认存在,且默认情况大多数不能登录系统。主要是方便系统管理,满足相应的系统进程对文件属主的要求。
- 普通用户:UID值为1000-65535,普通用户可以登录系统,但仅具有操作自己家目录中的文件及目录的权限。
创建用户
——创建新的用户信息——
语法:
useradd 选项 用户名
参数说明:
-
选项:
- -c comment 指定一段注释性描述。
- -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
- -g 用户组 指定用户所属的用户组。
- -G 用户组,用户组 指定用户所属的附加组。
- -s Shell文件 指定用户的登录Shell。
- -u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
-
用户名:
指定新账号的登录名。
例:
# useradd –d /home/test1 -m test1 //此命令创建了一个用户test,其中-d和-m选项用来为登录名test产生一个主目录 /home/sam(/home为默认的用户主目录所在的父目录)。 # useradd -s /bin/sh -g group –G adm,root test2 //此命令新建了一个用户test2,该用户的登录Shell是 /bin/sh,它属于group用户组,同时又属于adm和root用户组,其中group用户组是其主组。
——设置用户密码——
用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用。超级用户root可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。
语法:
passwd 选项 用户名
选项:
- -l 锁定口令,即禁用账号。
- -u 口令解锁。
- -d 使账号无口令。
- -f 强迫用户下次登录时修改口令。
例:
[root@test ~]# passwd test1 //给指定用户设置密码信息,只能root用户进行操作 Changing password for user test1. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully. [root@test ~]$ passwd //给当前登录系统用户设置密码,所有用户均可使用 Changing password for user root. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully.
普通用户修改自己的密码时,passwd命令会先询问原密码,验证后再要求用户输入两遍新密码,如果两次输入的密码一致,则将这个新密码指定给用户;而超级用户为用户指定密码时,就不需要知道原密码。
修改用户
根据实际情况可以更改用户的有关属性,如用户号、主目录、用户组、登录Shell等。
语法:
usermod 选项 用户名
常用的选项包括-c, -d, -m, -g, -G, -s, -u以及-o等,这些选项的意义与useradd命令中的选项一样,可以为用户指定新的资源值。
例:
usermod -s /bin/ksh -d /home/test –g aaa test //此命令将用户test的登录Shell修改为ksh,主目录改为/home/test,用户组改为aaa。
删除用户
如果一个用户的账号不再使用,可以从系统中删除。删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除,必要时还删除用户的主目录。
语法:
userdel 选项 用户名
userdel 即 user delete,删除用户,常用的选项是 -r,把用户及其主目录一起删除。
例:
userdel test //只删除用户信息,不会删除用户产生的数据文件信息 userdel -r test //彻底删除用户信息,以及用户产生的数据文件信息
用户切换和提权
在Linux系统中,超级管理用户root的权限太大,如果管理不好,就会带来严重的系统安全隐患。因此在工作场景中,只有在必要时才使用超级用户权限。一般临时性工作处理,都是以普通用户的身份完成的。当普通用户需要具有超级用户的权限时,可以通过两种方式改变普通用户权限,以达到对系统的控制权。
方式一:用户切换(su)
su(英文全拼:swith user)命令可以在用户之间进行切换。除root向普通用户切换不需要密码验证外,普通用户之间切换或者从普通用户切换到root都需要目标用户的密码验证。
语法:
su 选项 用户名 //若命令后面的用户名省略了,则默认切换为root用户 //从root用户切换到普通用户时,不需要密码验证 //从普通用户切换到root用户时,需要输入root密码验证
选项说明:
- -,-l:使一个shell成为登录的shell,并且使用该用户对应的环境变量配置
- -c:切换到一个shell下,执行一个命令,然后退出所切换的用户环境
- -p:切换用户时,不需要重置用户环境变量
- -m:同-p,为su的默认值,一般较少使用
- -s:如果/etc/shells允许,则运行指定的shell
在生产场景中,su命令比较常用的参数为"-"和"-c",其他的参数很少用到。更多选项说明可执行 man su 进行查看。
例:
[root@test ~]# su - aa //root用户切换为普通用户时,无需密码验证,直接进行切换 [aa@test ~]$ whoami //查看当前用户名 aa [aa@test ~]$ su - bb //普通用户切之间的切换,需要密码验证 密码: [bb@test ~]$ whoami //查看当前用户名 bb [bb@test ~]$ su - //普通用户切换为root用户,需要密码验证 密码: [root@test ~]# whoami //查看当前用户名 root
方式二:用户提权(sudo)
root可以有针对性地将不同命令或程序授予指定的普通用户,让普通用户不需要知道root密码就可以执行相应的命令。也就是说,经由 sudo 所执行的命令就好像是root亲自执行,前提是需要root授权相应的命令。
——第一步:root授权(visudo)——
root授权可以使用visudo命令进行配置管理,visudo命令是专门用来编辑/etc/sudoers这个文件的,同时它还提供了语法检查等功能。此命令执行相当于执行 vim /etc/sudoers 编辑,但使用此命令方式更安全,推荐此种方式。
语法:
visudo 选项
选项说明:
- -c:手动执行语法检查
例:执行visudo命令,即可打开sudo的配置文件进行编辑。在/etc/sudoers文件的大约第92行下面添加需要提升为root权限的普通用户名及对应权限:
//将aa用户提权为root身份 93 aa ALL=(ALL) ALL //授权bb用户使其可以以root身份添加和删除用户权限 94 bb ALL=(ALL) /usr/sbin/useradd, /usr/sbin/userdel //添加NOPASSWD信息,表示在普通用户使用特权时,可以不用输入密码信息 95 cc ALL=(ALL) NOPASSWD: ALL //上述授权配置内容对应说明如下所示: //编号 待授权的用户或组 机器=(授权角色) 可以执行的命令 //94 bb ALL=(ALL) /usr/sbin/useradd, /usr/sbin/userdel
通过visudo命令进行系统的授权管理的目的是,既能让运维人员正常工作,又不会威胁到系统的安全,还可以审计用户使用sudo的提权操作命令,默认的用户是无法获得root权限的。
为了管理方便,工作中可以为某一个普通用户授权为ALL权限,既可管理整个系统,平时也可以使用用户处理工作,而无需使用root用户。
语法检查:
[root@test ~]# visudo -c
/etc/sudoers: parsed OK
有的时候,运维管理员并不是使用visudo编辑sudoers文件,而是使用vim或者echo命令编辑的sudoers文件,此时就需要执行如下命令检查编辑文件的语法是否正确。
——第二步:普通用户行权(sudo)——
语法:
sudo 选项
选项说明:
- -l:列出当前用户可以执行的命令,只有sudoers文件里的用户才能使用该选项
- -u:可以指定用户的身份执行命令。后面是除root之外的用户,可以是用户名,也可以是uid
- -k:清除时间戳上的时间,下次再使用sudo时还需要再次输入密码
- -b:在后台执行指定的命令
- -c:不执行命令,而是修改文件,相当于命令 sudo edit
例:已经对bb用户进行了授权,此时再以bb用户的身份登录系统,就可以通过执行类似sudo ls -l /root(sudo后面加上正常命令)的命令来以root用户的权限管理系统了:
[aa@test ~]$ ls /root/ ls: cannot open directory /root/: Permission denied //可以看到,aa用户是无法直接访问/root家目录的 [aa@test ~]$ sudo ls /root We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. [sudo] password for aa: //如果授权配置中含有NOPASSWD,则执行时将不提示密码,否则会要求输入当前用户的密码
对于Linux系统bash的内置命令,一般无法进行sudo授权,例如,cd命令。

浙公网安备 33010602011771号