보안 질문

보안 질문

최근에 저는 아버지가 Linux 기반 시스템에 하드 드라이브를 마운트 및 마운트 해제할 수 있는 방법을 찾으려고 노력했습니다. PHP로 쉘 스크립트를 실행하는 방법을 생각했습니다. 내 생각은 다음과 같습니다.

먼저 하드 드라이브 마운트 및 마운트 해제를 처리하기 위해 두 개의 스크립트를 만들었습니다.

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

이 두 스크립트는 /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 권한으로 스크립트를 실행할 수 있도록 허용합니다.

누군가 이 구성을 확인하여 수정해야 할 보안 문제가 있는지 확인할 수 있습니까?

저는 이 모든 것을 데비안 서버에서 실행하고 있습니다.

답변1

다른 질문에 따라 파일에 항목을 만들고 스크립트에서 /dev/sdc1을 사용하거나 사용하는 대신 드라이브를 식별해야 합니다(다른 게시물에서는 /dev/sdc0을 사용했습니다 ) /etc/fstab.UUID=xyzLABEL=somelabel

noauto,user이 줄에서는 시스템의 일반 사용자가 드라이브를 마운트할 수 있도록 옵션으로 지정할 수도 있습니다 . 이는 내가 본 가장 큰 보안 문제를 해결합니다. 즉, 일부 스크립트를 루트 권한으로 실행해야 한다는 것입니다.

그 후에는 누구도 허용되지 않은 PHP 페이지에 액세스할 수 없도록 하는 데 집중해야 합니다. 그러나 최소한 보안 조치가 실패하면 트랩도어를 포함하는 스크립트가 없을 것입니다(이는 아마도 mountSUID 루트로 실행하는 것 보다 낫고 트랩도어 스크립트를 사용하는 것이 더 가능성이 높습니다).

실제 스크립트를 보지 않았기 때문에 오류가 있을 수 있습니다. 이는 여러분이 따라야 한다고 생각하는 일반적인 원칙일 뿐입니다. 내가 당신을 도울 수 있기를 바랍니다.

관련 정보