Archiv der Kategorie: Embedded

Debian Repository per ssh auf ein chroot

Für eigene Zwecke will man immer mal ein Repository haben, auf das andere nicht zugreifen können, aber das man auch an Bekannte oder Testgruppen oder wen auch immer weitergeben kann. ftp mit Passwort und http mit Passwort sind so ne Sache, ein wenig sicherer könnte das schon sein.

Debian Repositories können auch via ssh eingebunden werden, eine entsprechende Zeile in der sources list sieht dann so aus:

deb ssh://repouser@example.com/packages/ jessie main

Auf dem Server muss man einen entsprechenden Nutzer einrichten und die packages enthalten eben das Debian Repository. Authentisierung erfolg per ssh key, d.h. auf Clientseite wird ein ssh-Key erzeugt, der auf Serverseite im ~/.ssh/authorized_keys des repouser liegt. Soweit so straightforward.

Der Nachteil dieser Variante ist, dass der repouser nun einen ssh login auf dem Server hat, was ihn natürlich auch lesenden Zugriff auf andere Ressourcen gibt, was man eher nicht unbedingt will. Kann sein, dass man dies auch noch besser absichern kann, die beste Absicherung ist auf jeden Fall, diesen Benutzer in ein chroot environment zu sperren.

Dieses fahre ich über die sftp chroot variante des sshd, in der sshd_config steht dazu:

Subsystem sftp internal-sftp

Match Group sftp
ChrootDirectory %h
AllowTcpForwarding no

Nun muss der repouser noch zur Gruppe sftp dazu und jetzt kommt das eigentliche Problem: die chroot Umgebung mit den richtigen Dateien und Rechten auszustatten, d.h. alles dort einzurichten, was nötig ist, um auf Clientseite apt-get … aufzurufen. Und da war das Problem: Was braucht apt-get via ssh auf der Serverseite? Letzendlich hab ich es nur raus bekommen, in dem ich mir die Sourcen von apt-get angeschaut habe. Und da waren vor allem find und dd die Hänger… die drauf und es ging. Wie man herausbekommt, welche libs nötig sind, sagt ldd find und ldd dd und gut ist.

Das ganze ist hier in einem schmutzigen Script, das so unter Ubuntu 14.04 läuft, Achtung: die Libs werden so für andere Distris nicht passen, aber ldd ist dein Freund, der Rest stimmt.

#!/bin/bash
echo "This script should be started as root on the machine, which hosts the repo"
REPOUSER="repouser"
REPOHOME="ssdhome/$REPOUSER"
echo "Generating chroot environment for $REPOUSER in $REPOHOME"</code>

adduser --disabled-password --ingroup sftp --home /$REPOHOME $REPOUSER
mkdir -p /$REPOHOME
chown root:root /$REPOHOME
cd /$REPOHOME
mkdir -p bin dev etc home lib usr var tmp usr/bin vat/tmplib/x86_64-linux-gnu usr/lib/x86_64-linux-gnu $REPOHOME lib/x86_64-linux-gnu lib64
cp /bin/ls bin/
cp /bin/dash bin/sh
cp /bin/bash bin/
cp /usr/bin/scp usr/bin/
cp /bin/dd bin/
cp /usr/bin/find usr/bin/
cp /usr/bin/whoami usr/bin/
cp /lib/x86_64-linux-gnu/libtinfo.so.5 lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libdl.so.2 lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/
cp /lib64/ld-linux-x86-64.so.2 lib64/
cp /lib/x86_64-linux-gnu/libselinux.so.1 lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libacl.so.1 lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libpcre.so.3 lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libattr.so.1 lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libnss_compat* lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libm.so.6 lib/x86_64-linux-gnu/
mknod dev/null c 1 3
mknod dev/zero c 1 5
chmod 666 dev/*
chmod 1777 tmp
grep $REPOUSER /etc/passwd &gt;&gt; etc/passwd
echo "now, cp the repository beginning with the packages dir to ssdhome/$REPOUSER"
echo "do not forget to add the public key to ssdhome/$REPOUSER/.ssh/authorized_keys"
echo "and add a line like: deb ssh://$REPOUSER@example.com/packages/ jessie main"

 

MAMEKiosk – Update

Ein Nachtrag zum MAMEKIOSK:

Jetzt geht es darum das ganze auf RPI2 umzurüsten. Und ne USB Audio Karte reinzubauen. Zweiteres ganz einfach mit nem billig-USB-Dongle und dieser Anleitung.

Das aktuelle Image von piplay ist flugs gezogen, aber: pikeyd geht wohl nicht auf dem RPI2… also geschaut und da gibt es Retrogame was das gleiche machen sollte… sieht auch alles gut aus… aber irgendwas klappt da doch noch nicht ganz. Auf jeden Fall muss die obige Verdrahtung in retrogame.c so hardgecodet sein:


ioStandard[] = {
 { 7, KEY_LEFT }, // Joystick (4 pins) 
 { 9, KEY_RIGHT },
 { 10, KEY_DOWN },
 { 11, KEY_UP },
 { 17, KEY_LEFTCTRL }, // A/Fire/jump/primary 
 { 22, KEY_LEFTALT }, // B/Bomb/secondary 
 { 4, KEY_SPACE }, // C 
 { 8, KEY_5 }, // Credit
 { 15, KEY_1 }, // Start 1P 
 { 14, KEY_2 }, // Start 2P 
 { -1, -1 } }; // END OF LIST, DO NOT CHANGE 

Ob das nun funktioniert hat, kann man z.B. mit input-events 1 nachprüfen (aus dem input-utils paket).

Was ich noch nicht rausbekommen habe: welches das input mapping für die Bestätigung von safequit ist, also hab ich misc_safequit no in advmame.rc gesetzt. Ah, habs: [ui_select] isses… also doch safequit an.

BTW: ich hab doch das alte advmenu vom alten pimame genommen, das gefällt mir wesentlich besser als die ganzen vielen Emulatoren, ich will eh nur advmame.

Ergebnis vom Ganzen? Einiges gelernt, einiges gebastelt und: alles ist viel flüssiger und der Ton eiert nicht mehr rum, wenn die CPU unter Last kommt! Hat sich also gelohnt!

MAMEkiosk

Ein Projekt, das schon länger im Bau ist. Aber auch schon immer wieder mal fröhlich gespielt wird. In meiner beruflichen Historie hab ich am Telekiosk mit gebaut und wollte immer mal so ein Teil als Andenken haben, was auch irgendwann geklappt hat. (Dank an den Spender an dieser Stelle 🙂 ) Dieser ist von der Bildschirmkonstruktion und von der Gehäusestabilität hervorragend dazu geeignet, eine Spielekonsole nach alter Provinienz abzugeben. Also flugs das ganze alte Gerümpel raus – alleine schon wegen Lautstärke und Stromverbrauch – und ein Raspberry Pi rein. Fertig. … oh, moment. Der eingebaute TFT hat nur LVDS Input…

Die – elektrisch – einfachste Variante: TFT raus, billigen 17″ TFT abgreifen, einbauen – der Touch kann ja weiter verwendet werden.

Die Distribution, die drauf läuft ist ein PiMAME (jetzt PiPlay genannt),  mit kleinen Anpassungen. Für die Joysticks hab ich GPIO Pins benutzt (da ich nur einen Joystick und ein paar Knöppe gemacht hab, hat das gereicht), getrieben wird das über pikeyd, die Buttons hab ich mit Widerständen (siehe hier) an die GPIOs gemacht.

/etc/rc.local:

amixer cset numid=3 1
alsactl restore
/sbin/pikeyd -d
exit 0

/etc/pikeyd.conf:

KEY_LEFTCTRL    17
KEY_LEFTALT     22
KEY_SPACE       4
KEY_RIGHT       9
KEY_DOWN        10
KEY_UP          11
KEY_LEFT        7
KEY_5           8
KEY_1           15
KEY_2           14