Как заблокировать открытие определенных приложений в определенных аккаунтах

13

Как заблокировать определенные приложения от открытия на определенных счетах (например: Остановить учетную запись Джона при открытии Firefox или Gimp). Предполагается, что это для графического интерфейса, а не для терминала, и будет применяться только для определенных пользователей, поэтому, например, пользователь X может открывать Gimp, но не Firefox, пользователь Z может открывать Центр программного обеспечения, но не VirtualBox.

Какой хороший и простой способ сделать это для нового пользователя Ubuntu.

Луис Альварадо
источник
Поместить ACL в определенные файлы?
MDPC
Каков требуемый уровень безопасности? Будут
Jacob Vlijm
Сейчас уровень безопасности минимален. Пользователям нужно будет только запретить доступ (любыми средствами) к любому типу приложений. Я предполагаю, что пользователи плохо знают Linux и, вероятно, никогда не будут использовать терминал, но вы можете добавить любую информацию о нем.
Луис Альварадо
Я не знаю достаточно, чтобы на самом деле сделать это, но, возможно, вы могли бы настроить все критически важные приложения, чтобы они были доступны только группе. Затем вы можете добавить опытных пользователей в эту группу для полного доступа. Для пользователей с ограниченными правами вы можете использовать sudo (не root) вместе с соответствующими записями в sudoers, чтобы предоставить им защищенный паролем доступ к другим командам в каждом конкретном случае.
Джо
Я полагаю, что это то, для чего предназначен AppArmor, но я не думаю, что это можно назвать «легким» способом.
Муру

Ответы:

15

А. Варианты конфигурации

Если блокировка предназначена для блокировки неопытных пользователей от использования определенных приложений, редактирование (локальная копия) файла рабочего стола приложения (как описано в [1]), вероятно, является самым быстрым и простым способом.
Некоторые дополнительные действия могут быть сделаны, чтобы создать дополнительный барьер и / или предотвратить тот факт, что пользователь слишком легко узнает, что мы сделали, чтобы заблокировать приложение ([2] и [3]).

Настройка не подходит для ситуаций, в которых не принимают участия опытные пользователи. В «домашних» ситуациях со средними пользователями этого будет достаточно во многих случаях.

1. Пример блокировки gedit путем редактирования (локальной версии) файла .desktop.

  • Скопируйте файл на рабочем столе приложения в /usr/share/applicationsк ~/.local/share/applications:

    cp /usr/share/applications/gedit.desktop ~/.local/share/applications/gedit.desktop
    
  • Отредактируйте файл: откройте его с помощью gedit (пока вы все еще можете :)), перетащив его в открытое окно gedit.

    • заменить линию

      Exec=gedit %U
      

      по:

      Exec=zenity --info --text 'You are not allowed to use this application'
      
    • удалите (возможные) ярлыки, чтобы предотвратить запуск приложения одним из ярлыков:

      удалите строку (для примера gedit):

      Actions=Window;Document;
      

      и раздел (ы), как:

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

    С этого момента (после выхода из системы / входа в систему) пользователь увидит это сообщение, если попытается открыть gedit из Dash или попытается открыть файл, связанный с приложением:

    введите описание изображения здесь

    • Скрытие приложения от Dash (необязательная мера)

      После того, как мы внесли изменения, оставив gedit.desktopфайл открытым, мы можем добавить дополнительную строку:

      NoDisplay=true
      

      Добавив эту строку, geditдаже не будет отображаться в Dash.

    Отменить

    Чтобы отменить, просто удалите локальный .desktopфайл из~/.local/share/applications

2. Делая это немного сложнее выяснить

Хотя после редактирования .desktopфайла приложение больше не будет отображаться в Dash, при поиске в Dash все равно будет показан наш новый gedit.desktopфайл, который может непреднамеренно дать подсказку, как выйти из блока приложения.

введите описание изображения здесь

Чтобы избежать этого, мы должны исключить каталог ~/.local/share/applicationsиз поиска Dash и очистить историю поиска.
Откройте Системные настройки> «Безопасность и конфиденциальность»> «Файлы и приложения» (вкладка). Добавьте каталог ~/.local/share/applicationsв список, чтобы исключить из поиска.

введите описание изображения здесь

3. (Не) используя терминал / командную строку

Перенаправление geditкоманды(1)

Редактирование .desktopфайла не позволяет использовать приложение из Dash, но если пользователь знает AltF2комбинацию и команду для запуска приложения, он все равно сможет запустить приложение, как и в терминале. Хорошая и простая настройка дополнительных мер - это создать (если он еще не существует) каталог ~/binи создать небольшой скрипт в каталоге:

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

Сделайте его исполняемым и назовите его после приложения; geditв таком случае.

Так как ~/binв PATHвыполнении команды будет вызывать сценарий вместо «реального» geditприложения. В результате You are not allowed to use this applicationпоявится то же сообщение

Перенаправление geditкоманды(2)

Другой способ (с более ограниченным эффектом, см. Примечание) перенаправления команды приложения - добавить псевдоним в .bashrcфайл:

gedit ~/.bashrc

добавьте строку (пример gedit):

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

Примечание : это должно использоваться только в качестве дополнительной меры, так как оно только предотвращает прямой вызов приложения из терминала. Двойной щелчок на (например) .txtфайле, тем не менее, все равно откроет приложение.

Сделать использование терминала трудным или невозможным вообще

Чтобы предотвратить использование терминала, вы также можете выполнить тот же трюк с gnome-terminal.desktopфайлом -, что и в [1], и / или изменить комбинацию сочетаний клавиш по умолчанию для запуска терминала (Системные настройки> «Клавиатура»> «Сочетания клавиш»> «Пускатели»). )


4. Небольшой инструмент для автоматического создания (или отмены) отредактированной версии .desktop файла (как в 1.)

Если вы запустите приведенный ниже скрипт либо с аргументом, blockлибо unblock(вы должны запустить его с любым из них), вам будет представлен список с (глобальными) файлами рабочего стола, представляющими ваши установленные приложения:

введите описание изображения здесь

Выберите один, и ваше приложение будет заблокировано или разблокировано, в зависимости от аргумента, с которым вы его запускаете.

Заметка

Возможно, вам придется выйти / войти, чтобы заставить его работать.

Сценарий

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

Скопируйте скрипт в пустой файл, сохраните его как block_apps.pyи запустите:

python3 /path/to/block_apps.py block

или

python3 /path/to/block_apps.py unblock

B. Сценарий (ы) вариант (ы)

Блокировка определенных приложений также может быть выполнена путем запуска сценария в фоновом режиме. Сценарий должен будет выполнить определенные действия, если запущено одно из «запрещенных» приложений.

1. Скрипт для управления экраном при использовании запрещенных приложений.

Сценарий ниже предлагает гибкий способ блокировки пользовательских приложений. Он запускается с помощью простой команды с запрещенными приложениями в качестве аргумента, например (при условии, что вы сделали исполняемый скрипт):

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

Преимущество таких приложений в том, что они гибкие; даже в пределах одной учетной записи можно использовать разные настройки, просто используя другие приложения в качестве аргумента.

Что оно делает

Откомментировав одну из строк:

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

или

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

Сценарий либо:

черный экран ( action = "xrandr --output "+screen+" --brightness 0"):

введите описание изображения здесь

или переворачивает его вверх ногами ( action = "xrandr --output "+screen+" --rotate inverted"):
( кто сказал, что Unity не позволяет поставить панель запуска справа? )

введите описание изображения здесь

Сценарий

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

Как пользоваться

  • Скопируйте скрипт в пустой файл, сохраните его как block_apps.py, сделайте его исполняемым
  • запустите его командой:

    /path/to/block_apps.py <application_1> <application_2> <application_3> etc...
    
  • Важно
    , чтобы убить в block_apps.pyсценарий и восстановить «нормальные» настройки, используйте скрипт ниже (сделать его доступным при комбинации клавиш быстрого вызова):

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

Как всегда со сценариями, скопируйте его в пустой файл, сохраните как kill_blockapps.py, сделайте его исполняемым и запустите его:

/path/to/kill_blockapps.py

Возможно, вы захотите, чтобы это было под сочетанием клавиш: Выберите: «Системные настройки»> «Клавиатура»> «Ярлыки»> «Пользовательские ярлыки». Нажмите «+» и добавьте команду, как указано выше.

Якоб Влейм
источник
Отличная работа, Джейкоб. Отличный ответ. Продолжайте улучшать это.
Луис Альварадо
@EricCarvalho Спасибо за редактирование! пропустил тот.
Джейкоб Влейм