Mit Hilfe eines Systems wie „Ansible Pull“ kann auch eine Applikation wie LiFE Parental Control relativ einfach ausgerollt werden.
Das Debian Paket (https://github.com/valueerrorx/LiFE-Parental-Control/releases ) lässt sich automatisiert distributieren und auf den Systemen der Schüler:innen installieren. (siehe Beitrag zu Ansible > https://linux-bildung.at/?p=6697 )
Dazu holen wir uns über die github API alle Releases im json-Fromat und speichern diese in der Variable lpc_releases.
- name: Get all LiFE-Parental-Control releases info
uri:
url: https://api.github.com/repos/valueerrorx/LiFE-Parental-Control/releases
return_content: yes
register: lpc_releases
Aus diesen Releases brauchen wir die aktuellste
- name: Set most recent release
set_fact:
lpc_latest_releases: "{{ lpc_releases.json[0] }}"
Und aus den Assets des letzten Releases extrahieren wir uns die browser_download_url
- name: Extract amd64 .deb download URL
set_fact:
lpc_deb_url: >-
{{
lpc_latest_releases.assets
| selectattr('name', 'search', 'amd64.deb')
| map(attribute='browser_download_url')
| list
| first
}}
Diese .deb URL lässt sich dann ganz einfach installieren
- name: Install LPC .deb package
apt:
deb: "{{ lpc_deb_url }}"
state: present
Durch diese Installation läuft der Systemd Service „parental-control.service“ bereits am Zielsystem und liest die Einstellungen die er vornehmen und exekutieren soll aus der Datei:
/etc/life-parental/default.json
und für die Absicherung des App Zugriffs das Eltern-Passwort aus der Datei:
/etc/life-parental/auth.json
Beide Dateien erstellt man am besten im Vorfeld auf einem anderen PC, auf dem LiFE Parental Control installiert ist, indem man in der App die gewünschten Einstellungen für die Zielgeräte vornimmt und die fertigen Dateien in Folge aus dem Verzeichnis /etc/life-parental sichert und ebenso mittels Ansible an die idente Stelle auf den Geräten der Schüler:innen platziert. Die zwei Dateien default.json und auth.json liegen im ansible-pull Repository im Verzeichnis files. Damit werden sie auf den Client mitübertragen und mit folgenden Befehlen an die richtige Stelle kopiert.
- name: copy default.json
copy:
src: files/default.json
dest: /etc/life-parental/default.json
- name: copy auth.json # password is: linux-bildung
copy:
src: files/auth.json
dest: /etc/life-parental/auth.json
mode: '0600'
- name: Restart service parental-control, in all cases
ansible.builtin.service:
name: parental-control
state: restarted
Das Service parental-control wird noch neu gestartet, damit die Änderungen in den beiden Dateien auch tatsächlich vorgenommen werden.

Hard Lockdown
Benutzer-Rechte einschränken, Eltern-Admin Account anlegen, GRUB sperren, App-Installation einschränken
Was normalerweise optional über den Lockdown-Wizard direkt in der App gemacht wird kann auch über ein praktisches Shellscript erledigt werden:
/usr/bin/life-parental-lockdown
Dieses ist systemweit verfügbar, muss mit den entsprechenden Parametern gestartet werden und erledigt automatisiert den gesamten Prozess:
sudo /usr/bin/life-parental-lockdown <targetUser> <adminUser> <password|pwFile> <grubHash> [allowInstall] [allowUpdate] [protectGrub] [restrictAppImages]
| Argument | Description |
|---|---|
targetUser | Child account to de-privilege |
adminUser | Parent admin account (created if not existing) |
password|pwFile | Plain password string or path to a temp file containing it |
grubHash | Pre-computed grub.pbkdf2.sha512… hash (generate: grub-mkpasswd-pbkdf2) — leave empty to skip GRUB |
allowInstall | true to allow package installation (PolKit + sudoers) |
allowUpdate | true to allow system updates (PolKit + sudoers) |
protectGrub | true to enable GRUB password step; false to skip it (ignored if grubHash is empty) |
restrictAppImages | true to restrict AppImages/FUSE for the child user; false to skip this step |
Der Befehl um das Script zu starten könnte z.B. so aussehen:
sudo /usr/bin/life-parental-lockdown student parentadmin "MyPassword" "" false false false false
Diesen Befehl kann man auch in Ansible ausführen.
- name: parental lockdown ausführen
command: /usr/bin/life-parental-lockdown student parentadmin "MyPassword" "" false false false false
args:
creates: /var/lib/parental-lockdown.done
Bevor der Befehl tatsächlich ausgeführt wird, überprüft ansible auf Grund des Arguments creates, ob es die Datei /var/lib/parental-lockdown.done schon gibt. Falls diese Datei existiert, wird der Befehl nicht ausgeführt. Damit ist sichergestellt, dass der Befehl nur einmal ausgeführt wird.
Nachdem plaintext Passwörter in einem Git Repository keine gute Idee sind sollte hier mit Ansible Vault gearbeitet werden. Aber auch der Vault (symmetrische Verschlüsselung) braucht ein Passwort, um den Vault öffnen zu können.
Ein Vault-Passwort wird z.B. in /etc/ansible/vault-key schon bei der Ausrollung gespeichert, um dieses dann später nutzen zu können. Dabei muss aber auch der ansible-pull cronjob um „–vault-password-file=/etc/ansible/vault-key“ ergänzt werden.
ansible-vault encrypt_string 'MyPassword' --name 'lockdown_password'
Sie werden nach einem Vault-Passwort gefragt (zweimal). Die Ausgabe sieht so aus:
lockdown_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
61333835623938663033…
39656263323965353266…
3866
Der Task im Playbook würde dann so aussehen
vars:
lockdown_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
61333835623938663033…
39656263323965353266…
3866
tasks:
- name: parental lockdown ausführen
command: /usr/bin/life-parental-lockdown student parentadmin "{{ lockdown_password }}" "" false false false false
no_log: true

0 Kommentare