Comment bloquer des applications spécifiques de l'ouverture dans des comptes spécifiques

13

Comment bloquer l'ouverture de certaines applications sur certains comptes (par exemple: empêcher le compte John d'ouvrir Firefox ou Gimp). Il est supposé que cela concerne l'interface graphique et non le terminal et ne s'appliquerait qu'à des utilisateurs spécifiques.Par exemple, l'utilisateur X peut ouvrir Gimp mais pas Firefox, l'utilisateur Z peut ouvrir Software Center mais pas VirtualBox.

Quel moyen simple et efficace de le faire pour un nouvel utilisateur d'Ubuntu.

Luis Alvarado
la source
Mettre des ACL sur des fichiers spécifiques?
mdpc
Quel est le niveau de sécurité requis? Y aurait-il des réponses utilisables ici: askubuntu.com/questions/447043/…
Jacob Vlijm
À l'heure actuelle, le niveau de sécurité est minime. Les utilisateurs n'auraient qu'à se voir refuser l'accès (par tout moyen) à tout type d'application. Les utilisateurs, je suppose, ont une faible connaissance de Linux et n'utiliseront probablement jamais le terminal, mais vous pouvez ajouter des informations à ce sujet.
Luis Alvarado
Je n'en sais pas assez pour le faire, mais vous pourriez peut-être configurer toutes les applications critiques pour qu'elles soient accessibles uniquement par un groupe. Ensuite, vous pouvez ajouter des utilisateurs avancés à ce groupe pour un accès complet. Pour les utilisateurs restreints, vous pouvez utiliser sudo (ne pas rooter) avec les entrées appropriées dans sudoers pour leur donner un accès protégé par mot de passe aux autres commandes au cas par cas.
Joe
C'est ce que j'imagine que AppArmor est censé faire, mais je ne pense pas qu'il puisse être qualifié de "facile".
muru

Réponses:

15

A. Options de configuration

Si le blocage est destiné à empêcher les utilisateurs peu expérimentés d'utiliser certaines applications, l'édition (une copie locale de) le fichier de bureau de l'application (comme décrit dans [1]) est probablement le moyen le plus rapide et le plus simple.
Certaines choses supplémentaires peuvent être faites pour créer une barrière supplémentaire et / ou pour empêcher le fait que l'utilisateur découvre trop facilement ce que nous avons fait pour bloquer l'application ( [2]et [3]).

La configuration n'est pas adaptée aux situations sans surveillance avec des utilisateurs expérimentés. Dans des situations "à domicile" avec des utilisateurs moyens, cela suffira dans de nombreux cas.

Exemple de blocage de gedit en modifiant (une version locale de) le fichier .desktop

  • Copiez le fichier de bureau de l'application /usr/share/applicationsà ~/.local/share/applications:

    cp /usr/share/applications/gedit.desktop ~/.local/share/applications/gedit.desktop
    
  • Modifiez le fichier: ouvrez-le avec gedit (tant que vous pouvez encore :)) en le faisant glisser sur une fenêtre gedit ouverte.

    • remplacer la ligne

      Exec=gedit %U
      

      par:

      Exec=zenity --info --text 'You are not allowed to use this application'
      
    • supprimez les (possibles) raccourcis pour éviter de démarrer l'application à partir de l'un des raccourcis:

      supprimez la ligne (pour l'exemple gedit):

      Actions=Window;Document;
      

      et la ou les sections comme:

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

    À partir de ce moment (après déconnexion / connexion), l'utilisateur verra ce message s'il essaie d'ouvrir gedit à partir de Dash, ou essaie d'ouvrir un fichier lié à l'application:

    entrez la description de l'image ici

    • Masquer l'application de Dash (mesure facultative)

      Après avoir effectué les modifications ci-dessus, le gedit.desktopfichier étant toujours ouvert, nous pouvons ajouter une ligne supplémentaire:

      NoDisplay=true
      

      En ajoutant cette ligne, geditn'apparaîtra même pas dans Dash.

    annuler

    Pour annuler, supprimez simplement le .desktopfichier local de~/.local/share/applications

2.Rendre la recherche un peu plus difficile

Alors que, après avoir modifié le .desktopfichier, l'application n'apparaîtra plus dans Dash, la recherche Dash montrera toujours notre gedit.desktopfichier nouvellement créé , ce qui pourrait involontairement donner un indice sur la façon d'échapper au bloc d'application.

entrez la description de l'image ici

Pour éviter cela, nous devons exclure le répertoire ~/.local/share/applicationsde la recherche Dash et effacer l'historique de recherche.
Ouvrez Paramètres système> "Sécurité et confidentialité"> "Fichiers et applications" (onglet). Ajoutez le répertoire ~/.local/share/applicationsà la liste à exclure de la recherche.

entrez la description de l'image ici

3. (Pas) en utilisant le terminal / la ligne de commande

Rediriger la geditcommande(1)

La modification du .desktopfichier empêche d'utiliser l'application à partir de Dash, mais si l'utilisateur connaît la AltF2combinaison et la commande pour exécuter l'application, il pourra toujours démarrer l'application, tout comme avec le terminal. Une mesure supplémentaire agréable et facile à configurer consiste à créer (s'il n'existe pas encore) le répertoire ~/binet à créer un petit script dans le répertoire:

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

Rendez-le exécutable et nommez-le d'après l'application; geditdans ce cas.

Puisque ~/binc'est dans PATH, l'exécution de la commande appellera le script au lieu de la "vraie" geditapplication. En conséquence, le même You are not allowed to use this applicationmessage apparaîtra

Rediriger la geditcommande(2)

Une autre façon (avec un effet plus limité, voir note) de rediriger la commande de l'application est d'ajouter un alias au .bashrcfichier:

gedit ~/.bashrc

ajoutez la ligne (exemple gedit):

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

Remarque : ceci ne doit être utilisé que comme mesure supplémentaire, car il empêche uniquement l'appel direct de l'application à partir du terminal. Un double-clic sur un .txtfichier (par exemple) ouvrira cependant toujours l'application.

Rendre l'utilisation du terminal difficile ou impossible du tout

Pour empêcher l'utilisation du terminal, vous pouvez également faire la même astuce sur le gnome-terminal.desktopfichier - que dans [1]et / ou modifier la combinaison de touches de raccourci par défaut pour exécuter le terminal (Paramètres système> "Clavier"> "Raccourcis"> "Démarreurs" )


4. Un petit outil pour créer (ou annuler) automatiquement une version modifiée du .desktopfichier (comme dans 1.)

Si vous exécutez le script ci-dessous avec l'argument blockou unblock(vous devez l' exécuter avec l'un ou l'autre), une liste de fichiers (globaux) de bureau vous sera présentée, représentant vos applications installées:

entrez la description de l'image ici

Choisissez-en un, et votre application est bloquée ou débloquée, selon l'argument avec lequel vous l'exécutez.

Remarque

Vous devrez peut-être vous déconnecter / vous connecter pour que cela fonctionne.

Le script

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

Copiez le script dans un fichier vide, enregistrez-le sous block_apps.pyet exécutez-le soit:

python3 /path/to/block_apps.py block

ou

python3 /path/to/block_apps.py unblock

B. Option (s) scriptée (s)

Le blocage de certaines applications peut également être effectué en exécutant un script en arrière-plan. Le script devra effectuer certaines actions si l'une des applications "interdites" est exécutée.

1. Script pour manipuler l'écran lorsque des applications interdites sont utilisées.

Le script ci-dessous offre un moyen flexible de bloquer les applications définies par l'utilisateur. Il s'exécute avec une commande simple, avec les applications interdites comme argument, par exemple (en supposant que vous avez rendu le script exécutable):

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

L'avantage de bloquer des applications comme celle-ci est qu'il est flexible; même au sein d'un compte, différents paramètres peuvent être utilisés, simplement en utilisant d'autres applications comme argument.

Ce qu'il fait

En décommentant l'une des lignes:

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

ou

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

Le script soit:

noircit l'écran ( action = "xrandr --output "+screen+" --brightness 0"):

entrez la description de l'image ici

ou le met à l'envers ( action = "xrandr --output "+screen+" --rotate inverted"):
( qui a dit que l'unité ne permet pas de mettre le lanceur à droite? )

entrez la description de l'image ici

Le script

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

Comment utiliser

  • Copiez le script dans un fichier vide, enregistrez-le sous block_apps.py, rendez-le exécutable
  • exécutez-le par la commande:

    /path/to/block_apps.py <application_1> <application_2> <application_3> etc...
    
  • Important
    Pour tuer le block_apps.pyscript et restaurer les paramètres "normaux", utilisez le script ci-dessous (rendez-le disponible sous une combinaison de touches de raccourci):

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

Comme toujours avec les scripts, copiez-le dans un fichier vide, enregistrez-le sous kill_blockapps.py, rendez-le exécutable et exécutez-le par:

/path/to/kill_blockapps.py

Vous voudrez probablement avoir celui-ci sous une touche de raccourci: Choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez la commande comme ci-dessus.

Jacob Vlijm
la source
Excellent travail Jacob. Excellente réponse. Continuez à l'améliorer.
Luis Alvarado
@EricCarvalho Merci pour la modification! manqué celui-là.
Jacob Vlijm