安全问题

安全问题

最近,我一直在努力寻找一种方法,让我父亲能够在基于 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=xyzLABEL=somelabel标识您的驱动器,而不是在脚本中使用 /dev/sdc1 (顺便说一句,在另一篇文章中您使用 /dev/sdc0 )。

在该行上,您还可以指定noauto,user为选项,以便系统上的普通用户可以安装驱动器。这解决了我所看到的最大的安全问题,即您需要以 root 权限运行一些脚本。

之后,您只需集中精力确保没有人能够访问不允许的 PHP 页面,但至少如果您的安全措施失败,那么就不会有包含陷门的脚本(这可能比以mountSUID root 身份运行并使用陷门的脚本更有可能)。

我没有查看实际的脚本,因此它们可能包含错误,这些只是我认为您应该遵守的一般原则。希望我能帮助您。

相关内容