如何限制或限制对应用程序的访问?


18

我儿子在去年圣诞节收到了一台新笔记本电脑,主要是在他的新学校使用的。现在,他有了自己的笔记本电脑,他很高兴安装了Steam。

但是妻子希望我删除Steam,因为笔记本电脑主要是供学校使用的……如果不需要,我宁愿不这样做。

有什么办法可以限制或限制对Steam的访问?也许是Steam本身的密码,或者设定了可以运行的时间?

理想情况下,它必须使用起来非常简单,因为我的工作经常使我长时间不在家里(以及计算机,电信和...),而我的妻子却不像我那样舒服地围着计算机,更容易使用远非如此

当然有可以实现此任务的东西吗?


您可以使用路由器中的儿童安全锁来限制使用蒸汽,例如每天1小时。Steam将端口UDP 27000-27015用于客户端流量。如果您限制路由器中的这些端口,您的儿子将无法登录Steam。
凯夫因斯基

最简单的解决方案是在安装Steam的Ubuntu上创建一个用户配置文件。为将由您的儿子使用的新用户配置文件创建密码。

@Begueradj孩子可以很聪明。对计算机的物理访问意味着可能的root用户访问,这意味着除了加密之外,您可以绕过所有内容。您需要加密该用户的主目录,然后对其进行安全保护。
字节指挥官

@Gregory您儿子的计算机有多聪明?您是否需要100%安全的物品,或者只是简单地访问Steam就足够了吗?
字节指挥官

Answers:


2

设置流程或应用程序的时间限制

使用小的后台脚本,您可以为进程或应用程序设置时间限制。
只要您的用户不知道管理员的密码,就不会轻易超过它。

下面的解决方案

就是这么小的背景脚本。它将每天的使用限制为定义的分钟数,以在脚本的开头进行设置。设置完成(这不太困难),它运行起来非常容易,此后无需采取其他任何措施。

剧本

#!/usr/bin/python3
import subprocess
import os
import sys
import time

#--- set the time limit below (minutes)
minutes = 1
#--- set the process name to limit below
app = "gedit"

uselog = "/opt/limit/uselog"
datefile = "/opt/limit/currdate"

def read(f):
    try:
        return int(open(f).read().strip())
    except FileNotFoundError:
        pass

currday1 = read(datefile)

while True:
    time.sleep(10)
    currday2 = int(time.strftime("%d"))

    # check if the day has changed, to reset the used quantum
    if currday1 != currday2:
        open(datefile, "wt").write(str(currday2))
        try:
            os.remove(uselog)  
        except FileNotFoundError:
            pass

    try:
        # if the pid of the targeted process exists, add a "tick" to the used quantum
        pid = subprocess.check_output(["pgrep", app]).decode("utf-8").strip()
        n = read(uselog)
        n = n + 1 if n != None else 0
        # when time exceeds the permitted amount, kill the process
        if n > minutes*6: 
            subprocess.Popen(["kill", pid])
        open(uselog, "wt").write(str(n))
    except subprocess.CalledProcessError:
        pass

    currday1 = currday2

如何使用

  1. 在桌面上(或其他任何地方),创建一个名为: limit
  2. 将脚本复制到一个空文件中,将其另存为limit_use(无扩展名)在文件夹中,使其可执行
  3. 在脚本的开头编辑要限制的进程名称以及允许的最大分钟数。在示例中:

    #--- set the time limit below (minutes)
    minutes = 1
    #--- set the process name to limit below
    app = "gedit"
  4. 将文件夹复制到目录/opt

    cp -r /path/to/limit /opt
  5. 现在编辑/etc/rc.local以使脚本root在启动时运行:

    sudo -i gedit /etc/rc.local

    就在行前

    exit 0

    另一行:

    /opt/limit/limit_use &

而已

当有人试图杀死后台脚本时:

在此处输入图片说明

(不允许采取行动)

说明; 怎么运行的

  • 每10秒一次,脚本将查看目标进程是否正在运行。如果是这样,它将“加”一个“点”到总使用量中,以记录在文件中(/opt/limit/uselog)。如果达到每日限制,脚本将不再允许进程运行,如果存在则将其终止。
  • 在更改日期时(日期记录在文件中,因此重新启动将无济于事),日志文件将被删除,从而增加了新的使用时间。
  • 由于脚本在启动时运行,因此rc.local只有具有sudo特权的用户才能停止脚本,即使只有在用户知道进程名称的情况下也可以。

停止脚本

如果您想停止脚本,请使用以下命令:

sudo kill "$(pgrep limit_use)"

但是同样,您需要使用sudo密码。




编辑

尽管上面的脚本应该提供一种合理安全的方式来限制应用程序的使用,如@Bytecommander所提到的,但是它可以被超越,尽管不是很容易。结合以下措施,除非您的儿子知道安装程序,并且对Linux / Ubuntu很有经验,否则很难做到这一点。

额外措施

与“简单的解决方案”相距不远,但设置起来仍然不太困难,这是下面的其他措施。如果我们怀疑是违法的人会发现脚本是从调用的/etc/rc.local,会成为root用户并删除其中的行/etc/rc.local或者能够以这种方式停止脚本,那么我们可以面对他的下一个问题:屏幕在出现后变黑此外,该解决方案还会在重启后5分钟后检查后台脚本是否正在运行,如果没有,则将其涂黑。

额外的措施是启动-检查行中/opt/limit/limit_use &是否存在该行/etc/rc.local在5分钟后检查脚本是否仍在运行。由于脚本是从启动程序(隐藏在启动应用程序中)运行的/etc/xdg/autostart,因此除非您知道如何完成,否则很难找出正在发生的情况。这两种措施的结合使您的儿子不太可能发现,如果确实如此,可能不会阻止他。

如何设定

涉及两个简单步骤:

  1. 将下面的代码复制到一个空文件中,另存为blackout.desktop您的桌面上:

    [Desktop Entry]
    Name=not allowed
    Exec=/bin/bash -c "sleep 15 && /usr/local/bin/blackout.py"
    Type=Application
    Terminal=false
    NoDisplay=true

    将文件复制到/etc/xdg/autostart

    sudo cp /path/to/blackout.desktop /etc/xdg/autostart
  2. 将下面的脚本复制到一个空文件中,将其保存blackout.py在桌面上,使其可执行并复制到/usr/local/bin

    cp /path/to/blackout.py /usr/local/bin

    剧本

    #!/usr/bin/env python3
    import subprocess
    import time
    
    def dim_screen():
        screen = [
            l.split()[0] for l in subprocess.check_output(["xrandr"]).decode("utf-8").splitlines()\
            if " connected" in l
            ]
        for scr in screen:
            subprocess.Popen(["xrandr", "--output", scr, "--brightness", "0"])
    
    if not "/opt/limit/limit_use &" in open("/etc/rc.local").read():
        dim_screen()
    
    time.sleep(300)
    
    try:
        pid = subprocess.check_output(["pgrep", "limit_use"]).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        dim_screen()

说明

启动器/etc/xdg/autostart将为所有用户启动一个应用程序(在这种情况下为额外的安全检查)。这可以在本地覆盖,但是您必须知道检查运行。通过将该行NoDisplay=true放入启动器中,它不会在中本地显示Startup Applications,因此,不知道它是否存在,就不太可能被发现。

此外,您的儿子只有15秒的时间可以找到(然后屏幕变黑),因此,除非他是个天才,否则他将遇到一个严重的问题,他对Ubuntu有着丰富的经验,并且富有创造力。


但是,如果他的儿子可以使用root密码登录到系统,那么他将无法编辑rc.local
拉斐尔

1
@Raphael这就是为什么我提到的原因是用户不是管理员。但是如果他是,如果他足够聪明,几乎没有什么可以阻止他最终超越。
雅各布·弗利姆

Ikr,如果他精通Linux,或者如果他知道如何有效地使用Google,那么最终所有答案都将无效。
拉斐尔

1
@ByteCommander当然是对的。但是,考虑到兴趣(限制时间,花在游戏上),这似乎是所要求的简单解决方案,有限的时间和合理的安全级别的合理平衡。
雅各布·弗利姆

1
@JacobVlijm是的,当然。我只是指出,他们可能会这样阻止他们的8岁孩子,但是当它成为具有一定技术知识的青少年时,他们必须知道没有100%的安全性。(并不是说我不想让这个少年享有某种自由)
字节指挥官

4

根据我自己的经验,限制对计算机游戏的访问是教育我们孩子中最具挑战性的任务之一。当然,我们的父母希望他们主要在学校使用计算机,但这与孩子的意图严重冲突。他们会讨厌我们给他们提供仅可用于学校的硬件。

当然,我们希望他们学习如何以明智的方式使用他们的计算机,包括如何不仅用于工作,还用于娱乐。这包括游戏和观看视频。

不幸的是,Ubuntu几乎无法使用维护良好且运行良好的父母控制来限制孩子的计算。另一个主要问题是,一旦他们是聪明的孩子,我们采取的所有措施便徒劳无功。他们会始终设法克服我们的限制,以防万一他们真的很聪明,而我们甚至无法注意到它们。

在孩子计算机上运行的所有阻止软件或PAM限制都只是暂时的,很可能早晚会被克服。因此,我们决定让受密码保护的路由器完成这项工作,从而可以更轻松地控制物理访问。

因此,我们目前在某种程度上限制游戏的是以下所有因素的组合:

  • 与他们交谈以教育他们如何以及何时使用计算机进行休闲,以及何时将其用于学校。这是一个持续不断,相当乏味的过程,导致无休止的讨论和争论。但这是我们认为唯一可以长期持续下去的事情。
  • 没有管理员权限对其帐户。这是暂时的。我们确实知道他们sudo迟早可以加入小组。计划是他们会要求我们这样做,而不是隐瞒这一点。
  • 订立明确定义的计算时间的合同。他们需要知道允许他们使用机器的时间和期限。他们需要学习如何在这段时间里上学休闲。
  • 睡眠时间硬封锁所有互联网。

为了使孩子和我们双方都能轻松完成计算机使用合同,我们安装了以下限制:

  • 使用受密码保护的路由器,该路由器可以结合硬件(MAC)和时间表来限制Internet访问。只要他们对MAC欺骗一无所知,就可以很好地工作。它还将限制通过其智能手机和平板电脑的访问。如果您所在的社区中有开放的无线网络,那么这当然是行不通的。
  • 在孩子的计算机上安装SSH服务器,以拔掉插头,以防孩子迷失自己的意图。对于紧急情况,我们很高兴我们并不需要太多。
  • 安装了DNS黑名单(通过路由器,而不是计算机!),该黑名单应阻止最坏的访问。

如果该游戏需要互联网访问,例如SteamMinecraft或其他gamig服务器,则阻止互联网访问将有效地禁用游戏。但是,对于离线运行的游戏而言,这将是无效的。


您是指使用ssh还是仅关闭应用程序进行关机?
拉斐尔

视情况而定... SSH可以完成所有操作,关闭,杀死用户,杀死应用程序,还原黑客攻击,将用户从sudoers中删除,...对于SSH,我们在所有孩子的盒子上都有一个父级管理员帐户。
塔卡特

很好,您是第一个拥有附加安全层的人,除了所有本地人员(如果他们成为根用户可以恢复)(如果他们具有物理访问权限,这是无法避免的)。
字节指挥官

0

这可以通过使用Shell脚本来实现。

第一个脚本是在Steam运行后立即终止:

#!/bin/bash

while true
do
    pkill steam
    sleep 1
done

exit 0

将其另存为/path/to/anyname.sh,并将其添加到启动应用程序列表中。

该脚本将执行的操作是,它将steam每秒检查一次所有打开的进程,如果找到,则将其杀死。

但是,您需要一个steam可以在特定时间正确运行的解决方案,以便您的儿子可以在该时间间隔内玩游戏。为此,您必须编写另一个脚本:

#!/bin/bash

    echo "pkill anyname.sh" | at 10:00

exit 0

将其另存为/path/to/anyname2.sh,并将其添加到启动应用程序列表中。

该脚本将在10:00时杀死第一个脚本。因此,当您的儿子Steam在10:00钟跑步时。他现在可以播放。

第三个脚本是在另一个时间点重新启动第一个脚本,以使其Steam在一定时间间隔后终止,并且您的儿子将无法再玩游戏Steam

#!/bin/bash

    echo "bash /path/to/anyname.sh" | at 12:00

exit 0

将其另存为/path/to/anyname3.sh,并将其添加到启动应用程序列表中。

确保将这些路径隐藏起来,以免您的儿子找不到。


有没有办法可以阻止它启动而不是每次启动后都将其杀死?
爱德华·托瓦尔兹

@edwardtorvalds-我什么都不知道,所以我发布了这个解决方案。
拉斐尔

我支持您的回答,但是OP需要一种简单/轻松而不是太多的技术方法

它的操作非常简单,操作只需复制并粘贴脚本即可保存这些文件,然后将其添加到启动应用程序中,然后就不用管它了。
拉斐尔

杀死循环-我能想象的最脏。
2016年

0

为什么不使用新的用户帐户(通过系统设置)。这是Linux上“许可”的唯一一种方法。

  1. 新用户“ SteamUser”不应使用sudoers(仅限受限帐户)。
  2. 然后创建另一个名为“ SuperAdmin”的帐户,并使其成为sudoers帐户(root用户访问权限)。但只有您自己保留密码。
  3. 然后从sudoers中删除您儿子的帐户。(sudo组)。然后,该帐户将没有root访问权限,将无法安装或删除软件,更改系统范围的设置。
  4. 登录到您的“ SuperAdmin”帐户并更改Steam二进制文件Steam游戏文件夹的所有权,以防止除“ SteamUser”之外的任何人运行它们。这包括从除“ SteamUser”之外的任何人中删除读+写+执行访问

几条音符..

  • 不能用您儿子的帐户进行root用户访问,否则chown / chmod可以轻松绕过权限控制。
  • 基于后台脚本的其他建议只是一团糟。这意味着他们并不乐观。但是,它们很容易设置。
  • 转移到“ SteamAccount”的文件夹路径是:/home/son/.steam当然还有二进制文件/usr/games/steam
  • 要播放Steam,需要输入“ SteamUser”密码(您需要使用“ SteamUser”登录,然后他们才能运行Steam。您可以尝试通过锁定锁定一段时间后尝试使会话过期的方法,以防止播放时间过长。我不确定是否有类似的工具,但是从技术上讲可以设置时间限制,但可以设置会话时间,而不是设置程序时间。

啊,我相信我找到了我的
下注者

这并不是真正的安全,因为足够聪明的孩子(能够使用google并遵循分步指南已经足够)可以轻松访问用户的限制(如果他们具有物理访问权限)。
字节指挥官

@ByteCommander至少比后台脚本更可靠。但是,是的,你是对的。就像在Windows上一样。随处可见。
2016年

没有冒犯,但是这怎么安全呢?
Jacob Vlijm '16

您如何指定孩子使用Steam多长时间的时间限制?那学校允许的东西呢?另一个原因呢?我个人仇恨系统以每人太多帐户,因为他们是一个痛苦的使用,因为不共享设置等
字节指挥官
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.