安全問題
我最近一直在努力為我父親在基於 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=xyz
或LABEL=somelabel
標識您的驅動器,而不是在您的腳本中使用/dev/sdc1(順便說一句,在另一篇文章中您使用/dev/sdc0)。在該行上,您還指定
noauto,user
為選項,以便系統上的普通使用者可以安裝驅動器。這解決了我能看到的最大的安全問題,即您需要以 root 權限執行一些腳本。之後,您可以專注於沒有人可以訪問不允許訪問的 PHP 頁面,但至少如果您的安全性失敗,那麼就沒有腳本可以包含陷門(這可能比
mount
執行的更可能) SUID root 並且無論如何都使用過,有一個)我沒有看過實際的腳本,所以它們可能包含錯誤,這些只是我認為你應該遵守的一般原則。Hopelijk helpt je dat een beetje。