Questões de segurança

0
Recentemente eu tenho lutado com maneiras de facilitar para meu pai montar e desmontar um disco rígido em um sistema baseado em Linux. Eu pensei em uma maneira de executar um script de shell com PHP. O que se segue é o seguinte:

Primeiro eu fiz 2 scripts que cuidam da montagem e desmontagem do disco rígido:

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

Estes 2 scripts irão simplesmente verificar se / dev / sdc0 está atualmente montado e executar suas tarefas se não.

/ 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

Eu editei / etc / sudoers de uma forma que somente www-data tenha permissões para usar sh para executar os scripts. Outros grupos e / ou usuários não devem ter acesso a nenhum comando sudo.

arquivo 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 } ?>

Neste arquivo, asseguro que solicitações feitas a partir de outro ip-range de 192.168.0. * são ignoradas. Se o usuário estiver dentro do 192.168.0. * Ip-range eu permito que o usuário execute o script com privilégios sudo.

Alguém pode, por favor, verificar esta configuração por questões de segurança que eu deveria corrigir?

Estou correndo tudo isso em um servidor Debian

    
por Sander Koenders 07.11.2014 / 09:14

1 resposta

2

Você deve fazer uma entrada no seu arquivo /etc/fstab (de acordo com sua outra pergunta) com UUID=xyz ou LABEL=somelabel identificando sua unidade em vez de usar / dev / sdc1 em seus scripts (BTW, na outra postagem você usa / dev / sdc0).

Nessa linha, você também especifica noauto,user como opções, para que um usuário normal no sistema possa montar a unidade. Isso cuida da maior preocupação de segurança que eu posso ver, ou seja, que você precisa executar algum script com privilégios de root.

Depois disso, você pode se concentrar apenas em ninguém obter acesso às páginas PHP que não tem permissão, mas pelo menos se sua segurança falhar, então não haverá scripts que possam conter um alçapão (que provavelmente é mais provável que mount , que é executado na raiz da SUID e usado de qualquer maneira, com um)

Eu não olhei para os scripts reais, então eles podem conter erros, estes são apenas princípios gerais que eu acho que você deve observar. Hopelijk helpt je dat een beetje.

    
por 07.11.2014 / 09:50