Linux 编程之权限系统与工具使用(二),一文详解
[root@localhost test123]# ll 总用量 0drwxr-x--- 2 test123 test123 20 5 月 5 11:38 abc
1.2、默认权限
我们在 linux 系统中新建一个文件或者目录,那么这个文件或目录会有一个权限,这个权限就是默认权限。这个权限就是靠 umask 的值来定义的。那么什么是 umask?
umask(权限掩码) 就是指定当前用户在建立文件或目录时候的权限默认值。当新文件被创建时,其最初的权限由文件创建掩码决定。用户每次登录系统时,umask 命令都被执行, 并自动设置掩码 mode 来限制新文件的权限。用户可以通过再次执行 umask 命令来改变默认值,新的权限将会把旧的覆盖掉。
我们可以执行 umask 命令来查看系统中文件默认权限。
[root@localhost local]# umask0022
解释下 0022
第一位 0:文件特殊权限。
022:文件默认权限。
下面创建一个文件和一个目录。
[root@localhost tmp]# touch a.txt[root@localhost tmp]# mkdir dir[root@localhost tmp]# ll 总用量 54768-rw-r--r-- 1 root root 0 5 月 5 14:31 a.txtdrwxr-xr-x 2 root root 6 5 月 5 14:31 dir
我们看文件默认权限是 644,而目录的权限是 755,那么是如何依靠 umask 来设定权限的呢。
我们先看下文件默认权限的特点:
1.文件默认不能建立为执行权限,必须手工赋予执行权限。所以文件的默认权限最大为 666。这样能保护系统安全。
2.默认权限要换算成对应的字母权限在相减而不是数字。
3.建立文件或目录之后的默认权限,为 666 减去 umask 的值。
计算方式如下:
文件默认最大权限 666,umask=022
-rw-rw-rw- 减去 -----w--w- 等于 -rw-r--r-- (644)
文件默认最大权限 666,umask=033
-rw-rw-rw- 减去 -----wx-wx 等于 -rw-r--r-- (644)
其实是做了一个逻辑与的运算。
目录的默认权限:
1.目录默认权限最大是 777。2.目录默认权限换算成字符在相减。3.建立目录之后的默认权限,是 777 减去 umask 的值。
修改 umask 的值:
使用 umask + 值,比如 umask 0000;
不过这样只是临时生效,要永久修改就要修改环境变量配置文件/etc/profile
1.3、ACL(Access Control List )权限
linux 系统中一个文件只有一个所属组,一个所有者,acl 权限是解决用户对文件权限不足,也就是用户身份不够的情况下。打算让某个用户对这个文件有权限,不用考虑这个用户是哪个所有组还是其他人。用 acl 给这个用户赋予权限。ACL 权限 是解决用户对文件身份不足的问题(该用户不属于 拥有者 所属组 其他人)。系统是否支持 ACL 是与文件系统有关的。
首先查看系统分区中 ACL 权限是否开启,命令如下:
先看下分区情况[root@localhost tmp]# df 文件系统 1K-块 已用 可用 已用 % 挂载点/dev/mapper/centos-root 39134548 29770328 9364220 77% /devtmpfs 923152 0 923152 0% /devtmpfs 933636 80 933556 1% /dev/shmtmpfs 933636 9128 924508 1% /runtmpfs 933636 0 933636 0% /sys/fs/cgroup/dev/mapper/centos-home 19105792 33080 19072712 1% /home/dev/sda1 508588 177692 330896 35% /boot.host:/ 127927292 118371212 9556080 93% /mnt/hgfstmpfs 186728 12 186716 1% /run/user/42tmpfs 186728 0 186728 0% /run/user/0
因为我安装的是 centos7,所以我的系统文件系统是 xfs 类型,用 xfs_growfs 命令查看,如果文件系统是 ext2/ext3/ext4 可以用 dumpe2fs 命令查看指定分区详细文件系统信息。[root@localhost tmp]# xfs_growfs /dev/sda1meta-data=/dev/sda1 isize=256 agcount=4, agsize=32000 blks= sectsz=512 attr=2, projid32bit=1= crc=0 finobt=0 spinodes=0data = bsize=4096 blocks=128000, imaxpct=25= sunit=0 swidth=0 blksnaming =version 2 bsize=4096 ascii-ci=0 ftype=0log =internal bsize=4096 blocks=853, version=2= sectsz=512 sunit=0 blks, lazy-count=1realtime =none extsz=4096 blocks=0, rtextents=0
查看系统是否支持 ACL,使用 dmesg 命令(可以帮助用户了解系统的启动信息,可以查看 ACL 信息)查看,发现 xfs 文件系统是默认支持 ACL 权限的。
查看 ACL 权限:
设定 ACL 权限:
setfacl 选项 文件名选项:
-m:设定 ACL 权限。
-x:删除指定的 ACL 权限。
-b:删除所有的 ACL 权限。
-d:设定默认的 ACL 权限。
-k:删除默认的 ACL 权限。
-R:递归设定 ACL 权限。
1.4、sudo 权限
sudo 是 linux 系统管理指令,操作对象是系统命令。是允许让普通用户执行部分或者全部的系统管理员才能执行的命令的一个工具,限制某个普通用户有限的命令有 root 权限(比如说重启,备份,添加用户,ifconfig 命令等)。sudo 执行时候不需要知道超级管理员的密码。
sudo 是超级用户赋予普通用户权限才能使用,sudo 为系统管理员提供配置文件,使用 visudo 命令(这个命令可以防止两个用户同时修改它,也能进行有限的语法检查)可以打开该配置文件:
[root@localhost ~]# visudo 这个命令实际是打开了/etc/sudoers 文件
Sudoers allows particular users to run various commands as
the root user, without needing the root password.
Examples are provided at the bottom of the file for collections
of related commands, which can then be delegated out to particular
users or groups.
... ...
在文件 98 行有个例子
格式解释: 用户名(给哪个用户赋予权限,这里是 root) 被管理的主机地址(第一个 ALL)= (可使用身份(第二个 ALL),这个可以省略直接跟授权的命令) 授权的命令(要写绝对路径,命令写的越简单权限就越大,越详细普通用户获得权限就越小)使用 man 5 sudoers 命令查看配置文件详细解释
普通用户没有关闭系统的权限,如下提示。
[song@localhost ~]$ shutdown -r now==== AUTHENTICATING FOR org.freedesktop.login1.reboot ===Authentication is required for rebooting the system.Authenticating as: rootPassword: Failed to execute operation: 连接超时 Must be root.polkit-agent-helper-1: pam_authentic
ate failed: Authentication failure
在配置文件中最后一行给 song 用户添加 shutdown 权限并保存
用 song 账号登录并用 sudo -l 命令显示出自己(执行 sudo 的使用者)的权限。
[song@localhost ~]$ sudo -l[sudo] password for song:匹配此主机上 song 的默认条目:requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORSDISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATELC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARYLC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALLLANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",secure_path=/sbin:/bin:/usr/sbin:/usr/bin
用户 song 可以在该主机上运行以下命令:(ALL) /sbin/shutdown -r now 这里 song 身份就被切换成 ALL
这里用 sudo 命令后面加配置文件赋予的命令去执行,不能写错,不然会执行不了,如下。
[song@localhost ~]$ sudo /sbin/shutdown -h now 对不起,用户 song 无权以 root 的身份在 localhost.localdomain 上执行 /sbin/shutdown -h now。
所以写成配置文件里一模一样的就可以执行
[song@localhost ~]$ sudo /sbin/shutdown -r now
如果写多个可以用逗号分开
再看下
[song@localhost ~]$ sudo -l 匹配此主机上 song 的默认条目:requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAMELANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin:/bin:/usr/sbin:/usr/bin
用户 song 可以在该主机上运行以下命令:(ALL) /sbin/shutdown -r now, (ALL) /sbin/ls
上面的例子是给某个用户赋予权限,当然我们也可以给一组用户赋予权限。也是在配置文件中
Same thing without a password
%wheel ALL=(ALL) NOPASSWD: ALL
上面 wheel 是组名,前面要加上 %号,其它设置和用户一样。
sudo 命令主要参数说明:
1.5、文件的特殊权限 SetUid & SetGid & Sticky BIT
linux 系统文件中除了读(r),写(w),执行(x)权限外,还有 s 和 t 这两个特殊的权限。当 s 这个标志出现在文件所有者的 x 权限上时,此时就被称为 SetUid(简称 SUID),当 s 出现在用户组(g)上就是 SetGid,当 s 出现在其他用户(o)上就是 Sticky Bit(简称 SBIT)。
SetUid 的功能:
只有可执行的二进制程序才能设定 SUID 权限,就是这个文件可以执行才可以设定,否则不起作用。命令执行者要对该程序拥有 x(执行)权限。命令执行者在执行该程序是获得该程序文件属主身份,打个比方,user1 用户没有 passwd 文件的读取权限,那么 user1 用户希望能看见 passwd 文件内容,只能将自己的身份添加到 passwd 文件所属的用户组,或 者是用 root 用户登录,或者就是修改 passwd 的文件权限,也就是 setuid 这个特殊的文件权限。SetUid 权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效。
赋 SUID 权限方式:
数字赋予法:chmod 4755 文件名。
字母赋予法: chmod u+s 文件名 这里 s 就是 SUID 的意思,取消可以用 chmod u-s 文件名。
普通用户不能设置 SUID 权限。要用 root 用户执行。
[song@localhost ~]$ chmod 4755 /bin/vichmod: 更改"/bin/vi" 的权限: 不允许的操作
下面有个文件 aaa,并且用户对该文件拥有执行权限,我们去给该文件添加 SUID 权限。
红色箭头那里之前 x 变成了 s,表示 aaa 文件拥有了 s 权限,同时 aaa 文件也变成了红色,表示不安全。
如果要是用户对 aaa 没有执行权限呢。我们创建一个新文件 bbb,并修改其权限不包含执行权限。然后在赋予 SUID。
这里变成了大 S,这里大 S 表示不能正确使用的。
我们知道用户的密码是保存在/etc/shadow 文件中,我们看下这个文件的权限
[root@localhost tmp]# ll /etc/shadow---------- 1 root root 1696 5 月 27 18:58 /etc/shadow
发现这个文件的权限是 000,用户属主是 root,那么除了 root 用户能修改密码外,用户自己同样也能修改密码,为什么没有写入这个文件的权限去修改密码,这是因为这个 SUID 功能。我们看下 passwd 这个命令就知道原因了。
[root@localhost tmp]# which passwd/usr/bin/passwd[root@localhost tmp]# ll /usr/bin/passwd-rwsr-xr-x. 1 root root 27832 6 月 10 2014 /usr/bin/passwd
首先 passwd 命令是可执行的,同时发现 passwd 命令默认就有 SUID 权限,而且任何用户对这个命令也有执行权限(最后有 x),所以普通用户在执行这个命令的时候就会拥有这个命令所属主的身份,变成了 root,命令执行完后这个身份就消失了又变成普通用户。
系统还有其他的命令也包含 SUID 权限,比如 su 命令。
SUID 权限比较灵活,所以不能随意设置,不然会对系统造成潜在的危害。比如 vi 命令,如果添加 SUID 权限,那么普通用户获取 root 身份就可以修改所有的文件。
所以 SUID(也包括 SGID)权限原则:
关键的目录要严格控制写权限,比如根目录“/”,“/usr”目录等。用户的密码设置要严格遵守密码三原则(复杂性,易记性,时效性)。对系统中默认应该具有 SUID,SGID 权限的文件列表出来,定时检查有没有之外的文件被设置 SUID,SGID 权限。可以通过 find 命令查找。
[root@localhost tmp]# find / -type f ( -perm -04000 -o -perm -02000 ) -exec ls -lg {} ; 04000 表示 SUID 02000 表示 SGID -o 表示或者的意思 find: ‘/proc/26739/task/26739/fdinfo/6’: 没有那个文件或目录 find: ‘/proc/26739/fdinfo/6’: 没有那个文件或目录-rwsr-xr-x 1 root 0 5 月 28 14:19 /root/tmp/aaa-rwSr--r-- 1 root 0 5 月 28 14:30 /root/tmp/bbb-rwsr-xr-x. 1 root 32584 6 月 10 2014 /usr/bin/fusermount-r-xr-sr-x. 1 tty 15344 6 月 10 2014 /usr/bin/wall-rwsr-xr-x. 1 root 64200 3 月 6 2015 /usr/bin/chage-rws--x--x. 1 root 23960 3 月 6 2015 /usr/bin/chfn-rws--x--x. 1 root 23856 3 月 6 2015 /usr/bin/chsh-rwsr-xr-x. 1 root 44232 3 月 6 2015 /usr/bin/mount-rwsr-xr-x. 1 root 32064 3 月 6 2015 /usr/bin/su-rwxr-sr-x. 1 tty 19536 3 月 6 2015 /usr/bin/write-rwsr-xr-x. 1 root 78168 3 月 6 2015 /usr/bin/gpasswd-rwsr-xr-x. 1 root 41752 3 月 6 2015 /usr/bin/newgrp
在上面我们新创建一个文件系统会根据 umask 的设置赋予新文件一个权限,那么 umask 的值是四位,如下:
[root@localhost ~]# umask0022
可是我们通过 chmod 命令给文件赋予权限一般都是三位数字,比如 755,644 等,那么这个 umask 后三位 022 是基本默认权限,第一位 0 就是特殊权限。
1.6、chattr 权限(不可改变位权限)
chattr 命令用于改变文件属性,只针对 root 用户有效。
格式:chattr [ + - = ] [选项] 文件或目录,这里的[ + - = ]是控制文件的属性。
: 增加权限。
: 删除权限。
= : 赋予/等于某权限。
常用选项:
i: 即 insert,不得任意更动文件或目录。
如果对文件设置 i 属性,那么不允许对文件进行删除,重命名,添加和修改数据,相当于锁定这个文件。如果对目录设置 i 属性,那么只能修改目录下的文件数据(文件数据保存在文件自己的数据块中),不允许建立和删除文件。a:即 append,让文件或目录仅供附加用途。
如果对文件设置 a 属性,只能在文件中添加数据(因为 vi 被禁用了,所以用 echo >> 输出重定向追加的方式),不能删除也不能修改数据。如果对目录设置 a 属性,那么只允许在目录中新建和修改文件,不允许删除文件,可以适用于各种日志文件。
案例:
给文件添加 i 属性
[root@localhost tmp]# chattr +i aa.txt[root@localhost tmp]# lsattr aa.txt 用 lsattr 命令查看----i----------- aa.txt
不允许删除
[root@localhost tmp]# rm -rf aa.txtrm: 无法删除"aa.txt": 不允许的操作
给目录添加 i 属性
评论