Como impedir que aplicativos específicos sejam abertos em contas específicas

13

Como impedir que certos aplicativos sejam abertos em determinadas contas (por exemplo: Interrompa a conta John de abrir o Firefox ou Gimp). Supõe-se que seja para a GUI e não para o terminal e se aplicaria apenas a usuários específicos; portanto, por exemplo, o usuário X pode abrir o Gimp, mas não o Firefox, o usuário Z pode abrir o Software Center, mas não o VirtualBox.

Que maneira boa e fácil de fazer isso para um novo usuário do Ubuntu?

Luis Alvarado
fonte
Colocar ACLs em arquivos específicos?
MDPC
Qual é o nível de segurança necessário? Haveria respostas utilizáveis aqui: askubuntu.com/questions/447043/...
Jacob Vlijm
No momento, o nível de segurança é mínimo. Os usuários só precisam ter acesso negado (por qualquer meio) a qualquer tipo de aplicativo. Acho que os usuários têm pouco conhecimento do Linux e provavelmente nunca usarão o terminal, mas você pode adicionar qualquer informação sobre ele.
14134 Luis Alvarado
Não sei o suficiente para fazê-lo, mas talvez você possa configurar todos os aplicativos críticos para serem acessíveis apenas por um grupo. Em seguida, você pode adicionar usuários avançados a esse grupo para obter acesso total. Para os usuários restritos, você pode usar o sudo (não para root) junto com as entradas apropriadas no sudoers para fornecer a eles acesso protegido por senha aos outros comandos, caso a caso.
11124 Joe
É isso que imagino que o AppArmor deve fazer, mas não acho que seja qualificado como uma maneira "fácil".
Muru

Respostas:

15

A. Opções configuracionais

Se o bloqueio tiver como objetivo impedir que usuários não tão experientes usem certos aplicativos, editar (uma cópia local) do arquivo da área de trabalho do aplicativo (conforme descrito em [1]) é provavelmente a maneira mais rápida e fácil.
Algumas coisas adicionais podem ser feitas para criar uma barreira extra e / ou impedir o fato de o usuário descobrir com muita facilidade o que fizemos para bloquear o aplicativo ( [2]e [3]).

A configuração não é adequada para situações autônomas com usuários experientes. Em situações "domésticas" com usuários médios, será suficiente em muitos casos.

1.Exemplo para bloquear o gedit editando (uma versão local) do arquivo .desktop

  • Copiar o arquivo do desktop do aplicativo em /usr/share/applicationsque ~/.local/share/applications:

    cp /usr/share/applications/gedit.desktop ~/.local/share/applications/gedit.desktop
    
  • Edite o arquivo: abra-o com o gedit (enquanto você ainda pode :) :) arrastando-o sobre uma janela aberta do gedit.

    • substituir a linha

      Exec=gedit %U
      

      por:

      Exec=zenity --info --text 'You are not allowed to use this application'
      
    • remova os atalhos (possíveis) para impedir iniciar o aplicativo a partir de um dos atalhos:

      remova a linha (para o exemplo do gedit):

      Actions=Window;Document;
      

      e as seções como:

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

    A partir de então (após o logout / logon), o usuário verá esta mensagem se tentar abrir o gedit a partir do Dash ou tentar abrir um arquivo vinculado ao aplicativo:

    insira a descrição da imagem aqui

    • Ocultando o aplicativo do Dash (medida opcional)

      Depois de fazer as alterações acima, com o gedit.desktoparquivo ainda aberto, podemos adicionar uma linha adicional:

      NoDisplay=true
      

      Ao adicionar esta linha, geditnem aparecerá no Dash.

    Desfazer

    Para desfazer, basta remover o .desktoparquivo local de~/.local/share/applications

2.Fazer um pouco mais difícil de descobrir

Embora, depois de editar o .desktoparquivo, o aplicativo não apareça mais no Dash, a pesquisa do Dash ainda mostrará nosso gedit.desktoparquivo recém-criado , que pode, sem querer, dar uma dica de como escapar do bloco do aplicativo.

insira a descrição da imagem aqui

Para evitar isso, devemos excluir o diretório ~/.local/share/applicationsda pesquisa Dash e limpar o histórico de pesquisas.
Abra Configurações do sistema> "Segurança e privacidade"> "Arquivos e aplicativos" (guia). Adicione o diretório ~/.local/share/applicationsà lista para excluir da pesquisa.

insira a descrição da imagem aqui

3. (Não) usando o terminal / linha de comando

Redirecionando o geditcomando(1)

A edição do .desktoparquivo impede o uso do aplicativo pelo Dash, mas se o usuário conhecer a AltF2combinação e o comando para executá-lo, ele ainda poderá iniciar o aplicativo, assim como no terminal. Uma medida extra agradável e fácil de configurar é criar (se ainda não existir) o diretório ~/bine criar um pequeno script no diretório:

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

Torne-o executável e nomeie-o após o aplicativo; geditnesse caso.

Como ~/binestá PATH, a execução do comando chamará o script em vez do geditaplicativo "real" . Como resultado, a mesma You are not allowed to use this applicationmensagem aparecerá

Redirecionando o geditcomando(2)

Outra maneira (com efeito mais limitado, consulte a nota) de redirecionar o comando do aplicativo é adicionar um alias ao .bashrcarquivo:

gedit ~/.bashrc

adicione a linha (exemplo do gedit):

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

Nota : isso deve ser usado apenas como uma medida extra, pois impede apenas que o aplicativo seja chamado diretamente do terminal. Clicar duas vezes em um .txtarquivo (por exemplo) ainda abrirá o aplicativo.

Tornar difícil ou impossível a utilização do terminal

Para impedir o uso do terminal, você também pode executar o mesmo truque no gnome-terminal.desktoparquivo - como em [1], e / ou alterar a combinação de teclas de atalho padrão para executar o terminal (Configurações do sistema> "Teclado"> "Atalhos"> "Iniciantes" )


4. Uma pequena ferramenta para criar (ou desfazer) automaticamente uma versão editada do .desktoparquivo (como em 1.)

Se você executar o script abaixo com o argumento blockou unblock(você deve executá-lo com qualquer um), será apresentada uma lista com os arquivos da área de trabalho (global), representando seus aplicativos instalados:

insira a descrição da imagem aqui

Escolha uma e seu aplicativo é bloqueado ou desbloqueado, dependendo do argumento com o qual você o executa.

Nota

Você pode precisar sair / fazer login para fazê-lo funcionar.

O 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)

Copie o script em um arquivo vazio, salve-o como block_apps.pye execute-o:

python3 /path/to/block_apps.py block

ou

python3 /path/to/block_apps.py unblock

B. Opção (s) com script

O bloqueio de certos aplicativos também pode ser feito executando um script em segundo plano. O script precisaria executar determinadas ações se um dos aplicativos "proibidos" fosse executado.

1. Script para manipular a tela quando aplicativos proibidos são usados.

O script abaixo oferece uma maneira flexível de bloquear aplicativos definidos pelo usuário. Ele roda com um comando simples, com os aplicativos proibidos como argumento, por exemplo (supondo que você tenha feito o script executável):

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

A vantagem de bloquear aplicativos como esse é que ele é flexível; mesmo em uma conta, configurações diferentes podem ser usadas, simplesmente usando outros aplicativos como argumento.

O que faz

Ao não comentar uma das linhas:

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

ou

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

O script:

escurece a tela ( action = "xrandr --output "+screen+" --brightness 0"):

insira a descrição da imagem aqui

ou vira de cabeça para baixo ( action = "xrandr --output "+screen+" --rotate inverted"):
( quem disse que o Unity não permite colocar o iniciador à direita? )

insira a descrição da imagem aqui

O 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)

Como usar

  • Copie o script para um arquivo vazio, salve-o como block_apps.py, torne-o executável
  • execute-o pelo comando:

    /path/to/block_apps.py <application_1> <application_2> <application_3> etc...
    
  • Importante
    Para matar o block_apps.pyscript e restaurar as configurações "normais", use o script abaixo (disponibilize-o em uma combinação de teclas de atalho):

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

Como sempre com scripts, copie-o para um arquivo vazio, salve-o como kill_blockapps.py, torne-o executável e execute-o da seguinte maneira:

/path/to/kill_blockapps.py

Você provavelmente desejará colocá-lo sob uma tecla de atalho: Escolha: Configurações do sistema> "Teclado"> "Atalhos"> "Atalhos personalizados". Clique no "+" e adicione o comando como acima.

Jacob Vlijm
fonte
Ótimo trabalho, Jacob. Excelente resposta. Continue melhorando.
14134 Luis Alvarado
@EricCarvalho Obrigado pela edição! perdeu aquele.
23814 Jacob Vlijm