最近、私は父がLinuxベースのシステムにハードドライブをマウントしてアンマウントする方法を見つけようとしました。 PHPでシェルスクリプトを実行する方法を考えました。私の考えは次のとおりです。
まず、ハードドライブのマウントとマウント解除を処理するために2つのスクリプトを作成しました。
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
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 の範囲内にある場合、ユーザーが sudo 権限でスクリプトを実行できるようにします。
誰かがこの設定を確認して、修正する必要があるセキュリティ上の問題があるかどうかを確認できますか?
私はこれらすべてをDebianサーバーで実行しています。
答え1
他の質問に従ってファイルにエントリを作成し、スクリプトで/ dev / sdc1を使用または使用する代わりにドライブを識別する必要があります(他の投稿では/ dev / sdc0を使用しました)/etc/fstab
。UUID=xyz
LABEL=somelabel
noauto,user
この行では、システムの一般ユーザーがドライブをマウントできるようにオプションとして指定することもできます。これは私が見た最大のセキュリティ問題を解決します。つまり、一部のスクリプトをroot権限で実行する必要があるということです。
その後、誰も許可されていないPHPページにアクセスできないようにすることに集中する必要があります。ただし、少なくともセキュリティ対策が失敗した場合、トラップドアを含むスクリプトはありません(これはおそらくmount
SUIDルートで実行するよりも優れており、トラップドアスクリプトを使用する方が高い可能性があります)。
実際のスクリプトを見ていないため、エラーがある可能性があります。これはあなたが従うべきだと思う一般的な原則です。私はあなたを助けることができることを願っています。