AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题

问题[acl](unix)

Martin Hope
ali
Asked: 2023-05-02 23:29:23 +0800 CST

使用 setfacl 授予权限后,用户无法写入目录

  • 5

编辑:我忘记添加/mnt/storage已使用mergerfs安装(合并 2 个格式化为 ext4 的驱动器)

我正在运行 Lubuntu 22.04.2 并运行了以下命令(注意用户radarr属于该组media):

sudo setfacl -Rm  u:radarr:rwx /mnt/storage/Films
sudo setfacl -dRm u:radarr:rwx /mnt/storage/Films
sudo setfacl -Rm  g:media:rwx  /mnt/storage/Films
sudo setfacl -dRm g:media:rwx  /mnt/storage/Films

编辑:这是输出getfacl /mnt /mnt/storage /mnt/storage/Films:

getfacl: Removing leading '/' from absolute path names
# file: mnt
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

# file: mnt/storage
# owner: ali
# group: root
user::rwx
user:sonarr:rwx
user:radarr:r-x
group::rwx
group:media:r-x
mask::rwx
other::r-x

# file: mnt/storage/Films
# owner: ali
# group: ali
user::rwx
user:radarr:rwx
group::rwx
group:media:rwx
mask::rwx
other::r-x
default:user::rwx
default:user:radarr:rwx
default:group::rwx
default:group:media:rwx
default:mask::rwx
default:other::r-x

但是,当我使用以下方法测试写入权限时:

sudo -u radarr test -w /mnt/storage/Films; echo "$?"

即使在重新启动后,它也会返回 1 而不是 0,所以我想我误解了什么。是否有我错过的额外命令?

acl
  • 1 个回答
  • 20 Views
Martin Hope
Damn Vegetables
Asked: 2022-12-07 09:23:43 +0800 CST

setfacl -m 没有在传统文件权限的基础上增加权限?

  • 7

有一个目录/test/test2/。它的所有者是root,组是test,权限是drwxr-xr-x。我setfacl -m group:test:w ./在那个目录中执行。

现在,作为test其组包括的用户test,如果我getfacl ./在该目录中运行,输出是,

# file: .
# owner: root
# group: test
user::rwx
group::r-x
group:test:-w-
mask::rwx
other::r-x

现在,如果我执行touch test.txt,我得到touch: cannot touch 'test.txt': Permission denied。为什么会这样?不setfacl -m给权限加上chmod权限吗?我的意思是,我给了test组写权限setfacl,因为组有r-x传统权限(可以用更改chmod),这不是有效地给rwx了test组吗?

我试过namei -l /test/test2/了,输出是

f: /test/test2/
drwxr-xr-x root root /
drwxr-xr-x root root test
drwxrwxr-x root test test2
acl
  • 1 个回答
  • 37 Views
Martin Hope
bicyclesonthemoon
Asked: 2022-09-29 01:13:24 +0800 CST

从 C 程序的 AWK 脚本调用 cat 时,SETUID 无效

  • 1

考虑以下说明我的问题的简化示例。
服务器的操作系统是 Debian 11 armhf。

我们在目录中/botm/test/:

drwx------ 2 b b 4096 Sep 27 19:27 hide
-rwsr-xr-x 1 b b 8260 Sep 27 19:54 test1
-rwsr-xr-x 1 b b 8264 Sep 27 19:58 test2
-rw-r--r-- 1 b b   56 Sep 27 19:52 test1.awk
-rw-r--r-- 1 b b  172 Sep 27 19:54 test1.c
-rw-r--r-- 1 b b  186 Sep 27 19:58 test2.c

可以看出,只有所有者b才能访问该目录/botm/test/hide。

我们现在是用户test
我们无法访问该文件/botm/test/hide/test.txt:

$ cat hide/test.txt
cat: hide/test.txt: Permission denied

好的。程序设置test1了test2SETUID 位。
所以即使我们是用户test,我们也可以像用户一样运行这些程序b。

首先,test2.c:

/* test2.c */
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv)
{
  int r;
  r = execl("/usr/bin/cat","/usr/bin/cat","/botm/test/hide/test.txt", (char *)0);
  printf("%d\n",r);
  return r;
}
$ ./test2
hidden content
$ 

正如预期的那样,它有效。

现在, test1.c, test1.awk:

/* test1.c */
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv)
{
  int r;
  r = execl("/usr/bin/mawk","/usr/bin/mawk","-f","/botm/test/test1.awk", (char *)0);
  printf("%d\n",r);
  return r;
}
# test1.awk
BEGIN {
  system("cat /botm/test/hide/test.txt");
};
$ ./test1
cat: /botm/test/hide/test.txt: Permission denied
$

令人惊讶的是,这不起作用。

我的期望:
如果我运行test1具有 SETUID 的程序,那么它应该像 user 一样运行b。
因此,如果程序调用/usr/bin/mawk,那么它也应该以 user 身份运行b。
因此,如果 awk 脚本随后调用cat,那么cat也应该以用户身份运行b。
因此cat应该能够访问/botm/test/hide/test.txt仅对 user 可用的内容b。
但这不会发生。

现在有一些真实的背景。
以上只是一个简化的例子。我有一个包含多个 C 和 AWK 程序的项目。从 C 程序调用 AWK 程序来处理一些文本并生成一些输出。这包括有时调用cat或其他系统工具。其中一些程序作为用户从 Apache 服务器运行,该用户www-data无权(也不应该拥有)这些程序创建的某些临时文件。这就是使用SETUID 的原因。这种工作流程在这个项目中被大量使用(从 2014 年开始)。

我现在将它从我的旧服务器(它工作的地方)移动到一个新的服务器(它不起作用的地方)。将项目更改为不依赖此机制将是一个非常大的重新设计,我现在不想这样做。

为什么当 C 程序(带有 SETUID)调用调用系统工具(cat,...)的 AWK 脚本时,SETUID 不被保留?
怎么做才能再次保存?
在以前版本的系统上它可以工作。

编辑添加:

我验证了 AWK 程序仍然可以访问隐藏文件,只有调用的东西system()没有。

所以我发现这种行为的原因是在使用system()(或getline使用管道)时mawk调用sh执行命令。
AWK 没有exec或类似的东西。

sh除非使用-p.
这是新的行为。这部分man sh在我的旧服务器上不存在:

           -p priviliged    Do not attempt to reset effective uid if it does not match uid. This is not set by default to help avoid incorrect usage by
                            setuid root programs via system(3) or popen(3).

因此,要使我的程序再次运行,我必须至少实现以下其中一项:

  • 默认情况下/usr/bin/sh不删除SETUID。
  • 使用for时使用makemawk或其他兼容的 AWK 解释器-p/usr/bin/shsystem()
  • 找到从 AWK 运行程序的不同方式
  • 重新设计所有程序以不依赖于此。例如,在 C、Perl 或 Python 中执行它们,它们确实具有不依赖于sh.

重新设计整个项目(以及其他一些也使用此工作流程的项目)将花费我目前没有的精力和时间,因此我真的需要以某种方式恢复完整的 SETUID 功能。

实际上,可以在 AWK 程序中轻松重新创建 的功能,但在我的项目中cat也可以调用其他工具: , , , , , , . 在大多数情况下,不使用 SETUID 调用它们是不可接受的。system()[ -fcatcpmkdirmvsleepwget

awk acl
  • 1 个回答
  • 54 Views
Martin Hope
Radius
Asked: 2022-06-20 18:41:34 +0800 CST

setfacl 未授予指定用户权限

  • 1

我有这个奇怪的问题,我正试图围绕 acl 让一些开发人员对文件夹中的一些文件具有写入权限

这是一个示例文件夹结构,我在那里有一个 settings.local.php 文件,我用 chmod 给它 000 权限,然后我用 setfacl 给它 rwX 权限,它是成功的,因为在 getfacl 中确实给了我正确的权限,但不影响所有者权限,并且用户实际上无法保存文件,实际上在此示例中,用户甚至无法读取文件...

hostname:/srv/clientname/sites/local# chmod 000 *

hostname:/srv/clientname/sites/local# ls -la
total 64
dr-xrwxrwx+  3 clientname www-data  4096 Jun 19 16:50 .
drwxrwxrwx+  5 clientname www-data  4096 Jun 19 16:51 ..
----------+  1 clientname www-data   775 Jun 19 16:50 settings.local.php

hostname:/srv/clientname/sites/local# groups clientname
clientname : www-data sftp ftp

hostname:/srv/clientname/sites/local# setfacl -m u:clientname:rwX *

hostname:/srv/clientname/sites/local# ls -la
dr-xrwxrwx+  3 clientname www-data  4096 Jun 19 16:50 .
drwxrwxrwx+  5 clientname www-data  4096 Jun 19 16:51 ..
----rw----+  1 clientname www-data   775 Jun 19 16:50 settings.local.php

hostname:/srv/clientname/sites/local# getfacl settings.local.php
# file: settings.local.php
# owner: clientname
# group: www-data
user::---
user:www-data:rw-
user:clientname:rw-
group::r--
group:www-data:rw-
mask::rw-
other::---

我究竟做错了什么

acl
  • 1 个回答
  • 91 Views
Martin Hope
JAck
Asked: 2022-03-20 02:02:09 +0800 CST

我可以在命令 setfacL 中取消特定用户的权限吗?

  • 6

我知道这个 setfacl 是为了给权限:

setfacl -m u:user:rwx myfolder

但是有没有人可以获取权限,例如:

setfacl -m u:user:-rwx myfolder
permissions acl
  • 1 个回答
  • 469 Views
Martin Hope
PSkocik
Asked: 2022-02-23 06:05:43 +0800 CST

将现有文件/目录的权限与将要创建的文件/目录的权限进行比较

  • 0

假设我正在使用系统调用创建具有某些名称和模式参数的文件或目录,并且操作失败并显示EEXIST.

假设我知道我当前umask的euid、 和egid,如何判断现有文件/目录是否具有与操作成功时系统调用所创建的权限等效的权限。

AFAIK,对于经典权限,如果 .st_gid == egid && .st_uid == euid && (.st_mode & 07777) == (RequestedMode & 07777 & ~CurrentUmask)发现/预期的文件类型匹配,答案将是真实的。

如何将其扩展到具有访问控制列表的系统?

permissions acl
  • 1 个回答
  • 24 Views
Martin Hope
gjvatsalya
Asked: 2021-11-02 08:21:48 +0800 CST

为什么我为目录所有者设置了 acl 的目录被拒绝权限(在删除所有标准 posix 权限之后)?

  • 1

我正在尝试在ls对目录的所有者和组具有 acl 权限的目录上执行命令(没有标准的 posix 权限集)。即使getfacl说用户应该能够这样做,这也会导致 Permission Denied。

这就是我正在做的事情:

  1. 在其中创建一个目录和一个文件。

mkdir /tmp/mydir && touch /tmp/mydir/myfile

  1. 检查我是否可以ls在此目录上执行。
jgazula@gazula:/tmp$ ls -al /tmp/mydir/
total 896
drwxrwxr-x  2 jgazula jgazula   4096 Nov  1 11:57 .
drwxrwxrwt 25 root    root    909312 Nov  1 11:57 ..
-rw-rw-r--  1 jgazula jgazula      0 Nov  1 11:57 myfile
  1. 现在,让我们删除此目录上的所有标准 posix 权限。

chmod 000 /tmp/mydir

  1. 验证权限。
jgazula@gazula:/tmp$ ls -al /tmp | grep mydir
d---------  2 jgazula jgazula   4096 Nov  1 11:57 mydir
  1. 我们现在应该做不到ls。
jgazula@gazula:/tmp$ ls -al /tmp/mydir/
ls: cannot open directory '/tmp/mydir/': Permission denied
  1. 设置jgazula用户和组的 acl 权限。

sudo setfacl --mask -Rm u:jgazula:rwx,g:jgazula:rwx /tmp/mydir/

  1. 验证 acl 权限。
jgazula@gazula:/tmp$ getfacl -ep /tmp/mydir/
# file: /tmp/mydir/
# owner: jgazula
# group: jgazula
user::---
user:jgazula:rwx        #effective:rwx
group::---          #effective:---
group:jgazula:rwx       #effective:rwx
mask::rwx
other::---
  1. 既然acl权限(包括有效权限)看起来不错,应该可以ls在目录上执行吧?
jgazula@gazula:/tmp$ ls -al /tmp/mydir/
ls: cannot open directory '/tmp/mydir/': Permission denied

但我不能,我不明白为什么。

  1. 有趣的是,当我检查标准 posix 权限时,组权限位已设置?不确定我是否理解为什么只更新了组权限。
jgazula@gazula:/tmp$ ls -al /tmp | grep mydir
d---rwx---+  2 jgazula jgazula   4096 Nov  1 12:13 mydir
  1. 让我们为所有者和组设置 acl 权限(即,从命令中省略所有者/组)。

sudo setfacl --mask -Rm u::rwx,g::rwx /tmp/mydir/

  1. 再次验证 acl 权限。
jgazula@gazula:/tmp$ getfacl -ep /tmp/mydir/
# file: /tmp/mydir/
# owner: jgazula
# group: jgazula
user::rwx
user:jgazula:rwx        #effective:rwx
group::rwx          #effective:rwx
group:jgazula:rwx       #effective:rwx
mask::rwx
other::---
  1. 检查我ls现在是否可以执行。
jgazula@gazula:/tmp$ ls -al /tmp/mydir/
total 896
drwxrwx---+  2 jgazula jgazula   4096 Nov  1 11:57 .
drwxrwxrwt  25 root    root    909312 Nov  1 11:57 ..
-rwxrwxr--+  1 jgazula jgazula      0 Nov  1 11:57 myfile

为什么步骤#6 不能单独工作?我正在为用户和组显式设置 acl 权限。为什么我需要执行步骤 #11?

permissions acl
  • 1 个回答
  • 996 Views
Martin Hope
pgoetz
Asked: 2019-08-20 07:30:50 +0800 CST

为什么 NFSv4 不能以可用的方式翻译 POSIX ACL?

  • 3

我有一个 XFS 文件系统,其中某些文件夹(使用模式设置)没有公共可访问性,组所有者具有只读权限。有一个程序(以用户 cryosparc_user 运行)需要对所有文件的读取权限,所以我添加了一个默认的 POSIX ACL 授予 cryosparc_user 读取权限。

不幸的是,大部分处理都是在 NFSv4 挂载此文件系统的工作站上完成的,并且由于某种原因,POSIX ACL 没有在工作站上被翻译或接受(嗯,它们是,但显然不是以可用的方式),我可以不知道为什么。

服务器和工作站都在运行 Ubuntu 18.04,我不能简单地将 cryosparc_user 添加到组中,因为该组是 Active Directory 安全组(我们正在通过 AD 进行身份验证),而 cryosparc_user 是本地用户,不能在 AD 中设置。

以下是文件服务器上的权限:

root@kraken:/EM/EMtifs# getfacl pgoetz
# file: pgoetz
# owner: pgoetz
# group: cns-cnsitlabusers
user::rwx
group::r-x
other::---
default:user::rwx
default:user:cryosparc_user:r-x
default:group::r-x
default:mask::r-x
default:other::---

root@kraken:/EM/EMtifs# id cryosparc_user
uid=1017(cryosparc_user) gid=1017(cryosparc_user) groups=1017(cryosparc_user),10002(mclellan),10003(taylorlab)

以下是它们在安装了 NFSv4 的工作站上的样子:

root@javelina:/EM/EMtifs# getfacl pgoetz
# file: pgoetz
# owner: pgoetz
# group: cns-cnsitlabusers
user::rwx
group::r-x
other::---

root@javelina:/EM/EMtifs# id cryosparc_user
uid=1017(cryosparc_user) gid=1017(cryosparc_user) groups=1017(cryosparc_user)

root@javelina:/EM/EMtifs# nfs4_getfacl pgoetz
A::OWNER@:rwaDxtTcCy
A::GROUP@:rxtcy
A::EVERYONE@:tcy
A:fdi:OWNER@:rwaDxtTcCy
A:fdi:1017:rxtcy
A:fdi:GROUP@:rxtcy
A:fdi:EVERYONE@:tcy

请注意 NFS4 ACL 查询中倒数第三行。似乎为 cryosparc_user 用户提供了读取权限(两个系统上的本地 UID 均为 1017),但是

cryosparc_user@javelina:/EM/EMtifs$ whoami
cryosparc_user
cryosparc_user@javelina:/EM/EMtifs$ ls pgoetz
ls: cannot open directory 'pgoetz': Permission denied

从我读过的所有内容来看,没有要设置的挂载标志或类似的东西;这应该会自动工作,我不知道为什么它不工作。

我的后备计划是恢复在这些文件夹上使用本地组(以便可以将 cryosparc_user 添加到本地组),但这需要在每个系统上复制 AD 身份验证结构,这将是一个令人头疼的维护问题。

另一个想法是也使用 cryosparc_user 用户凭据对该文件系统进行只读 SMB 挂载,但我对双重挂载 500T 文件系统也不是很兴奋。我宁愿身份验证以合理的方式工作。

linux acl
  • 2 个回答
  • 2023 Views
Martin Hope
bbarker
Asked: 2019-06-23 05:27:20 +0800 CST

如何为目录设置 ACL,以便特定用户对目录和所有子目录具有 rwx 访问权限?

  • 0

注意:为了澄清问题,我假设启动一个空目录;我意识到如果它不是空的,我可以-R使用setfacl.

这是我尝试过的(想授予/tmp/badDiruser的访问权限me,当它被创建和拥有时otheruser):

$ sudo -u otheruser mkdir /tmp/badDir
$ sudo setfacl -dm "user:me:rwX" /tmp/badDir
$ sudo -u otheruser touch /tmp/badDir/baz
$ touch /tmp/badDir/baz

所以乍一看,这看起来不错。

但是,如果我尝试我需要的某些其他操作,这不是我所期望的:

$ touch /tmp/badDir
touch: setting times of '/tmp/badDir': Permission denied
$ touch /tmp/badDir/foo
touch: cannot touch '/tmp/badDir/foo': Permission denied

所以看起来我无法修改目录元数据或在目录中创建文件,尽管我可以修改用户创建的目录中的文件otheruser。

ls和的输出getfacl是:

$ ls -last /tmp/badDir
total 0
0 drwxrwxrwt  1 root     root     1794 Jun 22 09:22 ..
0 -rw-rw-r--+ 1 otheruser otheruser    0 Jun 22 09:22 baz
0 drwxr-xr-x+ 1 otheruser otheruser    6 Jun 22 09:22 .


$ getfacl /tmp/badDir
getfacl: Removing leading '/' from absolute path names
# file: tmp/badDir
# owner: otheruser
# group: otheruser
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:me:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

$ getfacl /tmp/badDir/baz
getfacl: Removing leading '/' from absolute path names
# file: tmp/badDir/baz
# owner: otheruser
# group: otheruser
user::rw-
user:me:rwx     #effective:rw-
group::r-x          #effective:r--
mask::rw-
other::r--

更新 1

只是为了确认,我确实启用了 acls:

$ sudo tune2fs -l /dev/disk/by-uuid/8d6bba7d-63c1-4406-855a-f56987dea98e | grep acl                                     
Default mount options:    user_xattr acl
permissions acl
  • 1 个回答
  • 700 Views
Martin Hope
cajjed
Asked: 2019-03-20 13:28:04 +0800 CST

UBIFS 可以设置为 ACL 吗?

  • 1

使用 systemd 241 在内核 4.20.17 上运行 Debian Buster:

+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN2 +IDN -PCRE2 default-hierarchy=hybrid

我在一个 nand (/dev/mtd3) 分区上有两个 ubifs 卷:

ubi0:rootfs on / type ubifs (ro,relatime,assert=read-only,ubi=0,vol=1)
/dev/ubi0_2 on /var type ubifs (rw,relatime,assert=read-only,ubi=0,vol=2)

我收到以下错误:

systemd-journald[747]: Failed to set ACL on /var/log/journal/2f572c0abab24e2fafc1b969aba78f1f/user-1000.journal, ignoring: Operation not supported

我可以将 UBIFS 设置为 ACL,如果可以,如何调整我的 fstab 以启用它?

/dev/ubi0_2 /var ubifs defaults,auto 0 0
acl systemd-journald
  • 1 个回答
  • 370 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve