在gnu / linux上设置文件权限等的不同方法是什么


19

在很久以前的Unix上,我了解了chmod:在Unix上设置权限的传统方法(以及使用setuid,setgid允许程序获得特权)。

我最近在GNU / Linux上发现了一些更新的命令:

  • setfacl扩展了传统的ugo:rwx位和的tchmod
  • setcap比的ug:s位提供更多的细粒度控制chmod
  • chattr 允许文件的某些其他控件(混合使用)。

还有其他吗?



另请参阅unix.stackexchange.com/q/246606/4778,以获取扩展的ACL(richACL)。
ctrl-alt-delor

Answers:


28

chmod:更改文件模式位

用法(八进制模式):

    chmod <octal-mode> files...

用法(符号模式):

    chmod <references><operator><modes> files..

references是字母的组合ugoa,用于指定files将修改哪个用户的访问权限:

  • u 拥有它的用户
  • gfile的组中的其他用户
  • o 不在文件组中的其他用户
  • a 所有用户

    如果省略,则默认为所有用户使用,但仅umask修改允许的权限。

    operator是以下字符之一+-=

    • + 将指定的文件模式位添加到每个文件的现有文件模式位 file
    • - 将指定的文件模式位删除为每个文件的现有文件模式位 file
    • =除非明确指定,否则将添加指定的位并删除未指定的位(为目录设置的setuidsetgid位除外)。

    mode由字母的组合组成,这些字母rwxXst指定要修改的权限位:

    • r
    • w
    • x 执行(或搜索目录)
    • X 仅当文件是目录或已经为某些用户设置了执行位时才执行/搜索
    • ssetuid或setgid(取决于指定的references
    • t 限制删除标志或粘性位

    或者,mode可以由字母之一组成ugo,在这种情况下,模式对应于当前授予所有者的权限(u),file组的成员(g)或上述两个类别中的用户的权限(o)。

各方面的chmod解释:

  • 访问控制(另请参见setfacl
    • rwx —读取(r),写入(w)和执行/交叉(x)权限。
      • 读取(r)影响是否可以读取文件或是否可以列出目录。
      • 写入(w)影响是否可以写入文件,或是否可以编辑目录(添加,删除,重命名文件)。
      • 执行(x)影响是否可以运行文件,将其用于脚本(请参阅参考资料#!)以及其他可执行文件。
      • 十字(x)影响目录是否可以遍历。
    • st—目录上的粘滞位(t)和setgid(s)
      • 粘性位仅影响目录。将阻止文件所有者和root以外的任何人删除目录中的文件。
      • 目录中的setgid位将导致将新文件和目录的组设置为同一组,并且将新目录中的setgid位设置为该组(另请参见setfacl中的默认值)。
    • s —可执行文件上的setuid,setgid。
      • 如果您不知道自己在做什么,这可能以一种不好的方式影响安全性。
      • 运行可执行文件时,如果设置了这些位之一,则可执行文件的有效用户/组将成为文件的有效用户/组。因此,程序以该用户身份运行。看到setcap一个更现代的方式来做到这一点。

chown chgrp


chattr:更改文件属性

用法:

    chattr <operator><attribute> files...

operator是字符之一+-=:* +将所选的属性是对现有attributes的的files * -中删除所选attributes * =覆盖当前组属性中的文件具有与指定的attributes

attribute是字母的组合acdeijstuADST,对应于以下属性:

  • a 仅追加
  • c 压缩的
  • d 没有转储
  • e 范围格式
  • i 一成不变的
  • j 数据日记
  • s 安全删除
  • t 没有尾巴合并
  • u 无法删除
  • A没有atime更新
  • D 同步目录更新
  • S 同步更新
  • T 目录层次结构的顶部

setfattr:更改扩展文件属性

用法(设置属性):

    setfattr -n <name> -v <value> files...

用法(删除):

    setfattr -x <name> files...

name 是要设置或删除的扩展属性的名称

value 是扩展属性的新值


setfacl:更改文件访问控制列表

用法:

    setfacl <option> [default:][<target>:][<param>][:<perms>] files...

option 必须包含以下内容之一:

  • --set 设置文件或目录的ACL,替换之前的ACL
  • -m| --modify修改文件或目录的ACL
  • -x| --remove 删除文件或目录的ACL条目

    target是字母之一ugmo(或下面显示的较长形式):

  • uusers由标识的命名用户的权限,如果省略param,则默认为文件所有者uid

  • ggroup由标识的命名组的权限,如果省略则param默认为拥有组uid
  • mmask有效权利面具
  • oother其他人的权限

    perms是字母的组合rwxX,对应于权限:

  • r

  • w
  • x 执行
  • X 仅当文件是目录或已经对某些用户具有执行权限时才执行

    或者,perms可以是指示权限集的八进制数字(0- 7)。


setcap:更改文件功能

用法:

    setcap <capability-clause> file 

A capability-clause由以逗号分隔的功能名称列表和后面的操作员标记对列表组成。

可用的运营商=+-。可用标志是ei并且p有效可继承允许的功能集相对应。

=运营商将提高特定功能集和重置等。如果未与=操作员一起给出任何标志,则将重置所有功能集。在+-运营商将分别升高或降低一个或多个指定的功能集。


chcon:更改文件SELinux安全上下文

用法:

    chcon [-u <user>] [-r <role>] [-t <type>] files...

用户是SELinux的用户,例如user_usystem_uroot

角色是SELinux角色(始终object_r用于文件)

type是SELinux主题类型


chsmack:更改SMACK扩展属性

用法:

    chsmack -a <value> file

value是要为SMACK64扩展文件属性设置的SMACK标签


setrichacl:更改丰富的访问控制列表。

richacl的功能将添加更多高级ACL。

目前尚在进行中,因此无法向您详细介绍。我没有用过。

另请参阅此问题除了传统的“ rwx”和POSIX ACL,是否还有更高级的文件系统ACL?手册页


5
+1如果您添加了每个cmd用法的示例,则此答案将非常有用,因为我们可以在以后参考该答案!
slm

1
@slm感谢您的建议。我为每个命令添加了简短的用法说明。
Thomas Nyman 2013年

对任何希望超越此处所示功能的人员的警告。我已经使用了此处概述的功能。但是,尝试通过fork和exec继承它们(有用)似乎是不可能的。我认为这是一个错误看到unix.stackexchange.com/questions/196483/...
CTRL-ALT-delor

我在之前的评论中提到的错误是一个设计错误,已在内核4.3中通过添加环境功能进行了修复,请参见man7.org/linux/man-pages/man7/capabilities.7.html
ctrl-alt-delor

1
我希望看到所有这些示例,这将成为一个规范的答案!
statquant

1

从高层次:

  • 通过支持基本文件系统权限所有Linux所有文件系统,其在-rwxrwxrwx由处理chmod,与所有者和组标识符绑定到每一文件或文件夹上由处理文件系统沿chownchgrp; 基本上每个人都知道这部分。
  • xattr缩写或已知的扩展文件属性。它们是文件系统功能,使用户可以将计算机文件与文件系统未解释的元数据相关联,而常规属性具有文件系统严格定义的目的。属性是与文件和目录永久关联的name:value对,类似于与流程关联的环境字符串。有一些特定的linux命令,它们与简单地将此元数据设置为各种文件/文件夹有关。
  • SELINUX被称为安全linux。您可以通过网络搜索历史记录。还知道SELINUX可以替代,例如AppArmor,并且可能还有其他替代品。至此,这些内核模块提供了通过使用xattr进行MAC(强制访问控制)功能和机制selinux将文件安全性标签存储在xattrs中。并且有与selinux相关的特定命令。

其他要点:

  • 关于xattr和selinux ,gnu / linux的时代和版本关系到可用功能和功能。
  • 据报道,并非所有文件系统都支持xattr;最好根据个人使用的Linux发行版和版本(rhel / suse / debian,irix,solaris,aix,unix从1960年代开始)进行个别研究
  • 实际上,只有uid / gid加上xattr固有的基本文件/文件夹权限才能使一切变为可能;SELinux使用xattr来存储文件/文件夹安全标签...使用selinux,所有低级的工作都已在xattr中完成/定义,以供您使用。因此,如果您的旧文件系统不支持xattr,则不会使用selinux。
  • 您可以启用或禁用selinux(或apparmor或任何其他内核模块)
  • 根据您的linux版本,可能能够为给定的已挂载文件系统启用或禁用xattr;我记得在SLES 11中的fstab挂载选项,user_xattr我可以选择在安装时在根文件系统上不提供xattr。我认为现在使用RHEL / CentOS 7,默认情况下存在xattr,而您不能拥有它。
  • 当执行lsif 时-rwxrwxrwx++表明该对象上存在扩展文件属性。
  • 访问控制列表(ACL):是附加到对象的权限的列表。ACL指定授予哪些用户或系统进程访问对象的权限,以及对给定对象允许的操作。
  • 来自centos Wiki selinux: selinux是在内核中实现的MAC安全机制;在未启用SELinux的情况下,仅使用传统的自由访问控制(DAC)方法(例如文件权限或访问控制列表(ACL))来控制用户的文件访问;允许用户和程序都向其他人授予不安全的文件权限,或者相反,允许用户和程序访问系统的某些部分,而这些部分对于正常操作是不必要的;本质上,在传统的DAC模型下,有两个特权级别,即根用户级别和用户级别,并且没有简单的方法来强制建立最小特权模型。由root启动的许多进程后来都失去了以受限用户身份运行的权利
  • 值得一读的是将xattr和ACL的使用放在透视图上,因为linux [kernel]将所有内容都视为一个文件(阻止设备或网络端口),您几乎可以使用xattr对其进行标记并通过selinux实施某种访问控制,不只是文件/文件夹。 https://wiki.centos.org/HowTos/SELinux
  • xattr可能会导致在系统与文件系统以及NFS之间移动数据的问题,在这种情况下,[较新的]系统对xattr的支持要比对较旧的系统更为全面,而较旧的系统可能无法识别所有这些扩展属性。请注意tar在xattr 上使用东西,如果它停留在该系统上没问题,但是如果xattr很重要(例如samba并在win10 ntfs和linux ext3 / 4,btrfs,xfs之间复制),则返回到其他地方可能会出现问题。在网络连接的存储设备之间来回移动)
  • 如果没有使用xattrs中定义的selinux或其他机制来强制ACL ,则xattrs从理论上讲就没有任何意义,可以被丢弃或剥离,因为在那一点上,这只是多余的负担。
  • 请小心,现在在rhel / centos 7中禁用 selinux,因为如果丢失了通过xattr进行的文件系统标记,则在将selinux改回强制宽容状态时会引起问题;再次取决于您的Linux版本以及它如何通过selinux使用xattr。

基本的Samba共享在RHEL / CentOS 7中不起作用...因为默认情况下selinux设置为强制执行;在您允许之前,selinux拒绝了所有内容,因此请禁用selinux(错误)或将其设置为宽松。如果将selinux保留为强制执行,则必须使用扩展属性将要samba共享的文件夹标记为扩展名,以便selinux识别并允许共享。因此,如果保留selinux强制执行,则使用所有selinux命令(它将设置必要的xattrs):

# from centos 7.6 /etc/samba/smb.conf.example

# Turn the samba_domain_controller Boolean on to allow a Samba PDC to use the useradd and groupadd family of binaries.
# Run the following command as the root user to turn this Boolean on:

# this is an selinux command, not 
setsebool -P samba_domain_controller on

# If you create a new directory, such as a new top-level directory, label it with      samba_share_t
# so that SELinux allows Samba to read and write to it.
# Do not label system directories, such as /etc/ and /home/ with samba_share_t, as such directories should already have an SELinux label.


# the xattr having the name "samba_share_t" is labelled onto "/mydatashare"
# this xattr of syntax "samba_share_t" is recognized by an existing rule in selinux
# if the folder does not have the xattr "samba_share_t" then the  rule in selinux (when enforced) will prevent access via samba to the folder.

chcon -t samba_share_t /mydatashare

您可以在具有此samba共享的linux系统上进一步使用selinux,以对该samba共享下的文件/文件夹实施限制(使用任何扩展属性)。由于这些文件/文件夹被共享,因此用户可以合法地将某些文件/文件夹复制到他们的win10 pc,然后再复制回去,从而失去扩展属性。现在,在该来回复制之后,在该linux系统上,selinux将限制对所述文件的访问,因为不再存在必需的xattr,并且用户/管理员大为惊讶,为什么现在事情不能正常工作了……设置selinux允许并认识到xattr在审计日志中显示丢失s 的问题,但这不会直接表明这是由于来回副本丢失了xattr的结果。还应考虑数据备份和还原以及需要记住的潜在工作xattr如果要基于正确的xattrs 强制执行安全性,则除了uid / gid之外还包括s。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.