Anmeldung per SSH-Key
- Details
- Geschrieben von Alexander Schulz
- Kategorie: Raspberry Pi
- Zugriffe: 31147
Eine Alternative zur SSH-Anmeldung mit einem Passwort ist die Verwendung des Private/Public-Key-Verfahren. Damit wird die Anmeldung sicherer, und (oder) bequemmer (wenn man sich den langen Passwort spart).
Die EInrichtung ist nicht kompliziert. Zunächst muss eine Schlüsselpaar generiert werden (falls nicht bereits vorhanden). Dafür kann z.B. das Programm puttygen.exe verwendet werden, die Schlüssel können auch auf dem Raspberry Pi selbst generiert werden. Dafür dient das Tool ssh-keygen
.
pi@RPI-01 ~ $ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/pi/.ssh/id_rsa):
Created directory '/home/pi/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/pi/.ssh/id_rsa.
Your public key has been saved in /home/pi/.ssh/id_rsa.pub.
The key fingerprint is:
e3:63:ab:4c:a5:43:a8:f4:81:ac:b1:cd:6d:09:d5:d4 pi@RPI-01
Die Passphrase kann natürlich auch leer bleiben. Damit kann die Anmeldung ohne jede Nachfrage realisiert werden. Man soll jedoch gut abwägen, ob das nicht ein zu hohes Risiko darstellt, was natürlich nicht in jedem Fall so sein muss (die Schlüssel können ja auf eine andere Art sicher verwahrt sein können).
Die Schlüssel landen standartmäßig in ~/.ssh : id_rsa (private key) und id_rsa.pub (public key).
Von dem Schlüsselpaar soll natürlich eine Sicherungskpie gemacht werden. Die Private Schlüssel soll (aus Sicherheitsgründen) am Raspberry Pi gelöscht werden. Public-key soll nach ~/.ssh/authorized_keys kopiert (oder umbenannt) werden.
mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
Danach sind noch die Rechte anzupassen:
chmod 0600 ~/.ssh/*
Der Datei-Besitzer soll der Anzumeldender Benutzer sein. Das ist normalerweise nach der Generierung bereits so, falls nicht (die Schlüssel wurden z.B. von einem anderen Benutzer erstellt), soll dies korrigiert werden (statt 'pi' den gewünschten Benutzer eintragen):
chown pi:pi ~/.ssh/*
Damit ist die Server-Seite eingerichtet.
Zum Anmelen kann z.B. das Programm PuTTY verwendet werden.
Dort ist folgendes (zusätzlich zu den Verbindungseinstellungen) einzustellen:
Unter Connection->Data->Auto-login username den Benutzernamen eintragen ('pi').
Danach uneter Connection->SSH->Auth->Private key file for authentication den Pfad zu dem privaten Schlüssel.
Da PuTTY nicht direkt den generierten Schlüssel (id_rsa) verwenden kann, muss dieser noch mit dem Tool puttygen.exe konvertiert werden. Dafür wird der private Schlüssel mit dem Programm geladen (Load) und danach mit der Funktion 'Save private key' der Schlüssel in ppk-Format gespeichert.
Jetzt sollte die Anmeldung per Key-Verfahren funktionieren.
USB Stick einbinden
- Details
- Geschrieben von Alexander Schulz
- Kategorie: Raspberry Pi
- Zugriffe: 48457
Es kann verschiedene Gründe geben, das Dateisystem eines Raspberry Pi mit einer Festplatte oder einem USB-Stick zu erweitern. Es ist nicht allzu schwer, passiert jedoch nicht so automatisch und von alleine, wie unter Windows.
Hier ist etwas Vorbereitung nötig.
Zuerst müssen ggf. die Dateisystemtreiber installiert werden. Die FAT32, NTFS und HFS+ dürften für die meisten Zwecke ausreichen:
sudo apt-get install ntfs-3g hfsutils hfsprogs
Dann muss noch ein Mount-Point erstellt werden. Z.B.:
sudo mkdir /media/usb1
Jetzt den Stick einstecken und die Ausgaben in /var/log/messages ansehen. Dort erfährt man, unter welchen Gerätenamen der Stick verfügbar ist. Es dürfte für den ersten Stick sda lauten. Da mein Usbstick wie eine Festplatte partitioniert ist, lauet Gerätename sda1.
Ausprobieren kann man folgenden Befehl verwenden:
sudo mount -t vfat -o iocharset=utf8,uid=pi,gid=pi /dev/sda1 /media/usb1/
Der Parameter vfat steht für Stick-Dateisystem FAT32, ntfs-3g für NTFS und hfsplus entsprechend für HFS+ und ohne iocharset=utf8 konnte ich keine Umlaute in Dateinamen verwenden.
Wenn alles richtig ist, wird der Stick-Inhat unter /media/usb1 eingebunden.
Zum 'Auswerfen' dient dann folgendes Befehl:
sudo umount /media/usb1
Damit der Stick nach einem Neustart automatisch eingebunden wird, muss ein entsprechender Eintrag in fstab eingetragen werden. Am besten mit UUID, gilt der Eintrag genau unf nur für diesen Stick. Die UUID kann mit dem Befehl blkid ermittelt werden:
sudo blkid /dev/sda1
In meinem Fall lautet die Ausgabe: /dev/sda1: UUID="DC72-5229" TYPE="vfat"
Jetzt kann die fstab entsprechend erweitert werden (sudo nano /etc/fstab
). Als letzte Zeile soll dafür folgendes eingefügt werden:
UUID=DC72-5229 /media/usb1/ vfat defaults,auto,users,rw,iocharset=utf8,uid=pi,gid=pi 0
Noch den Stick per Samba freigeben und fertig ist ein einfacher (und recht langsamer) NAS.
Nachrag:
Beim Einrichten von automatischen Backup bin ich auf das Problem mit den Dateien gestoßen, wenn sie größer als 4GB sind. Um dem zu entgehen, habe ich samba gestoppt (sudo service samba stop
), den Stick abgemeldet (sudo umount /media/usb1
), auf dem Windowsrechner in NTFS-Format konvertiert (format G: /fs:ntfs
), fstab entsprechend angepasst und alles wieder gemountet und gestartet.
Eintrag in fstab (UID hat sich beim Konvertieren geändert):
UUID=8804583D04583104 /media/usb1/ ntfs-3g defaults,uid=alex,gid=alex,umask=000 0 0
Ich musste jedoch feststellen, dass die Performance (im Vergleicht zu FAT32) mieserabel ist, die CPU-Auslastung ist sehr hoch. Das Auslesen der kompletten SDCard (8GB) hat die 6-fache Zeit benötigt.
Ich werde wohl mit ext4 probieren.
Nachtrag 2:
Da die Performance alles anderes als befriedigend war, habe ich den Stick mit ext4 formatiert.
Zuerst müssen Services gestoppt werden, die auf den Stick zugreifen (samba, pyload). Danach wird das Dateisystem ausgehängt (sudo umount /media/usb1
)
Mit mkfs -t ext4 /dev/sda1
wird das Dateisystem initialisiert (Auchtung! Alle Daten auf den Stick werden gelöscht!).
sudo blkid /dev/sda1
liefert die neue UUID. Somit lautet der neue Eintrag für fstab folgendermaßen:
UUID="fda0064d-bb36-46bd-b78b-7f4ed3aa31c4" /media/usb1/ ext4 defaults,noatime 0 0
Hier können keine uid und gid bei mount angegeben werden, daher müssen die notwendigen Rechte (nach dem mounten) mit chown und chmod gesetzt werden: sudo chown alex:alex -R /media/usb1
und sudo chmod a+w -R /media/usb1
. Danach noch wieder samba und pyload starten und fertig ;)
Die (Dauer)Schreibrate (ermittelt mit dd) hat sich gegenüber ntfs von ca. 2MB/s auf ca. 12MB/s erhöht.
Apache-Logs abschalten
- Details
- Geschrieben von Alexander Schulz
- Kategorie: Raspberry Pi
- Zugriffe: 40206
Logging ist natürlich sowohl wichtig als auch nützlich. Ein Raspberry Pi verwendet jedoch als nichtflüchtiges Speichermedium eine Flash-Karte und diese nehmen üblicherweise viele Schreibzugriffe irgendwann übel. Um dessen Lebensdauer zu verlängern, kann es sinnvoll sein, möglichst wenig zu logen. Dem Apache-Server (schon so eine Labertasche ;-) kann man das auf folgende Weise abgewöhnen:
- In apache2.conf (
sudo nano /etc/apache2/apache2.conf
) soll folgende Zeile:
durchErrorLog ${APACHE_LOG_DIR}/error.log
ersetzt und dann noch der EintragErrorLog /dev/null
auskommentiert werden (mit einem voreingestellten #-Zeichen).LogLevel warn
- In /etc/apache2/conf.d/other-vhosts-access-log (
sudo nano /etc/apache2/conf.d/other-vhosts-access-log
) ist folgendes auszukommentieren:
CustomLog ${APACHE_LOG_DIR}/other_vhosts_access.log vhost_combined
- In /etc/apache2/sites-enabled/000-default (
sudo nano /etc/apache2/sites-enabled/000-default
) müssen folgende drei Einträge dealtiviert werden (auch jeweils mit einem #-Zeichen):
ErrorLog ${APACHE_LOG_DIR}/error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined
Nach dem Neustart von Apache (sudo service apache2 restart
) soll nichts mehr gelogt werden.
Raspberry Pi: System überwachen (RPiUtils und SYSTAT)
- Details
- Geschrieben von Alexander Schulz
- Kategorie: FHEM
- Zugriffe: 52856
Bei der Suche nach einer Möglichkeit, die Parameter des Wirtsystems des FHEM-Servers zu überwachen, bin ich auf den SYSSAT-Modul und die RPiUtils-Bibliothek gestossen.
Sysstat liefert die Systemauslastung, mit RPiUtils können viele andere Werte erfasst werden. Allerdings ist dafür ein zimliches Gewusel von Dummy-Devices und AT-Befehle notwendig.
# --- RPi
define RPiValues weblink htmlCode {ShowRPiValues()}
attr RPiValues group RPi
attr RPiValues room 9.03_Tech
#
# --- Temp loggen
define RPiTemp dummy
attr RPiTemp comment RPi: CPU Temperatur
attr RPiTemp group RPi
attr RPiTemp room 9.03_Tech
define FileLog_RPiTemp FileLog ./log/rpi_temp-%Y-%m.log RPiTemp
attr FileLog_RPiTemp group RPi
attr FileLog_RPiTemp logtype temp4:Plot,text
attr FileLog_RPiTemp room 9.03_Tech
define C:AT.RPiTemp at +*00:05 { fhem("set RPiTemp ".RPiTemp(" ")) }
attr C:AT.RPiTemp group RPi
attr C:AT.RPiTemp room 9.03_Tech
define wl_RPiTemp SVG FileLog_RPiTemp:temp4:CURRENT
attr wl_RPiTemp group RPi
attr wl_RPiTemp label "Raspberry Pi Temperatur: Min $data{min1}, Max $data{max1}, Last $data{currval1}"
attr wl_RPiTemp room 9.03_Tech
#
# --- RAM loggen:
define RPiRam dummy
attr RPiRam comment RPi: RAM
attr RPiRam group RPi
attr RPiRam room 9.03_Tech
define FileLog_RPiRam FileLog ./log/rpi_ram-%Y-%m.log RPiRam
attr FileLog_RPiRam group RPi
attr FileLog_RPiRam logtype text
attr FileLog_RPiRam room 9.03_Tech
define C:AT.RPiRam at +*00:05 { fhem("set RPiRam ".RPiRamSwap("R")) }
attr C:AT.RPiRam group RPi
attr C:AT.RPiRam room 9.03_Tech
#
# --- SWAP loggen:
define RPiSwap dummy
attr RPiSwap comment RPi: Swap
attr RPiSwap group RPi
attr RPiSwap room 9.03_Tech
define FileLog_RPiSwap FileLog ./log/rpi_swap-%Y-%m.log RPiSwap
attr FileLog_RPiSwap group RPi
attr FileLog_RPiSwap logtype text
attr FileLog_RPiSwap room 9.03_Tech
define C:AT.RPiSwap at +*00:10 { fhem("set RPiSwap ".RPiRamSwap("S")) }
attr C:AT.RPiSwap group RPi
attr C:AT.RPiSwap room 9.03_Tech
#
# --- Filesystemspeicher loggen:
define RPiFS dummy
attr RPiFS comment RPi: Filesystem
attr RPiFS event-on-change-reading state
attr RPiFS group RPi
attr RPiFS room 9.03_Tech
define FileLog_RPiFS FileLog ./log/rpi_fs-%Y-%m.log RPiFS
attr FileLog_RPiFS group RPi
attr FileLog_RPiFS logtype text
attr FileLog_RPiFS room 9.03_Tech
define C:AT.RPiFS at +*01:00 { fhem("set RPiFS ".RPiFileSystem("","/")) }
attr C:AT.RPiFS group RPi
attr C:AT.RPiFS room 9.03_Tech
#
# --- Netzwerktraffik loggen:
define RPiLAN dummy
attr RPiLAN comment RPi: LAN Eth0
attr RPiLAN group RPi
attr RPiLAN room 9.03_Tech
define FileLog_RPiLAN FileLog ./log/rpi_lan-%Y-%m.log RPiLAN
attr FileLog_RPiLAN group RPi
attr FileLog_RPiLAN logtype text
attr FileLog_RPiLAN room 9.03_Tech
define C:AT.RPiLAN at +*00:10 { fhem("set RPiLAN ".RPiNetwork("", "eth0")) }
attr C:AT.RPiLAN group RPi
attr C:AT.RPiLAN room 9.03_Tech
#
# --- Sysstat (CPU load, diskusage)
define RPiStat SYSSTAT 60 600
attr RPiStat comment RPi: CPU load
attr RPiStat group RPi
attr RPiStat room 9.03_Tech
define FileLog_RPiStat FileLog ./log/rpi_sysstat-%Y-%m.log RPiStat
attr FileLog_RPiStat group RPi
attr FileLog_RPiStat logtype sysstat:Plot,text
attr FileLog_RPiStat nrarchive 1
attr FileLog_RPiStat room 9.03_Tech
define wl_RPiStat SVG FileLog_RPiStat:sysstat:CURRENT
attr wl_RPiStat group RPi
attr wl_RPiStat label "Load Min: $data{min1}, Max: $data{max1}, Aktuell: $data{currval1}"
attr wl_RPiStat room 9.03_Tech
.
Apache, MySQL und PHP auf Raspberry Pi
- Details
- Geschrieben von Alexander Schulz
- Kategorie: Raspberry Pi
- Zugriffe: 29513
Für die Installation von PGM3 wird ein Web-Server mit PHP-Unterstützung benötigt. Also habe ich die komplette LAMP-Stack installiert.
Wie immer, kann vorher eine System-Aktualisierung nicht schaden: sudo apt-get update && sudo apt-get upgrade
.
Apache
Zuerst der Webserver. Apache benötigt eine eigene Benutzergruppe: www-data. Auf meinem System war diese bereit vorhanden. Andernfalls muss diese angelegt werden:sudo groupadd www-data
sudo usermod -a -G www-data www-data
Die eigentliche Installation: sudo apt-get install apache2 apache2-utils
. Wer möchte, installiert zusätzlich auch die Dokumentation (apache2-doc).
Das Doc-Root von Apache befindet sich unter /var/www/. Dort ist bereits eine vordefinierte Seite testweise angelegt. Sie kann unter der URL http://192.168.0.10/ aufgerufen werden.
Um bequemer auf dieses Verzeichniss (von Windowsrechner aus) zu zugreife, habe ich eine neue Samba-Freigabe erstellt (sudo nano /etc/samba/smb.conf
):
[www]
comment = www (htdocs) Verzeichnis
path = /var/www
valid users = alex
read only = No
create mask = 0777
directory mask = 0777
PHP
Dann kommt PHP an die Reihe: sudo apt-get install php5
.
Zum Testen von PHP-Installation wird mit sudo nano /var/www/info.php
eine Datei mit folgendem Inhalt angelegt:
<?php
phpinfo();
?>
Zum Beschleunigen von PHP-Ausführung habe kann noch das Paket php-xcache installiert werden: sudo apt-get install php5-xcache
.
Falls alles korrekt installiert wurde, liefert der Aufruf http://192.168.0.10/info.php Informationen zu installierten Modulen. Davor muss der Apache-Server jedoch neugestartet werden (sudo service apache2 restart
).
MySQL
Und noch die Datenbank und das Administrationstool: sudo apt-get install mysql-server mysql-client php5-mysql phpmyadmin
.
Während der Installation muss der root-Passwort (für die MySQL) vergeben werden und die Webserverintegration (Apache) ausgewählt werden. Für phpmyadmin wird wird die Datenbankinitialisierung unternohmen und ein Passwort angegeben.
Im Anschluss muss noch die Apache-Konfiguration um die phpmyadmin-Integration erweitert werden. Dafür wird ans Ende der Konfigurationsdatei (sudo nano /etc/apache2/apache2.conf
) folgende Zeile eingefügt: Include /etc/phpmyadmin/apache.conf
. Und wenn man schon dabei ist, sollte der Server auch einen "Namen" bekommen (irgendwo am Anfang der Datei): ServerName localhost
.
Nach dem Neustart von Apache (sudo service apache2 restart
) sollte phpmyadmin aufgerufen werden können: http://192.168.0.10/phpmyadmin/ (Benutzer: root mit dem vorher vergebenen Passwort).
Zum Absichern der Datenbank für den EInsatz in produktiven Umgebungen bring MySQL ein spezielles Script mit: mysql_secure_installation.
Sein Daten legt MySQL im Verzeichnis /var/lib/mysql/
Zur nachträglichen Passwort-Änderung eines MySQL-Benutzer meldet man sich zuerst mit mysql -p -u root
im MySQL-Commandline-Tool an. Dort wird die Datenbank mysql geladen: USE mysql
, der Datensatz für den gewünschten Benutzer modifiziert: UPDATE user SET Password=PASSWORD('NewPasswd') WHERE user='Username';
und nach FLUSH PRIVILEGES;
wird die Änderung aktiv. Danach kann die MySQL-Commandline mit exit
verlassen werden.
Seite 6 von 14