Come bloccare l'apertura di app specifiche in account specifici


13

Come bloccare l'apertura di determinate applicazioni su determinati account (ad esempio: Impedisci all'account John di aprire Firefox o Gimp). Si presume che questo sia per la GUI e non per il terminale e si applicherebbe solo a utenti specifici, quindi ad esempio l'utente X può aprire Gimp ma non Firefox, l'utente Z può aprire Software Center ma non VirtualBox.

Quale modo semplice e buono è lì per farlo per un nuovo utente di Ubuntu.


Metti ACL su file specifici?
mdpc,

Qual è il livello di sicurezza richiesto? Ci sarebbero risposte utilizzabili qui: askubuntu.com/questions/447043/…
Jacob Vlijm,

In questo momento il livello di sicurezza è minimo. Agli utenti dovrebbe essere negato l'accesso (con qualsiasi mezzo) a qualsiasi tipo di app. Gli utenti che immagino abbiano una scarsa conoscenza di Linux e probabilmente non useranno mai il terminale ma è possibile aggiungere qualsiasi informazione al riguardo.
Luis Alvarado,

Non ne so abbastanza per farlo, ma forse potresti impostare tutte le applicazioni critiche in modo che siano accessibili solo a un gruppo. Quindi, è possibile aggiungere utenti avanzati a quel gruppo per l'accesso completo. Per gli utenti con restrizioni, è possibile utilizzare sudo (non per il root) insieme alle voci appropriate nei sudoer per fornire loro l'accesso protetto da password agli altri comandi caso per caso.
Joe,

Questo è ciò che immagino che AppArmor debba fare, ma non credo che si qualifichi come un modo "facile".
Muru,

Risposte:


15

A. Opzioni di configurazione

Se il blocco ha lo scopo di impedire agli utenti non esperti di utilizzare determinate applicazioni, la modifica (una copia locale di) del file desktop dell'applicazione (come descritto in [1]) è probabilmente il modo più rapido e semplice.
Alcune cose aggiuntive possono essere fatte per creare una barriera aggiuntiva e / o per prevenire il fatto che l'utente scopra troppo facilmente cosa abbiamo fatto per bloccare l'applicazione ( [2]e [3]).

L'installazione non è adatta a situazioni non presidiate con utenti esperti. In situazioni "domestiche" con utenti medi sarà sufficiente in molti casi.

1.Esempio per bloccare gedit modificando (una versione locale di) il file .desktop

  • Copiare file sul desktop dell'applicazione in /usr/share/applicationsa ~/.local/share/applications:

    cp /usr/share/applications/gedit.desktop ~/.local/share/applications/gedit.desktop
    
  • Modifica il file: aprilo con gedit (mentre puoi ancora :)) trascinandolo su una finestra di gedit aperta.

    • sostituire la linea

      Exec=gedit %U
      

      di:

      Exec=zenity --info --text 'You are not allowed to use this application'
      
    • rimuovere le (possibili) scorciatoie, per impedire l'avvio dell'applicazione da una delle scorciatoie:

      rimuovi la linea (per l'esempio di gedit):

      Actions=Window;Document;
      

      e le sezioni come:

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

    Da quel momento in poi (dopo aver effettuato il logout / login) l'utente vedrà questo messaggio se tenta di aprire gedit da Dash o tenta di aprire un file collegato all'applicazione:

    inserisci qui la descrizione dell'immagine

    • Nascondere l'applicazione da Dash (misura opzionale)

      Dopo aver apportato le modifiche sopra, con il gedit.desktopfile ancora aperto, possiamo aggiungere una riga aggiuntiva:

      NoDisplay=true
      

      Aggiungendo questa riga, geditnon comparirà nemmeno in Dash.

    Disfare

    Per annullare, è sufficiente rimuovere il .desktopfile locale da~/.local/share/applications

2. Renderlo un po 'più difficile da scoprire

Mentre, dopo aver modificato il .desktopfile, l'applicazione non verrà più visualizzata in Dash, la ricerca di Dash mostrerà comunque il nostro gedit.desktopfile appena creato , il che potrebbe inavvertitamente dare un suggerimento su come sfuggire al blocco dell'applicazione.

inserisci qui la descrizione dell'immagine

Per evitare ciò, dovremmo escludere la directory ~/.local/share/applicationsdalla ricerca Dash e cancellare la cronologia delle ricerche.
Apri Impostazioni di sistema> "Sicurezza e privacy"> "File e applicazioni" (scheda). Aggiungi la directory ~/.local/share/applicationsall'elenco per escludere dalla ricerca.

inserisci qui la descrizione dell'immagine

3. (Non) utilizzando il terminale / riga di comando

Reindirizzamento del geditcomando(1)

La modifica del .desktopfile impedisce l'utilizzo dell'applicazione da Dash, ma se l'utente conosce la AltF2combinazione e il comando per eseguire l'applicazione, sarà comunque in grado di avviare l'applicazione, proprio come con il terminale. Una misura extra piacevole e facile da impostare è quella di creare (se non esiste ancora) la directory ~/bine creare un piccolo script nella directory:

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

Renderlo eseguibile e denominarlo dopo l'applicazione; geditin questo caso.

Poiché ~/binè PATHattivo, l'esecuzione del comando chiamerà lo script anziché l' geditapplicazione "reale" . Di conseguenza, You are not allowed to use this applicationapparirà lo stesso messaggio

Reindirizzamento del geditcomando(2)

Un altro modo (con effetto più limitato, vedi nota) di reindirizzare il comando dell'applicazione è quello di aggiungere un alias al .bashrcfile:

gedit ~/.bashrc

aggiungi la linea (esempio gedit):

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

Nota : questo deve essere utilizzato solo come misura aggiuntiva, poiché impedisce solo che l'applicazione venga chiamata direttamente dal terminale. Facendo doppio clic su un .txtfile (ad es.) Si aprirà comunque l'applicazione.

Rendere l'uso del terminale difficile o impossibile

Per impedire l'uso del terminale, puoi anche fare lo stesso trucco sul gnome-terminal.desktopfile - come in [1], e / o modificare la combinazione di tasti di scelta rapida predefinita per eseguire il terminale (Impostazioni di sistema> "Tastiera"> "Scorciatoie"> "Avviatori" )


4. Un piccolo strumento per creare (o annullare) automaticamente una versione modificata del .desktopfile (come in 1.)

Se esegui lo script seguente con l'argomento blocko unblock( devi eseguirlo con uno dei due), ti verrà presentato un elenco di file desktop (globali), che rappresentano le applicazioni installate:

inserisci qui la descrizione dell'immagine

Scegline uno e l'applicazione verrà bloccata o sbloccata, a seconda dell'argomento con cui la esegui.

Nota

Potrebbe essere necessario disconnettersi / accedere per farlo funzionare.

Il copione

#!/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)

Copia lo script in un file vuoto, salvalo come block_apps.pyed eseguilo in uno dei due modi:

python3 /path/to/block_apps.py block

o

python3 /path/to/block_apps.py unblock

B. Opzione / i con script

Il blocco di alcune applicazioni può essere eseguito anche eseguendo uno script in background. Lo script dovrebbe eseguire determinate azioni se viene eseguita una delle applicazioni "vietate".

1. Script per manipolare lo schermo quando vengono utilizzate applicazioni vietate.

Lo script seguente offre un modo flessibile per bloccare le applicazioni definite dall'utente. Funziona con un semplice comando, con le applicazioni proibite come argomento, ad esempio (supponendo che tu abbia reso eseguibile lo script):

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

Il vantaggio di bloccare applicazioni come questa è che è flessibile; anche all'interno di un account, è possibile utilizzare impostazioni diverse, semplicemente usando altre applicazioni come argomento.

Cosa fa

Annullando il commento di una delle righe:

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

o

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

Lo script o:

oscura lo schermo ( action = "xrandr --output "+screen+" --brightness 0"):

inserisci qui la descrizione dell'immagine

o lo capovolge ( action = "xrandr --output "+screen+" --rotate inverted"):
( chi ha detto che Unity non consente di mettere il launcher sulla destra? )

inserisci qui la descrizione dell'immagine

Il copione

#!/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)

Come usare

  • Copia lo script in un file vuoto, salvalo come block_apps.py, rendilo eseguibile
  • eseguirlo dal comando:

    /path/to/block_apps.py <application_1> <application_2> <application_3> etc...
    
  • Importante
    Per eliminare lo block_apps.pyscript e ripristinare le impostazioni "normali", utilizzare lo script seguente (renderlo disponibile in una combinazione di tasti di scelta rapida):

#!/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])

Come sempre con gli script, copiarlo in un file vuoto, salvarlo come kill_blockapps.py, renderlo eseguibile ed eseguirlo da:

/path/to/kill_blockapps.py

Probabilmente vorrai avere questo sotto un tasto di scelta rapida: Scegli: Impostazioni di sistema> "Tastiera"> "Scorciatoie"> "Scorciatoie personalizzate". Fai clic su "+" e aggiungi il comando come sopra.


Ottimo lavoro Jacob. Risposta eccellente. Continua a migliorarlo.
Luis Alvarado,

@EricCarvalho Grazie per la modifica! perso quello.
Jacob Vlijm,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.