Як заблокувати відкриття конкретних додатків у конкретних облікових записах


13

Як заблокувати відкриття певних додатків для певних облікових записів (наприклад, зупиніть обліковий запис Джона від відкриття Firefox або Gimp). Передбачається, що це для графічного інтерфейсу, а не для терміналу, і застосовуватиметься лише до конкретних користувачів, тому, наприклад, користувач X може відкривати Gimp, але не Firefox, користувач Z може відкрити Центр програмного забезпечення, але не VirtualBox.

Який хороший і простий спосіб зробити це для нового користувача Ubuntu.


Поставити ACL на певні файли?
mdpc

Який необхідний рівень безпеки? Чи будуть тут відповіді корисні: askubuntu.com/questions/447043/…
Яків Влійм

Зараз рівень безпеки мінімальний. Користувачам потрібно буде лише заборонити доступ (будь-якими способами) до будь-якого типу додатків. Користувачі, напевно, мають низькі знання Linux і, ймовірно, ніколи не використовуватимуть термінал, але ви можете додати будь-яку інформацію про нього.
Луїс Альварадо

Я не знаю достатньо, щоб насправді це зробити, але, можливо, ви могли б налаштувати всі критичні програми, щоб вони були доступними лише групі. Потім ви можете додати досвідчених користувачів до цієї групи для повного доступу. Для обмежених користувачів ви можете використовувати sudo (не для кореневого використання) разом з відповідними записами в sudoers, щоб надати їм захищений паролем доступ до інших команд у кожному конкретному випадку.
Джо

Це те, що я думаю, що AppArmor призначений робити, але я не думаю, що це кваліфікується як "простий" спосіб.
муру

Відповіді:


15

A. Конфігураційні параметри

Якщо блок призначений для того, щоб заблокувати не так досвідчених користувачів у користуванні певними програмами, редагування (локальна копія) файлу робочого столу програми (як описано в [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 Дякую за редагування! пропустив того.
Яків Влійм
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.