Как я могу ограничить или ограничить доступ к приложению?

18

В прошлое Рождество мой сын получил новый ноутбук, в основном для использования в своей новой школе ... И теперь, когда у него есть собственный ноутбук, он рад, что Steam установлен.

Но жена хочет, чтобы я удалил Steam, потому что ноутбук в основном предназначен для школьного использования ... Я бы не стал этого делать, если бы мне не пришлось.

Есть ли способ, которым я могу ограничить или иным образом ограничить доступ к Steam? Возможно, пароль на самом Steam, или установить время, в течение которого он может быть запущен?

В идеале , это должно быть что-то довольно простое в использовании, потому что моя работа часто держит меня вдали от дома (и компьютеров, и телекоммуникаций, и ...) в течение долгого времени, и в то время как моей жене не так комфортно с компьютерами, как я, проще в использовании, гораздо лучше.

Конечно, есть что- то , что может решить эту задачу?

Грегори Опера
источник
Вы можете использовать блокировку от детей в маршрутизаторе, чтобы ограничить доступ к Steam, например, 1 час в день. Steam использует порты UDP 27000 - 27015 для клиентского трафика. Если вы ограничите эти порты в своем роутере, ваш сын не сможет войти в steam.
Кев Ински
Самое простое решение - создать профиль пользователя в вашей Ubuntu, на котором вы устанавливаете Steam. Создайте пароль для нового профиля пользователя, который будет использоваться вашим сыном.
@Begueradj Дети могут быть умными. А физический доступ к машине означает возможный root-доступ, что означает, что вы можете обойти все, кроме, возможно, шифрования. Вам нужно будет зашифровать домашний каталог этого пользователя, чтобы надежно защитить его.
Byte Commander
@ Грегори Насколько умный ваш сын с компьютерами? Вам нужна 100% безопасная вещь, или достаточно, если доступ к Steam просто сделан нетривиальным?
Byte Commander

Ответы:

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 минут после перезапуска, а затем отключается.

Дополнительная мера является startup- проверить , если строка /opt/limit/limit_use &присутствует в /etc/rc.local, и проверка через 5 минут , если сценарий все еще работает. Поскольку скрипт запускается из средства запуска (скрытого от Startup Applications), /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()

объяснение

Launchers in /etc/xdg/autostartзапустит приложение (в данном случае дополнительная проверка безопасности) для всех пользователей. Это может быть перезаписано локально, но вы должны знать, какие проверки выполняются. Поместив линию NoDisplay=trueв нашу программу запуска, она не будет отображаться локально Startup Applications, поэтому, не зная, что она существует, она вряд ли будет обнаружена.

Кроме того, у вашего сына есть только 15 секунд, чтобы узнать (затем экран затемняется), поэтому у него будут серьезные проблемы, если он не гениален, имеет большой опыт работы с Ubuntu и творческим умом.

Якоб Влейм
источник
Но если его сын сможет войти в систему, используя пароль root, он не сможет изменить rc.local?
Рафаэль
1
@Raphael, поэтому я упомянул, пока пользователь не является администратором . Но если он есть, практически ничто не помешает ему в конечном итоге превзойти, если он достаточно умен.
Якоб Влейм
Икр, если он хорошо разбирается в Linux или знает, как эффективно использовать Google, в конечном итоге ни один из ответов не сработает.
Рафаэль
1
@ByteCommander верно, конечно. Тем не менее, представляется разумным баланс запрошенного простого решения, ограниченное время и разумный уровень безопасности, учитывая заинтересованность в данном вопросе (ограничение времени, затраченного на игры).
Джейкоб Влейм
1
@JacobVlijm Да, конечно. Я просто указываю, что таким образом они могут не пускать своего 8-летнего ребенка, но когда он становится подростком с некоторыми техническими знаниями, они должны знать, что нет 100% -ной безопасности. (Не то, чтобы я не хотел подарить подростку немного свободы)
Byte Commander
4

Исходя из моего собственного опыта, ограничение доступа к компьютерным играм является одной из самых сложных задач в обучении наших детей. Конечно, мы, родители, хотим, чтобы они использовали свои компьютеры в основном в школе, но это сильно противоречит намерениям ребенка. Они будут ненавидеть нас за то, что мы предоставили им оборудование, пригодное только для школы.

И, конечно , мы также хотим, чтобы узнать , как использовать свой компьютер в разумном пути, в том числе , как использовать его не только для работы , но и для отдыха. Это включает в себя игры и просмотр видео.

К сожалению, хорошо поддерживаемый и работающий родительский контроль, ограничивающий работу ребенка, для Ubuntu практически недоступен. Еще одна важная проблема заключается в том, что, как только они становятся умными детьми, все предпринимаемые нами меры становятся тщетными. Они всегда найдут способы преодолеть наши ограничения, если они действительно умны, даже если мы не сможем это заметить.

Любое блокирующее программное обеспечение или PAM-ограничения, работающие на компьютере ребенка, будут только временными и рано или поздно могут быть преодолены очень легко. Поэтому мы решили позволить защищенному паролем маршрутизатору выполнять свою работу, где физическим доступом можно управлять намного проще.

Таким образом, то, что мы делаем здесь, чтобы несколько ограничить игровые возможности на данный момент, является комбинацией всего следующего:

  • Поговори с ними чтобы научить их, как и когда использовать компьютеры для отдыха и когда использовать их в школе. Это постоянно продолжающийся, довольно утомительный процесс, ведущий к бесконечным дискуссиям и спорам. Но это то, что мы чувствуем, это единственное , что будет продолжаться в долгосрочной перспективе.
  • Нет прав администратора на свой аккаунт. Это временная вещь. Мы знаем, что они sudoрано или поздно смогут войти в группу. План состоит в том, что они будут просить нас об этом, а не скрывать это.
  • Заключите контракт на четко определенное время вычислений. Им нужно знать, для чего и как долго им разрешено пользоваться своими машинами. Им нужно научиться разделять это время для школы и отдыха.
  • Хард-блокировать весь интернет во время сна .

Чтобы облегчить выполнение договора об использовании компьютера для детей и для нас, мы установили следующие ограничения:

  • Используйте защищенный паролем маршрутизатор, который позволяет ограничивать доступ в Интернет на комбинации аппаратного обеспечения (MAC) и расписания. Пока они не знают о спуфинге MAC, это будет работать довольно хорошо. Это также ограничит доступ через их смартфоны и планшеты. Это, конечно, не сработает, если в вашем районе была открытая беспроводная сеть.
  • Установить SSH-сервер на компьютеры ребенка, чтобы отключить его на случай, если он потеряется в своих собственных намерениях. Это для экстренных случаев, мы рады, что нам не нужно было много.
  • Установлен DNS черный список (через роутер, а не компьютер!), Который должен заблокировать доступ к худшему.

Блокировка доступа к интернету фактически отключит игры, если этой игре необходим доступ в интернет, такой как Steam , Minecraft или другие игровые серверы. Однако это не будет иметь никакого эффекта для игр, работающих в автономном режиме.

Takkat
источник
Вы имеете в виду отключение с помощью sshили просто закрытие приложения?
Рафаэль
Зависит от ситуации ... SSH может делать все это, выключать, убивать пользователей, убивать приложения, отменять хаки, удалять пользователей из sudoers, ... для SSH у нас есть родительская учетная запись администратора на всех ящиках ребенка.
Таккат
Хорошо, вы первый, кто имеет дополнительный уровень безопасности, кроме всех локальных вещей, которые можно восстановить, если они станут root (что невозможно предотвратить, если у них есть физический доступ).
Byte Commander
0

Это может быть достигнуто с помощью сценариев оболочки.

Первый скрипт - убить, 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 - я не знаю ни одного, поэтому я разместил это решение.
Рафаэль
Я поддерживаю ваш ответ, но ОП нужен ПРОСТОЙ / ЛЕГКИЙ, а не СЛИШКОМ технический метод
Это просто и легко, все, что нужно сделать оператору - это скопировать и вставить сценарии, сохранить эти файлы и добавить их в автозагрузку приложений, а затем забыть об этом.
Рафаэль
убить петлю - самый грязный я могу себе представить.
Croll
0

Почему бы не использовать новую учетную запись пользователя (через настройки системы ). Это единственный метод в Linux для «разрешений».

  1. Новый пользователь "SteamUser" не должен быть в sudoers (только ограниченный аккаунт).
  2. Затем создайте вторую учетную запись с именем «SuperAdmin» и создайте для нее учетную запись sudoers (root-доступ). Но сохраняйте свой пароль только при себе.
  3. Затем удалите учетную запись вашего сына от sudoers. ( sudoгруппа). Тогда эта учетная запись не будет иметь root-доступа, она не сможет устанавливать или удалять программное обеспечение, изменять общесистемные настройки.
  4. Войти в свою «SuperAdmin» счета и изменение права собственности на паровые бинарники и паровые играх папка , чтобы предотвратить их запуск никто , кроме «SteamUser». Это включает в себя удаление прав на чтение + запись + выполнение от любого, кроме "SteamUser"

Несколько заметок ..

  • Невозможно оставить root-доступ с учетной записью вашего сына, в противном случае контроль разрешений легко обойти с помощью chown / chmod.
  • Другие предложения, основанные на фоновых скриптах, просто нестабильны. Это означает, что они не перспективны. Тем не менее, их легко настроить, может быть.
  • Пути к папкам для передачи в «SteamAccount»: /home/son/.steamи, конечно, двоичный файл./usr/games/steam
  • Для игры в Steam требуется пароль «SteamUser» (вам нужно будет войти в систему с помощью «SteamUser», и они запустят Steam. Вы можете попытаться найти методы, чтобы прервать сеанс через некоторое время с блокировкой, чтобы не играть слишком долго. не уверен, что есть такие инструменты, но технически возможно установить временные ограничения, но для сессий, а не для программ.
Кролл
источник
Ах, я думаю, что нашел своего даунотера ...
Джейкоб Влейм
Это не совсем безопасно, потому что достаточно умные дети (уже достаточно иметь возможность пользоваться Google и следовать пошаговым инструкциям) могут легко обойти ограничения пользователей, если у них есть физический доступ.
Byte Commander
@ByteCommander, по крайней мере, более надежен, чем фоновые скрипты. Но да, ты прав. Прямо как в Windows. Как и везде
Croll
Без обид, но как это безопаснее?
Джейкоб Влейм
И как вы хотите указать лимит времени, в течение которого ребенок может использовать Steam? А как насчет разрешенных школьных вещей? Еще один счет для этого? Лично я ненавижу системы с слишком большим количеством учетных записей на человека, потому что их неудобно использовать из-за отсутствия общих настроек и т. Д.
Byte Commander