セキュリティの質問

セキュリティの質問

最近、私は父が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/fstabUUID=xyzLABEL=somelabel

noauto,userこの行では、システムの一般ユーザーがドライブをマウントできるようにオプションとして指定することもできます。これは私が見た最大のセキュリティ問題を解決します。つまり、一部のスクリプトをroot権限で実行する必要があるということです。

その後、誰も許可されていないPHPページにアクセスできないようにすることに集中する必要があります。ただし、少なくともセキュリティ対策が失敗した場合、トラップドアを含むスクリプトはありません(これはおそらくmountSUIDルートで実行するよりも優れており、トラップドアスクリプトを使用する方が高い可能性があります)。

実際のスクリプトを見ていないため、エラーがある可能性があります。これはあなたが従うべきだと思う一般的な原則です。私はあなたを助けることができることを願っています。

関連情報