So verhindern Sie, dass bestimmte Apps in bestimmten Konten geöffnet werden

13

So blockieren Sie das Öffnen bestimmter Anwendungen auf bestimmten Konten (z. B .: Stoppen Sie das Öffnen von Firefox oder Gimp durch Konto John). Es wird davon ausgegangen, dass dies für die Benutzeroberfläche und nicht für das Terminal gilt und nur für bestimmte Benutzer gilt. So kann beispielsweise Benutzer X Gimp, jedoch nicht Firefox, Benutzer Z Software Center, jedoch nicht VirtualBox öffnen.

Welche gute und einfache Möglichkeit gibt es, dies für einen neuen Benutzer von Ubuntu zu tun.

Luis Alvarado
quelle
Setzen Sie ACLs auf bestimmte Dateien?
mdpc
Was ist das erforderliche Sicherheitsniveau? Gibt
Jacob Vlijm
Momentan ist die Sicherheitsstufe minimal. Den Benutzern müsste lediglich (auf irgendeine Weise) der Zugriff auf einen App-Typ verweigert werden. Die Benutzer, die ich vermute, haben nur geringe Linux-Kenntnisse und werden das Terminal wahrscheinlich nie benutzen, aber Sie könnten Informationen dazu hinzufügen.
Luis Alvarado
Ich weiß nicht genug, um es tatsächlich zu tun, aber vielleicht könnten Sie alle kritischen Anwendungen so einrichten, dass sie nur für eine Gruppe zugänglich sind. Anschließend können Sie dieser Gruppe erweiterte Benutzer für den vollständigen Zugriff hinzufügen. Für die eingeschränkten Benutzer können Sie sudo (nicht als Root) zusammen mit den entsprechenden Einträgen in sudoers verwenden, um ihnen von Fall zu Fall einen kennwortgeschützten Zugriff auf die anderen Befehle zu gewähren.
Joe
Ich stelle mir vor, dass AppArmor dazu gedacht ist, aber ich glaube nicht, dass es sich um einen "einfachen" Weg handelt.
Muru

Antworten:

15

A. Konfigurationsoptionen

Wenn der Block nicht so erfahrenen Benutzern die Verwendung bestimmter Anwendungen untersagen soll, ist das Bearbeiten (einer lokalen Kopie) der Desktop-Datei der Anwendung (wie in beschrieben [1]) wahrscheinlich der schnellste und einfachste Weg.
Einige zusätzliche Dinge können getan werden, um eine zusätzliche Barriere zu schaffen und / oder um zu verhindern, dass der Benutzer zu leicht herausfindet, was wir getan haben, um die Anwendung ( [2]und [3]) zu blockieren .

Die Einrichtung ist nicht für unbeaufsichtigte Situationen mit erfahrenen Benutzern geeignet. In "häuslichen" Situationen mit durchschnittlichen Benutzern ist dies in vielen Fällen ausreichend.

1.Beispiel für das Blockieren von gedit durch Bearbeiten (einer lokalen Version von) der .desktop-Datei

  • Kopieren Sie die Desktop - Datei der Anwendung in /usr/share/applicationszu ~/.local/share/applications:

    cp /usr/share/applications/gedit.desktop ~/.local/share/applications/gedit.desktop
    
  • Bearbeiten Sie die Datei: Öffnen Sie sie mit gedit (solange Sie dies noch können :)), indem Sie sie über ein geöffnetes gedit-Fenster ziehen.

    • Ersetzen Sie die Leitung

      Exec=gedit %U
      

      durch:

      Exec=zenity --info --text 'You are not allowed to use this application'
      
    • Entfernen Sie die (möglichen) Verknüpfungen, um zu verhindern, dass die Anwendung über eine der Verknüpfungen gestartet wird:

      entferne die Zeile (für das gedit Beispiel):

      Actions=Window;Document;
      

      und die Abschnitte mögen:

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

    Von da an (nach dem Abmelden / Anmelden) wird dem Benutzer diese Meldung angezeigt, wenn er versucht, gedit über Dash zu öffnen, oder wenn er versucht, eine mit der Anwendung verknüpfte Datei zu öffnen:

    Bildbeschreibung hier eingeben

    • Anwendung vor Dash verstecken (optionale Maßnahme)

      Nachdem wir die obigen Änderungen vorgenommen haben und die gedit.desktopDatei noch geöffnet ist, können wir eine zusätzliche Zeile hinzufügen:

      NoDisplay=true
      

      Wenn Sie diese Zeile hinzufügen, geditwird sie nicht einmal in Dash angezeigt.

    Rückgängig machen

    Um dies rückgängig zu machen, entfernen Sie einfach die lokale .desktopDatei von~/.local/share/applications

2. Es etwas schwieriger zu machen, es herauszufinden

Während .desktopdie Anwendung nach der Bearbeitung der Datei nicht mehr in Dash angezeigt wird , zeigt die Dash- Suche weiterhin unsere neu erstellte gedit.desktopDatei an, die möglicherweise unbeabsichtigt einen Hinweis darauf gibt, wie der Anwendungsblock verlassen werden kann.

Bildbeschreibung hier eingeben

Um dies zu vermeiden, sollten wir das Verzeichnis ~/.local/share/applicationsvon der Dash-Suche ausschließen und den Suchverlauf löschen.
Öffnen Sie die Systemeinstellungen> "Sicherheit und Datenschutz"> "Dateien und Anwendungen" (Registerkarte). Fügen Sie das Verzeichnis ~/.local/share/applicationsder Liste hinzu, um es von der Suche auszuschließen.

Bildbeschreibung hier eingeben

3. (Nicht) Verwenden der Terminal- / Befehlszeile

geditBefehl umleiten(1)

Durch das Bearbeiten der .desktopDatei wird die Verwendung der Anwendung über Dash verhindert. Wenn der Benutzer jedoch die AltF2Kombination und den Befehl zum Ausführen der Anwendung kennt , kann er die Anwendung wie mit dem Terminal starten. Eine nette und einfach einzurichtende zusätzliche Maßnahme ist, das Verzeichnis zu erstellen (falls es noch nicht existiert) ~/binund ein kleines Skript im Verzeichnis zu erstellen:

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

Machen Sie es ausführbar und benennen Sie es nach der Anwendung. geditin diesem Fall.

Da ~/binin ist PATH, wird der Befehl ausgeführt wird das Skript aufrufen anstelle der „echten“ geditAnwendung. Infolgedessen wird dieselbe You are not allowed to use this applicationMeldung angezeigt

geditBefehl umleiten(2)

Eine andere Möglichkeit (mit eingeschränkterem Effekt, siehe Hinweis), den Befehl der Anwendung umzuleiten, besteht darin, der .bashrcDatei einen Alias ​​hinzuzufügen :

gedit ~/.bashrc

füge die Zeile hinzu (gedit Beispiel):

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

Hinweis : Dies ist nur als zusätzliche Maßnahme zu verwenden, da nur verhindert wird, dass die Anwendung direkt vom Terminal aufgerufen wird. Ein Doppelklick auf eine (zB) .txtDatei öffnet die Anwendung jedoch weiterhin.

Machen Sie die Verwendung des Terminals schwierig oder unmöglich

Um die Verwendung des Terminals zu verhindern, können Sie in der gnome-terminal.desktopDatei den gleichen Trick [1]ausführen wie in und / oder die Standard-Tastenkombination ändern, um das Terminal auszuführen (Systemeinstellungen> "Tastatur"> "Tastenkombinationen"> "Starter"). )


4. Ein kleines Tool zum automatischen Erstellen (oder Rückgängigmachen) einer bearbeiteten Version der .desktopDatei (wie in 1.)

Wenn Sie das folgende Skript entweder mit dem Argument blockoder unblock(Sie müssen es mit einem der beiden ausführen) ausführen, wird eine Liste mit (globalen) Desktop-Dateien angezeigt, die Ihre installierten Anwendungen darstellen:

Bildbeschreibung hier eingeben

Wählen Sie eine aus, und Ihre Anwendung wird abhängig vom Argument, mit dem Sie sie ausführen, gesperrt oder entsperrt.

Hinweis

Möglicherweise müssen Sie sich abmelden / anmelden, damit es funktioniert.

Das Drehbuch

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

Kopieren Sie das Skript in eine leere Datei, speichern Sie es als block_apps.pyund führen Sie es aus:

python3 /path/to/block_apps.py block

oder

python3 /path/to/block_apps.py unblock

B. Skriptoption (en)

Das Blockieren bestimmter Anwendungen kann auch durch Ausführen eines Skripts im Hintergrund erfolgen. Das Skript müsste bestimmte Aktionen ausführen, wenn eine der "verbotenen" Anwendungen ausgeführt wird.

1. Skript zum Bearbeiten des Bildschirms, wenn verbotene Anwendungen verwendet werden.

Das folgende Skript bietet eine flexible Möglichkeit, benutzerdefinierte Anwendungen zu blockieren. Es wird mit einem einfachen Befehl ausgeführt, wobei die verbotenen Anwendungen als Argument dienen (vorausgesetzt, Sie haben das Skript ausführbar gemacht):

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

Das Blockieren solcher Anwendungen hat den Vorteil, dass sie flexibel sind. Selbst innerhalb eines Kontos können verschiedene Einstellungen verwendet werden, indem einfach andere Anwendungen als Argument verwendet werden.

Was es macht

Indem Sie eine der Zeilen auskommentieren:

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

oder

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

Das Skript entweder:

schwärzt den Bildschirm ( action = "xrandr --output "+screen+" --brightness 0"):

Bildbeschreibung hier eingeben

oder stellt es auf den Kopf ( action = "xrandr --output "+screen+" --rotate inverted"):
( Wer hat gesagt, dass Unity es nicht erlaubt, den Launcher rechts zu platzieren? )

Bildbeschreibung hier eingeben

Das Drehbuch

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

Wie benutzt man

  • Kopieren Sie das Skript in eine leere Datei, speichern Sie es als block_apps.py, und machen Sie es ausführbar
  • starte es mit dem Befehl:

    /path/to/block_apps.py <application_1> <application_2> <application_3> etc...
    
  • Wichtig
    Um das Skript zu beendenblock_apps.py und "normale" Einstellungen wiederherzustellen, verwenden Sie das folgende Skript (stellen Sie es unter einer Tastenkombination zur Verfügung):

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

Kopieren Sie es wie immer mit Skripten in eine leere Datei, speichern Sie es als kill_blockapps.py, machen Sie es ausführbar und führen Sie es aus durch:

/path/to/kill_blockapps.py

Möglicherweise möchten Sie diesen unter einer Tastenkombination haben: Wählen Sie: Systemeinstellungen> "Tastatur"> "Tastenkombinationen"> "Benutzerdefinierte Tastenkombinationen". Klicken Sie auf das "+" und fügen Sie den Befehl wie oben beschrieben hinzu.

Jacob Vlijm
quelle
Großartige Arbeit, Jacob. Hervorragende Antwort. Verbessere es weiter.
Luis Alvarado
@EricCarvalho Danke für die Bearbeitung! habe das verpasst.
Jacob Vlijm