Debian

安全問題

  • November 7, 2014

我最近一直在努力為我父親在基於 linux 的系統上安裝和解除安裝硬碟驅動器提供一種簡單的方法。我想到了一種用 PHP 執行 shell 腳本的方法。以下是我想出的:

首先,我製作了 2 個腳本來負責安裝和解除安裝硬碟:

unmount_script.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

mount_script.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

這 2 個腳本將簡單地檢查 /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-range 內,我允許使用者使用 sudo 權限執行腳本。

有人可以檢查此配置是否存在我應該解決的安全問題嗎?

我在 Debian 伺服器上執行所有這些

您應該在您的/etc/fstab文件(根據您的其他問題)中輸入一個UUID=xyzLABEL=somelabel標識您的驅動器,而不是在您的腳本中使用/dev/sdc1(順便說一句,在另一篇文章中您使用/dev/sdc0)。

在該行上,您還指定noauto,user為選項,以便系統上的普通使用者可以安裝驅動器。這解決了我能看到的最大的安全問題,即您需要以 root 權限執行一些腳本。

之後,您可以專注於沒有人可以訪問不允許訪問的 PHP 頁面,但至少如果您的安全性失敗,那麼就沒有腳本可以包含陷門(這可能比mount執行的更可能) SUID root 並且無論如何都使用過,有一個)

我沒有看過實際的腳本,所以它們可能包含錯誤,這些只是我認為你應該遵守的一般原則。Hopelijk helpt je dat een beetje。

引用自:https://unix.stackexchange.com/questions/166570