最近,我一直在努力寻找一种方法,让我父亲能够在基于 Linux 的系统上安装和卸载硬盘。我想到了一种用PHP执行shell脚本的方法。以下是我的想法:
首先,我制作了两个脚本来负责安装和卸载硬盘:
卸载脚本.sh:
#!/bin/bash
MOUNT="/home/media/externalHardDrive"
if grep -qs "$MOUNT" /proc/mounts; then
umount "$MOUNT"
if [ $? -eq 0 ]; then
echo "HardDrive kan veilig worden verwijderd :D"
else
echo "Er is iets mis gegaan, blijf overal vanaf :("
fi
else
echo "Er is geen HardDrive gemount op $MOUNT, deze kan daarom niet verwijderd worden!"
fi
挂载脚本.sh
#!/bin/bash
MOUNT="/home/media/externalHardDrive"
if grep -qs "$MOUNT" /proc/mounts; then
echo "HardDrive is al gemount op $MOUNT ;)"
else
mount /dev/sdc1 "$MOUNT"
if [ $? -eq 0 ]; then
echo "HardDrive is succesvol gemount :D"
fi
fi
这两个脚本将简单地检查 /dev/sdc0 当前是否已安装,如果没有则执行其任务。
/etc/sudoers:
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Allow members of group sudo to execute any command
# %sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
www-data ALL=(ALL) NOPASSWD: /home/media/mount_script.sh
www-data ALL=(ALL) NOPASSWD: /home/media/unmount_script.sh
www-data ALL=NOPASSWD: /bin/sh
我以某种方式编辑了 /etc/sudoers ,因此只有 www-data 有权使用 sh 执行脚本。其他组和/或用户不应有权访问任何 sudo 命令。
PHP 文件:
<?php
if ((substr($_SERVER['REMOTE_ADDR'],0,10) == "192.168.0.") || ($_SERVER['REMOTE_ADDR'] == "127.0.0.1")) {
if(isset($_POST['mount'])) {
$output = shell_exec('sudo sh /home/media/mount_script.sh');
}
if(isset($_POST['unmount'])) {
$output = shell_exec('sudo sh /home/media/unmount_script.sh');
}
?>
<html>
<head>
<title>Control panel</title>
</head>
<body style="text-align:center;">
<h2>HardDisk Control Panel</h2>
<p>Status:</p>
<textarea cols="33" rows="10"><?php if(isset($output)) { echo $output; } ?></textarea><br /><br />
<form method="post">
<input type="submit" name="mount" value="mount" />
<input type="submit" name="unmount" value="unmount" />
</form>
</body>
</html>
<?php } ?>
在这个文件中,我确保从 192.168.0.* 以外的其他 IP 范围发出的请求将被忽略。如果用户位于 192.168.0.* IP 范围内,我允许用户使用 sudo 权限执行脚本。
有人可以检查此配置是否存在我应该修复的安全问题吗?
我在 Debian 服务器上运行这一切
答案1
您应该在文件中创建一个条目/etc/fstab
(按照您的其他问题),并使用UUID=xyz
或LABEL=somelabel
标识您的驱动器,而不是在脚本中使用 /dev/sdc1 (顺便说一句,在另一篇文章中您使用 /dev/sdc0 )。
在该行上,您还可以指定noauto,user
为选项,以便系统上的普通用户可以安装驱动器。这解决了我所看到的最大的安全问题,即您需要以 root 权限运行一些脚本。
之后,您只需集中精力确保没有人能够访问不允许的 PHP 页面,但至少如果您的安全措施失败,那么就不会有包含陷门的脚本(这可能比以mount
SUID root 身份运行并使用陷门的脚本更有可能)。
我没有查看实际的脚本,因此它们可能包含错误,这些只是我认为您应该遵守的一般原则。希望我能帮助您。