Linux Dienst mit privilegiertem Port ohne Administrator-Rechte

Diens­te soll­ten nicht mit admi­nis­tra­ti­ven Rech­ten gestar­tet wer­den. Es sei denn der Dienst sieht dies vor und erstellt die Unter­pro­zes­se mit nor­ma­len Pri­vi­le­gi­en.
Nicht jede Appli­ka­ti­on berück­sich­tigt das, was zur Fol­ge hat, dass man­che Pro­zes­se kei­ne Diens­te im unte­ren Port­be­reich zur Ver­fü­gung stel­len können.

Hier schafft man ein­fach mit authbind Abhil­fe. So kann zum Bei­spiel eine klei­ne Web­ser­ve­r­ap­pli­ka­ti­on mit Benut­zer­rech­ten auf Port 80 lau­fen.
Möch­te man dem Benut­zer "mini­ser­ver" das Recht geben dies durch­zu­füh­ren, legt man mit touch /etc/authbind/byport/80 eine lee­re Datei an und über­gibt mit chown miniserver:miniserver /etc/authbind/byport/80 deren Besitz. Zuletzt wer­den mit chmod 500 /etc/authbind/byport/80 noch die Rech­te limi­tiert.
Nun kann die Appli­ka­ti­on mit authbind als Wrap­per gestar­tet wer­den und darf auf Port 80 lauschen.

WIM von ISO für USB-Stick splitten

Inzwi­schen sind die Win­dows Instal­la­ti­ons­images so groß gewor­den, dass sie nicht mehr auf FAT32-Daten­trä­ger kopiert wer­den kön­nen. Mit fol­gen­dem Befehl kön­nen die­se gesplit­tet werden:

dism /Split-Image /ImageFile:"<Pfad>\install.wim" /SWMFile:"<Pfad>\install.swm" /FileSize:1024

Anschlie­ßend kann die install.wim gelöscht und der ISO-Inhalt pro­blem­los auf den USB-Stick kopiert werden.

Problem mit Desktop-Symbolen unter Windows 10 Creators Update beheben

Das Crea­tors Update (Ver­si­on 1703 = Build 15063) für Win­dows 10 bringt auf eini­gen Sys­te­men mit bestimm­ten Moni­tor-Auf­lö­sun­gen die Desk­top-Sym­bo­le durch­ein­an­der. Anschlie­ßend las­sen sich die­se auch nicht mehr kor­rekt anord­nen. Dies fällt beson­ders dann auf, wenn meh­re­re Icons gleich­zei­tig mar­kiert und ver­scho­ben werden.

Hier­für gibt es eine ein­fa­che Lösung:
Durch einem Rechts­klick auf eine freie Stel­le des Desk­tops erscheint das Kon­text­me­nü. Hier ist unter "Ansicht" die bereits akti­ve Grö­ße der Desk­top-Icons (z.B. "Mit­tel­gro­ße Sym­bo­le") erneut aus­zu­wäh­len. Dadurch wer­den die Sym­bo­le neu am Git­ter aus­ge­rich­tet und die Posi­tio­nen korrigiert.

Anschlie­ßend funk­tio­niert die Posi­tio­nie­rung wie­der wie gewohnt und auch zuvor uner­reich­ba­re Berei­che an den Rän­dern kön­nen wie­der ord­nungs­ge­mäß genutzt werden.

Debian Minimal-Installation auf Raspberry Pi

Um den Raspber­ry Pi als klei­nen Ser­ver zu benut­zen, sind die vor­ge­fer­tig­ten Images von Raspbi­an über­di­men­sio­niert und im Hin­blick auf Boot­zeit und Grund­aus­las­tung unge­eig­net. Seit meh­re­ren Jah­ren nut­ze ich des­halb das Pro­jekt "Raspbi­an (mini­mal) unat­ten­ded net­in­stal­ler", wel­cher ab dem Modell 1B ein­ge­setzt wer­den kann.

Um die aktu­el­len Ker­nel zu nut­zen und auch das Modell 3 zu unter­stüt­zen habe ich das Pro­jekt ent­spre­chend ange­passt. Von der Releases-Sei­te mei­nes Forks kann eine ZIP-Datei her­un­ter­ge­la­den wer­den, des­sen Inhalt ledig­lich auf die SD-Kar­te kopiert wer­den muss.

Anschlie­ßend ein­fach die (µ)SD-Karte und ein mit DHCP und Inter­net­ver­bin­dung ver­sor­gen­des Netz­werk­ka­bel anste­cken, Strom­ver­sor­gung anschlie­ßen und nach ca. 15 Minu­ten Instal­la­ti­ons­zeit boo­tet auto­ma­tisch ein mini­ma­les, sau­be­res Debi­an auf dem Pi.

Anpas­sun­gen des Instal­la­ti­ons­vor­gangs mit­tels einer installer-config.txt kön­nen ana­log zum Ursprungs­pro­jekt gemacht werden.

Man soll­te dar­an den­ken, nach der Instal­la­ti­on mit­tels dpkg-reconfigure locales die Spra­che, dpkg-reconfigure console-data das Tas­ta­tur­lay­out und dpkg-reconfigure tzdata die Zeit­zo­ne festzulegen.

Kernelupdate und Grub2 auf XEN-VMs

Ein XEN basier­ter vSer­ver hat den gro­ßen Vor­teil, dass eige­ne Ker­nel und Modu­le genutzt wer­den können.
Stellt der Pro­vi­der VMs jedoch nur mit Grub 1 zur Ver­fü­gung ver­hin­dert die Aus­gangs­kon­fi­gu­ra­ti­on aber unter Umstän­den das Boo­ten neue­rer Ker­nels, da "update-grub" die "menu.lst" nicht auto­ma­ti­siert anpas­sen kann.

Im Zuge der Kor­rek­tu­ren darf auch auf Grub 2 migriert wer­den. Hier­bei wer­den die Grub-Ein­trä­ge kom­plett neu gene­riert und sicher­ge­stellt, dass auch Hosts, wel­che Grub 2 nicht selbst­stän­dig laden, ent­spre­chend wei­ter­ge­lei­tet wer­den. Even­tu­el­le Feh­ler­mel­dun­gen, wel­che beim Auf­ruf von "update-grub" auf­tre­ten kön­nen igno­riert wer­den, sofern die jeweils letz­te Aus­ga­be den Erfolg des Befehls anzeigt.

Die fol­gen­den Befeh­le bezie­hen sich auf Debi­an v8.x:

apt-get -y install grub-legacy
cp -pR /boot/grub/ /boot/grub_old
rm -rf /boot/grub/*
rm -rf /boot/xen/*
update-grub
apt-get -y purge pv-grub-menu grub-common grub-legacy grub-pc grub2 grub2-common
apt-get -y install grub-xen
grub-install --target=x86_64-xen
sed -i 's/timeout\t\t5/timeout\t\t0/' /boot/grub/menu.lst
sed -i 's/# groot=(hostdisk\/\/dev\/xvda1)/# groot=(hd0,0)/' /boot/grub/menu.lst
nano /boot/grub/menu.lst

Alle Ker­nel in der Lis­te ent­fer­nen und erset­zen durch:

title Chainload Grub 2
root (hd0,0)
kernel /boot/xen/pvboot-x86_64.elf

Abschlie­ßend Grub 2 fer­tig kon­fi­gu­rie­ren lassen:

sed -i 's/GRUB_TIMEOUT=5/GRUB_TIMEOUT=0/' /etc/default/grub
update-grub

Nun kann die VM neu gestar­tet werden.

Optio­nal:
Wenn gewünscht, kann auch "fstab" ange­passt wer­den, sodass gemäß den Richt­li­ni­en von Debi­an v8 UUIDs als Iden­ti­fier genutzt wer­den. "xvda2" wird im fol­gen­den Bei­spiel als Swap gemountet:

sed -i 's/^\/dev\/xvd/#\/dev\/xvd/' /etc/fstab
sed -i 's/^proc/#proc/' /etc/fstab
echo "# /dev/xvda1" >> /etc/fstab
echo -e "$(blkid /dev/xvda1 -s UUID | awk '{print $2}' | sed 's/\"//g')\t/\t\t$(df -T /dev/xvda1 | grep "^/dev" | awk '{print $2}')\terrors=remount-ro\t0\t1" >> /etc/fstab
echo "# /dev/xvda2" >> /etc/fstab
echo -e "$(blkid /dev/xvda2 -s UUID | awk '{print $2}' | sed 's/\"//g')\tnone\t\tswap\tsw\t\t\t0\t0" >> /etc/fstab

GitHub Release Notifications

Nach­dem ich immer mehr Pro­jek­te bei Git­Hub ver­fol­ge und ein­set­ze, war der Ein­satz einer auto­ma­ti­schen Benach­rich­ti­gung bei neu­en Ver­sio­nen überfällig.

Lösun­gen, wie "Sib­bell" sind lei­der noch nicht aus­ge­reift oder funk­tio­nie­ren über­haupt nicht. Inzwi­schen set­ze ich "rss2email" ein.

Setzt man hin­ter die URL des Release-Tabs das Suf­fix ".atom", erhält man dadurch die URL, wel­che von "rss2email" ein­ge­le­sen wird und deren Ein­trä­ge — sofern noch nicht ver­sandt — per eMail an den gewünsch­ten Emp­fän­ger geschickt werden.
Die Kon­fi­gu­ra­ti­ons­da­tei ist nach der Initia­li­sie­rung unter "~/.config/rss2email.cfg" zu finden.

TeamSpeak Passwortwiederherstellung

Team­Speak ist in grö­ße­ren Grup­pen eine prak­ti­sche Alter­na­ti­ve zur VoIP-Kom­mu­ni­ka­ti­on wie sie z.B. auch Sky­pe bie­tet. Hat man eine Instanz im Archiv, zu wel­cher jedoch kei­ne Zugangs­da­ten mehr zur Ver­fü­gung ste­hen, kön­nen die­se leicht wie­der­her­ge­stellt werden:
Zunächst ist Team­Speak zu been­den und mit einem tem­po­rär gesetz­ten Pass­wort zu starten:

./ts3server_minimal_runscript.sh serveradmin_password=tempPassword

Anschlie­ßend kann man sich per telnet localhost 10011 mit der Ser­ver­Query-Schnitt­stel­le ver­bin­den und das Pass­wort zurücksetzen:

login serveradmin tempPassword
clientsetserverquerylogin client_login_name=serveradmin

Das neu gene­rier­te Pass­wort wird in der Kon­so­le angezeigt.


Benö­tigt man auch einen Admin-Token, bekommt man die­sen mit fol­gen­den Befehlen:

use sid=1
tokenadd tokentype=0 tokenid1=6 tokenid2=0

Der neu gene­rier­te Token für die Ser­ver­grup­pe "Ser­ver Admin (6)" wird in der Kon­so­le angezeigt.


Man soll­te nicht ver­ges­sen, Team­Speak anschlie­ßend ohne den Pass­wort-Para­me­ter neu zu starten.

Abstürze bei Silverlight in Vollbild-Modus

Nach­dem eini­ge Brow­ser den Sup­port von NPA­PI-Erwei­te­run­gen nach und nach abstel­len, wer­den zum Anse­hen von Video­streams wie­der ver­mehrt Flash-Play­er eingesetzt.
Bei "Ama­zon Instant Video" ist im Flash-Play­er-Modus jedoch kein HD mög­lich, wes­halb sich der auf Win­dows-Sys­te­men in der Regel vor­in­stal­lier­te Inter­net Explo­rer als Ersatz-Brow­ser für das Fil­me­schau­en anbietet.

Hier­bei gibt es jedoch ein Pro­blem: Ver­lässt man meh­re­re Male den Voll­bild­mo­dus, erscheint ein Popup von Sil­ver­light, das jedoch auf kei­ne Ein­ga­be reagiert und zum Absturz des Brow­sers führt. Eine Neu­in­stal­la­ti­on von Sil­ver­light bringt hier­bei kei­ne Abhilfe.
Um die­ses Pro­blem zu lösen, ist ledig­lich die fol­gen­de Anpas­sung in der Regis­try vorzunehmen:

Schlüs­sel:

HKEY_CURRENT_USER\Software\AppDataLow\Software\Microsoft\Silverlight\Permissions\http://ecx.images-amazon.com:80

DWORD-Wert:

"StaysInFullScreenWhenUnfocused"=dword:00000011

Redmine mit GIT auf Debian-Server

Red­mi­ne ist wohl eines der kom­for­ta­bels­ten und mäch­tigs­ten Issue-Track­ing-Sys­te­me im Open-Source-Bereich.
Hier möch­te ich zei­gen, wie man es auf einem Debi­an-Ser­ver mit nginx als Web­ser­ver instal­liert und einrichtet:

Mit Red­mi­ne 3.0.0 muss das "Red­mi­ne Boot­strap Kit plug­in" v0.2.0 und das "Red­mi­ne Git Hos­ting Plug­in" v1.0.1 oder höher ver­wen­det werden.
Hier­zu sind gege­be­nen­falls Anpas­sun­gen an den Depen­den­ci­es der Gem­files nötig, wel­che sich aus den Hin­wei­sen der Bund­ler-Instal­la­ti­ons­pro­ze­du­ren ergeben.

Tipp:
https://github.com/jbox-web/grack.git klonen und in plugins/redmine_git_hosting/Gemfile ändern: "gem 'gitlab-grack', path: '/opt/redmine/plugins/redmine_git_hosting/grack', require: 'grack'"
In plugins/redmine_git_hosting/grack/grack.gemspec "gem.add_dependency("rack", "~> 1.4.1")" auskommentieren.
In plugins/redmine_git_hosting/Gemfile "gem 'redcarpet', '~> 2.3.0'" auskommentieren.
apt-get install apt-transport-https ca-certificates
echo "deb https://oss-binaries.phusionpassenger.com/apt/passenger wheezy main" > /etc/apt/sources.list.d/passenger.list
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7
apt-get update

apt-get remove nginx nginx-full nginx-light nginx-naxsi nginx-common
apt-get install sudo ssh make g++ bzip2 zip unzip libssl-dev nginx-extras passenger mysql-server libmysqlclient-dev ruby ruby-dev git git-core gitolite imagemagick libmagickcore-dev libmagickwand-dev libicu-dev

nano /etc/nginx/nginx.conf
--------------------
(Prozessanzahl limitieren:         )
(worker_processes 1;               )
(worker_connections 1024;          )
(passenger_max_instances_per_app 2;)

Auskommentieren:
passenger_root ...;
passenger_ruby ...;
-----------------------------
service nginx restart

adduser --system --shell /bin/bash --gecos 'Git Administrator' --group --disabled-password --home /opt/gitolite git
adduser --system --shell /bin/bash --gecos 'Redmine Administrator' --group --disabled-password --home /opt/redmine redmine

su redmine
ssh-keygen -t rsa -N '' -f ~/.ssh/redmine_gitolite_admin_id_rsa
exit
dpkg-reconfigure gitolite
------------------------------------------------------------------
user: git
repos path: /opt/gitolite
admin ssh-key: /opt/redmine/.ssh/redmine_gitolite_admin_id_rsa.pub
------------------------------------------------------------------
su redmine
ln -s /opt/redmine/.ssh/redmine_gitolite_admin_id_rsa /opt/redmine/.ssh/id_rsa
ln -s /opt/redmine/.ssh/redmine_gitolite_admin_id_rsa.pub /opt/redmine/.ssh/id_rsa.pub
exit
visudo
--------------------------------------
# temp - *REMOVE* after installation
redmine    ALL=(ALL)      NOPASSWD:ALL

# redmine gitolite integration
redmine    ALL=(git)      NOPASSWD:ALL
git        ALL=(redmine)  NOPASSWD:ALL
--------------------------------------
sudo su - redmine
cd ~
wget http://www.redmine.org/releases/redmine-x.x.x.tar.gz
tar zxf redmine-x.x.x.tar.gz
mv redmine-x.x.x/* .
rm -Rf redmine-x.x.x
rm redmine-x.x.x.tar.gz

mysql -u root -p -v -e "CREATE DATABASE redmine CHARACTER SET utf8;
CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'redmine';
GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';"

cd /opt/redmine/config
cp database.yml.example database.yml
cp configuration.yml.example configuration.yml
nano database.yml
nano configuration.yml

cd ~
mkdir public/plugin_assets
sudo gem install bundler
bundle install --without development test postgresql sqlite
rake generate_secret_token
RAILS_ENV=production rake db:migrate
RAILS_ENV=production rake redmine:load_default_data

cd ~/plugins
git clone https://github.com/jbox-web/redmine_bootstrap_kit.git
cd ~/plugins/redmine_bootstrap_kit
git checkout x.x.x
git clone https://github.com/jbox-web/redmine_git_hosting.git
cd ~/plugins/redmine_git_hosting
git checkout x.x.x

ln -s /opt/redmine/.ssh/redmine_gitolite_admin_id_rsa /opt/redmine/plugins/redmine_git_hosting/ssh_keys/redmine_gitolite_admin_id_rsa
ln -s /opt/redmine/.ssh/redmine_gitolite_admin_id_rsa.pub /opt/redmine/plugins/redmine_git_hosting/ssh_keys/redmine_gitolite_admin_id_rsa.pub

sudo su - git
sed -i 's/$GL_GITCONFIG_KEYS = ""/$GL_GITCONFIG_KEYS = ".*"/g' /opt/gitolite/.gitolite.rc
exit

cd ~
git clone git@localhost:gitolite-admin.git
cd gitolite-admin/
echo "
repo    @all
        RW+    = admin" >> conf/gitolite.conf
git commit -m 'Automatic Repository Initialization' conf/gitolite.conf
git push
cd ~
rm -rf gitolite-admin

cd ~
bundle install --without development
RAILS_ENV=production rake redmine:plugins:migrate
exit

su root
nano /etc/nginx/sites-available/default
---------------------------------------
Hinzufügen:
        location ~ ^/redmine(/.*|$) {
                alias /opt/redmine/public$1;
                passenger_base_uri /redmine;
                passenger_app_root /opt/redmine;
                passenger_document_root /opt/redmine/public;
                passenger_enabled on;
        }
---------------------------------------
nginx -s reload

visudo
-------------------------------------------------
Temp-Eintrag entfernen: "redmine    ALL=(ALL)..."
-------------------------------------------------

Raspberry Pi im Serverbetrieb mit Zusatzhardware

Um ein mög­lichst sau­be­res Debi­an mit Hard­ware Floa­ting Point Unit Unter­stüt­zung auf dem Raspber­ry Pi ein­zu­set­zen, emp­fiehlt sich die Nut­zung des "Raspbi­an (mini­mal) unat­ten­ded net­in­stal­ler". Dabei wer­den jedoch auch vie­le Ker­nel-Modu­le und Firm­ware-Pake­te nicht mitinstalliert.

Um Sys­tem­kom­po­nen­ten zur Unter­stüt­zung wei­te­rer Hard­ware nach­zu­in­stal­lie­ren soll dies am Bei­spiel des WiFi-Chip­sat­zes RTL8191SU auf­ge­zeigt werden.

  • Zunächst sind die Quel­len der Paket­ver­wal­tung in der Datei "/etc/apt/sources.list" zu ergänzen:
deb http://mirrordirector.raspbian.org/raspbian wheezy main contrib non-free firmware
deb http://archive.raspberrypi.org/debian wheezy main
  • Anschlie­ßend wird das Update-Skript "rpi-update" instal­liert:
apt-get update && apt-get install rpi-update
  • Mit dem Aus­füh­ren von "rpi-update" wer­den dann unter ande­rem die feh­len­den Ker­nel­mo­du­le nachgeladen.
  • Jetzt fehlt nur noch die Firm­ware für den hier ver­wen­de­ten WiFi-Chipsatz:
apt-get install firmware-realtek

Nach einem Neu­start des Raspber­ry Pi ist der Adap­ter nun in Funk­ti­on. Veri­fi­ziert wer­den kann dies zum Bei­spiel mit:

ip link show

Mit dem oben erwähn­ten "Raspbi­an (mini­mal) unat­ten­ded net­in­stal­ler" ist der Raspber­ry Pi im Ver­gleich zum Stan­dard-Raspbi­an zum Bei­spiel als klei­ner und schnell star­ten­der WiFi-Acces­s­Point, Paket­fil­ter oder Pro­xy verwendbar.
Über­flüs­si­ge Pake­te müs­sen bei der Ein­rich­tung nicht auf­wen­dig gesucht und ent­fernt wer­den — man lädt sich nur das in die Instal­la­ti­on, was wirk­lich benö­tigt wird.

Anmer­kung:
Der WiFi-Chipsatz(treiber) des RTL8191SU läuft mit den aktu­el­len Ker­neln nicht beson­ders schnell. Mit der Abschal­tung des IEEE 802.11n kön­nen aber wenigs­tens die 54 MBit/s von IEEE 802.11g erreicht wer­den. Dazu ein­fach die Opti­on des Ker­nel­mo­duls anpas­sen und neu starten:

echo "options r8712u ht_enable=0" | tee /etc/modprobe.d/r8712u.conf