특정 계정에서 특정 앱이 열리지 않도록 차단하는 방법


13

특정 계정에서 특정 응용 프로그램이 열리지 않도록 차단하는 방법 (예 : 계정 John이 Firefox 또는 Gimp를 열지 못하도록 중지) 이것은 GUI 용이며 터미널이 아니라 특정 사용자에게만 적용되는 것으로 가정합니다. 예를 들어 사용자 X는 Gimp를 열 수 있지만 Firefox는 열 수없고 사용자 Z는 Software Center를 열 수 있지만 VirtualBox는 열 수 없습니다.

우분투의 새로운 사용자를 위해이 작업을 수행하는 것이 좋고 쉬운 방법은 무엇입니까?


특정 파일에 ACL을 넣습니까?
mdpc

필요한 보안 수준은 무엇입니까? 여기에 유용한 답변이 있습니까
Jacob Vlijm

현재 보안 수준은 최소입니다. 사용자는 모든 유형의 앱에 대한 액세스를 거부해야합니다. 내가 생각하는 사용자는 Linux에 대해 잘 모르고 아마도 터미널을 사용하지 않을 것이지만 그것에 대한 정보를 추가 할 수 있습니다.
Luis Alvarado

실제로는 충분히 알지 못하지만 모든 중요한 응용 프로그램을 그룹에서만 액세스 할 수 있도록 설정할 수 있습니다. 그런 다음 전체 액세스를 위해 해당 그룹에 고급 사용자를 추가 할 수 있습니다. 제한된 사용자의 경우 sudo (루트 아님)와 sudoers의 해당 항목을 함께 사용하여 경우에 따라 다른 명령에 대한 암호로 보호 된 액세스 권한을 부여 할 수 있습니다.
Joe

이것이 AppArmor가해야 할 일이라고 생각하지만 그것이 "쉬운"방법이라고 생각하지는 않습니다.
muru

답변:


15

A. 구성 옵션

이 블록이 경험이없는 사용자가 특정 응용 프로그램을 사용하지 못하도록하려면 응용 프로그램의 데스크톱 파일 (에 설명 된대로)의 편집 (로컬 복사본 [1])이 가장 빠르고 쉬운 방법 일 것입니다.
추가 장벽을 만들거나 사용자가 응용 프로그램을 차단하기 위해 수행 한 작업 ( [2][3]) 을 너무 쉽게 발견한다는 사실을 방지하기 위해 몇 가지 추가 작업을 수행 할 수 있습니다 .

이 설정은 숙련 된 사용자가있는 무인 상황에 적합하지 않습니다. 일반 사용자가있는 "집"상황에서는 많은 경우 충분합니다.

1. .desktop 파일 (로컬 버전)을 편집하여 gedit를 차단하는 예

  • 응용 프로그램의 데스크탑 파일 /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를 열려고하거나 응용 프로그램에 연결된 파일을 열려고하면이 메시지를 보게됩니다.

    여기에 이미지 설명을 입력하십시오

    • 대시에서 애플리케이션 숨기기 (선택적 측정 값)

      위와 같이 변경 한 후 gedit.desktop파일을 열어 둔 상태에서 다음 줄을 추가 할 수 있습니다.

      NoDisplay=true
      

      이 줄을 추가하면 gedit대시에도 표시되지 않습니다.

    실행 취소

    실행 취소하려면 간단히 로컬 .desktop파일을~/.local/share/applications

찾기가 좀 더 어려워 짐

.desktop파일 을 편집 한 후에 는 응용 프로그램이 더 이상 Dash에 표시되지 않지만 Dash 검색 은 새로 생성 된 gedit.desktop파일을 계속 표시 하므로 의도하지 않게 응용 프로그램 블록을 이스케이프하는 방법에 대한 힌트를 줄 수 있습니다.

여기에 이미지 설명을 입력하십시오

이를 피하려면 ~/.local/share/applicationsDash 검색 에서 디렉토리 를 제외 하고 검색 기록을 지워야합니다.
시스템 설정> "보안 및 개인 정보"> "파일 및 응용 프로그램"(탭)을여십시오. ~/.local/share/applications검색에서 제외 할 디렉토리 를 목록에 추가하십시오 .

여기에 이미지 설명을 입력하십시오

3. 터미널 / 명령 줄 사용

gedit명령 재 지정(1)

.desktop파일을 편집하면 Dash에서 응용 프로그램을 사용할 수 없지만 사용자가 AltF2응용 프로그램을 실행하는 조합과 명령을 알고 있으면 터미널과 마찬가지로 응용 프로그램을 계속 시작할 수 있습니다. 추가 측정 값을 설정하는 것이 쉽고 쉬운 방법은 디렉토리를 만들고 (아직 존재하지 않는 경우) 디렉토리 ~/bin에 작은 스크립트를 만드는 것입니다.

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

실행 가능하게 만들고 응용 프로그램 이름을 따서 지정하십시오. gedit이 경우

~/binis에 있기 때문에 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") :
( ? 유니티 오른쪽에있는 실행을 넣을 수 없습니다 말했다 사람 )

여기에 이미지 설명을 입력하십시오

스크립트

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

이 설정을 바로 가기 키 아래에 둘 수도 있습니다. 시스템 설정> "키보드"> "바로 가기"> "사용자 정의 바로 가기"를 선택하십시오. "+"를 클릭하고 위와 같이 명령을 추가하십시오.


대단한 야곱. 훌륭한 답변입니다. 계속 개선하십시오.
Luis Alvarado

@EricCarvalho 편집 해 주셔서 감사합니다! 그 중 하나를 놓쳤다.
Jacob Vlijm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.