允许 SFTP 用户创建新文件,但不允许修改或删除它们

允许 SFTP 用户创建新文件,但不允许修改或删除它们

我正在设置一个服务器来托管我的雷斯蒂奇备份。备份将通过 SFTP 完成。在备份期间,restic 无需删除或修改任何文件,因此我决定防止用户这样做。这样,任何有权访问正在备份的机器的人都无法轻易破坏我的备份。

我想使用 chroot 来限制该用户仅能访问备份存储库。我想到的唯一办法是chmod -R 444 $BACKUP_LOCATION && chown -R root:root $BACKUP_LOCATION每分钟运行一次 cron,但这似乎有点不靠谱。

有没有更优雅的方法?

答案1

你可以通过混合使用来实现这一点属性(Linux 的扩展属性) &inotify 实用程序

实现此目的的一种方法是使用扩展属性:

1- 在您的目录中设置正确的权限,以便任何人都可以在其中创建文件并'光盘' 至此:

sudo chmod 777 $BACKUP_LOCATION

2-安装inotify 工具(这取决于你的操作系统),这个实用程序将使你能够观察对 $BACKUP_LOCATION 所做的更改,这里是新文件创建检测:

3-编辑并保存以下脚本,此处新文件将具有扩展属性不可变的(这意味着即使使用 root 用户也无法删除或编辑它们)并且r--,r--,r--权限:

#!/bin/sh
BACKUPDIR="/path/your/backup/directory"
inotifywait -m -r -e create --format '%w%f' "${BACKUPDIR}" | while read NEWFILE
do
    chmod 444 "$NEWFILE"
    chattr +i "$NEWFILE"
done

4- 在以下位置创建服务“/etc/systemd/system/backuprotection.service” 这会将您的脚本作为守护进程运行,因为它需要在后台运行,同时还要确保脚本在重新启动后仍能继续运行:

[Unit]
Description=Service for backup protection

[Service]
User=root
ExecStart=/path/your/script.sh
SuccessExitStatus=143
TimeoutStopSec=10
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

5-从磁盘重新加载新配置:

sudo systemctl 守护进程重新加载

6-启用您的服务,以便它在 systemd 启动后启动:

sudo systemctl enable backuprotection

7-启动并检查状态备份保护服务 :

sudo systemctl start script.sh
sudo systemctl status backuprotection

8- 检查 $BACKUP_LOCATION 下新创建的文件 xattributes 和权限:

# Permissions should be r--,r--,r--
ls -ltr $BACKUP_LOCATION
# "i" should be set on the 5th position
lsattr $BACKUP_LOCATION

相关内容