我已经阅读了几篇文章,如何使用Rsync和公钥authentication自动备份文件。 他们都非常相似。 我刚刚完成一切设置,一切正常,但…我刚刚发现一篇文章,说这是不安全的。 我做了以下几点:
/var/sites/.ssh (文件authorized_keys )。 该目录归"user12" from="BACKUP.SERVERS.IP.ADDRESS",command="/root/validate_rsync" 我使用以下内容创build了一个文件/ root / validate_rsync:
#!/bin/sh echo $SSH_ORIGINAL_COMMAND >> /var/log/synchronize-log.log case "$SSH_ORIGINAL_COMMAND" in *\&*) echo "Rejected" ;; *\;*) echo "Rejected" ;; *\(*) echo "Rejected" ;; *\{*) echo "Rejected" ;; *\<*) echo "Rejected" ;; *\>*) echo "Rejected" ;; *\`*) echo "Rejected" ;; *\|*) echo "Rejected" ;; rsync\ --server*) $SSH_ORIGINAL_COMMAND ;; *) echo "Rejected" ;; esac
我运行rsync命令:
rsync -avzp --del -e "ssh -p 2211" [email protected]:/var/sites/photos/ /var/sites/sync/photos
我得到了错误信息:文件/root/validate_rsync权限问题。 我将文件/root/validate_rsync到/var/sites/validate_rsync ,并将其转换为user12:user12
现在同步工作。 但是我发现一篇文章说这是不安全的:
1-执行rsync命令的用户标识不应拥有validate_rsync命令本身,也不能写入它。 否则,rsync可以用另一个不validation的脚本覆盖validation脚本,甚至可以执行任意命令。
2-类似地,授权密钥文件不应该由rsync用户拥有或写入,否则rsync可以用来覆盖该文件,一个不需要运行validate-rsync的需求,或者一个运行其他命令的文件代替。
资源
我能做什么? 如果validate_rsync属于root,则同步不会启动,因为user12不能访问root的文件。 如果authorized-keys文件将由其他用户拥有,我将无法使用用户名user12login。
我的问题:
我应该在哪里放置validate_rsync和授权密钥文件,在哪个目录? 他们应该拥有什么样的权限和所有权?
有什么办法如何告诉validate_rsync文件,只允许同步2个文件夹: /var/sites/photos/ , /var/sites/photos2/
这些安全问题是正确的。 所以,为了回答你的第一个问题:为了使其工作,你应该把validate_rsync放在user12具有执行权限的目录下,而不是写入。 同样的validate_rsync文件应该对用户具有读取和执行权限,但是当然不能写入。 这里的问题是/root默认情况下只能由root用户访问,你需要一个path,每个目录对user12有执行权限。 例如,您可以将validate_rsync复制到/usr/local/bin并使其由root拥有。 只要user12可以执行和读取,就没关系。
您不需要保护您的authorized_keys文件。 强制user12通过configuration运行一个命令会更好,在sshd_configinput以下内容:
Match user user12 ForceCommand /usr/local/bin/validate_rsync
我认为这个解决scheme比修改authorized_keys更好。
另外,在你的validate_rsync我会引用$SSH_ORIGINAL_COMMAND (更安全),我会改变你的case来检查正则expression式命令的有效性,使用grep ; 更简单,更紧凑,更强大:
echo "$SSH_ORIGINAL_COMMAND" >> /var/log/synchronize-log.log if echo "$SSH_ORIGINAL_COMMAND" | grep -qE '[&;<>`|]'; then echo Rejected elif [[ "${SSH_ORIGINAL_COMMAND:0:14}" == "rsync --server" ]]; then $SSH_ORIGINAL_COMMAND else echo Rejected fi
要回答第二个问题,在loggingSSH_ORIGINAL_COMMAND时,可以使用要考虑的目录运行testing,然后检查所获得的SSH_ORIGINAL_COMMAND。 然后你可以让validate_rsync来validation那个命令。
为了保护authorized_keys文件,我遇到了这个解决scheme: https : //superuser.com/questions/852434/how-to-protect-authorized-keys-file
如果您不打算经常更改,那么删除该文件的写入权限是很常见的。
chmod 400 ~/.ssh/authorized_keys
当然,现在,写入权限可能会被恶意脚本添加回来,所以您需要将文件及其父目录设置为不可变:
sudo chattr +i ~/.ssh/authorized_keys sudo chattr +i ~/.ssh