Jak mogę ograniczyć lub ograniczyć dostęp do aplikacji?

18

W minione święta mój syn otrzymał nowego laptopa, głównie do użytku w swojej nowej szkole ... A teraz, kiedy ma własnego laptopa, jest podekscytowany zainstalowaniem Steam.

Ale żona chce, żebym usunął Steam, ponieważ laptop jest przeznaczony głównie do użytku szkolnego ... Wolałbym tego nie robić, jeśli nie muszę.

Czy istnieje sposób, aby ograniczyć lub w inny sposób ograniczyć dostęp do Steam? Być może hasło do samego Steam, lub ustawić czas, w którym można go uruchomić?

Idealnie byłoby, gdyby był to bardzo prosty w użyciu, ponieważ moja praca często utrzymuje mnie z dala od domu (i komputerów, telekomunikacji i ...) przez długi czas, a moja żona nie czuje się tak komfortowo przy komputerach jak ja, łatwiejszy w użyciu jest o wiele lepszy.

Z pewnością jest coś , co może wykonać to zadanie?

Gregory Opera
źródło
Możesz użyć zabezpieczenia przed dziećmi w routerze, aby ograniczyć dostęp do pary, np. 1 godzinę dziennie. Steam używa portów UDP 27000 - 27015 dla ruchu klienta. Jeśli ograniczysz te porty w routerze, twój syn nie będzie mógł zalogować się do Steam.
Kev Inski
Najprostszym rozwiązaniem jest utworzenie profilu użytkownika na Ubuntu, na którym instalujesz Steam. Utwórz hasło do nowego profilu użytkownika, który będzie używany przez twojego syna.
@Begueradj Kids może być mądry. A fizyczny dostęp do maszyny oznacza możliwy dostęp do konta root, co oznacza, że ​​możesz ominąć wszystko oprócz szyfrowania. Musisz wtedy zaszyfrować katalog domowy tego użytkownika, aby go bezpiecznie zabezpieczyć.
Bajt Dowódca
@Gregory Jak inteligentny jest twój syn z komputerami? Czy potrzebujesz w 100% bezpiecznej rzeczy, czy może wystarczy, jeśli dostęp do Steam jest po prostu trywialny?
Bajt Dowódca

Odpowiedzi:

2

Ustaw limit czasu dla procesu lub aplikacji

Za pomocą małego skryptu w tle możesz ustawić limit czasu dla procesu lub aplikacji.
Tak długo, jak użytkownik nie zna hasła administratora , nie jest ono zbyt łatwe do przekroczenia.

Rozwiązanie poniżej

To taki mały skrypt w tle. Ogranicza dzienne użycie do określonej liczby minut, które można ustawić w skrypcie. Po skonfigurowaniu (co nie jest zbyt trudne) działa bardzo łatwo i nie wymaga żadnych dodatkowych działań.

Scenariusz

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

Jak używać

  1. Na pulpicie (lub w dowolnym innym miejscu) utwórz folder o nazwie: limit
  2. Skopiuj skrypt do pustego pliku, zapisz go jako limit_use(bez rozszerzenia) w folderze i spraw, aby był wykonywalny
  3. Edytuj w nagłówku skryptu nazwę procesu do ograniczenia i maksymalną liczbę dozwolonych minut. W przykładzie:

    #--- set the time limit below (minutes)
    minutes = 1
    #--- set the process name to limit below
    app = "gedit"
  4. Skopiuj folder do katalogu /opt:

    cp -r /path/to/limit /opt
  5. Teraz edytuj, /etc/rc.localaby skrypt działał tak, jak rootpodczas uruchamiania:

    sudo -i gedit /etc/rc.local

    Tuż przed linią

    exit 0

    inna linia:

    /opt/limit/limit_use &

Otóż ​​to

Gdy ktoś próbuje zabić skrypt w tle:

wprowadź opis zdjęcia tutaj

(działanie niedozwolone)

Wyjaśnienie; jak to działa

  • Raz na 10 sekund skrypt sprawdza, czy proces docelowy jest uruchomiony. Jeśli tak, „dodaje” jeden „punkt” do całkowitego zużycia, co ma zostać zapisane w pliku ( /opt/limit/uselog). Jeśli dzienny limit zostanie osiągnięty, skrypt nie pozwala już na uruchomienie procesu, zabijając go, jeśli istnieje.
  • Po zmianie dnia (data jest zapisywana w pliku, więc ponowne uruchomienie nie pomoże), plik dziennika jest usuwany, co pozwala na nagromadzenie nowego czasu użytkowania.
  • Ponieważ skrypt uruchamia się przy uruchamianiu , rc.localtylko użytkownicy z uprawnieniami sudo mogą zatrzymać skrypt, nawet jeśli użytkownik zna nazwę procesu.

Zatrzymaj skrypt

Jeśli chcesz zatrzymać skrypt, użyj polecenia:

sudo kill "$(pgrep limit_use)"

Ale ponownie potrzebujesz do tego hasła sudo.




EDYTOWAĆ

Chociaż powyższy skrypt powinien zapewniać względnie bezpieczny sposób ograniczania użycia aplikacji, jak wspomniano w @Bytecommander, można go przekroczyć, choć nie bardzo łatwo. Połączenie z poniższą miarą sprawi, że jest bardzo mało prawdopodobne, że tak się stanie, chyba że twój syn wie konfigurację i jest dość doświadczony w Linuksie / Ubuntu.

Dodatkowa miara

Nieco dalej od „prostego rozwiązania”, ale wciąż niezbyt trudnego do skonfigurowania, jest dodatkowy środek poniżej. Jeśli nasza podejrzewany przestępca dowie skrypt jest wywoływany /etc/rc.local, że uda się uzyskać uprawnienia administratora i usunąć linię /etc/rc.local, czy będzie w stanie zatrzymać skrypt w ten sposób, możemy skonfrontować go z kolejnym problemem: czarni odfiltrować po zaloguj się. Ponadto rozwiązanie sprawdza, czy skrypt w tle działa po 5 minutach od ponownego uruchomienia, aw razie potrzeby wygasa.

Dodatkową miarą jest uruchomienie - sprawdzenie, czy linia /opt/limit/limit_use &jest obecna /etc/rc.local, i sprawdzenie po 5 minutach, czy skrypt nadal działa. Ponieważ skrypt działa w programie uruchamiającym (ukrytym przed aplikacjami startowymi), /etc/xdg/autostarttrudno będzie dowiedzieć się, co się dzieje, chyba że wiesz, jak to zrobić. Połączenie tych dwóch środków sprawia, że ​​jest mało prawdopodobne, że twój syn się dowie, a jeśli to zrobi, prawdopodobnie nic go nie powstrzyma.

Jak skonfigurować

W grę wchodzą dwa proste kroki:

  1. Skopiuj poniższy kod do pustego pliku i zapisz go jak blackout.desktopna pulpicie:

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

    Skopiuj plik do /etc/xdg/autostart:

    sudo cp /path/to/blackout.desktop /etc/xdg/autostart
  2. Skopiuj poniższy skrypt do pustego pliku, zapisz go jak blackout.pyna pulpicie, ustaw go jako wykonywalny i skopiuj do /usr/local/bin:

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

    Scenariusz

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

Wyjaśnienie

Program uruchamiający w /etc/xdg/autostarturuchomi aplikację (w tym przypadku dodatkowe sprawdzenie bezpieczeństwa) dla wszystkich użytkowników. To mógłby być zastąpiony lokalnie, ale trzeba znać się sprawdzać przebiegów. Umieszczając linię NoDisplay=truew naszym programie uruchamiającym, nie pojawi się ona lokalnie Startup Applications, więc bez wiedzy, że istnieje, jest mało prawdopodobne, aby została odkryta.

Co więcej, twój syn ma tylko 15 sekund, aby się dowiedzieć (wtedy ekran jest zaciemniony), więc miałby poważny problem, chyba że jest genialny, ma duże doświadczenie z Ubuntu i kreatywnym umysłem.

Jacob Vlijm
źródło
Ale jeśli jego syn może zalogować się do systemu przy użyciu hasła roota, to czy nie będzie w stanie edytować rc.local?
Raphael
1
@ Rafael dlatego wspomniałem, o ile użytkownik nie jest administratorem . Ale jeśli jest, praktycznie nic nie powstrzyma go przed przekroczeniem, jeśli będzie wystarczająco mądry.
Jacob Vlijm
Ikr, jeśli jest dobrze zorientowany w systemie Linux lub jeśli umie efektywnie korzystać z google, ostatecznie żadna z odpowiedzi i tak nie zadziała.
Raphael
1
@ByteCommander to prawda. Niemniej jednak wydaje się rozsądną równowagą żądanego prostego rozwiązania, ograniczonego czasu i rozsądnego poziomu bezpieczeństwa, biorąc pod uwagę przedmiotowe zainteresowanie (ograniczenie czasu, spędzonej gry).
Jacob Vlijm
1
@JacobVlijm Tak, oczywiście. Po prostu wskazuję, że mogą trzymać swoje 8-letnie dziecko w ten sposób, ale kiedy staje się nastolatkiem z pewną wiedzą techniczną, muszą wiedzieć, że nie ma 100% bezpieczeństwa. (Nie to, że nie chciałbym przyznać nastolatkowi trochę wolności)
Bajt Dowódca
4

Z własnego doświadczenia wynika, że ​​ograniczenie dostępu do gier komputerowych jest jednym z najtrudniejszych zadań w edukacji naszych dzieci. Oczywiście my, rodzice, chcemy, aby korzystali ze swoich komputerów głównie w szkole, ale jest to bardzo sprzeczne z intencjami dziecka. Będą nas nienawidzić za to, że dali im sprzęt nadający się tylko do szkoły.

Oczywiście chcemy też, aby nauczyli się rozsądnie korzystać z komputera, w tym z niego nie tylko w pracy, ale również w czasie wolnym. Obejmuje to gry i oglądanie filmów.

Niestety, dobrze utrzymana i działająca kontrola rodzicielska w celu ograniczenia przetwarzania danych przez dziecko jest prawie niedostępna dla Ubuntu. Inną ważną kwestią jest to, że gdy tylko są inteligentnymi dziećmi, wszystkie podjęte przez nas środki stają się daremne. Zawsze znajdą sposoby na przezwyciężenie naszych ograniczeń, na wypadek, gdyby byli naprawdę sprytni, a my nawet tego nie zauważymy.

Wszelkie oprogramowanie blokujące lub ograniczenia PAM działające na komputerze dziecka będą miały charakter tymczasowy i wcześniej lub później można je bardzo łatwo pokonać. Dlatego postanowiliśmy pozwolić routerowi chronionemu hasłem wykonać zadanie, w którym fizyczny dostęp może być kontrolowany o wiele łatwiej.

To, co robimy tutaj, aby nieco ograniczyć obecnie grę, to połączenie wszystkich następujących elementów:

  • Porozmawiaj z nimi, aby dowiedzieć się, jak i kiedy korzystać z komputerów w czasie wolnym, a kiedy używać ich w szkole. Jest to ciągły, dość żmudny proces, który prowadzi do niekończących się dyskusji i dyskusji. Ale to, co czujemy, jest jedyną rzeczą, która przetrwa w dłuższej perspektywie.
  • Brak uprawnień administratora na ich koncie. To jest tymczasowe. Wiemy, że sudowcześniej czy później będą mogli dołączyć do grupy. Plan jest taki, że poprosą nas o to, zamiast ukrywać się.
  • Zawrzyj umowę na jasno określone czasy obliczeń. Muszą wiedzieć, po co i jak długo mogą korzystać ze swoich maszyn. Muszą nauczyć się, jak podzielić ten czas na szkołę i na wypoczynek.
  • Zablokuj cały internet w godzinach snu .

Aby ułatwić realizację umowy dotyczącej korzystania z komputera zarówno przez dzieci, jak i przez nas, zainstalowaliśmy następujące ograniczenia:

  • Użyj routera chronionego hasłem, który umożliwia ograniczenie dostępu do Internetu na podstawie kombinacji sprzętu (MAC) i harmonogramu. Dopóki nie wiedzą o fałszowaniu adresów MAC, będzie to działać całkiem dobrze. Ograniczy również dostęp za pośrednictwem smartfonów i tabletów. To oczywiście nie zadziała, jeśli w Twojej okolicy była otwarta sieć bezprzewodowa.
  • Zainstaluj serwer SSH na komputerach dzieciaków, aby wyciągnąć wtyczkę na wypadek, gdyby zgubiły się we własnych intencjach. To jest w nagłych przypadkach, cieszymy się, że nie potrzebowaliśmy wiele.
  • Zainstalowano czarną listę DNS (przez router, a nie przez komputer!), Która powinna blokować dostęp do najgorszych.

Zablokowanie dostępu do Internetu skutecznie wyłączy grę, jeśli ta gra potrzebuje dostępu do Internetu, takiego jak Steam , Minecraft lub inne serwery gamig. Nie będzie to jednak miało wpływu na gry uruchamiane poza linią.

Takkat
źródło
Masz na myśli zamknięcie za pomocą sshlub po prostu zamknięcie aplikacji?
Raphael
Zależy od sytuacji ... SSH może zrobić to wszystko, zamknąć, zabić użytkownika, zabić aplikację, cofnąć hacki, usunąć użytkowników z sudoers, ... dla SSH mamy konto administratora nadrzędnego na wszystkich pudełkach dla dzieci.
Takkat
Fajnie, jesteś pierwszym, który ma dodatkową warstwę bezpieczeństwa, z wyjątkiem wszystkich lokalnych rzeczy, które można cofnąć, jeśli zostaną rootem (czego nie można zapobiec, jeśli mają fizyczny dostęp).
Bajt Dowódca
0

Można to osiągnąć za pomocą skryptów powłoki.

Pierwszym skryptem jest zabijanie Steamzaraz po uruchomieniu:

#!/bin/bash

while true
do
    pkill steam
    sleep 1
done

exit 0

Zapisz go jako /path/to/anyname.shi dodaj do listy aplikacji startowych.

Ten skrypt zrobi to, że będzie sprawdzał każdy otwarty proces nazwany steamco sekundę, a jeśli go znajdzie, zabije go.

Ale potrzebujesz rozwiązania, w którym steammożna uruchomić w określonym czasie we właściwym czasie, aby twój syn mógł grać w gry w tym czasie. Aby to zrobić, musisz napisać inny skrypt:

#!/bin/bash

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

exit 0

Zapisz go jako, /path/to/anyname2.sha także dodaj go do listy aplikacji startowych.

Ten skrypt zabije pierwszy skrypt o godzinie 10:00. Więc kiedy twój syn biegnie Steamo godzinie 10:00. Będzie mógł teraz w nią zagrać.

Trzeci skrypt polega na ponownym zainicjowaniu pierwszego skryptu w innym momencie, aby zabijał Steampo pewnym czasie, a Twój syn nie będzie mógł już grać w gry Steam.

#!/bin/bash

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

exit 0

Zapisz go jako /path/to/anyname3.shi dodaj do listy aplikacji startowych.

Upewnij się, że te ścieżki są ukryte, aby twój syn się nie dowiedział.

Raphael
źródło
czy nie istnieje sposób, w jaki można by go zatrzymać zamiast zabijać po każdym uruchomieniu?
Edward Torvalds,
@edwardtorvalds - nie znam żadnego, więc opublikowałem to rozwiązanie.
Raphael
Popieram twoją odpowiedź, ale OP potrzebuje PROSTEJ / ŁATWEJ, a NIE ZBYT technicznej metody
To proste i łatwe, wszystko, co musisz zrobić, to skopiować i wkleić skrypty zapisać te pliki i dodać je do aplikacji startowych, a następnie zapomnieć o tym.
Raphael
kill loop - najbrudniejsza, jaką mogę sobie wyobrazić.
Croll
0

Dlaczego nie skorzystać z nowego konta użytkownika (poprzez Ustawienia systemowe )? Jest to jedyna metoda dla „uprawnień” w systemie Linux.

  1. Nowy użytkownik „SteamUser” nie powinien znajdować się w sudoers (tylko ograniczone konto).
  2. Następnie utwórz drugie konto o nazwie „SuperAdmin” i ustaw je jako konto sudoers (dostęp do konta root). Ale przechowuj hasło tylko przy sobie.
  3. Następnie usuń konto swojego syna z sudoers. ( sudogrupa). To konto nie będzie miało dostępu do konta root, nie będzie mogło instalować ani usuwać oprogramowania, zmieniać ustawień systemowych.
  4. Zaloguj się do swojego konta „SuperAdmin” i zmień własność plików binarnych Steam oraz folderu gier Steam, aby uniemożliwić ich uruchamianie przez kogokolwiek poza „SteamUser”. Obejmuje to usunięcie dostępu do odczytu i zapisu + wykonania od kogokolwiek z wyjątkiem „SteamUser”

Kilka notatek ..

  • Nie ma możliwości pozostawienia dostępu do konta root za pomocą konta twojego syna, w przeciwnym razie kontrolę uprawnień można łatwo ominąć za pomocą chown / chmod.
  • Inne sugestie oparte na skryptach w tle to po prostu niestabilny bałagan. Oznacza to, że nie są obiecujące. Jednak mogą być łatwe do skonfigurowania.
  • Ścieżki folderów do przeniesienia do „SteamAccount” to: /home/son/.steami oczywiście plik binarny/usr/games/steam
  • Aby zagrać w Steam, wymagane jest hasło „SteamUser” (musisz zalogować się za pomocą „SteamUser”, a one uruchomią Steam. Możesz spróbować poszukać metod, aby wygasnąć sesję po pewnym czasie z zablokowaniem, aby zapobiec zbyt długiemu odtwarzaniu. Jestem nie jestem pewien, czy istnieją takie narzędzia, ale technicznie możliwe jest ustawienie limitów czasowych, ale dla sesji, a nie programów.
Croll
źródło
Ach, wydaje mi się, że znalazłem swojego downvocera ...
Jacob Vlijm
Nie jest to tak naprawdę bezpieczne, ponieważ wystarczająco inteligentne dzieci (wystarczająca jest możliwość korzystania z Google'a i korzystania z przewodnika krok po kroku) mogą łatwo ominąć ograniczenia użytkowników, jeśli mają fizyczny dostęp.
Bajt Dowódca
@ByteCommander przynajmniej jest bardziej niezawodny niż skrypty w tle. Ale tak, masz rację. Podobnie jak w systemie Windows. Jak wszędzie.
Croll
Bez obrazy, ale jak to jest bardziej bezpieczne?
Jacob Vlijm
A jak chcesz określić limit czasu, przez jaki dziecko może korzystać ze Steam? A co z dozwolonymi szkolnymi rzeczami? Kolejne konto do tego? Osobiście nienawidzę systemów z zbyt dużą liczbą kont na osobę, ponieważ korzystanie z nich jest utrudnione ze względu na niepodzielone ustawienia itp.
Byte Commander