我是一名新手,尝试在 Ubuntu Server 22.04 中创建一个用户,并赋予其对所有现有目录和文件的读取权限,以便它可以备份所有内容,并通过 SFTP 将它们复制到备份服务器(即 Windows Server 2019)。我尝试应用功能(7)但我想我做错了,因为备份用户无法读取没有“其他”权限的目录和文件(例如:)rwxrwx---
。我做错了什么?还有其他方法可以创建对系统中的所有文件和目录具有“只读”权限的用户吗?
我使用以下方式创建用户backup-user
:
sudo useradd backup-user -c "User to execute backups" -d /
并定义密码:
sudo passwd backup-user
然后用以下代码编辑文件/etc/security/capability.conf
:
sudo nano /etc/security/capability.conf
在文件末尾添加以下行:
cap_dac_read_search backup-user
然后登录backup-user
并尝试:
cd /var/log/apache2
接收:
-sh: 1: cd: can't cd to /var/log/apache2
还尝试在末尾添加/etc/security/capability.conf
以下行:
cap_dac_override backup-user
但得到了相同的结果。
目录的权限/var/log/apache2
为:
drwxr-x--- root adm
当记录为 时backup-user
, 的结果为capsh --print
:
Current: =
Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read,cap_perfmon,cap_bpf,cap_checkpoint_restore
Ambient set =
Current IAB:
Securebits: 00/0x0/1'b0
secure-noroot: no (unlocked)
secure-no-suid-fixup: no (unlocked)
secure-keep-caps: no (unlocked)
secure-no-ambient-raise: no (unlocked)
uid=1004(backup-apesp) euid=1004(backup-apesp)
gid=1004(backup-apesp)
groups=1004(backup-apesp)
Guessed mode: UNCERTAIN (0)
当以用户身份登录时sudo
,结果为sudo capsh --print
:
Current: =ep
Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read,cap_perfmon,cap_bpf,cap_checkpoint_restore
Ambient set =
Current IAB:
Securebits: 00/0x0/1'b0
secure-noroot: no (unlocked)
secure-no-suid-fixup: no (unlocked)
secure-keep-caps: no (unlocked)
secure-no-ambient-raise: no (unlocked)
uid=0(root) euid=0(root)
gid=0(root)
groups=0(root)
Guessed mode: UNCERTAIN (0)
答案1
您可以使用以下方法实现此目的访问控制列表 (ACL),它允许您向选定用户或组授予额外的文件权限,而无需更改文件的所有者或组。(鸣谢这个答案。
首先,为了消除依赖关系,请确保您有该setfacl
命令(例如,只需在终端中输入它),如果没有,请安装acl
包含该命令的包。
然后,您可以使用setfacl
授予backup-user
访问您想要备份的任何文件和目录的权限,而无需更改其所有者或组:
backup_paths=(
/home/jack
/home/mary
/var/log
)
for path in "${backup_paths[@]"; do
setfacl -Rm backup-user:rwX "$path"
setfacl -Rdm backup-user:rwX "$path"
done
关于调用的一些注意事项setfacl
:
该
-R
开关以递归方式应用权限。-m
无论出于什么原因,在权限规范之前都需要此开关(请参阅setfacl --help
)。X
注意中的大写字母:rwX
,其含义是“如果所有者可以执行该文件,则允许该用户执行该文件”。我们必须调用该命令两次:一次不带,
-d
用于更改现有文件和目录的权限;第二次带,用于-d
更改默认目录的权限,这会导致该权限适用于将来在其下创建的任何文件/目录。
另请参阅setfacl --help
和man setfacl
。
如果你确实想允许backup-user
访问一切,您可以改为调用相同的两个命令/
。
答案2
由于您对另一个顶级答案的评论表示您实际上正在尝试将一些服务器目录镜像到另一台机器(有些困难),我将编写另一个我认为可以相当容易地完成工作的解决方案。
首先,rsync
这可能是实现此目的的完美工具。它可以镜像整个目录树,同时保留其属性(所有者、组、权限、时间戳(时间戳对某些服务器很重要)等),包含选择性地将镜像文件树中的文件列入白名单/黑名单的选项,并尽可能高效地执行任务(因此,如果已经执行了备份,它会比较源树和目标树并仅传输新的更改,因此,例如,如果源文件和目标文件的时间戳和大小相同,则跳过传输;您可以自定义此行为)。
备份的最基本用法rsync
可能就是这样:
rsync -ai SRC DEST
其中,SRC
和DEST
可以是本地目录,也可以是远程挂载的位置。我们稍后会讲到这些,但首先让我们解释一下这些开关:
-a
(代表--archive
)实际上是 的简写-rogptlD
。这些开关的含义是:r
:递归o
:保留所有者g
:保留组p
:保留权限t
:保留时间戳l
:将符号链接保留为符号链接D
:将特殊文件(设备/fifos/等)保存为特殊文件
-i
代表“逐项列出更改”,它为每个传输/更新的文件或目录打印一行,以多列前缀开头,解释正在更新的内容。(其输出格式超出了本答案的范围,但您可以打开man rsync
并查找该--itemize-changes, -i
部分,其中包含这些列含义的完整描述。)该
-m
开关还可用于修剪(即不备份)空目录,但如果您的服务器需要存在任何空目录,您可能需要小心使用它。
如您所见,仅使用两个开关,rsync
已经完成了大约 90% 的任务。如果您想有选择地镜像 下的某些文件SRC
,则可以使用以下一个或多个选项:
--files-from=FILE
:将 中列出的子路径(相对于SRC
)列入白名单FILE
。SRC
除了 中列出的路径之外,下的任何内容FILE
都不会被备份。每个路径占一行,空行将被忽略,以 开头的行#
被视为注释并被忽略。--exclude=PATTERN
:用于排除文件的 glob 模式,例如*.txt
导致从备份中rsync
排除所有文件。.txt
--exclude-from=FILE
:从中读取排除模式FILE
,每个模式占一行。--include=PATTERN
:排除模式的覆盖。例如,如果您使用--exclude=*.txt --include=items.txt
,则除名为 的文件外,所有.txt
文件都将被排除,items.txt
而这些文件将被包含。(请注意,与 不同--files-from
,使用并不自动意味着排除所有其他文件,除了使用和--include
明确排除的文件。)--exclude
--exclude-from
--include-from=FILE
:喜欢--include
但阅读模式来自FILE
rsync
有无数的选项可以供您查看man rsync
,但我提到这些是因为它们最有可能在最常见的备份任务中需要。
解决了这个问题,现在进入“如何rsync
与远程主机一起使用”部分。
如果您不执着于使用 SFTP,据我所知,rsync
与远程计算机一起使用的首选(也是最简单)方法是使用 SSH。由于 SFTP 只是通过 SSH 的文件传输协议,因此我假设您已经能够通过 SSH 从服务器连接到备份计算机(反之亦然)。因此,rsync
通过 SSH 使用非常简单:
# On the server
rsync -ai /path/to/src user@host:/path/to/dest
# Or on the backup machine
rsync -ai user@host:/path/to/src /path/to/dest
解决了这个问题后,剩下的事情就是确保rsync
可以访问服务器上要备份的文件和目录。就像我说的,您可以rsync
以 root 身份运行,并且可以通过在服务器上为其创建 systemd 服务来使此操作更简单、更安全(即避免使用 shell 脚本)。
# /etc/systemd/system/rsync-backup.service
[Unit]
Description=rsync backup service
[Service]
Type=oneshot
ExecStart=rsync -a --password-file=FILE SRC... user@host:DEST
其中FILE
包含用于 SSH 连接到远程的密码(显然您应该将其保存在只有 root 才能读取的安全地方,例如将其保存在/root/password.txt
和中chmod go-rwx /root/password.txt
)。
然后您可以创建一个计时器来每天自动运行它:
# /etc/systemd/system/rsync-backup.timer
[Unit]
Description=Run backup everyday
[Timer]
OnCalendar=daily
Accuracy=1min
Persistent=true
[Install]
WantedBy=timers.target
然后运行systemctl daemon-reload
让 systemd 读取新的单元文件。然后你可以使用以下命令启用计时器:
systemctl enable rsync-backup.timer
这将每天执行备份,以rsync
root 身份运行并具有访问本地计算机上所有内容的权限,据我所知,只要您不依赖古怪的 shell 脚本以 root 身份调用外部命令,这应该是安全的,这将是一场噩梦。并且rsync
仅通过 SSH 通信以访问远程主机,它不需要任何特殊权限,因此它可以以普通用户身份进行 SSH。但如果由于某种原因失败,您也可以以 root 身份进行 SSH,尽管在这种情况下我建议使用强 GPG 密钥进行 SSH,而不是密码。
除非我在这里遗漏了什么,否则这听起来像是一个完整且相当简单的解决方案,可以满足您的服务器备份需求。
编辑:另外,虽然我不认为这会解决你的服务器备份权限过高的问题,但你可能需要看看克隆,这是比许多用例更好的解决方案rsync
。它自称是“云存储的瑞士军刀”。它支持许多供应商包括 Google Drive、Dropbox、Amazon、Azure 和 SFTP、SMB、WebDAV 等通用协议,并且能够将来自任何提供商/协议的远程内容挂载为普通目录,这样您就可以使用任何程序访问它们,就像它们是文件系统上的普通文件一样。挂载不需要 root(使用 FUSER 执行),因此任何用户都可以挂载远程目录,而无需sudo
任何其他特殊权限。
快速了解一下它的用法:
# List available backends
rclone help backends
# Start CLI wizard which walks you through
# the creation of a new remote:
rclone config
# There are many commands that you can use,
# such as `rclone {copy|move|sync} SRC DEST`,
# but probably the most intuitive way to use it
# is by mounting the remote as a local directory:
mkdir -p ~/Remotes/GDrive
rclone mount gdrive:/ ~/Remotes/GDrive
# This will run in the foreground so you should
# switch to another terminal window.
# Then you can access files on the remote just as if
# they were local files, using any program you want:
cd ~/Remote/GDrive
ls # print list of files on the remote
# Copy/download files from the remote to your machine
cp -v -- *.png ~/Pictures
# Copy/upload files from your machine to the remote
cp -v -- ~/Music/*.ogg .
touch NEW-FILE # Create new file
vim script.py # Edit new/existing file
# Browse remote with graphical file manager
dolphin . &
# etc.
要卸载远程,只需返回正在rclone mount
运行的终端,然后使用 将其杀死Ctrl-C
。或者,如果您在后台生成它,则可以用 将其杀死killall rclone
。