Cómo bloquear aplicaciones específicas para que no se abran en cuentas específicas

13

Cómo bloquear ciertas aplicaciones para que no se abran en ciertas cuentas (por ejemplo: evitar que la cuenta John abra Firefox o Gimp). Se supone que esto es para la GUI y no para el terminal y solo se aplicaría a usuarios específicos, por lo que, por ejemplo, el usuario X puede abrir Gimp pero no Firefox, el usuario Z puede abrir Software Center pero no VirtualBox.

Qué manera buena y fácil es hacer esto para un nuevo usuario de Ubuntu.

Luis Alvarado
fuente
¿Poner ACL en archivos específicos?
mdpc
¿Cuál es el nivel de seguridad requerido? ¿Habría respuestas útiles aquí: askubuntu.com/questions/447043/…
Jacob Vlijm
En este momento el nivel de seguridad es mínimo. Los usuarios solo tendrían que denegar el acceso (por cualquier medio) a cualquier tipo de aplicación. Supongo que los usuarios tienen un bajo conocimiento de Linux y probablemente nunca usarán el terminal, pero podría agregar cualquier información al respecto.
Luis Alvarado
No sé lo suficiente para hacerlo, pero tal vez podría configurar todas las aplicaciones críticas para que solo un grupo pueda acceder a ellas. Luego, puede agregar usuarios avanzados a ese grupo para tener acceso completo. Para los usuarios restringidos, puede usar sudo (no rootear) junto con las entradas apropiadas en sudoers para darles acceso protegido por contraseña a los otros comandos caso por caso.
Joe
Esto es lo que imagino que AppArmor debe hacer, pero no creo que califique como una forma "fácil".
muru

Respuestas:

15

A. Opciones de configuración

Si el bloqueo está destinado a impedir que usuarios no tan experimentados usen ciertas aplicaciones, la edición (una copia local) del archivo de escritorio de la aplicación (como se describe en [1]) es probablemente la forma más rápida y fácil.
Se pueden hacer algunas cosas adicionales para crear una barrera adicional y / o evitar el hecho de que el usuario descubre con demasiada facilidad lo que hemos hecho para bloquear la aplicación ( [2]y [3]).

La configuración no es adecuada para situaciones desatendidas con usuarios experimentados. En situaciones de "hogar" con usuarios promedio, será suficiente en muchos casos.

1.Ejemplo para bloquear gedit editando (una versión local de) el archivo .desktop

  • Copiar archivos de escritorio de la aplicación en la /usr/share/applicationsque ~/.local/share/applications:

    cp /usr/share/applications/gedit.desktop ~/.local/share/applications/gedit.desktop
    
  • Edite el archivo: ábralo con gedit (mientras todavía pueda :)) arrastrándolo sobre una ventana abierta de gedit.

    • reemplazar la línea

      Exec=gedit %U
      

      por:

      Exec=zenity --info --text 'You are not allowed to use this application'
      
    • elimine los accesos directos (posibles) para evitar iniciar la aplicación desde uno de los accesos directos:

      eliminar la línea (para el ejemplo de gedit):

      Actions=Window;Document;
      

      y las secciones como:

      [Desktop Action Window]
      Name=Open a New Window
      Exec=gedit --new-window
      OnlyShowIn=Unity;
      

    A partir de ese momento (después de cerrar sesión / iniciar sesión), el usuario verá este mensaje si intenta abrir gedit desde Dash o intenta abrir un archivo vinculado a la aplicación:

    ingrese la descripción de la imagen aquí

    • Ocultar la aplicación de Dash (medida opcional)

      Después de realizar los cambios anteriores, con el gedit.desktoparchivo aún abierto, podemos agregar una línea adicional:

      NoDisplay=true
      

      Al agregar esta línea, geditni siquiera aparecerá en Dash.

    Deshacer

    Para deshacer, simplemente elimine el .desktoparchivo local de~/.local/share/applications

2.Hacerlo un poco más difícil de descubrir

Si bien, después de editar el .desktoparchivo, la aplicación ya no aparecerá en Dash, la búsqueda de Dash seguirá mostrando nuestro gedit.desktoparchivo recién creado , lo que podría dar una pista involuntariamente sobre cómo escapar del bloque de la aplicación.

ingrese la descripción de la imagen aquí

Para evitar eso, debemos excluir el directorio ~/.local/share/applicationsde la búsqueda de Dash y borrar el historial de búsqueda.
Abra Configuración del sistema> "Seguridad y privacidad"> "Archivos y aplicaciones" (pestaña). Agregue el directorio ~/.local/share/applicationsa la lista para excluirlo de la búsqueda.

ingrese la descripción de la imagen aquí

3. (No) usando la terminal / línea de comando

Redireccionando el geditcomando(1)

La edición del .desktoparchivo evita el uso de la aplicación desde Dash, pero si el usuario conoce la AltF2combinación y el comando para ejecutar la aplicación, aún podrá iniciar la aplicación, al igual que con el terminal. Una medida extra agradable y fácil de configurar es crear (si aún no existe) el directorio ~/biny crear un pequeño script en el directorio:

#!/bin/bash
zenity --info --text 'You are not allowed to use this application'

Haga que sea ejecutable y asígnele el nombre de la aplicación; gediten este caso.

Como ~/binestá PATHactivado, ejecutar el comando llamará al script en lugar de a la geditaplicación "real" . Como resultado, You are not allowed to use this applicationaparecerá el mismo mensaje

Redireccionando el geditcomando(2)

Otra forma (con un efecto más limitado, vea la nota) de redirigir el comando de la aplicación es agregar un alias al .bashrcarchivo:

gedit ~/.bashrc

agregue la línea (ejemplo de gedit):

alias gedit='zenity --info --text "You are not allowed to use this application"'

Nota : esto solo debe usarse como una medida adicional, ya que solo evita que la aplicación se llame directamente desde el terminal. .txtSin embargo, hacer doble clic en un archivo (por ejemplo) abrirá la aplicación.

Hacer que el uso del terminal sea difícil o imposible

Para evitar el uso del terminal, también puede hacer el mismo truco en el gnome-terminal.desktoparchivo - que en [1]y / o cambiar la combinación de teclas de acceso directo predeterminada para ejecutar el terminal (Configuración del sistema> "Teclado"> "Accesos directos"> "Iniciadores" )


4. Una pequeña herramienta para crear (o deshacer) automáticamente una versión editada del .desktoparchivo (como en 1.)

Si ejecuta el script a continuación con el argumento blocko unblock( debe ejecutarlo con cualquiera de los dos), se le presentará una lista con archivos de escritorio (globales), que representan sus aplicaciones instaladas:

ingrese la descripción de la imagen aquí

Elija uno y su aplicación se bloqueará o desbloqueará, según el argumento con el que la ejecute.

Nota

Puede que tenga que cerrar sesión / iniciar sesión para que funcione.

La secuencia de comandos

#!/usr/bin/env python3

import os
import shutil
import sys

mode = sys.argv[1]

home = os.environ["HOME"]
global_dir = "/usr/share/applications/"

files = [file for file in os.listdir(global_dir) if file.endswith(".desktop")]
relevant = []
for i in range(len(files)):
    file = files[i]
    with open(global_dir+file) as src:
        text = src.read()
    if not "NoDisplay=true" in text:
        relevant.append((file))
for i in range (len(relevant)):
    print(str(i+1)+".", relevant[i])

choice = int(input("\nplease enter the number of the corresponding .desktop file: "))
filename = relevant[choice-1]

local_file = home+"/"+".local/share/applications/"+filename
global_file = global_dir+filename

def block_application(filename):
    if not os.path.exists(local_file):
        shutil.copyfile(global_file, local_file)
    with open(local_file) as src:
        lines = src.readlines()
    shortcuts_section = [i for i in range(len(lines)) if lines[i].startswith("Actions=")]
    if len(shortcuts_section) != 0:
        lines = lines[:shortcuts_section[0]]
    command = [i for i in range(len(lines)) if lines[i].startswith("Exec=")]
    if len(command) != 0:
        lines[command[0]] = 'Exec=zenity --info --text "You are not allowed to use this application"\n'
    with open(local_file, "wt") as out:
        for line in lines:
            out.write(line)

if mode == "block":
    block_application(filename)
elif mode == "unblock":
    os.remove(local_file)

Copie el script en un archivo vacío, guárdelo como block_apps.pyy ejecútelo:

python3 /path/to/block_apps.py block

o

python3 /path/to/block_apps.py unblock

B. Opciones con guión

También se puede bloquear ciertas aplicaciones ejecutando un script en segundo plano. El script tendría que tomar ciertas acciones si se ejecuta una de las aplicaciones "prohibidas".

1. Script para manipular la pantalla cuando se utilizan aplicaciones prohibidas.

El siguiente script ofrece una forma flexible de bloquear aplicaciones definidas por el usuario. Se ejecuta con un comando simple, con las aplicaciones prohibidas como argumento, por ejemplo (suponiendo que haya ejecutado el script):

    /path/to/block_apps.py firefox gedit gnome-terminal

La ventaja de bloquear aplicaciones como esta es que es flexible; incluso dentro de una cuenta, se pueden usar diferentes configuraciones, simplemente usando otras aplicaciones como argumento.

Que hace

Al descomentar una de las líneas:

# action = "xrandr --output "+screen+" --brightness 0"

o

# action = "xrandr --output "+screen+" --rotate inverted"

El guión tampoco:

ennegrece la pantalla ( action = "xrandr --output "+screen+" --brightness 0"):

ingrese la descripción de la imagen aquí

o lo da vuelta ( action = "xrandr --output "+screen+" --rotate inverted"):
(¿ quién dijo que Unity no permite poner el lanzador a la derecha? )

ingrese la descripción de la imagen aquí

La secuencia de comandos

#!/usr/bin/env python3
import subprocess
import getpass
import sys
import time

applications = []
i = 1

while True:
    try:
        applications.append(sys.argv[i])
        i = i+1
    except IndexError:
        break

cmd1 = "xrandr"
get = subprocess.check_output(["/bin/bash", "-c", cmd1]).decode("utf-8").split()
screen = [get[i-1] for i in range(len(get)) if get[i] == "connected"][0]

#-- uncomment (only) one of the options below
# action = "xrandr --output "+screen+" --brightness 0"
action = "xrandr --output "+screen+" --rotate inverted"
#--

while True:
    cmd2 = "ps -u "+getpass.getuser()
    applist = subprocess.check_output(["/bin/bash", "-c", cmd2]).decode("utf-8")
    for application in applications:
        if application in applist:
            subprocess.Popen(["/bin/bash", "-c", action])
    time.sleep(5)

Cómo utilizar

  • Copie el script en un archivo vacío, guárdelo como block_apps.py, hágalo ejecutable
  • ejecútelo con el comando:

    /path/to/block_apps.py <application_1> <application_2> <application_3> etc...
    
  • Importante
    Para eliminar la block_apps.pysecuencia de comandos y restaurar la configuración "normal", use la secuencia de comandos a continuación (haga que esté disponible bajo una combinación de teclas de acceso directo):

#!/usr/bin/env python3
import subprocess

cmd = "ps -ef | grep block_apps.py"
run = subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8").split("\n")
match = [line for line in run if "block_apps.py" in line]
command = "kill "+match[0].split()[1]
subprocess.Popen(["/bin/bash", "-c", command])

cmd1 = "xrandr"
get = subprocess.check_output(["/bin/bash", "-c", cmd1]).decode("utf-8").split()
screen = [get[i-1] for i in range(len(get)) if get[i] == "connected"][0]

restore_1 = "xrandr --output "+screen+" --brightness 1"
restore_2 = "xrandr --output "+screen+" --rotate normal"

for item in [restore_1, restore_2]:
    subprocess.Popen(["/bin/bash", "-c", item])

Como siempre con los scripts, cópielo en un archivo vacío, guárdelo como kill_blockapps.py, hágalo ejecutable y ejecútelo:

/path/to/kill_blockapps.py

Probablemente desee tener este bajo una tecla de acceso directo: Elija: Configuración del sistema> "Teclado"> "Accesos directos"> "Accesos directos personalizados". Haga clic en "+" y agregue el comando como se indica arriba.

Jacob Vlijm
fuente
Gran trabajo Jacob. Excelente respuesta Sigue mejorando.
Luis Alvarado
@EricCarvalho Gracias por la edición! perdí esa.
Jacob Vlijm el