วิธีการปิดกั้นแอพที่เฉพาะเจาะจงจากการเปิดในบัญชีที่เฉพาะเจาะจง


13

วิธีปิดกั้นแอปพลิเคชันบางอย่างจากการเปิดในบางบัญชี (เช่น: หยุดบัญชี John จากการเปิด Firefox หรือ Gimp) มันถือว่าเป็นส่วนนี้สำหรับ GUI ไม่ใช่เทอร์มินัลและจะใช้กับผู้ใช้เฉพาะเท่านั้นตัวอย่างเช่น user X สามารถเปิด Gimp แต่ไม่ใช่ Firefox ผู้ใช้ Z สามารถเปิด Software Center แต่ไม่ใช่ VirtualBox

มีวิธีที่ดีและง่ายในการทำสิ่งนี้สำหรับผู้ใช้ใหม่ของ Ubuntu


วาง ACL ในไฟล์เฉพาะหรือไม่
mdpc

ระดับความปลอดภัยที่ต้องการคืออะไร จะมีคำตอบที่ใช้งานได้ที่นี่: askubuntu.com/questions/447043/ …
Jacob Vlijm

ตอนนี้ระดับความปลอดภัยมีน้อย ผู้ใช้จะต้องถูกปฏิเสธการเข้าถึงแอปประเภทใด ๆ ผู้ใช้ที่ฉันเดาว่ามีความรู้เกี่ยวกับ Linux ต่ำและอาจจะไม่ใช้ terminal แต่คุณสามารถเพิ่มข้อมูลใด ๆ ได้
Luis Alvarado

ฉันไม่รู้จริง ๆ พอที่จะทำมัน แต่บางทีคุณอาจตั้งค่าแอปพลิเคชันที่สำคัญทั้งหมดให้เข้าถึงได้โดยกลุ่มเท่านั้น จากนั้นคุณสามารถเพิ่มผู้ใช้ขั้นสูงในกลุ่มนั้นเพื่อการเข้าถึงแบบเต็ม สำหรับผู้ใช้ที่ถูก จำกัด คุณสามารถใช้ sudo (ไม่ให้รูท) พร้อมกับรายการที่เหมาะสมใน sudoers เพื่อให้พวกเขาได้รับการป้องกันด้วยรหัสผ่านในการเข้าถึงคำสั่งอื่น ๆ เป็นกรณี ๆ ไป
Joe

นี่คือสิ่งที่ฉันจินตนาการว่า AppArmor ตั้งใจจะทำ แต่ฉันไม่คิดว่ามันมีคุณสมบัติเป็นวิธี "ง่าย"
muru

คำตอบ:


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

คุณอาจต้องการใช้ปุ่มทางลัดนี้: เลือก: การตั้งค่าระบบ> "แป้นพิมพ์"> "ทางลัด"> "ทางลัดที่กำหนดเอง" คลิกที่ "+" และเพิ่มคำสั่งดังกล่าวข้างต้น


สุดยอดยาโคบ คำตอบที่ยอดเยี่ยม พัฒนาต่อไปเรื่อย ๆ
Luis Alvarado

@EricCarvalho ขอบคุณสำหรับการแก้ไข! พลาดที่หนึ่ง
Jacob Vlijm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.