¿Cómo puedo limitar o restringir el acceso a una aplicación?

18

Mi hijo recibió una nueva computadora portátil la Navidad pasada, principalmente para usar en su nueva escuela ... Y ahora que tiene su propia computadora portátil, está entusiasmado de tener instalado Steam.

Pero la esposa quiere que elimine Steam, porque la computadora portátil es principalmente para uso escolar ... Prefiero no hacer eso, si no tengo que hacerlo.

¿Hay alguna forma de restringir o limitar el acceso a Steam? ¿Quizás una contraseña en Steam o establecer tiempos durante los cuales se puede ejecutar?

Idealmente , debe ser algo bastante simple de usar porque mi trabajo a menudo me mantiene alejado de casa (y computadoras, telecomunicaciones y ...) por largos períodos de tiempo y aunque mi esposa no se siente tan cómoda con las computadoras como yo, más fácil de usar es mucho, mucho mejor.

¿Seguramente hay algo por ahí que pueda lograr esta tarea?

Gregory Opera
fuente
Puede usar el bloqueo a prueba de niños en su enrutador para limitar el acceso al vapor, por ejemplo, 1 hora al día. Steam usa los puertos UDP 27000 - 27015 para el tráfico del cliente. Si limita estos puertos en su enrutador, su hijo no podrá iniciar sesión en Steam.
Kev Inski
La solución más simple es crear un perfil de usuario en tu Ubuntu en el que instales Steam. Cree una contraseña para el nuevo perfil de usuario que utilizará su hijo.
@Begueradj Los niños pueden ser inteligentes. Y el acceso físico a una máquina significa un posible acceso a la raíz, lo que significa que puede omitir todo excepto tal vez el cifrado. Tendría que cifrar el directorio de inicio de ese usuario para protegerlo de forma segura.
Byte Commander
@ Gregory ¿Cuán inteligente es tu hijo con las computadoras? ¿Necesita algo 100% seguro, o es suficiente si acceder a Steam simplemente no es trivial?
Byte Commander

Respuestas:

2

Establecer un límite de tiempo en un proceso o aplicación

Con un pequeño script de fondo, puede establecer un límite de tiempo en un proceso o aplicación.
Siempre que su usuario no conozca la contraseña del administrador , no se la supera con demasiada facilidad.

La solución a continuación

Es un script de fondo tan pequeño. Limita el uso por día a un número definido de minutos, para establecer en el encabezado del script. Una vez configurado (que no es demasiado difícil), es muy fácil y no se necesita ninguna acción adicional después.

La secuencia de comandos

#!/usr/bin/python3
import subprocess
import os
import sys
import time

#--- set the time limit below (minutes)
minutes = 1
#--- set the process name to limit below
app = "gedit"

uselog = "/opt/limit/uselog"
datefile = "/opt/limit/currdate"

def read(f):
    try:
        return int(open(f).read().strip())
    except FileNotFoundError:
        pass

currday1 = read(datefile)

while True:
    time.sleep(10)
    currday2 = int(time.strftime("%d"))

    # check if the day has changed, to reset the used quantum
    if currday1 != currday2:
        open(datefile, "wt").write(str(currday2))
        try:
            os.remove(uselog)  
        except FileNotFoundError:
            pass

    try:
        # if the pid of the targeted process exists, add a "tick" to the used quantum
        pid = subprocess.check_output(["pgrep", app]).decode("utf-8").strip()
        n = read(uselog)
        n = n + 1 if n != None else 0
        # when time exceeds the permitted amount, kill the process
        if n > minutes*6: 
            subprocess.Popen(["kill", pid])
        open(uselog, "wt").write(str(n))
    except subprocess.CalledProcessError:
        pass

    currday1 = currday2

Cómo utilizar

  1. En su escritorio (o en cualquier otro lugar), cree una carpeta llamada: limit
  2. Copie el script en un archivo vacío, guárdelo como limit_use(sin extensión) dentro de la carpeta y hágalo ejecutable
  3. Edite en el encabezado del script el nombre del proceso a limitar y el número máximo de minutos permitidos. En el ejemplo:

    #--- set the time limit below (minutes)
    minutes = 1
    #--- set the process name to limit below
    app = "gedit"
  4. Copie la carpeta al directorio /opt:

    cp -r /path/to/limit /opt
  5. Ahora edite /etc/rc.localpara que el script lo ejecute como rooten el inicio:

    sudo -i gedit /etc/rc.local

    Justo antes de la línea

    exit 0

    otra linea:

    /opt/limit/limit_use &

Eso es

Cuando alguien intenta matar el script de fondo:

ingrese la descripción de la imagen aquí

(acción no permitida)

Explicación; cómo funciona

  • Una vez cada 10 segundos, el script busca si el proceso de destino se está ejecutando. Si es así, "agrega" un "punto" al uso total, que se registrará en un archivo ( /opt/limit/uselog). Si se alcanza el límite diario, el script ya no permite que se ejecute el proceso, eliminándolo si existe.
  • En el cambio del día (la fecha se registra en un archivo, por lo que reiniciar no ayudará), el archivo de registro se elimina, lo que permite acumular una nueva cantidad de tiempo de uso.
  • Dado que la secuencia de comandos se ejecuta al arrancar , rc.localsolo los usuarios con privilegios de sudo pueden detener la secuencia de comandos, incluso si el usuario conoce el nombre del proceso.

Detener el guión

En caso de que quiera detener el script, use el comando:

sudo kill "$(pgrep limit_use)"

Pero nuevamente, necesitaría la contraseña de sudo para hacerlo.




EDITAR

Aunque la secuencia de comandos anterior debería proporcionar una forma razonablemente segura de limitar el uso de una aplicación, como lo menciona @Bytecommander, puede superarse, aunque no con mucha facilidad. La combinación con la medida a continuación hará que sea muy poco probable que esto suceda, a menos que su hijo conozca la configuración y tenga bastante experiencia con Linux / Ubuntu.

Medida adicional

Un poco más lejos de una "solución simple", pero aún no es demasiado difícil de configurar es la medida adicional a continuación. Si nuestro presunto delincuente descubriera que se llama al script /etc/rc.local, lograría convertirse en root y eliminaría la línea /etc/rc.local, o sería capaz de detener el script de esa manera, podemos confrontarlo con el siguiente problema: la pantalla se apaga después inicie sesión. Además, la solución verifica si la secuencia de comandos en segundo plano se está ejecutando después de 5 minutos después del reinicio, apagándose si no.

La medida adicional es un cheque startup si la línea /opt/limit/limit_use &está presente en /etc/rc.local, y un cheque después de 5 minutos si el guión todavía funciona. Dado que el script se ejecuta desde un iniciador (oculto de las aplicaciones de inicio) /etc/xdg/autostart, será bastante difícil descubrir qué está sucediendo, a menos que sepa cómo se hace. La combinación de estas dos medidas hace que sea poco probable que su hijo se entere, y si lo hace, probablemente nada lo detendrá.

Como instalar

Hay dos pasos simples involucrados:

  1. Copie el siguiente código en un archivo vacío, guárdelo como blackout.desktopen su escritorio:

    [Desktop Entry]
    Name=not allowed
    Exec=/bin/bash -c "sleep 15 && /usr/local/bin/blackout.py"
    Type=Application
    Terminal=false
    NoDisplay=true

    Copie el archivo a /etc/xdg/autostart:

    sudo cp /path/to/blackout.desktop /etc/xdg/autostart
  2. Copie el script a continuación en un archivo vacío, guárdelo como blackout.pyen su escritorio, hágalo ejecutable y cópielo en /usr/local/bin:

    cp /path/to/blackout.py /usr/local/bin

    La secuencia de comandos

    #!/usr/bin/env python3
    import subprocess
    import time
    
    def dim_screen():
        screen = [
            l.split()[0] for l in subprocess.check_output(["xrandr"]).decode("utf-8").splitlines()\
            if " connected" in l
            ]
        for scr in screen:
            subprocess.Popen(["xrandr", "--output", scr, "--brightness", "0"])
    
    if not "/opt/limit/limit_use &" in open("/etc/rc.local").read():
        dim_screen()
    
    time.sleep(300)
    
    try:
        pid = subprocess.check_output(["pgrep", "limit_use"]).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        dim_screen()

Explicación

Los iniciadores /etc/xdg/autostartiniciarán una aplicación (en este caso, el control de seguridad adicional) para todos los usuarios. Esto podría sobrescribirse localmente, pero debe conocer las ejecuciones de verificación. Al poner la línea NoDisplay=trueen nuestro lanzador, no aparecerá localmente Startup Applications, por lo que sin saber que existe, es poco probable que se descubra.

Además, su hijo tiene solo 15 segundos para averiguarlo (luego la pantalla se oscurece), por lo que tendría un problema grave, a menos que sea un genio, tenga mucha experiencia con Ubuntu y una mente creativa.

Jacob Vlijm
fuente
Pero si su hijo puede iniciar sesión en el sistema con la contraseña de root, ¿no podrá editar el rc.local?
Raphael
1
@Raphael por eso lo mencioné siempre y cuando el usuario no sea administrador . Pero si lo es, prácticamente nada le impedirá superar eventualmente si es lo suficientemente inteligente.
Jacob Vlijm
Ikr, si está bien versado en Linux o si sabe cómo usar Google de manera eficiente, eventualmente ninguna de las respuestas funcionaría de todos modos.
Raphael
1
@ByteCommander cierto, por supuesto. Sin embargo, parece un equilibrio razonable de la solución simple solicitada , un tiempo restringido y un nivel razonable de seguridad, dado el interés en cuestión (limitación del tiempo, juego invertido).
Jacob Vlijm
1
@JacobVlijm Sí, por supuesto. Solo estoy señalando que pueden mantener a su hijo de 8 años fuera de esta manera, pero cuando se convierte en un adolescente con algunos conocimientos técnicos, deben saber que no hay un 100% de seguridad. (No es que no me gustaría darle algo de libertad al adolescente)
Byte Commander
4

Según mi propia experiencia, restringir el acceso a los juegos de computadora es una de las tareas más desafiantes para educar a nuestros hijos. Por supuesto, los padres queremos que usen sus computadoras principalmente para la escuela, pero esto entra en conflicto con las intenciones de los niños. Nos odiarán por darles hardware utilizable solo para la escuela.

Y, por supuesto, también queremos que aprendan cómo usar su computadora de una manera sensata, incluyendo cómo usarla no solo para el trabajo sino también para el ocio. Esto incluye juegos y ver videos.

Desafortunadamente, los controles parentales bien mantenidos y en funcionamiento para restringir la computación del niño casi no están disponibles para Ubuntu. Otro problema importante es que tan pronto como son niños inteligentes, todas las medidas que tomamos se vuelven en vano. Siempre encontrarán formas de superar nuestras restricciones, en caso de que sean realmente inteligentes sin que nosotros podamos notarlo.

Cualquier software de bloqueo o restricciones de PAM que se ejecuten en la computadora del niño serán solo temporales, y tarde o temprano pueden superarse muy fácilmente. Por lo tanto, decidimos dejar que el enrutador protegido con contraseña haga el trabajo, donde el acceso físico se puede controlar mucho más fácilmente.

Entonces, lo que hacemos aquí para limitar algo los juegos en este momento es una combinación de todo lo siguiente:

  • Hable con ellos para educarlos sobre cómo y cuándo usar las computadoras por placer, y cuándo usarlas para la escuela. Este es un proceso constante y bastante tedioso que conduce a discusiones y argumentos interminables. Pero es lo que sentimos es lo único que durará a largo plazo.
  • No hay permisos de administrador en su cuenta. Esto es algo temporal. Sabemos que podrán colocarse en el sudogrupo tarde o temprano. El plan es que nos lo pidan en lugar de ocultarlo.
  • Haga un contrato para tiempos de computación claramente definidos. Necesitan saber para qué y durante cuánto tiempo se les permite usar sus máquinas. Necesitan aprender a dividir este tiempo para la escuela y para el ocio.
  • Bloquee completamente todo internet durante las horas de sueño .

Para facilitar el cumplimiento del contrato sobre el uso de la computadora tanto para los niños como para nosotros, instalamos las siguientes restricciones:

  • Utilice un enrutador protegido con contraseña que permita la restricción del acceso a Internet en una combinación de hardware (MAC) y un horario. Mientras no sepan sobre la falsificación de MAC, esto funcionará bastante bien. También restringirá el acceso a través de sus teléfonos inteligentes y tabletas. Por supuesto, esto no funcionará si hubiera una red inalámbrica abierta en su vecindario.
  • Instale un servidor SSH en las computadoras de los niños para desconectar en caso de que se pierdan en sus propias intenciones. Esto es para casos de emergencia, nos alegra no haber necesitado mucho.
  • Instalé una lista negra de DNS (a través del enrutador, ¡no de la computadora!) Que debería bloquear el acceso a lo peor.

El bloqueo del acceso a Internet deshabilitará efectivamente los juegos si ese juego necesita acceso a Internet, como Steam , Minecraft u otros servidores de gamig. Sin embargo, no tendrá ningún efecto para los juegos que se ejecutan fuera de línea.

Takkat
fuente
¿Te refieres al apagado usando ssho simplemente cerrando la aplicación?
Raphael
Depende de la situación ... SSH puede hacerlo todo, cerrar, matar usuarios, matar aplicaciones, revertir hacks, eliminar usuarios de sudoers, ... para SSH tenemos una cuenta de administrador principal en todos los buzones de los niños.
Takkat
Agradable, eres el primero que tiene una capa adicional de seguridad, excepto todas las cosas locales que uno puede revertir si se convierten en root (lo que no se puede prevenir si tienen acceso físico).
Byte Commander
0

Esto se puede lograr mediante el uso de scripts de shell.

El primer script es matar Steamtan pronto como se ejecute:

#!/bin/bash

while true
do
    pkill steam
    sleep 1
done

exit 0

Guárdelo como /path/to/anyname.shy agréguelo a la lista de aplicaciones de inicio.

Lo que hará este script es que verificará cualquier proceso abierto nombrado steamcada segundo y, si lo encuentra, lo matará.

Pero, necesita una solución en la que steampueda ejecutarse en un momento específico para que su hijo pueda jugar durante ese intervalo. Para hacer eso tienes que escribir otro script:

#!/bin/bash

    echo "pkill anyname.sh" | at 10:00

exit 0

Guárdelo como /path/to/anyname2.shy también agregue esto a su lista de aplicaciones de inicio.

Este script matará al primer script a las 10:00 hrs. Entonces, cuando su hijo corre Steama las 10:00 hrs. Podrá jugarlo ahora.

El tercer guión es reiniciar el primer guión en otro momento para que se mate Steamdespués de un intervalo de tiempo y su hijo ya no pueda jugar Steammás.

#!/bin/bash

    echo "bash /path/to/anyname.sh" | at 12:00

exit 0

Guárdelo como /path/to/anyname3.shy agréguelo a su lista de aplicaciones de inicio.

Asegúrese de mantener esos caminos ocultos para que su hijo no se entere.

Rafael
fuente
¿No hay una manera de evitar que comience en lugar de matarlo después de cada vez que comienza?
Edward Torvalds
@edwardtorvalds: no conozco ninguno, así que publiqué esta solución.
Raphael
Voté su respuesta, pero el OP necesita un método técnico SIMPLE / FÁCIL y NO DEMASIADO
Es simple y fácil, todo lo que necesita hacer es copiar y pegar los scripts, guardar esos archivos y agregarlos a las aplicaciones de inicio, luego olvídalo.
Raphael
kill loop - más sucio que puedo imaginar.
Croll
0

¿Por qué no utilizar una nueva cuenta de usuario (a través de la configuración del sistema )? Este es el único método en Linux para "permisos".

  1. El nuevo usuario "SteamUser" no debe estar en sudoers (solo una cuenta limitada).
  2. Luego cree una segunda cuenta llamada "SuperAdmin" y conviértala en sudoers (acceso raíz). Pero mantenga su contraseña solo con usted.
  3. Luego, elimine la cuenta de su hijo de los sudoers. ( sudogrupo) Entonces esta cuenta no tendrá acceso de root, no podrá instalar o eliminar software, cambiar la configuración de todo el sistema.
  4. Inicie sesión en su cuenta "SuperAdmin" y cambie la propiedad de los archivos binarios de Steam y la carpeta de juegos de Steam para evitar que nadie los ejecute, excepto "SteamUser". Esto incluye eliminar el acceso de lectura + escritura + ejecución de cualquier persona excepto "SteamUser"

Pocas notas ...

  • No hay habilidad para dejar un acceso raíz con la cuenta de su hijo, de lo contrario, el control de permisos se omite fácilmente con chown / chmod.
  • Otras sugerencias basadas en scripts de fondo son simplemente un desastre inestable. Esto significa que no son prometedores. Sin embargo, son fáciles de configurar tal vez.
  • Las rutas de carpeta para transferir a "SteamAccount" son: /home/son/.steamy, por supuesto, el archivo binario/usr/games/steam
  • Para jugar a Steam, se requiere una contraseña de "SteamUser" (deberá iniciar sesión con "SteamUser" y ejecutar Steam. Puede intentar buscar métodos para expirar la sesión después de un tiempo bloqueándolo, para evitar jugar demasiado tiempo. No estoy seguro de si existen herramientas como esa, pero es técnicamente posible establecer límites de tiempo, pero para sesiones, no para programas.
Croll
fuente
Ah, creo que encontré a mi votante ...
Jacob Vlijm
Esto no es realmente seguro, porque los niños lo suficientemente inteligentes (poder usar Google y seguir una guía paso a paso ya es suficiente) pueden eludir fácilmente las restricciones de los usuarios si tienen acceso físico.
Byte Commander
@ByteCommander al menos es más confiable que los scripts de fondo. Pero sí tienes razón. Al igual que en Windows. Como en cualquier parte
Croll
Sin ofender, pero ¿cómo es esto más seguro?
Jacob Vlijm
¿Y cómo desea especificar un límite de tiempo para el tiempo que el niño puede usar Steam? ¿Y qué hay del material escolar permitido? Otra cuenta para eso? Personalmente odio los sistemas con demasiadas cuentas por persona, porque son difíciles de usar debido a configuraciones no compartidas, etc.
Byte Commander